@sumaris-net/ngx-components 18.15.2 → 18.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/doc/changelog.md +10 -0
- package/esm2022/src/app/core/about/about.modal.mjs +53 -20
- package/esm2022/src/app/core/services/local-settings.service.mjs +8 -4
- package/esm2022/src/app/core/services/model/entity.model.mjs +10 -8
- package/esm2022/src/app/core/services/network.utils.mjs +1 -1
- package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
- package/esm2022/src/app/shared/file/url.utils.mjs +3 -1
- package/esm2022/src/app/shared/form/field.component.mjs +1 -1
- package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +5 -2
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +160 -15
- package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +4 -3
- package/esm2022/src/app/shared/material/testing/common.test.mjs +1 -1
- package/esm2022/src/environments/environment.class.mjs +2 -1
- package/esm2022/src/environments/environment.mjs +2 -1
- package/fesm2022/sumaris-net.ngx-components.mjs +231 -43
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/core/about/about.modal.d.ts +23 -11
- package/src/app/core/services/local-settings.service.d.ts +25 -0
- package/src/app/core/services/network.utils.d.ts +1 -0
- package/src/app/shared/material/datetime/datetime.module.d.ts +2 -1
- package/src/app/shared/material/datetime/material.datetime.d.ts +24 -7
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +1 -0
- package/src/assets/i18n/en-US.json +4 -1
- package/src/assets/i18n/en.json +4 -1
- package/src/assets/i18n/fr.json +4 -1
- package/src/assets/manifest.json +1 -1
- package/src/environments/environment.class.d.ts +1 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { booleanAttribute, ChangeDetectionStrategy, Component, forwardRef, Inject, Input, Optional, ViewChild, ViewChildren, } from '@angular/core';
|
|
1
|
+
import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewChild, ViewChildren, } from '@angular/core';
|
|
2
2
|
import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
|
|
3
3
|
import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
|
|
4
4
|
import { isMoment } from 'moment';
|
|
@@ -35,12 +35,20 @@ const DEFAULT_VALUE_ACCESSOR = {
|
|
|
35
35
|
useExisting: forwardRef(() => MatDateTime),
|
|
36
36
|
multi: true,
|
|
37
37
|
};
|
|
38
|
-
const I18N_KEYS = [
|
|
38
|
+
const I18N_KEYS = [
|
|
39
|
+
'COMMON.DATE_PATTERN',
|
|
40
|
+
'COMMON.TIME_PATTERN',
|
|
41
|
+
'COMMON.DATE_TIME_PATTERN',
|
|
42
|
+
'COMMON.DATE_PLACEHOLDER',
|
|
43
|
+
'COMMON.TIME_PLACEHOLDER',
|
|
44
|
+
'COMMON.HOUR_PATTERN',
|
|
45
|
+
];
|
|
39
46
|
const noop = () => { };
|
|
40
47
|
export class MatDateTime {
|
|
41
48
|
dateAdapter;
|
|
42
49
|
translate;
|
|
43
50
|
formBuilder;
|
|
51
|
+
renderer;
|
|
44
52
|
cd;
|
|
45
53
|
formGroupDir;
|
|
46
54
|
_onChangeCallback = noop;
|
|
@@ -49,6 +57,7 @@ export class MatDateTime {
|
|
|
49
57
|
_controlSubscription;
|
|
50
58
|
_writing = true;
|
|
51
59
|
_disabling = false;
|
|
60
|
+
_focused = false;
|
|
52
61
|
_tabindex;
|
|
53
62
|
_readonly = false;
|
|
54
63
|
_controlName;
|
|
@@ -68,6 +77,8 @@ export class MatDateTime {
|
|
|
68
77
|
maskitoTimeOptions;
|
|
69
78
|
datePlaceholder;
|
|
70
79
|
timePlaceholder;
|
|
80
|
+
timePickerReady = false;
|
|
81
|
+
logPrefix = '[mat-date-time]';
|
|
71
82
|
placeholder;
|
|
72
83
|
floatLabel = 'auto';
|
|
73
84
|
mobile;
|
|
@@ -77,6 +88,9 @@ export class MatDateTime {
|
|
|
77
88
|
startDate = null;
|
|
78
89
|
datePickerFilter;
|
|
79
90
|
allowNoTime = false;
|
|
91
|
+
dottedMinutesInGap = true;
|
|
92
|
+
timeHoursOnly = false;
|
|
93
|
+
debug = false;
|
|
80
94
|
set appearance(value) {
|
|
81
95
|
this._appearance = value;
|
|
82
96
|
}
|
|
@@ -141,10 +155,17 @@ export class MatDateTime {
|
|
|
141
155
|
datePicker;
|
|
142
156
|
timePicker;
|
|
143
157
|
_matInputs;
|
|
144
|
-
|
|
158
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
159
|
+
focused = new EventEmitter();
|
|
160
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
|
161
|
+
blurred = new EventEmitter();
|
|
162
|
+
keydownEscape = new EventEmitter();
|
|
163
|
+
keyupEnter = new EventEmitter();
|
|
164
|
+
constructor(dateAdapter, translate, formBuilder, renderer, cd, formGroupDir, defaultOptions) {
|
|
145
165
|
this.dateAdapter = dateAdapter;
|
|
146
166
|
this.translate = translate;
|
|
147
167
|
this.formBuilder = formBuilder;
|
|
168
|
+
this.renderer = renderer;
|
|
148
169
|
this.cd = cd;
|
|
149
170
|
this.formGroupDir = formGroupDir;
|
|
150
171
|
this.locale = (translate.currentLang || translate.defaultLang).substring(0, 2);
|
|
@@ -179,6 +200,7 @@ export class MatDateTime {
|
|
|
179
200
|
ngOnDestroy() {
|
|
180
201
|
this._subscription.unsubscribe();
|
|
181
202
|
this._controlSubscription?.unsubscribe();
|
|
203
|
+
this.blurred.complete();
|
|
182
204
|
}
|
|
183
205
|
writeValue(value) {
|
|
184
206
|
if (this._writing)
|
|
@@ -251,16 +273,47 @@ export class MatDateTime {
|
|
|
251
273
|
}
|
|
252
274
|
}
|
|
253
275
|
}
|
|
254
|
-
openTimePicker(event) {
|
|
255
|
-
if (!
|
|
276
|
+
openTimePicker(event, timePicker = this.timePicker) {
|
|
277
|
+
if (!timePicker || this.disabled)
|
|
256
278
|
return; // Skip
|
|
257
279
|
this._preventEvent(event);
|
|
258
|
-
|
|
280
|
+
timePicker.open();
|
|
281
|
+
setTimeout(() => {
|
|
282
|
+
this.fixTimePickerPosition();
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
fixTimePickerPosition() {
|
|
286
|
+
const overlayPane = document.querySelector('.cdk-overlay-pane:has(ngx-mat-timepicker-provider)');
|
|
287
|
+
if (!overlayPane)
|
|
288
|
+
return;
|
|
289
|
+
const rect = overlayPane.getBoundingClientRect();
|
|
290
|
+
const viewportWidth = window.innerWidth;
|
|
291
|
+
const viewportHeight = window.innerHeight;
|
|
292
|
+
let deltaX = 0;
|
|
293
|
+
let deltaY = 0;
|
|
294
|
+
// Corrections basées sur la position dans le viewport
|
|
295
|
+
if (rect.right > viewportWidth) {
|
|
296
|
+
deltaX = viewportWidth - rect.right;
|
|
297
|
+
}
|
|
298
|
+
else if (rect.left < 0) {
|
|
299
|
+
deltaX = -rect.left;
|
|
300
|
+
}
|
|
301
|
+
if (rect.bottom > viewportHeight) {
|
|
302
|
+
deltaY = viewportHeight - rect.bottom;
|
|
303
|
+
}
|
|
304
|
+
else if (rect.top < 0) {
|
|
305
|
+
deltaY = -rect.top;
|
|
306
|
+
}
|
|
307
|
+
if (deltaX !== 0 || deltaY !== 0) {
|
|
308
|
+
const pickerElement = overlayPane.firstElementChild;
|
|
309
|
+
this.renderer.setStyle(pickerElement ?? overlayPane, 'transform', `translate(${deltaX}px, ${deltaY}px)`);
|
|
310
|
+
}
|
|
259
311
|
}
|
|
260
312
|
focus() {
|
|
261
313
|
const matInput = this._matInputs.first;
|
|
262
314
|
if (!matInput)
|
|
263
315
|
return;
|
|
316
|
+
// Need a delay to prevent early focus event, just after a blur event
|
|
264
317
|
setTimeout(() => {
|
|
265
318
|
if (isFocusableElement(matInput.nativeElement)) {
|
|
266
319
|
matInput.nativeElement.focus();
|
|
@@ -381,7 +434,7 @@ export class MatDateTime {
|
|
|
381
434
|
}
|
|
382
435
|
this._writing = false;
|
|
383
436
|
}
|
|
384
|
-
|
|
437
|
+
_onTimePickerChanged(timeStr) {
|
|
385
438
|
// Update the time control, if need
|
|
386
439
|
if (this.timeControl.value !== timeStr) {
|
|
387
440
|
// DEBUG
|
|
@@ -404,7 +457,67 @@ export class MatDateTime {
|
|
|
404
457
|
// Open the picker
|
|
405
458
|
this.openTimePicker(event);
|
|
406
459
|
}
|
|
407
|
-
|
|
460
|
+
filterInputTextFocusEvent(event) {
|
|
461
|
+
if (!event || event.defaultPrevented) {
|
|
462
|
+
if (this.debug)
|
|
463
|
+
console.debug(this.logPrefix + ' calling filterInputTextFocusEvent - event.defaultPrevented');
|
|
464
|
+
return false;
|
|
465
|
+
}
|
|
466
|
+
if (this.debug)
|
|
467
|
+
console.debug(this.logPrefix + ' calling filterInputTextFocusEvent', event.relatedTarget);
|
|
468
|
+
// Ignore event from internal component
|
|
469
|
+
if (event.relatedTarget instanceof HTMLElement && event.relatedTarget.tagName === 'MAT-OPTION' /*TODO*/) {
|
|
470
|
+
event.preventDefault();
|
|
471
|
+
if (event.stopPropagation)
|
|
472
|
+
event.stopPropagation();
|
|
473
|
+
event.returnValue = false;
|
|
474
|
+
// DEBUG
|
|
475
|
+
//if (this.debug) console.debug(this.logPrefix + ' Cancelling focus event');
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
478
|
+
// Already focused
|
|
479
|
+
if (this._focused)
|
|
480
|
+
return false;
|
|
481
|
+
this._focused = true;
|
|
482
|
+
// DEBUG
|
|
483
|
+
if (this.debug)
|
|
484
|
+
console.debug(this.logPrefix + ' Emit focus event');
|
|
485
|
+
// Need a delay to prevent early focus event, just after a blur event
|
|
486
|
+
setTimeout(() => {
|
|
487
|
+
if (!this._focused)
|
|
488
|
+
return; // Skip if blur event received
|
|
489
|
+
this.focused.emit(event);
|
|
490
|
+
}, 10);
|
|
491
|
+
return true;
|
|
492
|
+
}
|
|
493
|
+
filterInputTextBlurEvent(event) {
|
|
494
|
+
if (!event || event.defaultPrevented)
|
|
495
|
+
return;
|
|
496
|
+
// DEBUG
|
|
497
|
+
//if (this.debug) console.debug(this.logPrefix + ' filterInputTextBlurEvent', event);
|
|
498
|
+
console.debug(this.logPrefix + ' filterInputTextBlurEvent', event);
|
|
499
|
+
// Ignore event from internal components
|
|
500
|
+
if (event.relatedTarget instanceof HTMLElement && event.relatedTarget.tagName === 'MAT-OPTION' /*TODO*/) {
|
|
501
|
+
event.preventDefault();
|
|
502
|
+
if (event.stopPropagation)
|
|
503
|
+
event.stopPropagation();
|
|
504
|
+
event.returnValue = false;
|
|
505
|
+
// DEBUG
|
|
506
|
+
//if (this.debug) console.debug(this.logPrefix + " Cancelling blur event");
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
// Already blurred: skip
|
|
510
|
+
if (!this._focused)
|
|
511
|
+
return;
|
|
512
|
+
this._focused = false;
|
|
513
|
+
// Need a delay to prevent early blur event without triggering formChange event
|
|
514
|
+
setTimeout(() => {
|
|
515
|
+
if (this._focused)
|
|
516
|
+
return; // Skip if focus again
|
|
517
|
+
this._onBlur(event);
|
|
518
|
+
}, 100);
|
|
519
|
+
}
|
|
520
|
+
_onBlur(event) {
|
|
408
521
|
if (this.dateControl.touched || this.timeControl.touched) {
|
|
409
522
|
const dateStr = this.dateControl.value;
|
|
410
523
|
// Auto fill data time/in case of partial input
|
|
@@ -440,6 +553,8 @@ export class MatDateTime {
|
|
|
440
553
|
}
|
|
441
554
|
// Check if touched
|
|
442
555
|
this._checkIfTouched();
|
|
556
|
+
// Emit blur event
|
|
557
|
+
this.blurred.emit(event);
|
|
443
558
|
}
|
|
444
559
|
_checkIfTouched() {
|
|
445
560
|
if (this.dateControl.touched || this.timeControl.touched) {
|
|
@@ -459,7 +574,13 @@ export class MatDateTime {
|
|
|
459
574
|
/* -- private method -- */
|
|
460
575
|
updateTranslations(translations) {
|
|
461
576
|
this.datePattern = translations['COMMON.DATE_PATTERN'] !== 'COMMON.DATE_PATTERN' ? translations['COMMON.DATE_PATTERN'] : 'DD/MM/YYYY';
|
|
462
|
-
this.timePattern =
|
|
577
|
+
this.timePattern = this.timeHoursOnly
|
|
578
|
+
? translations['COMMON.HOUR_PATTERN'] !== 'COMMON.HOUR_PATTERN'
|
|
579
|
+
? translations['COMMON.HOUR_PATTERN']
|
|
580
|
+
: 'HH:00'
|
|
581
|
+
: translations['COMMON.TIME_PATTERN'] !== 'COMMON.TIME_PATTERN'
|
|
582
|
+
? translations['COMMON.TIME_PATTERN']
|
|
583
|
+
: 'HH:MM';
|
|
463
584
|
const displayPattern = translations['COMMON.DATE_TIME_PATTERN'] !== 'COMMON.DATE_TIME_PATTERN' ? translations['COMMON.DATE_TIME_PATTERN'] : 'L LT';
|
|
464
585
|
this.updateDisplayPattern(displayPattern);
|
|
465
586
|
const datePlaceholder = translations['COMMON.DATE_PLACEHOLDER'] !== 'COMMON.DATE_PLACEHOLDER'
|
|
@@ -510,6 +631,7 @@ export class MatDateTime {
|
|
|
510
631
|
this.timePlaceholder = timePlaceholder;
|
|
511
632
|
const timeOptions = maskitoTimeOptionsGenerator({
|
|
512
633
|
mode: this.timePattern.toUpperCase(),
|
|
634
|
+
step: 1,
|
|
513
635
|
});
|
|
514
636
|
const { plugins, // plugins keeps caret inside actual value and remove placeholder on blur
|
|
515
637
|
...placeholderOptions
|
|
@@ -632,18 +754,20 @@ export class MatDateTime {
|
|
|
632
754
|
markForCheck() {
|
|
633
755
|
this.cd.markForCheck();
|
|
634
756
|
}
|
|
635
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MatDateTime, deps: [{ token: i1.MomentDateAdapter }, { token: i2.TranslateService }, { token: i3.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
|
|
636
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MatDateTime, selector: "mat-date-time-field", inputs: { placeholder: "placeholder", floatLabel: "floatLabel", mobile: ["mobile", "mobile", booleanAttribute], compact: ["compact", "compact", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], startDate: "startDate", datePickerFilter: "datePickerFilter", allowNoTime: ["allowNoTime", "allowNoTime", booleanAttribute], appearance: "appearance", subscriptSizing: "subscriptSizing", formControl: "formControl", formControlName: "formControlName", required: "required", readonly: "readonly", tabindex: "tabindex" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "timePicker", first: true, predicate: ["timePicker"], descendants: true }, { propertyName: "_matInputs", predicate: ["matInput"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"_formControl\" />\n <ion-text>{{ _formControl.value | dateFormat: { pattern: displayPattern } }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"_formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable + time -->\n <ion-grid class=\"ion-no-padding {{ appearance }}\">\n <ion-row class=\"ion-no-padding no-wrap\">\n <!-- day -->\n <ion-col class=\"day ion-no-padding\" [style.--button-count]=\"clearable ? 2 : 1\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"_formControl.touched && (dateControl.invalid || _formControl.invalid)\"\n (click)=\"_openDatePickerIfMobile($event, datePicker)\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <!-- Mobile -->\n @if (mobile) {\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"dateControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n hidden\n type=\"text\"\n readonly\n [formControl]=\"_formControl\"\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n />\n } @else {\n <!-- Desktop -->\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-input-element\"\n [maskito]=\"maskitoDateOptions\"\n [formControl]=\"dateControl\"\n [placeholder]=\"datePlaceholder | translate\"\n (blur)=\"_onBlur()\"\n (keyup.arrowDown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"_formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <button\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"_formControl.disabled\"\n >\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"_formControl.disabled || !_formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n <!-- The date picker -->\n <mat-datepicker #datePicker [touchUi]=\"mobile\" [disabled]=\"disabled\" [startAt]=\"startDate\">\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <!-- Cancel button -->\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <!-- Apply button -->\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label>{{ timeControl.value || ('COMMON.TIME' | translate) }}</ion-label>\n <ion-icon slot=\"end\" name=\"chevron-forward\"></ion-icon>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n </ion-col>\n\n <!-- hour -->\n <ion-col class=\"hour ion-no-padding\" [style.--button-count]=\"compact ? 0 : 1\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"_formControl.touched && (timeControl.invalid || _formControl.invalid)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label translate>COMMON.TIME</mat-label>\n }\n\n @if (mobile) {\n <input\n #matInput\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"timeControl\"\n [required]=\"requiredTime\"\n (click)=\"openTimePicker($event)\"\n readonly\n />\n\n <!-- Hide the final (hidden) input -->\n <input\n matInput\n hidden\n type=\"text\"\n readonly\n [formControl]=\"timeControl\"\n [required]=\"required\"\n [ngxMatTimepicker]=\"timePicker\"\n [format]=\"24\"\n />\n } @else {\n <input\n matInput\n #matInput\n type=\"text\"\n [formControl]=\"timeControl\"\n [maskito]=\"maskitoTimeOptions\"\n class=\"mat-input-element\"\n autocomplete=\"off\"\n [placeholder]=\"timePlaceholder | translate\"\n [required]=\"requiredTime\"\n (keyup.arrowDown)=\"openTimePicker($event)\"\n (keyup.escape)=\"_preventEvent($event)\"\n (blur)=\"_onBlur()\"\n [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n />\n <!-- Hide the final (hidden) input -->\n <input\n hidden\n type=\"text\"\n readonly\n [formControl]=\"timeControl\"\n [required]=\"requiredTime\"\n [ngxMatTimepicker]=\"timePicker\"\n [format]=\"24\"\n />\n }\n\n @if (!compact) {\n <button\n matSuffix\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n [disabled]=\"_formControl.disabled\"\n (click)=\"openTimePicker($event)\"\n >\n <mat-icon>{{ !compact && mobile ? 'access_time' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n }\n <ngx-mat-timepicker\n #timePicker\n (timeSet)=\"_onTimePickerChange($event)\"\n [isEsc]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"!mobile\"\n color=\"accent\"\n ></ngx-mat-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Do the same as MatFormField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (_formControl.touched && _formControl.errors; as errors) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('validDate') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n }\n @case ('dateIsAfter') {\n <mat-error>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: _formControl.errors.dateIsAfter }}\n </mat-error>\n }\n @case ('dateIsBefore') {\n <mat-error>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: _formControl.errors.dateIsBefore }}\n </mat-error>\n }\n @case ('dateRange') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n }\n @case ('dateMaxDuration') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n }\n @case ('dateMinDuration') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n }\n @case ('msg') {\n <mat-error>\n {{\n _formControl.errors.msg?.key || _formControl.errors.msg | translate: _formControl.errors.msg?.params\n }}\n </mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n }\n </div>\n}\n\n<!-- cancel button -->\n<ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n</ng-template>\n\n<!-- confirm button -->\n<ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding: 0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}ion-row.no-wrap{flex-wrap:nowrap}ion-grid ion-col{--button-width: calc(var(--button-count, 0px) * 24px)}ion-grid.fill ion-col.day{--min-width: calc(100px + var(--button-width, 0px));min-width:var(--min-width)}ion-grid.fill ion-col.hour{--min-width: calc(55px + var(--button-width, 0px));--max-width: calc(65px + var(--button-width, 0px));min-width:var(--min-width);max-width:var(--max-width)}ion-grid.fill ion-col.hour mat-form-field{width:100%}ion-grid.fill ion-col.hour mat-form-field mat-label,ion-grid.fill ion-col.hour mat-form-field input[type=text]{text-align:left;min-width:52px}ion-grid.outline ion-col.day{min-width:calc(110px + var(--button-width))}ion-grid.outline ion-col.hour{--min-width: calc(65px + var(--button-width));--max-width: calc(75px + var(--button-width))}mat-form-field.mat-form-field-disabled ion-col.day{min-width:150px}.hour mat-form-field.mat-mdc-form-field-should-float .mat-mdc-form-field-placeholder{max-width:inherit}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i5.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonRow, selector: "ion-row" }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { kind: "directive", type: i10.MatDatepickerCancel, selector: "[matDatepickerCancel], [matDateRangePickerCancel]" }, { kind: "directive", type: i10.MatDatepickerApply, selector: "[matDatepickerApply], [matDateRangePickerApply]" }, { kind: "directive", type: i11.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i13.NgxMatTimepickerComponent, selector: "ngx-mat-timepicker", inputs: ["appendToInput", "color", "dottedMinutesInGap", "enableKeyboardInput", "format", "minutesGap", "cancelBtnTmpl", "confirmBtnTmpl", "defaultTime", "disableAnimation", "editableHintTmpl", "hoursOnly", "isEsc", "max", "min", "preventOverlayClick", "timepickerClass"], outputs: ["closed", "hourSelected", "opened", "timeChanged", "timeSet"] }, { kind: "directive", type: i13.NgxMatTimepickerDirective, selector: "[ngxMatTimepicker]", inputs: ["format", "max", "min", "ngxMatTimepicker", "value", "disableClick", "disabled"] }, { kind: "pipe", type: i14.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i15.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i16.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i17.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
757
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MatDateTime, deps: [{ token: i1.MomentDateAdapter }, { token: i2.TranslateService }, { token: i3.UntypedFormBuilder }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i3.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
|
|
758
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MatDateTime, selector: "mat-date-time-field", inputs: { logPrefix: "logPrefix", placeholder: "placeholder", floatLabel: "floatLabel", mobile: ["mobile", "mobile", booleanAttribute], compact: ["compact", "compact", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], startDate: "startDate", datePickerFilter: "datePickerFilter", allowNoTime: ["allowNoTime", "allowNoTime", booleanAttribute], dottedMinutesInGap: ["dottedMinutesInGap", "dottedMinutesInGap", booleanAttribute], timeHoursOnly: ["timeHoursOnly", "timeHoursOnly", booleanAttribute], debug: ["debug", "debug", booleanAttribute], appearance: "appearance", subscriptSizing: "subscriptSizing", formControl: "formControl", formControlName: "formControlName", required: "required", readonly: "readonly", tabindex: "tabindex" }, outputs: { focused: "focus", blurred: "blur", keydownEscape: "keydown.escape", keyupEnter: "keyup.enter" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "timePicker", first: true, predicate: ["timePicker"], descendants: true }, { propertyName: "_matInputs", predicate: ["matInput"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"_formControl\" />\n <ion-text>{{ _formControl.value | dateFormat: { pattern: displayPattern } }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"_formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable + time -->\n <ion-grid class=\"ion-no-padding {{ appearance }}\">\n <ion-row class=\"ion-no-padding no-wrap\">\n <!-- Day -->\n <ion-col class=\"day ion-no-padding\" [style.--button-count]=\"clearable ? 2 : 1\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"_formControl.touched && (dateControl.invalid || _formControl.invalid)\"\n (click)=\"_openDatePickerIfMobile($event, datePicker)\"\n (focus)=\"_openDatePickerIfMobile($event, datePicker)\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <!-- Day input (mobile) -->\n @if (mobile) {\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"dateControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n hidden\n type=\"text\"\n readonly\n [formControl]=\"_formControl\"\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n />\n } @else {\n <!-- Day input (desktop) -->\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-input-element\"\n [maskito]=\"maskitoDateOptions\"\n [formControl]=\"dateControl\"\n [placeholder]=\"datePlaceholder | translate\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"_formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <button\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"_formControl.disabled\"\n >\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"_formControl.disabled || !_formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n <!-- The date picker -->\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\" [disabled]=\"disabled\"\n [startAt]=\"startDate\"\n [xPosition]=\"!mobile ? 'end' : undefined\">\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <!-- Cancel button -->\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <!-- Apply button -->\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label>{{ timeControl.value || ('COMMON.TIME' | translate) }}</ion-label>\n <ion-icon slot=\"end\" name=\"chevron-forward\"></ion-icon>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n </ion-col>\n\n <!-- Hour -->\n <ion-col class=\"hour ion-no-padding\" [style.--button-count]=\"compact ? 0 : 1\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"_formControl.touched && (timeControl.invalid || _formControl.invalid)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label translate>COMMON.TIME</mat-label>\n }\n\n <!-- Hour input (mobile) -->\n @if (mobile) {\n <input\n #matInput\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"timeControl\"\n [required]=\"requiredTime\"\n (click)=\"openTimePicker($event)\"\n readonly\n />\n\n <!-- Hide the final (hidden) input -->\n <input\n matInput\n hidden\n type=\"text\"\n readonly\n [formControl]=\"timeControl\"\n [required]=\"required\"\n [ngxMatTimepicker]=\"timePicker\"\n [format]=\"24\"\n />\n } @else {\n <!-- Hour input (desktop) -->\n <input\n matInput\n #matInput\n type=\"text\"\n [formControl]=\"timeControl\"\n [maskito]=\"maskitoTimeOptions\"\n class=\"mat-input-element\"\n autocomplete=\"off\"\n [placeholder]=\"timePlaceholder | translate\"\n [required]=\"requiredTime\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"openTimePicker($event)\"\n (keyup.escape)=\"_preventEvent($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n />\n <!-- Hide the final (hidden) input -->\n <input\n hidden\n type=\"text\"\n readonly\n [formControl]=\"timeControl\"\n [required]=\"requiredTime\"\n [ngxMatTimepicker]=\"timePicker\"\n [format]=\"24\"\n />\n }\n\n @if (!compact) {\n <button\n matSuffix\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n [disabled]=\"_formControl.disabled\"\n (click)=\"openTimePicker($event)\"\n >\n <mat-icon>{{ !compact && mobile ? 'access_time' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n }\n <ngx-mat-timepicker\n #timePicker\n [isEsc]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"!mobile\"\n [dottedMinutesInGap]=\"dottedMinutesInGap\"\n [hoursOnly]=\"timeHoursOnly\"\n [appendToInput]=\"!mobile\"\n (timeSet)=\"_onTimePickerChanged($event)\"\n color=\"accent\"\n ></ngx-mat-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Do the same as MatFormField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (_formControl.touched && _formControl.errors; as errors) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('validDate') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n }\n @case ('dateIsAfter') {\n <mat-error>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: _formControl.errors.dateIsAfter }}\n </mat-error>\n }\n @case ('dateIsBefore') {\n <mat-error>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: _formControl.errors.dateIsBefore }}\n </mat-error>\n }\n @case ('dateRange') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n }\n @case ('dateMaxDuration') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n }\n @case ('dateMinDuration') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n }\n @case ('msg') {\n <mat-error>\n {{\n _formControl.errors.msg?.key || _formControl.errors.msg | translate: _formControl.errors.msg?.params\n }}\n </mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n }\n </div>\n}\n\n<!-- cancel button -->\n<ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n</ng-template>\n\n<!-- confirm button -->\n<ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding: 0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}ion-row.no-wrap{flex-wrap:nowrap}ion-grid ion-col{--button-width: calc(var(--button-count, 0px) * 24px)}ion-grid.fill ion-col.day{--min-width: calc(100px + var(--button-width, 0px));min-width:var(--min-width)}ion-grid.fill ion-col.hour{--min-width: calc(55px + var(--button-width, 0px));--max-width: calc(65px + var(--button-width, 0px));min-width:var(--min-width);max-width:var(--max-width)}ion-grid.fill ion-col.hour mat-form-field{width:100%}ion-grid.fill ion-col.hour mat-form-field mat-label,ion-grid.fill ion-col.hour mat-form-field input[type=text]{text-align:left;min-width:52px}ion-grid.outline ion-col.day{min-width:calc(110px + var(--button-width))}ion-grid.outline ion-col.hour{--min-width: calc(65px + var(--button-width));--max-width: calc(75px + var(--button-width))}mat-form-field.mat-form-field-disabled ion-col.day{min-width:150px}.hour mat-form-field.mat-mdc-form-field-should-float .mat-mdc-form-field-placeholder{max-width:inherit}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i5.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonRow, selector: "ion-row" }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { kind: "directive", type: i10.MatDatepickerCancel, selector: "[matDatepickerCancel], [matDateRangePickerCancel]" }, { kind: "directive", type: i10.MatDatepickerApply, selector: "[matDatepickerApply], [matDateRangePickerApply]" }, { kind: "directive", type: i11.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i13.NgxMatTimepickerComponent, selector: "ngx-mat-timepicker", inputs: ["appendToInput", "color", "dottedMinutesInGap", "enableKeyboardInput", "format", "minutesGap", "cancelBtnTmpl", "confirmBtnTmpl", "defaultTime", "disableAnimation", "editableHintTmpl", "hoursOnly", "isEsc", "max", "min", "preventOverlayClick", "timepickerClass"], outputs: ["closed", "hourSelected", "opened", "timeChanged", "timeSet"] }, { kind: "directive", type: i13.NgxMatTimepickerDirective, selector: "[ngxMatTimepicker]", inputs: ["format", "max", "min", "ngxMatTimepicker", "value", "disableClick", "disabled"] }, { kind: "pipe", type: i14.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i15.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i16.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i17.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
637
759
|
}
|
|
638
760
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MatDateTime, decorators: [{
|
|
639
761
|
type: Component,
|
|
640
|
-
args: [{ selector: 'mat-date-time-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"_formControl\" />\n <ion-text>{{ _formControl.value | dateFormat: { pattern: displayPattern } }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"_formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable + time -->\n <ion-grid class=\"ion-no-padding {{ appearance }}\">\n <ion-row class=\"ion-no-padding no-wrap\">\n <!-- day -->\n <ion-col class=\"day ion-no-padding\" [style.--button-count]=\"clearable ? 2 : 1\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"_formControl.touched && (dateControl.invalid || _formControl.invalid)\"\n (click)=\"_openDatePickerIfMobile($event, datePicker)\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <!-- Mobile -->\n @if (mobile) {\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"dateControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n hidden\n type=\"text\"\n readonly\n [formControl]=\"_formControl\"\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n />\n } @else {\n <!-- Desktop -->\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-input-element\"\n [maskito]=\"maskitoDateOptions\"\n [formControl]=\"dateControl\"\n [placeholder]=\"datePlaceholder | translate\"\n (blur)=\"_onBlur()\"\n (keyup.arrowDown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"_formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <button\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"_formControl.disabled\"\n >\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"_formControl.disabled || !_formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n <!-- The date picker -->\n <mat-datepicker #datePicker [touchUi]=\"mobile\" [disabled]=\"disabled\" [startAt]=\"startDate\">\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <!-- Cancel button -->\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <!-- Apply button -->\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label>{{ timeControl.value || ('COMMON.TIME' | translate) }}</ion-label>\n <ion-icon slot=\"end\" name=\"chevron-forward\"></ion-icon>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n </ion-col>\n\n <!-- hour -->\n <ion-col class=\"hour ion-no-padding\" [style.--button-count]=\"compact ? 0 : 1\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"_formControl.touched && (timeControl.invalid || _formControl.invalid)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label translate>COMMON.TIME</mat-label>\n }\n\n @if (mobile) {\n <input\n #matInput\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"timeControl\"\n [required]=\"requiredTime\"\n (click)=\"openTimePicker($event)\"\n readonly\n />\n\n <!-- Hide the final (hidden) input -->\n <input\n matInput\n hidden\n type=\"text\"\n readonly\n [formControl]=\"timeControl\"\n [required]=\"required\"\n [ngxMatTimepicker]=\"timePicker\"\n [format]=\"24\"\n />\n } @else {\n <input\n matInput\n #matInput\n type=\"text\"\n [formControl]=\"timeControl\"\n [maskito]=\"maskitoTimeOptions\"\n class=\"mat-input-element\"\n autocomplete=\"off\"\n [placeholder]=\"timePlaceholder | translate\"\n [required]=\"requiredTime\"\n (keyup.arrowDown)=\"openTimePicker($event)\"\n (keyup.escape)=\"_preventEvent($event)\"\n (blur)=\"_onBlur()\"\n [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n />\n <!-- Hide the final (hidden) input -->\n <input\n hidden\n type=\"text\"\n readonly\n [formControl]=\"timeControl\"\n [required]=\"requiredTime\"\n [ngxMatTimepicker]=\"timePicker\"\n [format]=\"24\"\n />\n }\n\n @if (!compact) {\n <button\n matSuffix\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n [disabled]=\"_formControl.disabled\"\n (click)=\"openTimePicker($event)\"\n >\n <mat-icon>{{ !compact && mobile ? 'access_time' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n }\n <ngx-mat-timepicker\n #timePicker\n (timeSet)=\"_onTimePickerChange($event)\"\n [isEsc]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"!mobile\"\n color=\"accent\"\n ></ngx-mat-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Do the same as MatFormField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (_formControl.touched && _formControl.errors; as errors) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('validDate') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n }\n @case ('dateIsAfter') {\n <mat-error>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: _formControl.errors.dateIsAfter }}\n </mat-error>\n }\n @case ('dateIsBefore') {\n <mat-error>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: _formControl.errors.dateIsBefore }}\n </mat-error>\n }\n @case ('dateRange') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n }\n @case ('dateMaxDuration') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n }\n @case ('dateMinDuration') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n }\n @case ('msg') {\n <mat-error>\n {{\n _formControl.errors.msg?.key || _formControl.errors.msg | translate: _formControl.errors.msg?.params\n }}\n </mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n }\n </div>\n}\n\n<!-- cancel button -->\n<ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n</ng-template>\n\n<!-- confirm button -->\n<ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding: 0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}ion-row.no-wrap{flex-wrap:nowrap}ion-grid ion-col{--button-width: calc(var(--button-count, 0px) * 24px)}ion-grid.fill ion-col.day{--min-width: calc(100px + var(--button-width, 0px));min-width:var(--min-width)}ion-grid.fill ion-col.hour{--min-width: calc(55px + var(--button-width, 0px));--max-width: calc(65px + var(--button-width, 0px));min-width:var(--min-width);max-width:var(--max-width)}ion-grid.fill ion-col.hour mat-form-field{width:100%}ion-grid.fill ion-col.hour mat-form-field mat-label,ion-grid.fill ion-col.hour mat-form-field input[type=text]{text-align:left;min-width:52px}ion-grid.outline ion-col.day{min-width:calc(110px + var(--button-width))}ion-grid.outline ion-col.hour{--min-width: calc(65px + var(--button-width));--max-width: calc(75px + var(--button-width))}mat-form-field.mat-form-field-disabled ion-col.day{min-width:150px}.hour mat-form-field.mat-mdc-form-field-should-float .mat-mdc-form-field-placeholder{max-width:inherit}\n"] }]
|
|
641
|
-
}], ctorParameters: () => [{ type: i1.MomentDateAdapter }, { type: i2.TranslateService }, { type: i3.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i3.FormGroupDirective, decorators: [{
|
|
762
|
+
args: [{ selector: 'mat-date-time-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"_formControl\" />\n <ion-text>{{ _formControl.value | dateFormat: { pattern: displayPattern } }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"_formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable + time -->\n <ion-grid class=\"ion-no-padding {{ appearance }}\">\n <ion-row class=\"ion-no-padding no-wrap\">\n <!-- Day -->\n <ion-col class=\"day ion-no-padding\" [style.--button-count]=\"clearable ? 2 : 1\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"_formControl.touched && (dateControl.invalid || _formControl.invalid)\"\n (click)=\"_openDatePickerIfMobile($event, datePicker)\"\n (focus)=\"_openDatePickerIfMobile($event, datePicker)\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <!-- Day input (mobile) -->\n @if (mobile) {\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"dateControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n hidden\n type=\"text\"\n readonly\n [formControl]=\"_formControl\"\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n />\n } @else {\n <!-- Day input (desktop) -->\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-input-element\"\n [maskito]=\"maskitoDateOptions\"\n [formControl]=\"dateControl\"\n [placeholder]=\"datePlaceholder | translate\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"_formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <button\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"_formControl.disabled\"\n >\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n matSuffix\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"_formControl.disabled || !_formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n <!-- The date picker -->\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\" [disabled]=\"disabled\"\n [startAt]=\"startDate\"\n [xPosition]=\"!mobile ? 'end' : undefined\">\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <!-- Cancel button -->\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <!-- Apply button -->\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label>{{ timeControl.value || ('COMMON.TIME' | translate) }}</ion-label>\n <ion-icon slot=\"end\" name=\"chevron-forward\"></ion-icon>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n </ion-col>\n\n <!-- Hour -->\n <ion-col class=\"hour ion-no-padding\" [style.--button-count]=\"compact ? 0 : 1\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"_formControl.touched && (timeControl.invalid || _formControl.invalid)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label translate>COMMON.TIME</mat-label>\n }\n\n <!-- Hour input (mobile) -->\n @if (mobile) {\n <input\n #matInput\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"timeControl\"\n [required]=\"requiredTime\"\n (click)=\"openTimePicker($event)\"\n readonly\n />\n\n <!-- Hide the final (hidden) input -->\n <input\n matInput\n hidden\n type=\"text\"\n readonly\n [formControl]=\"timeControl\"\n [required]=\"required\"\n [ngxMatTimepicker]=\"timePicker\"\n [format]=\"24\"\n />\n } @else {\n <!-- Hour input (desktop) -->\n <input\n matInput\n #matInput\n type=\"text\"\n [formControl]=\"timeControl\"\n [maskito]=\"maskitoTimeOptions\"\n class=\"mat-input-element\"\n autocomplete=\"off\"\n [placeholder]=\"timePlaceholder | translate\"\n [required]=\"requiredTime\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowDown)=\"openTimePicker($event)\"\n (keyup.escape)=\"_preventEvent($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n />\n <!-- Hide the final (hidden) input -->\n <input\n hidden\n type=\"text\"\n readonly\n [formControl]=\"timeControl\"\n [required]=\"requiredTime\"\n [ngxMatTimepicker]=\"timePicker\"\n [format]=\"24\"\n />\n }\n\n @if (!compact) {\n <button\n matSuffix\n type=\"button\"\n mat-icon-button\n tabindex=\"-1\"\n [disabled]=\"_formControl.disabled\"\n (click)=\"openTimePicker($event)\"\n >\n <mat-icon>{{ !compact && mobile ? 'access_time' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n }\n <ngx-mat-timepicker\n #timePicker\n [isEsc]=\"!mobile\"\n [defaultTime]=\"'00:00'\"\n [cancelBtnTmpl]=\"timePickerCancelButton\"\n [confirmBtnTmpl]=\"timePickerOkButton\"\n [preventOverlayClick]=\"mobile\"\n [enableKeyboardInput]=\"!mobile\"\n [dottedMinutesInGap]=\"dottedMinutesInGap\"\n [hoursOnly]=\"timeHoursOnly\"\n [appendToInput]=\"!mobile\"\n (timeSet)=\"_onTimePickerChanged($event)\"\n color=\"accent\"\n ></ngx-mat-timepicker>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Do the same as MatFormField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (_formControl.touched && _formControl.errors; as errors) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('validDate') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_TIME</mat-error>\n }\n @case ('dateIsAfter') {\n <mat-error>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: _formControl.errors.dateIsAfter }}\n </mat-error>\n }\n @case ('dateIsBefore') {\n <mat-error>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: _formControl.errors.dateIsBefore }}\n </mat-error>\n }\n @case ('dateRange') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</mat-error>\n }\n @case ('dateMaxDuration') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</mat-error>\n }\n @case ('dateMinDuration') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</mat-error>\n }\n @case ('msg') {\n <mat-error>\n {{\n _formControl.errors.msg?.key || _formControl.errors.msg | translate: _formControl.errors.msg?.params\n }}\n </mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n }\n </div>\n}\n\n<!-- cancel button -->\n<ng-template #timePickerCancelButton>\n <ion-button fill=\"clear\" color=\"dark\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n</ng-template>\n\n<!-- confirm button -->\n<ng-template #timePickerOkButton>\n <ion-button fill=\"solid\" color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative;--ion-grid-column-padding: 0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}ion-row.no-wrap{flex-wrap:nowrap}ion-grid ion-col{--button-width: calc(var(--button-count, 0px) * 24px)}ion-grid.fill ion-col.day{--min-width: calc(100px + var(--button-width, 0px));min-width:var(--min-width)}ion-grid.fill ion-col.hour{--min-width: calc(55px + var(--button-width, 0px));--max-width: calc(65px + var(--button-width, 0px));min-width:var(--min-width);max-width:var(--max-width)}ion-grid.fill ion-col.hour mat-form-field{width:100%}ion-grid.fill ion-col.hour mat-form-field mat-label,ion-grid.fill ion-col.hour mat-form-field input[type=text]{text-align:left;min-width:52px}ion-grid.outline ion-col.day{min-width:calc(110px + var(--button-width))}ion-grid.outline ion-col.hour{--min-width: calc(65px + var(--button-width));--max-width: calc(75px + var(--button-width))}mat-form-field.mat-form-field-disabled ion-col.day{min-width:150px}.hour mat-form-field.mat-mdc-form-field-should-float .mat-mdc-form-field-placeholder{max-width:inherit}\n"] }]
|
|
763
|
+
}], ctorParameters: () => [{ type: i1.MomentDateAdapter }, { type: i2.TranslateService }, { type: i3.UntypedFormBuilder }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i3.FormGroupDirective, decorators: [{
|
|
642
764
|
type: Optional
|
|
643
765
|
}] }, { type: undefined, decorators: [{
|
|
644
766
|
type: Inject,
|
|
645
767
|
args: [MAT_FORM_FIELD_DEFAULT_OPTIONS]
|
|
646
|
-
}] }], propDecorators: {
|
|
768
|
+
}] }], propDecorators: { logPrefix: [{
|
|
769
|
+
type: Input
|
|
770
|
+
}], placeholder: [{
|
|
647
771
|
type: Input
|
|
648
772
|
}], floatLabel: [{
|
|
649
773
|
type: Input
|
|
@@ -666,6 +790,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
666
790
|
}], allowNoTime: [{
|
|
667
791
|
type: Input,
|
|
668
792
|
args: [{ transform: booleanAttribute }]
|
|
793
|
+
}], dottedMinutesInGap: [{
|
|
794
|
+
type: Input,
|
|
795
|
+
args: [{ transform: booleanAttribute }]
|
|
796
|
+
}], timeHoursOnly: [{
|
|
797
|
+
type: Input,
|
|
798
|
+
args: [{ transform: booleanAttribute }]
|
|
799
|
+
}], debug: [{
|
|
800
|
+
type: Input,
|
|
801
|
+
args: [{ transform: booleanAttribute }]
|
|
669
802
|
}], appearance: [{
|
|
670
803
|
type: Input
|
|
671
804
|
}], subscriptSizing: [{
|
|
@@ -689,5 +822,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
689
822
|
}], _matInputs: [{
|
|
690
823
|
type: ViewChildren,
|
|
691
824
|
args: ['matInput']
|
|
825
|
+
}], focused: [{
|
|
826
|
+
type: Output,
|
|
827
|
+
args: ['focus']
|
|
828
|
+
}], blurred: [{
|
|
829
|
+
type: Output,
|
|
830
|
+
args: ['blur']
|
|
831
|
+
}], keydownEscape: [{
|
|
832
|
+
type: Output,
|
|
833
|
+
args: ['keydown.escape']
|
|
834
|
+
}], keyupEnter: [{
|
|
835
|
+
type: Output,
|
|
836
|
+
args: ['keyup.enter']
|
|
692
837
|
}] } });
|
|
693
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9kYXRldGltZS9tYXRlcmlhbC5kYXRldGltZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2RhdGV0aW1lL21hdGVyaWFsLmRhdGV0aW1lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFHUixTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSw4QkFBOEIsRUFBdUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuSixPQUFPLEVBQTRDLGlCQUFpQixFQUEwQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqSixPQUFPLEVBQUUsUUFBUSxFQUFVLE1BQU0sUUFBUSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFnQixXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxN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c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNrQyxXQUFXO3NCQUFsRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUdsQyxVQUFVO3NCQURiLEtBQUs7Z0JBU0YsZUFBZTtzQkFEbEIsS0FBSztnQkFRTyxXQUFXO3NCQUF2QixLQUFLO2dCQU9PLGVBQWU7c0JBQTNCLEtBQUs7Z0JBT08sUUFBUTtzQkFBcEIsS0FBSztnQkFnQk8sUUFBUTtzQkFBcEIsS0FBSztnQkFTTyxRQUFRO3NCQUFwQixLQUFLO2dCQW1CbUIsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUNFLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDRyxVQUFVO3NCQUFuQyxZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBQcm92aWRlcixcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMsIE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIE1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGlzTW9tZW50LCBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgU2hhcmVkVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7IGZpbHRlciwgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElucHV0RWxlbWVudCwgc2V0VGFiSW5kZXggfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHsgaXNGb2N1c2FibGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vZm9jdXNhYmxlJztcbmltcG9ydCB7IG1lcmdlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGVGaWx0ZXJGbiwgTWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IGlzQmxhbmtTdHJpbmcsIGlzTmlsLCBpc05vdE5pbCwgaXNOb3ROaWxCb29sZWFuLCBpc05vdE5pbE9yQmxhbmssIG51bGxJZk5pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRGF0ZVV0aWxzLCBmcm9tRGF0ZUlTT1N0cmluZywgdG9EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vZGF0ZXMnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHsgTW9tZW50RGF0ZUFkYXB0ZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC1tb21lbnQtYWRhcHRlcic7XG5pbXBvcnQgeyBBcHBGbG9hdExhYmVsVHlwZSB9IGZyb20gJy4uLy4uL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgTWFza2l0b09wdGlvbnMgfSBmcm9tICdAbWFza2l0by9jb3JlJztcbmltcG9ydCB7IE1hc2tpdG9EYXRlTW9kZSwgbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yLCBNYXNraXRvVGltZU1vZGUsIG1hc2tpdG9UaW1lT3B0aW9uc0dlbmVyYXRvciwgbWFza2l0b1dpdGhQbGFjZWhvbGRlciB9IGZyb20gJ0BtYXNraXRvL2tpdCc7XG5pbXBvcnQgeyBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX0FQUEVBUkFOQ0UsIE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfU1VCU0NSSVBUX1NJWklORyB9IGZyb20gJy4uL21hdGVyaWFsLmNvbmZpZyc7XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0RGF0ZVRpbWUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmNvbnN0IEkxOE5fS0VZUyA9IFsnQ09NTU9OLkRBVEVfUEFUVEVSTicsICdDT01NT04uVElNRV9QQVRURVJOJywgJ0NPTU1PTi5EQVRFX1RJTUVfUEFUVEVSTicsICdDT01NT04uREFURV9QTEFDRUhPTERFUicsICdDT01NT04uVElNRV9QTEFDRUhPTERFUiddO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmRlY2xhcmUgaW50ZXJmYWNlIE5neFRpbWVQaWNrZXIge1xuICBvcGVuKCk7XG4gIGNsb3NlKCk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1kYXRlLXRpbWUtZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWwuZGF0ZXRpbWUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmRhdGV0aW1lLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbREVGQVVMVF9WQUxVRV9BQ0NFU1NPUl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNYXREYXRlVGltZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgSW5wdXRFbGVtZW50IHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9jb250cm9sU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX3dyaXRpbmcgPSB0cnVlO1xuICBwcml2YXRlIF9kaXNhYmxpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdGFiaW5kZXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVhZG9ubHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29udHJvbE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2FwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcblxuICBwcm90ZWN0ZWQgX2Zvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHByb3RlY3RlZCBkYXRlQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwcm90ZWN0ZWQgdGltZUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHJvdGVjdGVkIGRpc3BsYXlQYXR0ZXJuOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBkYXRlUGF0dGVybjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgdGltZVBhdHRlcm46IHN0cmluZztcbiAgcHJvdGVjdGVkIGxvY2FsZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbWFza2l0b0RhdGVPcHRpb25zOiBNYXNraXRvT3B0aW9ucztcbiAgcHJvdGVjdGVkIG1hc2tpdG9UaW1lT3B0aW9uczogTWFza2l0b09wdGlvbnM7XG4gIHByb3RlY3RlZCBkYXRlUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIHRpbWVQbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEFwcEZsb2F0TGFiZWxUeXBlID0gJ2F1dG8nO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9iaWxlOiBib29sZWFuO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY29tcGFjdCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjbGVhcmFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0ZVBpY2tlckZpbHRlcjogRGF0ZUZpbHRlckZuPE1vbWVudD47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhbGxvd05vVGltZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBhcHBlYXJhbmNlKHZhbHVlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlKSB7XG4gICAgdGhpcy5fYXBwZWFyYW5jZSA9IHZhbHVlO1xuICB9XG4gIGdldCBhcHBlYXJhbmNlKCk6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2Uge1xuICAgIHJldHVybiB0aGlzLl9hcHBlYXJhbmNlIHx8IHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHN1YnNjcmlwdFNpemluZyh2YWx1ZTogU3Vic2NyaXB0U2l6aW5nKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0U2l6aW5nID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHN1YnNjcmlwdFNpemluZygpOiBTdWJzY3JpcHRTaXppbmcge1xuICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRTaXppbmcgfHwgdGhpcy5fZGVmYXVsdFN1YnNjcmlwdFNpemluZztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmb3JtQ29udHJvbCh2YWx1ZTogVW50eXBlZEZvcm1Db250cm9sKSB7XG4gICAgdGhpcy5fc2V0Rm9ybUNvbnRyb2wodmFsdWUpO1xuICB9XG4gIGdldCBmb3JtQ29udHJvbCgpOiBVbnR5cGVkRm9ybUNvbnRyb2wge1xuICAgIHJldHVybiB0aGlzLl9mb3JtQ29udHJvbDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmb3JtQ29udHJvbE5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NldEZvcm1Db250cm9sTmFtZSh2YWx1ZSk7XG4gIH1cbiAgZ2V0IGZvcm1Db250cm9sTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb250cm9sTmFtZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbiB8IGFueSkge1xuICAgIGlmICh0aGlzLl9yZXF1aXJlZCA9PT0gdmFsdWUpIHJldHVybjsgLy8gU0tpcFxuXG4gICAgdGhpcy5fcmVxdWlyZWQgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5fZm9ybUNvbnRyb2wpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzKHRoaXMuX2Zvcm1Db250cm9sLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBnZXQgcmVxdWlyZWRUaW1lKCk6IGJvb2xlYW4gfCBhbnkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZCAmJiAhdGhpcy5hbGxvd05vVGltZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFiaW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLl90YWJpbmRleCAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3RhYmluZGV4ID0gdmFsdWU7XG4gICAgICBpZiAoIXRoaXMuX3dyaXRpbmcpIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdGFiaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiaW5kZXg7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29udHJvbC5kaXNhYmxlZDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ2RhdGVQaWNrZXInKSBkYXRlUGlja2VyOiBNYXREYXRlcGlja2VyPE1vbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RpbWVQaWNrZXInKSB0aW1lUGlja2VyOiBOZ3hUaW1lUGlja2VyO1xuICBAVmlld0NoaWxkcmVuKCdtYXRJbnB1dCcpIF9tYXRJbnB1dHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUykgZGVmYXVsdE9wdGlvbnM/OiBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9uc1xuICApIHtcbiAgICB0aGlzLmxvY2FsZSA9ICh0cmFuc2xhdGUuY3VycmVudExhbmcgfHwgdHJhbnNsYXRlLmRlZmF1bHRMYW5nKS5zdWJzdHJpbmcoMCwgMik7XG4gICAgdGhpcy5fZGVmYXVsdFN1YnNjcmlwdFNpemluZyA9IGRlZmF1bHRPcHRpb25zPy5zdWJzY3JpcHRTaXppbmcgfHwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HO1xuICAgIHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlID0gZGVmYXVsdE9wdGlvbnM/LmFwcGVhcmFuY2UgfHwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9BUFBFQVJBTkNFO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuX2Zvcm1Db250cm9sIHx8ICh0aGlzLl9jb250cm9sTmFtZSAmJiAodGhpcy5mb3JtR3JvdXBEaXI/LmZvcm0uZ2V0KHRoaXMuX2NvbnRyb2xOYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wpKTtcbiAgICBpZiAoIWNvbnRyb2wpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSAnZm9ybUNvbnRyb2wnIG9yICdmb3JtQ29udHJvbE5hbWUnIGluIDxtYXQtZGF0ZS10aW1lLWZpZWxkPi5cIik7XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIHRoaXMubW9iaWxlID0gaXNOb3ROaWwodGhpcy5tb2JpbGUpID8gdGhpcy5tb2JpbGUgOiBpc01vYmlsZSh3aW5kb3cpO1xuICAgIHRoaXMuX3JlcXVpcmVkID0gaXNOb3ROaWxCb29sZWFuKHRoaXMuX3JlcXVpcmVkKSA/IHRoaXMuX3JlcXVpcmVkIDogY29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgfHwgaXNCbGFua1N0cmluZyh0aGlzLl9yZXF1aXJlZCk7XG5cbiAgICB0aGlzLl9zZXRGb3JtQ29udHJvbChjb250cm9sKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgZGF0ZSBjb250cm9sXG4gICAgdGhpcy5kYXRlQ29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgdGltZSBjb250cm9sXG4gICAgdGhpcy50aW1lQ29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcblxuICAgIC8vIEdldCBwYXR0ZXJucyB0byBkaXNwbGF5IGRhdGUgYW5kIGRhdGUrdGltZVxuICAgIHRoaXMudXBkYXRlVHJhbnNsYXRpb25zKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoSTE4Tl9LRVlTKSk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMudHJhbnNsYXRlXG4gICAgICAgIC5nZXQoSTE4Tl9LRVlTKVxuICAgICAgICAucGlwZShza2lwKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCh0cmFuc2xhdGlvbnMpID0+IHRoaXMudXBkYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9ucykpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBtZXJnZSh0aGlzLmRhdGVDb250cm9sLnZhbHVlQ2hhbmdlcywgdGhpcy50aW1lQ29udHJvbC52YWx1ZUNoYW5nZXMpLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSh0aGlzLmRhdGVDb250cm9sLnZhbHVlLCB0aGlzLnRpbWVDb250cm9sLnZhbHVlKVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgIC8vIEVuYWJsZSBhbmltYXRpb25zIG5vdy4gVGhpcyBlbnN1cmVzIHdlIGRvbid0IGFuaW1hdGUgb24gaW5pdGlhbCByZW5kZXIuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9jb250cm9sU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcFxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuXG4gICAgLy8gQ29udmVydCBpbnRvIGRhdGVcbiAgICBjb25zdCBtb21lbnQgPSBpc01vbWVudCh2YWx1ZSkgPyB2YWx1ZSA6IGZyb21EYXRlSVNPU3RyaW5nKHZhbHVlKTtcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiW21hdC1kYXRlLXRpbWVdIHdyaXRlVmFsdWUoKSB3aXRoOlwiLCB2YWx1ZSk7XG5cbiAgICBpZiAoIW1vbWVudCB8fCAhbW9tZW50LmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy5kYXRlQ29udHJvbC5wYXRjaFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMudGltZUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBtb21lbnRcbiAgICAgICAgLy8gSW1wb3J0YW50OiBjbG9uZSwgYmVjYXVzZSBzdGFydE9mKCkgd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIGRhdGVcbiAgICAgICAgLmNsb25lKClcbiAgICAgICAgLy8gUmVzZXQgdGltZVxuICAgICAgICAuc3RhcnRPZignZGF5Jyk7XG4gICAgICBjb25zdCBkYXRlU3RyID0gdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQoZGF0ZSwgdGhpcy5kYXRlUGF0dGVybik7XG5cbiAgICAgIC8vIEZvcm1hdCB0aW1lXG4gICAgICBsZXQgdGltZVN0cjogc3RyaW5nO1xuICAgICAgaWYgKERhdGVVdGlscy5pc05vVGltZShtb21lbnQpKSB7XG4gICAgICAgIC8vIENsZWFyIHRpbWVcbiAgICAgICAgdGltZVN0ciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAtIEZvcm1hdCBoaFxuICAgICAgICBsZXQgaG91cjogbnVtYmVyIHwgc3RyaW5nID0gbW9tZW50LmhvdXIoKTtcbiAgICAgICAgaG91ciA9ICtob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cjtcbiAgICAgICAgLy8gLSBGb3JtYXQgbW1cbiAgICAgICAgbGV0IG1pbnV0ZXM6IG51bWJlciB8IHN0cmluZyA9IG1vbWVudC5taW51dGVzKCk7XG4gICAgICAgIG1pbnV0ZXMgPSArbWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXM7XG4gICAgICAgIHRpbWVTdHIgPSBgJHtob3VyfToke21pbnV0ZXN9YDtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLmRhdGVDb250cm9sLnBhdGNoVmFsdWUoZGF0ZVN0ciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy50aW1lQ29udHJvbC5wYXRjaFZhbHVlKHRpbWVTdHIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGluZykgcmV0dXJuOyAvLyBTa2lwXG4gICAgdGhpcy5fZGlzYWJsaW5nID0gdHJ1ZTtcblxuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLmRhdGVDb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy50aW1lQ29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRlQ29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy50aW1lQ29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2Rpc2FibGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvcGVuRGF0ZVBpY2tlcihldmVudD86IEV2ZW50LCBkYXRlUGlja2VyPzogTWF0RGF0ZXBpY2tlcjxhbnk+KSB7XG4gICAgZGF0ZVBpY2tlciA9IGRhdGVQaWNrZXIgfHwgdGhpcy5kYXRlUGlja2VyO1xuICAgIGlmIChkYXRlUGlja2VyKSB7XG4gICAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWRhdGVQaWNrZXIub3BlbmVkKSB7XG4gICAgICAgIGRhdGVQaWNrZXIub3BlbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9wZW5UaW1lUGlja2VyKGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMudGltZVBpY2tlciB8fCB0aGlzLmRpc2FibGVkKSByZXR1cm47IC8vIFNraXBcblxuICAgIHRoaXMuX3ByZXZlbnRFdmVudChldmVudCk7XG5cbiAgICB0aGlzLnRpbWVQaWNrZXIub3BlbigpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgY29uc3QgbWF0SW5wdXQgPSB0aGlzLl9tYXRJbnB1dHMuZmlyc3Q7XG4gICAgaWYgKCFtYXRJbnB1dCkgcmV0dXJuO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoaXNGb2N1c2FibGVFbGVtZW50KG1hdElucHV0Lm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIG1hdElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKGV2ZW50PzogRXZlbnQpIHtcbiAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgdGhpcy5fZm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIHByb3RlY3RlZCBfc2V0Rm9ybUNvbnRyb2xOYW1lKGNvbnRyb2xOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWNvbnRyb2xOYW1lIHx8IHRoaXMuX2NvbnRyb2xOYW1lID09PSBjb250cm9sTmFtZSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICB0aGlzLl9jb250cm9sTmFtZSA9IGNvbnRyb2xOYW1lO1xuXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwRGlyPy5mb3JtPy5nZXQoY29udHJvbE5hbWUpIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgICBpZiAoY29udHJvbCkgdGhpcy5fc2V0Rm9ybUNvbnRyb2woY29udHJvbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NldEZvcm1Db250cm9sKGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCkge1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICBpZiAodGhpcy5fZm9ybUNvbnRyb2wgIT09IGNvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2Zvcm1Db250cm9sID0gY29udHJvbDtcblxuICAgICAgLy8gTGlzdGVuIHN0YXR1cyBjaGFuZ2VzICh3aGVuIGRvbmUgb3V0c2lkZSB0aGUgY29tcG9uZW50ICAtIGUuZy4gd2hlbiBzZXRFcnJvcnMoKSBpcyBjYWxsaW5nIG9uIHRoZSBmb3JtQ29udHJvbClcbiAgICAgIHRoaXMuX2NvbnRyb2xTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9jb250cm9sU3Vic2NyaXB0aW9uID0gY29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoXykgPT4gIXRoaXMuX3JlYWRvbmx5ICYmICF0aGlzLl93cml0aW5nICYmICF0aGlzLl9kaXNhYmxpbmcpIC8vIFNraXBcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgICAgLy8gREVCVUdcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ1ttYXQtZGF0ZS10aW1lXSB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5IG9mIHN1YiBjb250cm9scycpO1xuXG4gICAgICAgICAgdGhpcy5kYXRlQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLnRpbWVDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIGlmICh0aGlzLl9mb3JtQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGF0ZUNvbnRyb2wudG91Y2hlZCkgdGhpcy5kYXRlQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMudGltZUNvbnRyb2wudG91Y2hlZCkgdGhpcy50aW1lQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGUtdGltZV0gdGltZUNvbnRyb2wuZXJyb3IgPycsIHRoaXMudGltZUNvbnRyb2wuZXJyb3JzKTtcbiAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdmFsaWRhdG9yc1xuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xWYWxpZGF0b3JzKGNvbnRyb2wsIHRoaXMuX3JlcXVpcmVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfdXBkYXRlQ29udHJvbFZhbGlkYXRvcnMoY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sLCByZXF1aXJlZDogYm9vbGVhbikge1xuICAgIGlmICghY29udHJvbCkgcmV0dXJuO1xuXG4gICAgLy8gQWRkICd2YWxpZERhdGUnIHZhbGlkYXRvclxuICAgIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMuYWxsb3dOb1RpbWUgPyBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZUFsbG93Tm9UaW1lIDogU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGU7XG4gICAgICBjb25zdCBpbnZlcnNlVmFsaWRhdG9yID0gdGhpcy5hbGxvd05vVGltZSA/IFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlIDogU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVBbGxvd05vVGltZTtcbiAgICAgIGlmICghY29udHJvbC5oYXNWYWxpZGF0b3IodmFsaWRhdG9yKSkge1xuICAgICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnModmFsaWRhdG9yKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250cm9sLmhhc1ZhbGlkYXRvcihpbnZlcnNlVmFsaWRhdG9yKSkge1xuICAgICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnMoaW52ZXJzZVZhbGlkYXRvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlcXVpcmVkIHZhbGlkYXRvciAoaWYgbmVlZClcbiAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgIGlmICghY29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkpIHtcbiAgICAgICAgY29udHJvbC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkpIHtcbiAgICAgICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfb25EYXRlUGlja2VyQ2hhbmdlKGV2ZW50OiBNYXREYXRlcGlja2VySW5wdXRFdmVudDxNb21lbnQ+KTogdm9pZCB7XG4gICAgLy9jb25zb2xlLmRlYnVnKGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9Ll9vbkRhdGVQaWNrZXJDaGFuZ2VdYCk7XG5cbiAgICAvLyBNYWtlIHN1cmUgZXZlbnQgaXMgdmFsaWRcbiAgICBpZiAoIWV2ZW50IHx8IChldmVudC52YWx1ZSAhPT0gbnVsbCAmJiAhaXNNb21lbnQoZXZlbnQudmFsdWUpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIE1hdERhdGVwaWNrZXIgZXZlbnQuIFNraXBwaW5nJywgZXZlbnQpO1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgbGV0IG1vbWVudCA9IGV2ZW50LnZhbHVlO1xuXG4gICAgLy8gTm8gdmFsdWUsIGJ1dCBtb2JpbGUgbW9kZTogdXNlIHRoZSBjdXJyZW50IGRhdGVcbiAgICBpZiAoIW1vbWVudCAmJiB0aGlzLm1vYmlsZSkge1xuICAgICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG4gICAgICBtb21lbnQgPSBEYXRlVXRpbHMucmVzZXRUaW1lKERhdGVVdGlscy5tb21lbnQoKS5sb2NhbGUodGhpcy5sb2NhbGUpKTtcbiAgICAgIHRoaXMuX2Zvcm1Db250cm9sLnNldFZhbHVlKG1vbWVudCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIHVzYWJsZSBkYXRlLCB0aGVuIGNvbnZlcnQgdG8gZGF0ZSBwYXR0ZXJuIChlLmcgREQvTU0vWVlZWSlcbiAgICBjb25zdCBkYXRlID0gbW9tZW50XG4gICAgICA/LmxvY2FsZSh0aGlzLmxvY2FsZSkgLy8gc2V0IGxvY2FsZVxuICAgICAgLmhvdXIoMClcbiAgICAgIC5taW51dGUoMClcbiAgICAgIC5zZWNvbmRzKDApXG4gICAgICAubWlsbGlzZWNvbmQoMCkgLy8gUmVzZXQgaG91clxuICAgICAgLnV0Yyh0cnVlKTtcbiAgICBjb25zdCBkYXRlU3RyID0gKGRhdGUgJiYgdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQoZGF0ZSwgdGhpcy5kYXRlUGF0dGVybikpIHx8IG51bGw7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGRhdGUgY29udHJvbFxuICAgIGlmICh0aGlzLmRhdGVDb250cm9sLnZhbHVlICE9PSBkYXRlU3RyKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy8gY29uc29sZS5kZWJ1ZyhcIlttYXQtZGF0ZS10aW1lXSBvbkRhdGVQaWNrZXJDaGFuZ2UoKSBuZXcgdmFsdWU6XCIsIGRhdGVTdHIpO1xuXG4gICAgICB0aGlzLmRhdGVDb250cm9sLnNldFZhbHVlKGRhdGVTdHIsIHtcbiAgICAgICAgZW1pdEV2ZW50OiB0cnVlLCAvLyBXaWxsIGNhbGwgb25Gb3JtQ2hhbmdlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgIC8vIExvb3AgaWYgaW52YWxpZFxuICAgICAgaWYgKCFldmVudC52YWx1ZSAmJiB0aGlzLnJlcXVpcmVkKSB7XG4gICAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB0aGlzLl9vcGVuRGF0ZVBpY2tlcklmTW9iaWxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9vcGVuVGltZVBpY2tlcklmTW9iaWxlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25UaW1lUGlja2VyQ2hhbmdlKHRpbWVTdHI6IHN0cmluZykge1xuICAgIC8vIFVwZGF0ZSB0aGUgdGltZSBjb250cm9sLCBpZiBuZWVkXG4gICAgaWYgKHRoaXMudGltZUNvbnRyb2wudmFsdWUgIT09IHRpbWVTdHIpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvLyBjb25zb2xlLmRlYnVnKFwiW21hdC1kYXRlLXRpbWVdIG9uVGltZVBpY2tlckNoYW5nZSgpIG5ldyB2YWx1ZTpcIiwgdGltZVN0cik7XG5cbiAgICAgIHRoaXMudGltZUNvbnRyb2wuc2V0VmFsdWUodGltZVN0ciwge1xuICAgICAgICBlbWl0RXZlbnQ6IHRydWUsIC8vIFdpbGwgY2FsbCBvbkZvcm1DaGFuZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfb3BlbkRhdGVQaWNrZXJJZk1vYmlsZShldmVudD86IEV2ZW50LCBkYXRlUGlja2VyPzogTWF0RGF0ZXBpY2tlcjxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLm1vYmlsZSB8fCBldmVudD8uZGVmYXVsdFByZXZlbnRlZCB8fCB0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgLy8gT3BlbiB0aGUgcGlja2VyXG4gICAgdGhpcy5vcGVuRGF0ZVBpY2tlcihudWxsLCBkYXRlUGlja2VyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb3BlblRpbWVQaWNrZXJJZk1vYmlsZShldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLm1vYmlsZSB8fCBldmVudD8uZGVmYXVsdFByZXZlbnRlZCB8fCB0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAvLyBPcGVuIHRoZSBwaWNrZXJcbiAgICB0aGlzLm9wZW5UaW1lUGlja2VyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb25CbHVyKCkge1xuICAgIGlmICh0aGlzLmRhdGVDb250cm9sLnRvdWNoZWQgfHwgdGhpcy50aW1lQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICBjb25zdCBkYXRlU3RyID0gdGhpcy5kYXRlQ29udHJvbC52YWx1ZTtcblxuICAgICAgLy8gQXV0byBmaWxsIGRhdGEgdGltZS9pbiBjYXNlIG9mIHBhcnRpYWwgaW5wdXRcbiAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoZGF0ZVN0cikpIHtcbiAgICAgICAgY29uc3QgdGltZVN0ciA9IHRoaXMudGltZUNvbnRyb2wudmFsdWU7XG4gICAgICAgIGNvbnN0IGRhdGU6IE1vbWVudCA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZGF0ZVN0ciwgdGhpcy5kYXRlUGF0dGVybik7XG4gICAgICAgIGxldCB2YWxpZERhdGUgPSB0cnVlO1xuICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKHRpbWVTdHIpKSB7XG4gICAgICAgICAgY29uc3QgaG91clBhcnRzID0gKHRpbWVTdHIgfHwgJycpLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgY29uc3QgaG91ciA9IHBhcnNlSW50KGhvdXJQYXJ0c1swXSB8fCAwKTtcbiAgICAgICAgICBjb25zdCBtaW51dGVzID0gcGFyc2VJbnQoaG91clBhcnRzWzFdIHx8IDApO1xuICAgICAgICAgIGRhdGUubG9jYWxlKHRoaXMubG9jYWxlKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGVzKS5zZWNvbmRzKDApLm1pbGxpc2Vjb25kKDApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIHRpbWUsIGFuZCBub3QgcmVxdWlyZWQ6IG1hcmtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgRGF0ZVV0aWxzLm1hcmtOb1RpbWUoZGF0ZSk7XG4gICAgICAgICAgdmFsaWREYXRlID0gdGhpcy5hbGxvd05vVGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZShkYXRlKTtcblxuICAgICAgICBpZiAodmFsaWREYXRlKSB7XG4gICAgICAgICAgdGhpcy5fZm9ybUNvbnRyb2wuc2V0VmFsdWUoZGF0ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hcmsgY29udHJvbCBhcyBpbnZhbGlkLCBiZWNhdXNlIHRpbWUgaXMgbWlzc2luZ1xuICAgICAgICAgIHRoaXMuX2Zvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgICB0aGlzLl9mb3JtQ29udHJvbC5zZXRFcnJvcnMoe1xuICAgICAgICAgICAgdmFsaWREYXRlOiB0cnVlLFxuICAgICAgICAgICAgLi4udGhpcy5fZm9ybUNvbnRyb2wuZXJyb3JzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdG91Y2hlZFxuICAgIHRoaXMuX2NoZWNrSWZUb3VjaGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NoZWNrSWZUb3VjaGVkKCkge1xuICAgIGlmICh0aGlzLmRhdGVDb250cm9sLnRvdWNoZWQgfHwgdGhpcy50aW1lQ29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfcHJldmVudEV2ZW50KGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kIC0tICovXG5cbiAgcHJpdmF0ZSB1cGRhdGVUcmFuc2xhdGlvbnModHJhbnNsYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgdGhpcy5kYXRlUGF0dGVybiA9IHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfUEFUVEVSTiddICE9PSAnQ09NTU9OLkRBVEVfUEFUVEVSTicgPyB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5EQVRFX1BBVFRFUk4nXSA6ICdERC9NTS9ZWVlZJztcbiAgICB0aGlzLnRpbWVQYXR0ZXJuID0gdHJhbnNsYXRpb25zWydDT01NT04uVElNRV9QQVRURVJOJ10gIT09ICdDT01NT04uVElNRV9QQVRURVJOJyA/IHRyYW5zbGF0aW9uc1snQ09NTU9OLlRJTUVfUEFUVEVSTiddIDogJ0hIOk1NJztcblxuICAgIGNvbnN0IGRpc3BsYXlQYXR0ZXJuID1cbiAgICAgIHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfVElNRV9QQVRURVJOJ10gIT09ICdDT01NT04uREFURV9USU1FX1BBVFRFUk4nID8gdHJhbnNsYXRpb25zWydDT01NT04uREFURV9USU1FX1BBVFRFUk4nXSA6ICdMIExUJztcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlQYXR0ZXJuKGRpc3BsYXlQYXR0ZXJuKTtcblxuICAgIGNvbnN0IGRhdGVQbGFjZWhvbGRlciA9XG4gICAgICB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5EQVRFX1BMQUNFSE9MREVSJ10gIT09ICdDT01NT04uREFURV9QTEFDRUhPTERFUidcbiAgICAgICAgPyB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5EQVRFX1BMQUNFSE9MREVSJ11cbiAgICAgICAgOiB0aGlzLmRhdGVQYXR0ZXJuPy50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMudXBkYXRlRGF0ZU1hc2tPcHRpb25zKGRhdGVQbGFjZWhvbGRlcik7XG5cbiAgICBjb25zdCB0aW1lUGxhY2Vob2xkZXIgPVxuICAgICAgdHJhbnNsYXRpb25zWydDT01NT04uVElNRV9QTEFDRUhPTERFUiddICE9PSAnQ09NTU9OLlRJTUVfUExBQ0VIT0xERVInXG4gICAgICAgID8gdHJhbnNsYXRpb25zWydDT01NT04uVElNRV9QTEFDRUhPTERFUiddXG4gICAgICAgIDogdGhpcy50aW1lUGF0dGVybj8udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnVwZGF0ZVRpbWVNYXNrT3B0aW9ucyh0aW1lUGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEaXNwbGF5UGF0dGVybihkaXNwbGF5UGF0dGVybjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZGlzcGxheVBhdHRlcm4gIT09IGRpc3BsYXlQYXR0ZXJuKSB7XG4gICAgICB0aGlzLmRpc3BsYXlQYXR0ZXJuID0gZGlzcGxheVBhdHRlcm47XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0ZU1hc2tPcHRpb25zKGRhdGVQbGFjZWhvbGRlcjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZGF0ZVBsYWNlaG9sZGVyICE9PSBkYXRlUGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuZGF0ZVBsYWNlaG9sZGVyID0gZGF0ZVBsYWNlaG9sZGVyO1xuXG4gICAgICBjb25zdCBkYXRlT3B0aW9ucyA9IG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvcih7XG4gICAgICAgIG1vZGU6IHRoaXMuZGF0ZVBhdHRlcm4udG9Mb3dlckNhc2UoKSBhcyBNYXNraXRvRGF0ZU1vZGUsXG4gICAgICAgIHNlcGFyYXRvcjogJy8nLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGx1Z2lucywgLy8gcGx1Z2lucyBrZWVwcyBjYXJldCBpbnNpZGUgYWN0dWFsIHZhbHVlIGFuZCByZW1vdmUgcGxhY2Vob2xkZXIgb24gYmx1clxuICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnNcbiAgICAgICAgLy8gcGFzcyAndHJ1ZScgYXMgc2Vjb25kIGFyZ3VtZW50IHRvIGFkZCBwbHVnaW4gdG8gaGlkZSBwbGFjZWhvbGRlciB3aGVuIGlucHV0IGlzIG5vdCBmb2N1c2VkXG4gICAgICB9ID0gbWFza2l0b1dpdGhQbGFjZWhvbGRlcih0aGlzLmRhdGVQbGFjZWhvbGRlciwgdHJ1ZSk7XG5cbiAgICAgIHRoaXMubWFza2l0b0RhdGVPcHRpb25zID0ge1xuICAgICAgICAuLi5kYXRlT3B0aW9ucyxcbiAgICAgICAgcGx1Z2luczogcGx1Z2lucy5jb25jYXQoZGF0ZU9wdGlvbnMucGx1Z2lucyB8fCBbXSksXG4gICAgICAgIHByZXByb2Nlc3NvcnM6IFtcbiAgICAgICAgICAvLyBBbHdheXMgcHV0IGl0IEJFRk9SRSBhbGwgb3RoZXIgcHJlcHJvY2Vzc29yc1xuICAgICAgICAgIC4uLnBsYWNlaG9sZGVyT3B0aW9ucy5wcmVwcm9jZXNzb3JzLFxuICAgICAgICAgIC4uLmRhdGVPcHRpb25zLnByZXByb2Nlc3NvcnMsXG4gICAgICAgIF0sXG4gICAgICAgIHBvc3Rwcm9jZXNzb3JzOiBbXG4gICAgICAgICAgLi4uZGF0ZU9wdGlvbnMucG9zdHByb2Nlc3NvcnMsXG4gICAgICAgICAgLy8gQWx3YXlzIHB1dCBpdCBBRlRFUiBhbGwgb3RoZXIgcG9zdHByb2Nlc3NvcnNcbiAgICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnMucG9zdHByb2Nlc3NvcnMsXG4gICAgICAgIF0sXG4gICAgICB9IGFzIFJlcXVpcmVkPE1hc2tpdG9PcHRpb25zPjtcblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRpbWVNYXNrT3B0aW9ucyh0aW1lUGxhY2Vob2xkZXI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnRpbWVQbGFjZWhvbGRlciAhPT0gdGltZVBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLnRpbWVQbGFjZWhvbGRlciA9IHRpbWVQbGFjZWhvbGRlcjtcblxuICAgICAgY29uc3QgdGltZU9wdGlvbnMgPSBtYXNraXRvVGltZU9wdGlvbnNHZW5lcmF0b3Ioe1xuICAgICAgICBtb2RlOiB0aGlzLnRpbWVQYXR0ZXJuLnRvVXBwZXJDYXNlKCkgYXMgTWFza2l0b1RpbWVNb2RlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGx1Z2lucywgLy8gcGx1Z2lucyBrZWVwcyBjYXJldCBpbnNpZGUgYWN0dWFsIHZhbHVlIGFuZCByZW1vdmUgcGxhY2Vob2xkZXIgb24gYmx1clxuICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnNcbiAgICAgICAgLy8gcGFzcyAndHJ1ZScgYXMgc2Vjb25kIGFyZ3VtZW50IHRvIGFkZCBwbHVnaW4gdG8gaGlkZSBwbGFjZWhvbGRlciB3aGVuIGlucHV0IGlzIG5vdCBmb2N1c2VkXG4gICAgICB9ID0gbWFza2l0b1dpdGhQbGFjZWhvbGRlcih0aGlzLnRpbWVQbGFjZWhvbGRlciwgdHJ1ZSk7XG5cbiAgICAgIHRoaXMubWFza2l0b1RpbWVPcHRpb25zID0ge1xuICAgICAgICAuLi50aW1lT3B0aW9ucyxcbiAgICAgICAgcGx1Z2luczogcGx1Z2lucy5jb25jYXQodGltZU9wdGlvbnMucGx1Z2lucyB8fCBbXSksXG4gICAgICAgIHByZXByb2Nlc3NvcnM6IFtcbiAgICAgICAgICAvLyBBbHdheXMgcHV0IGl0IEJFRk9SRSBhbGwgb3RoZXIgcHJlcHJvY2Vzc29yc1xuICAgICAgICAgIC4uLnBsYWNlaG9sZGVyT3B0aW9ucy5wcmVwcm9jZXNzb3JzLFxuICAgICAgICAgIC4uLnRpbWVPcHRpb25zLnByZXByb2Nlc3NvcnMsXG4gICAgICAgIF0sXG4gICAgICAgIHBvc3Rwcm9jZXNzb3JzOiBbXG4gICAgICAgICAgLi4udGltZU9wdGlvbnMucG9zdHByb2Nlc3NvcnMsXG4gICAgICAgICAgLy8gQWx3YXlzIHB1dCBpdCBBRlRFUiBhbGwgb3RoZXIgcG9zdHByb2Nlc3NvcnNcbiAgICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnMucG9zdHByb2Nlc3NvcnMsXG4gICAgICAgIF0sXG4gICAgICB9IGFzIFJlcXVpcmVkPE1hc2tpdG9PcHRpb25zPjtcblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uRm9ybUNoYW5nZShkYXRlU3RyOiBzdHJpbmcsIHRpbWVTdHI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICAvLyBDbGVhbiB1cFxuICAgIGlmIChkYXRlU3RyID09PSB0aGlzLmRhdGVQbGFjZWhvbGRlcikge1xuICAgICAgZGF0ZVN0ciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGVTdHIgPSBudWxsSWZOaWxPckJsYW5rKGRhdGVTdHIpO1xuICAgIH1cbiAgICBpZiAodGltZVN0ciA9PT0gdGhpcy50aW1lUGxhY2Vob2xkZXIpIHtcbiAgICAgIHRpbWVTdHIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aW1lU3RyID0gbnVsbElmTmlsT3JCbGFuayh0aW1lU3RyKTtcbiAgICB9XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZyhgW21hdC1kYXRlLXRpbWVdIG9uRm9ybUNoYW5nZSgpIC0gY29udHJvbHMgdmFsdWVzOiBgLCBbZGF0ZVN0ciwgdGltZVN0cl0pO1xuXG4gICAgY29uc3QgaW5jb21wbGV0ZVZhbHVlID0gIXRoaXMuYWxsb3dOb1RpbWUgJiYgaXNOaWwodGltZVN0cikgIT09IGlzTmlsKGRhdGVTdHIpO1xuICAgIGlmIChpbmNvbXBsZXRlVmFsdWUgfHwgdGhpcy5kYXRlQ29udHJvbC5pbnZhbGlkIHx8IHRoaXMudGltZUNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgLy9jb25zb2xlLmRlYnVnKGBbbWF0LWRhdGUtdGltZV0gb25Gb3JtQ2hhbmdlKCkgZXJyb3IgLT4gaW5jb21wbGV0ZVZhbHVlOiAke2luY29tcGxldGVWYWx1ZX1gKTtcblxuICAgICAgdGhpcy5fZm9ybUNvbnRyb2wubWFya0FzUGVuZGluZyh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgdGhpcy5fZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgICAgdmFsaWREYXRlOiBpbmNvbXBsZXRlVmFsdWUsXG4gICAgICAgIC4uLnRoaXMuX2Zvcm1Db250cm9sLmVycm9ycyxcbiAgICAgICAgLi4udGhpcy5kYXRlQ29udHJvbC5lcnJvcnMsXG4gICAgICAgIC4uLnRoaXMudGltZUNvbnRyb2wuZXJyb3JzLFxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5kYXRlQ29udHJvbC5kaXJ0eSB8fCB0aGlzLnRpbWVDb250cm9sLmRpcnR5KSB7XG4gICAgICAgIHRoaXMuX2Zvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb3JjZSAnMCcgZm9yIGVtcHR5IG1vbnRoIChvdGhlcndpc2UgbW9tZW50IHdpbGwgdXNlIHRoZSBjdXJyZW50IG1vbnRoKVxuICAgIGRhdGVTdHIgPSBkYXRlU3RyXG4gICAgICA/LnJlcGxhY2UoL1teXFxkL10vZywgJycpIC8vIEtlZXAgb25seSBkaWdpdHMgYW5kIHNsYXNoZXNcbiAgICAgIC5yZXBsYWNlKCcvLycsICcvMC8nKVxuICAgICAgLy8gRm9yY2UgJzAnIGZvciBlbXB0eSB5ZWFyIChvdGhlcndpc2UgbW9tZW50IHdpbGwgdXNlIHRoZSBjdXJyZW50IHllYXIpXG4gICAgICAucmVwbGFjZSgvXFwvJC8sICcvMCcpO1xuXG4gICAgLy8gUGFyc2UgZGF0ZVxuICAgIGNvbnN0IGRhdGU6IE1vbWVudCA9IChkYXRlU3RyICYmIHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZGF0ZVN0ciwgdGhpcy5kYXRlUGF0dGVybikpIHx8IG51bGw7XG5cbiAgICAvLyBQYXJzZSB0aW1lXG4gICAgY29uc3QgaG91clBhcnRzID0gKHRpbWVTdHIgfHwgJycpLnNwbGl0KCc6Jyk7XG4gICAgY29uc3QgaG91ciA9IHBhcnNlSW50KGhvdXJQYXJ0c1swXSB8fCAnMCcpO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUludChob3VyUGFydHNbMV0gfHwgJzAnKTtcbiAgICBjb25zdCBkYXRlVGltZSA9IGRhdGVcbiAgICAgID8ubG9jYWxlKHRoaXMubG9jYWxlKSAvLyBzZXQgYXMgdGltZSBhcyBsb2NhbGUgdGltZVxuICAgICAgLmhvdXIoaG91cilcbiAgICAgIC5taW51dGUobWludXRlcykgLy8gU2V0IGxvY2FsIGhvdXJcbiAgICAgIC5zZWNvbmRzKDApXG4gICAgICAubWlsbGlzZWNvbmQoMCkgLy8gUmVzZXQgc2Vjb25kcy9taWxsaXNlY29uZFxuICAgICAgLnV0YygpOyAvLyBDb252ZXJ0IHRvIFVUQyAoYXZvaWQgVFogb2Zmc2V0IGluIGZpbmFsIHN0cmluZylcblxuICAgIC8vIFNldCBtb2RlbCB2YWx1ZVxuICAgIHRoaXMuZW1pdENoYW5nZShkYXRlVGltZSwgZGF0ZVN0cik7XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZShkYXRlOiBNb21lbnQsIGRlZmF1bHRWYWx1ZT86IHN0cmluZykge1xuICAgIC8vIENvbnZlcnQgdG8gbW9kZWwgdmFsdWUgKElTTyBkYXRlIHN0cmluZylcbiAgICAvLyBJTVBPUlRBTlQ6IElmIGRhdGUgaXMgaW52YWxpZCwgdGhlbiBrZWVwIHRoZSBpbnZhbGlkIHN0cmluZyB2YWx1ZVxuICAgIC8vIHRvIGFsbG93IFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlKCkgdG8gcmFpc2UgYW4gZXJyb3JcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBkYXRlPy5pc1ZhbGlkKCkgPyB0b0RhdGVJU09TdHJpbmcoZGF0ZSkgOiBkZWZhdWx0VmFsdWUgfHwgbnVsbDtcblxuICAgIGlmICh0aGlzLl9mb3JtQ29udHJvbC52YWx1ZSAhPT0gY29udHJvbFZhbHVlKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGUtdGltZV0gRW1pdCBuZXcgdmFsdWU6ICcgKyBjb250cm9sVmFsdWUpO1xuXG4gICAgICAvLyBVcGRhdGUgZm9ybUNvbnRyb2wgdmFsdWUgKHRoaXMgaXMgbmVlZCB0byB1cGRhdGUgZGF0ZVBpY2tlciBhbHNvLCBpbiBkZXNrdG9wIG1vZGUpXG4gICAgICBpZiAoIXRoaXMubW9iaWxlICYmIGRhdGU/LmlzVmFsaWQoKSkge1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKGNvbnRyb2xWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGFuZ2VzIGNvbWVzIGZyb20gaW5zaWRlIGZ1bmN0aW9uOiB1c2UgdGhlIGNhbGxiYWNrXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKGNvbnRyb2xWYWx1ZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5lZWQgdG8gdXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFiSW5kZXgoKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuX3RhYmluZGV4KSB8fCB0aGlzLl90YWJpbmRleCA9PT0gLTEpIHJldHVybjsgLy8gc2tpcFxuXG4gICAgLy8gRm9jdXMgdG8gZmlyc3QgaW5wdXRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX21hdElucHV0cy5mb3JFYWNoKChlbGVtZW50UmVmLCBpbmRleCkgPT4ge1xuICAgICAgICBzZXRUYWJJbmRleChlbGVtZW50UmVmLCB0aGlzLl90YWJpbmRleCArIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0FzVG91Y2hlZChvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW4gfSkge1xuICAgIHRoaXMuZGF0ZUNvbnRyb2wubWFya0FzVG91Y2hlZChvcHRzKTtcbiAgICB0aGlzLnRpbWVDb250cm9sLm1hcmtBc1RvdWNoZWQob3B0cyk7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNEaXJ0eShvcHRzPzogYW55KSB7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2wubWFya0FzRGlydHkob3B0cyk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8IS0tIHJlYWRvbmx5IC0tPlxuQGlmIChyZWFkb25seSkge1xuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIlxuICA+XG4gICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgfVxuXG4gICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiB0eXBlPVwidGV4dFwiIHJlYWRvbmx5IFtmb3JtQ29udHJvbF09XCJfZm9ybUNvbnRyb2xcIiAvPlxuICAgIDxpb24tdGV4dD57eyBfZm9ybUNvbnRyb2wudmFsdWUgfCBkYXRlRm9ybWF0OiB7IHBhdHRlcm46IGRpc3BsYXlQYXR0ZXJuIH0gfX08L2lvbi10ZXh0PlxuXG4gICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gaGludHMgLS0+XG4gICAgPG1hdC1oaW50IFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIl9mb3JtQ29udHJvbC5pbnZhbGlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0SGludFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbn0gQGVsc2Uge1xuICA8IS0tIHdyaXRhYmxlICsgdGltZSAtLT5cbiAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmcge3sgYXBwZWFyYW5jZSB9fVwiPlxuICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmcgbm8td3JhcFwiPlxuICAgICAgPCEtLSBkYXkgLS0+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cImRheSBpb24tbm8tcGFkZGluZ1wiIFtzdHlsZS4tLWJ1dHRvbi1jb3VudF09XCJjbGVhcmFibGUgPyAyIDogMVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIlxuICAgICAgICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0taW52YWxpZF09XCJfZm9ybUNvbnRyb2wudG91Y2hlZCAmJiAoZGF0ZUNvbnRyb2wuaW52YWxpZCB8fCBfZm9ybUNvbnRyb2wuaW52YWxpZClcIlxuICAgICAgICAgIChjbGljayk9XCJfb3BlbkRhdGVQaWNrZXJJZk1vYmlsZSgkZXZlbnQsIGRhdGVQaWNrZXIpXCJcbiAgICAgICAgICAoZm9jdXMpPVwiX29wZW5EYXRlUGlja2VySWZNb2JpbGUoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgcGxhY2Vob2xkZXIgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIE1vYmlsZSAtLT5cbiAgICAgICAgICBAaWYgKG1vYmlsZSkge1xuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICNtYXRJbnB1dFxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2wgbWRjLXRleHQtZmllbGRfX2lucHV0XCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImRhdGVDb250cm9sXCJcbiAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgaGlkZGVuXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIl9mb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIlxuICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlUGlja2VyRmlsdGVyXCJcbiAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX29uRGF0ZVBpY2tlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8IS0tIERlc2t0b3AgLS0+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgI21hdElucHV0XG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtaW5wdXQtZWxlbWVudFwiXG4gICAgICAgICAgICAgIFttYXNraXRvXT1cIm1hc2tpdG9EYXRlT3B0aW9uc1wiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJkYXRlQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkYXRlUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJfb25CbHVyKClcIlxuICAgICAgICAgICAgICAoa2V5dXAuYXJyb3dEb3duKT1cIm9wZW5EYXRlUGlja2VyKCRldmVudCwgZGF0ZVBpY2tlcilcIlxuICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIl9wcmV2ZW50RXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiX2Zvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgaGlkZGVuXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIlxuICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlUGlja2VyRmlsdGVyXCJcbiAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX29uRGF0ZVBpY2tlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbkRhdGVQaWNrZXIoJGV2ZW50LCBkYXRlUGlja2VyKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiX2Zvcm1Db250cm9sLmRpc2FibGVkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+e3sgbW9iaWxlID8gJ2RhdGVfcmFuZ2UnIDogJ2tleWJvYXJkX2Fycm93X2Rvd24nIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICBAaWYgKGNsZWFyYWJsZSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIlxuICAgICAgICAgICAgICBbaGlkZGVuXT1cIl9mb3JtQ29udHJvbC5kaXNhYmxlZCB8fCAhX2Zvcm1Db250cm9sLnZhbHVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8IS0tIFRoZSBkYXRlIHBpY2tlciAtLT5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyICNkYXRlUGlja2VyIFt0b3VjaFVpXT1cIm1vYmlsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtzdGFydEF0XT1cInN0YXJ0RGF0ZVwiPlxuICAgICAgICAgIDwhLS0gRGF0ZSBwaWNrZXIgYnV0dG9ucyAtLT5cbiAgICAgICAgICBAaWYgKG1vYmlsZSkge1xuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLWFjdGlvbnM+XG4gICAgICAgICAgICAgIDwhLS0gQ2FuY2VsIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgbWF0RGF0ZXBpY2tlckNhbmNlbD5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgIDwhLS0gQXBwbHkgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwic29saWRcIiBjb2xvcj1cInRlcnRpYXJ5XCIgbWF0RGF0ZXBpY2tlckFwcGx5PlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+e3sgdGltZUNvbnRyb2wudmFsdWUgfHwgKCdDT01NT04uVElNRScgfCB0cmFuc2xhdGUpIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlci1hY3Rpb25zPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPCEtLSBob3VyIC0tPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJob3VyIGlvbi1uby1wYWRkaW5nXCIgW3N0eWxlLi0tYnV0dG9uLWNvdW50XT1cImNvbXBhY3QgPyAwIDogMVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIlxuICAgICAgICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0taW52YWxpZF09XCJfZm9ybUNvbnRyb2wudG91Y2hlZCAmJiAodGltZUNvbnRyb2wuaW52YWxpZCB8fCBfZm9ybUNvbnRyb2wuaW52YWxpZClcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIDxtYXQtbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5USU1FPC9tYXQtbGFiZWw+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChtb2JpbGUpIHtcbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sIG1kYy10ZXh0LWZpZWxkX19pbnB1dFwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0aW1lQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFRpbWVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblRpbWVQaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICA8IS0tIEhpZGUgdGhlIGZpbmFsIChoaWRkZW4pIGlucHV0IC0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIGhpZGRlblxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0aW1lQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgIFtuZ3hNYXRUaW1lcGlja2VyXT1cInRpbWVQaWNrZXJcIlxuICAgICAgICAgICAgICBbZm9ybWF0XT1cIjI0XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgI21hdElucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInRpbWVDb250cm9sXCJcbiAgICAgICAgICAgICAgW21hc2tpdG9dPVwibWFza2l0b1RpbWVPcHRpb25zXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtaW5wdXQtZWxlbWVudFwiXG4gICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ0aW1lUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRUaW1lXCJcbiAgICAgICAgICAgICAgKGtleXVwLmFycm93RG93bik9XCJvcGVuVGltZVBpY2tlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJfcHJldmVudEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJfb25CbHVyKClcIlxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXggIT09IHVuZGVmaW5lZCA/IHRhYmluZGV4ICsgMSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPCEtLSBIaWRlIHRoZSBmaW5hbCAoaGlkZGVuKSBpbnB1dCAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBoaWRkZW5cbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGltZUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRUaW1lXCJcbiAgICAgICAgICAgICAgW25neE1hdFRpbWVwaWNrZXJdPVwidGltZVBpY2tlclwiXG4gICAgICAgICAgICAgIFtmb3JtYXRdPVwiMjRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKCFjb21wYWN0KSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiX2Zvcm1Db250cm9sLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5UaW1lUGlja2VyKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+e3sgIWNvbXBhY3QgJiYgbW9iaWxlID8gJ2FjY2Vzc190aW1lJyA6ICdrZXlib2FyZF9hcnJvd19kb3duJyB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPG5neC1tYXQtdGltZXBpY2tlclxuICAgICAgICAgICAgI3RpbWVQaWNrZXJcbiAgICAgICAgICAgICh0aW1lU2V0KT1cIl9vblRpbWVQaWNrZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbaXNFc2NdPVwiIW1vYmlsZVwiXG4gICAgICAgICAgICBbZGVmYXVsdFRpbWVdPVwiJzAwOjAwJ1wiXG4gICAgICAgICAgICBbY2FuY2VsQnRuVG1wbF09XCJ0aW1lUGlja2VyQ2FuY2VsQnV0dG9uXCJcbiAgICAgICAgICAgIFtjb25maXJtQnRuVG1wbF09XCJ0aW1lUGlja2VyT2tCdXR0b25cIlxuICAgICAgICAgICAgW3ByZXZlbnRPdmVybGF5Q2xpY2tdPVwibW9iaWxlXCJcbiAgICAgICAgICAgIFtlbmFibGVLZXlib2FyZElucHV0XT1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgY29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgID48L25neC1tYXQtdGltZXBpY2tlcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLWdyaWQ+XG5cbiAgPCEtLSBEbyB0aGUgc2FtZSBhcyBNYXRGb3JtRmllbGQgc2luY2UgYW5ndWxhciAxNSAoc2VlIGNvbXBvbmVudCBzb3VyY2UpLS0+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlclwiXG4gICAgW2NsYXNzLm1hdC1tZGMtZm9ybS1maWVsZC1ib3R0b20tYWxpZ25dPVwic3Vic2NyaXB0U2l6aW5nID09PSAnZml4ZWQnXCJcbiAgICBbY2xhc3MubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC1keW5hbWljLXNpemVdPVwic3Vic2NyaXB0U2l6aW5nID09PSAnZHluYW1pYydcIlxuICA+XG4gICAgQGlmIChfZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBfZm9ybUNvbnRyb2wuZXJyb3JzOyBhcyBlcnJvcnMpIHtcbiAgICAgIDwhLS0gZXJyb3JzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1lcnJvci13cmFwcGVyXCI+XG4gICAgICAgIEBpZiAoZXJyb3JzIHwgbWFwS2V5cyB8IGFycmF5Rmlyc3Q7IGFzIGVycm9yS2V5KSB7XG4gICAgICAgICAgQHN3aXRjaCAoZXJyb3JLZXkpIHtcbiAgICAgICAgICAgIEBjYXNlICgncmVxdWlyZWQnKSB7XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3ZhbGlkRGF0ZScpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfVElNRTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlSXNBZnRlcicpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICB7eyAnRVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfQUZURVInIHwgdHJhbnNsYXRlOiBfZm9ybUNvbnRyb2wuZXJyb3JzLmRhdGVJc0FmdGVyIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlSXNCZWZvcmUnKSB7XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAge3sgJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX0JFRk9SRScgfCB0cmFuc2xhdGU6IF9mb3JtQ29udHJvbC5lcnJvcnMuZGF0ZUlzQmVmb3JlIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlUmFuZ2UnKSB7XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX1JBTkdFPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2RhdGVNYXhEdXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUFYX0RVUkFUSU9OPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2RhdGVNaW5EdXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUlOX0RVUkFUSU9OPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ21zZycpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgX2Zvcm1Db250cm9sLmVycm9ycy5tc2c/LmtleSB8fCBfZm9ybUNvbnRyb2wuZXJyb3JzLm1zZyB8IHRyYW5zbGF0ZTogX2Zvcm1Db250cm9sLmVycm9ycy5tc2c/LnBhcmFtc1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0RXJyb3JUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEVycm9yVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8IS0tIGhpbnRzIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgPC9kaXY+XG59XG5cbjwhLS0gY2FuY2VsIGJ1dHRvbiAtLT5cbjxuZy10ZW1wbGF0ZSAjdGltZVBpY2tlckNhbmNlbEJ1dHRvbj5cbiAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCI+XG4gICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DQU5DRUw8L2lvbi1sYWJlbD5cbiAgPC9pb24tYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBjb25maXJtIGJ1dHRvbiAtLT5cbjxuZy10ZW1wbGF0ZSAjdGltZVBpY2tlck9rQnV0dG9uPlxuICA8aW9uLWJ1dHRvbiBmaWxsPVwic29saWRcIiBjb2xvcj1cInRlcnRpYXJ5XCI+XG4gICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICA8L2lvbi1idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRFcnJvclRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3IsW21hdEVycm9yXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0SGludFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlclwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSxbbWF0SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXNwYWNlclwiPjwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50W2FsaWduPSdlbmQnXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
838
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9kYXRldGltZS9tYXRlcmlhbC5kYXRldGltZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2RhdGV0aW1lL21hdGVyaWFsLmRhdGV0aW1lLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUlOLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDhCQUE4QixFQUF1RSxNQUFNLDhCQUE4QixDQUFDO0FBQ25KLE9BQU8sRUFBNEMsaUJBQWlCLEVBQTBDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpKLE9BQU8sRUFBRSxRQUFRLEVBQVUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQWdCLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JILE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJB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LFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxrQkFBa0I7c0JBQXpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsYUFBYTtzQkFBcEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxLQUFLO3NCQUE1QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUdsQyxVQUFVO3NCQURiLEtBQUs7Z0JBU0YsZUFBZTtzQkFEbEIsS0FBSztnQkFRTyxXQUFXO3NCQUF2QixLQUFLO2dCQU9PLGVBQWU7c0JBQTNCLEtBQUs7Z0JBT08sUUFBUTtzQkFBcEIsS0FBSztnQkFnQk8sUUFBUTtzQkFBcEIsS0FBSztnQkFTTyxRQUFRO3NCQUFwQixLQUFLO2dCQW1CbUIsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUNFLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDRyxVQUFVO3NCQUFuQyxZQUFZO3VCQUFDLFVBQVU7Z0JBR1AsT0FBTztzQkFBdkIsTUFBTTt1QkFBQyxPQUFPO2dCQUVDLE9BQU87c0JBQXRCLE1BQU07dUJBQUMsTUFBTTtnQkFDWSxhQUFhO3NCQUF0QyxNQUFNO3VCQUFDLGdCQUFnQjtnQkFDRCxVQUFVO3NCQUFoQyxNQUFNO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUHJvdmlkZXIsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMsIE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIE1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zLCBTdWJzY3JpcHRTaXppbmcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGlzTW9tZW50LCBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgU2hhcmVkVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7IGZpbHRlciwgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElucHV0RWxlbWVudCwgc2V0VGFiSW5kZXggfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHsgaXNGb2N1c2FibGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vZm9jdXNhYmxlJztcbmltcG9ydCB7IG1lcmdlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGVGaWx0ZXJGbiwgTWF0RGF0ZXBpY2tlciwgTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IGlzQmxhbmtTdHJpbmcsIGlzTmlsLCBpc05vdE5pbCwgaXNOb3ROaWxCb29sZWFuLCBpc05vdE5pbE9yQmxhbmssIG51bGxJZk5pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRGF0ZVV0aWxzLCBmcm9tRGF0ZUlTT1N0cmluZywgdG9EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vZGF0ZXMnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHsgTW9tZW50RGF0ZUFkYXB0ZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC1tb21lbnQtYWRhcHRlcic7XG5pbXBvcnQgeyBBcHBGbG9hdExhYmVsVHlwZSB9IGZyb20gJy4uLy4uL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgTWFza2l0b09wdGlvbnMgfSBmcm9tICdAbWFza2l0by9jb3JlJztcbmltcG9ydCB7IE1hc2tpdG9EYXRlTW9kZSwgbWFza2l0b0RhdGVPcHRpb25zR2VuZXJhdG9yLCBNYXNraXRvVGltZU1vZGUsIG1hc2tpdG9UaW1lT3B0aW9uc0dlbmVyYXRvciwgbWFza2l0b1dpdGhQbGFjZWhvbGRlciB9IGZyb20gJ0BtYXNraXRvL2tpdCc7XG5pbXBvcnQgeyBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX0FQUEVBUkFOQ0UsIE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfU1VCU0NSSVBUX1NJWklORyB9IGZyb20gJy4uL21hdGVyaWFsLmNvbmZpZyc7XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0RGF0ZVRpbWUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmNvbnN0IEkxOE5fS0VZUyA9IFtcbiAgJ0NPTU1PTi5EQVRFX1BBVFRFUk4nLFxuICAnQ09NTU9OLlRJTUVfUEFUVEVSTicsXG4gICdDT01NT04uREFURV9USU1FX1BBVFRFUk4nLFxuICAnQ09NTU9OLkRBVEVfUExBQ0VIT0xERVInLFxuICAnQ09NTU9OLlRJTUVfUExBQ0VIT0xERVInLFxuICAnQ09NTU9OLkhPVVJfUEFUVEVSTicsXG5dO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmRlY2xhcmUgaW50ZXJmYWNlIE5neFRpbWVQaWNrZXIge1xuICBvcGVuKCk7XG4gIGNsb3NlKCk7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1kYXRlLXRpbWUtZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWwuZGF0ZXRpbWUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmRhdGV0aW1lLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbREVGQVVMVF9WQUxVRV9BQ0NFU1NPUl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNYXREYXRlVGltZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgSW5wdXRFbGVtZW50IHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9jb250cm9sU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgX3dyaXRpbmcgPSB0cnVlO1xuICBwcml2YXRlIF9kaXNhYmxpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZm9jdXNlZCA9IGZhbHNlO1xuICBwcml2YXRlIF90YWJpbmRleDogbnVtYmVyO1xuICBwcml2YXRlIF9yZWFkb25seSA9IGZhbHNlO1xuICBwcml2YXRlIF9jb250cm9sTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9zdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0QXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdFN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuXG4gIHByb3RlY3RlZCBfZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHJvdGVjdGVkIGRhdGVDb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHByb3RlY3RlZCB0aW1lQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwcm90ZWN0ZWQgZGlzcGxheVBhdHRlcm46IHN0cmluZztcbiAgcHJvdGVjdGVkIGRhdGVQYXR0ZXJuOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB0aW1lUGF0dGVybjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbG9jYWxlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBtYXNraXRvRGF0ZU9wdGlvbnM6IE1hc2tpdG9PcHRpb25zO1xuICBwcm90ZWN0ZWQgbWFza2l0b1RpbWVPcHRpb25zOiBNYXNraXRvT3B0aW9ucztcbiAgcHJvdGVjdGVkIGRhdGVQbGFjZWhvbGRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgdGltZVBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB0aW1lUGlja2VyUmVhZHkgPSBmYWxzZTtcblxuICBASW5wdXQoKSBsb2dQcmVmaXggPSAnW21hdC1kYXRlLXRpbWVdJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgZmxvYXRMYWJlbDogQXBwRmxvYXRMYWJlbFR5cGUgPSAnYXV0byc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBjb21wYWN0ID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBhdXRvZm9jdXMgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNsZWFyYWJsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBzdGFydERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkYXRlUGlja2VyRmlsdGVyOiBEYXRlRmlsdGVyRm48TW9tZW50PjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGFsbG93Tm9UaW1lID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkb3R0ZWRNaW51dGVzSW5HYXAgPSB0cnVlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgdGltZUhvdXJzT25seSA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgZGVidWcgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgYXBwZWFyYW5jZSh2YWx1ZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSkge1xuICAgIHRoaXMuX2FwcGVhcmFuY2UgPSB2YWx1ZTtcbiAgfVxuICBnZXQgYXBwZWFyYW5jZSgpOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwZWFyYW5jZSB8fCB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzdWJzY3JpcHRTaXppbmcodmFsdWU6IFN1YnNjcmlwdFNpemluZykge1xuICAgIHRoaXMuX3N1YnNjcmlwdFNpemluZyA9IHZhbHVlO1xuICB9XG4gIGdldCBzdWJzY3JpcHRTaXppbmcoKTogU3Vic2NyaXB0U2l6aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0U2l6aW5nIHx8IHRoaXMuX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZm9ybUNvbnRyb2wodmFsdWU6IFVudHlwZWRGb3JtQ29udHJvbCkge1xuICAgIHRoaXMuX3NldEZvcm1Db250cm9sKHZhbHVlKTtcbiAgfVxuICBnZXQgZm9ybUNvbnRyb2woKTogVW50eXBlZEZvcm1Db250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybUNvbnRyb2w7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZm9ybUNvbnRyb2xOYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZXRGb3JtQ29udHJvbE5hbWUodmFsdWUpO1xuICB9XG4gIGdldCBmb3JtQ29udHJvbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbE5hbWU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4gfCBhbnkpIHtcbiAgICBpZiAodGhpcy5fcmVxdWlyZWQgPT09IHZhbHVlKSByZXR1cm47IC8vIFNLaXBcblxuICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2Zvcm1Db250cm9sKSB7XG4gICAgICB0aGlzLl91cGRhdGVDb250cm9sVmFsaWRhdG9ycyh0aGlzLl9mb3JtQ29udHJvbCwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB8IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkVGltZSgpOiBib29sZWFuIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQgJiYgIXRoaXMuYWxsb3dOb1RpbWU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRhYmluZGV4KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fdGFiaW5kZXggIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl90YWJpbmRleCA9IHZhbHVlO1xuICAgICAgaWYgKCF0aGlzLl93cml0aW5nKSB0aGlzLnVwZGF0ZVRhYkluZGV4KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRhYmluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmluZGV4O1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbnRyb2wuZGlzYWJsZWQ7XG4gIH1cblxuICBAVmlld0NoaWxkKCdkYXRlUGlja2VyJykgZGF0ZVBpY2tlcjogTWF0RGF0ZXBpY2tlcjxNb21lbnQ+O1xuICBAVmlld0NoaWxkKCd0aW1lUGlja2VyJykgdGltZVBpY2tlcjogTmd4VGltZVBpY2tlcjtcbiAgQFZpZXdDaGlsZHJlbignbWF0SW5wdXQnKSBfbWF0SW5wdXRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoJ2ZvY3VzJykgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoJ2JsdXInKSBibHVycmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PigpO1xuICBAT3V0cHV0KCdrZXlkb3duLmVzY2FwZScpIGtleWRvd25Fc2NhcGUgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICBAT3V0cHV0KCdrZXl1cC5lbnRlcicpIGtleXVwRW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGF0ZUFkYXB0ZXI6IE1vbWVudERhdGVBZGFwdGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUykgZGVmYXVsdE9wdGlvbnM/OiBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9uc1xuICApIHtcbiAgICB0aGlzLmxvY2FsZSA9ICh0cmFuc2xhdGUuY3VycmVudExhbmcgfHwgdHJhbnNsYXRlLmRlZmF1bHRMYW5nKS5zdWJzdHJpbmcoMCwgMik7XG4gICAgdGhpcy5fZGVmYXVsdFN1YnNjcmlwdFNpemluZyA9IGRlZmF1bHRPcHRpb25zPy5zdWJzY3JpcHRTaXppbmcgfHwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HO1xuICAgIHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlID0gZGVmYXVsdE9wdGlvbnM/LmFwcGVhcmFuY2UgfHwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9BUFBFQVJBTkNFO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuX2Zvcm1Db250cm9sIHx8ICh0aGlzLl9jb250cm9sTmFtZSAmJiAodGhpcy5mb3JtR3JvdXBEaXI/LmZvcm0uZ2V0KHRoaXMuX2NvbnRyb2xOYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wpKTtcbiAgICBpZiAoIWNvbnRyb2wpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSAnZm9ybUNvbnRyb2wnIG9yICdmb3JtQ29udHJvbE5hbWUnIGluIDxtYXQtZGF0ZS10aW1lLWZpZWxkPi5cIik7XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgIHRoaXMubW9iaWxlID0gaXNOb3ROaWwodGhpcy5tb2JpbGUpID8gdGhpcy5tb2JpbGUgOiBpc01vYmlsZSh3aW5kb3cpO1xuICAgIHRoaXMuX3JlcXVpcmVkID0gaXNOb3ROaWxCb29sZWFuKHRoaXMuX3JlcXVpcmVkKSA/IHRoaXMuX3JlcXVpcmVkIDogY29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgfHwgaXNCbGFua1N0cmluZyh0aGlzLl9yZXF1aXJlZCk7XG5cbiAgICB0aGlzLl9zZXRGb3JtQ29udHJvbChjb250cm9sKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgZGF0ZSBjb250cm9sXG4gICAgdGhpcy5kYXRlQ29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgdGltZSBjb250cm9sXG4gICAgdGhpcy50aW1lQ29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsKTtcblxuICAgIC8vIEdldCBwYXR0ZXJucyB0byBkaXNwbGF5IGRhdGUgYW5kIGRhdGUrdGltZVxuICAgIHRoaXMudXBkYXRlVHJhbnNsYXRpb25zKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoSTE4Tl9LRVlTKSk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMudHJhbnNsYXRlXG4gICAgICAgIC5nZXQoSTE4Tl9LRVlTKVxuICAgICAgICAucGlwZShza2lwKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCh0cmFuc2xhdGlvbnMpID0+IHRoaXMudXBkYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9ucykpXG4gICAgKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBtZXJnZSh0aGlzLmRhdGVDb250cm9sLnZhbHVlQ2hhbmdlcywgdGhpcy50aW1lQ29udHJvbC52YWx1ZUNoYW5nZXMpLnN1YnNjcmliZSgoKSA9PlxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSh0aGlzLmRhdGVDb250cm9sLnZhbHVlLCB0aGlzLnRpbWVDb250cm9sLnZhbHVlKVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgIC8vIEVuYWJsZSBhbmltYXRpb25zIG5vdy4gVGhpcyBlbnN1cmVzIHdlIGRvbid0IGFuaW1hdGUgb24gaW5pdGlhbCByZW5kZXIuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9jb250cm9sU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuYmx1cnJlZC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcFxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuXG4gICAgLy8gQ29udmVydCBpbnRvIGRhdGVcbiAgICBjb25zdCBtb21lbnQgPSBpc01vbWVudCh2YWx1ZSkgPyB2YWx1ZSA6IGZyb21EYXRlSVNPU3RyaW5nKHZhbHVlKTtcblxuICAgIC8vIERFQlVHXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiW21hdC1kYXRlLXRpbWVdIHdyaXRlVmFsdWUoKSB3aXRoOlwiLCB2YWx1ZSk7XG5cbiAgICBpZiAoIW1vbWVudCB8fCAhbW9tZW50LmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy5kYXRlQ29udHJvbC5wYXRjaFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMudGltZUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBtb21lbnRcbiAgICAgICAgLy8gSW1wb3J0YW50OiBjbG9uZSwgYmVjYXVzZSBzdGFydE9mKCkgd2lsbCB1cGRhdGUgdGhlIGV4aXN0aW5nIGRhdGVcbiAgICAgICAgLmNsb25lKClcbiAgICAgICAgLy8gUmVzZXQgdGltZVxuICAgICAgICAuc3RhcnRPZignZGF5Jyk7XG4gICAgICBjb25zdCBkYXRlU3RyID0gdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQoZGF0ZSwgdGhpcy5kYXRlUGF0dGVybik7XG5cbiAgICAgIC8vIEZvcm1hdCB0aW1lXG4gICAgICBsZXQgdGltZVN0cjogc3RyaW5nO1xuICAgICAgaWYgKERhdGVVdGlscy5pc05vVGltZShtb21lbnQpKSB7XG4gICAgICAgIC8vIENsZWFyIHRpbWVcbiAgICAgICAgdGltZVN0ciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAtIEZvcm1hdCBoaFxuICAgICAgICBsZXQgaG91cjogbnVtYmVyIHwgc3RyaW5nID0gbW9tZW50LmhvdXIoKTtcbiAgICAgICAgaG91ciA9ICtob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cjtcbiAgICAgICAgLy8gLSBGb3JtYXQgbW1cbiAgICAgICAgbGV0IG1pbnV0ZXM6IG51bWJlciB8IHN0cmluZyA9IG1vbWVudC5taW51dGVzKCk7XG4gICAgICAgIG1pbnV0ZXMgPSArbWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXM7XG4gICAgICAgIHRpbWVTdHIgPSBgJHtob3VyfToke21pbnV0ZXN9YDtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLmRhdGVDb250cm9sLnBhdGNoVmFsdWUoZGF0ZVN0ciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy50aW1lQ29udHJvbC5wYXRjaFZhbHVlKHRpbWVTdHIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGluZykgcmV0dXJuOyAvLyBTa2lwXG4gICAgdGhpcy5fZGlzYWJsaW5nID0gdHJ1ZTtcblxuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLmRhdGVDb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy50aW1lQ29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRlQ29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy50aW1lQ29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2Rpc2FibGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvcGVuRGF0ZVBpY2tlcihldmVudD86IEV2ZW50LCBkYXRlUGlja2VyPzogTWF0RGF0ZXBpY2tlcjxhbnk+KSB7XG4gICAgZGF0ZVBpY2tlciA9IGRhdGVQaWNrZXIgfHwgdGhpcy5kYXRlUGlja2VyO1xuICAgIGlmIChkYXRlUGlja2VyKSB7XG4gICAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgICBpZiAoIWRhdGVQaWNrZXIub3BlbmVkKSB7XG4gICAgICAgIGRhdGVQaWNrZXIub3BlbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9wZW5UaW1lUGlja2VyKGV2ZW50PzogRXZlbnQsIHRpbWVQaWNrZXI6IE5neFRpbWVQaWNrZXIgPSB0aGlzLnRpbWVQaWNrZXIpIHtcbiAgICBpZiAoIXRpbWVQaWNrZXIgfHwgdGhpcy5kaXNhYmxlZCkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgdGltZVBpY2tlci5vcGVuKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZpeFRpbWVQaWNrZXJQb3NpdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXhUaW1lUGlja2VyUG9zaXRpb24oKSB7XG4gICAgY29uc3Qgb3ZlcmxheVBhbmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2RrLW92ZXJsYXktcGFuZTpoYXMobmd4LW1hdC10aW1lcGlja2VyLXByb3ZpZGVyKScpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghb3ZlcmxheVBhbmUpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSBvdmVybGF5UGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICBsZXQgZGVsdGFYID0gMDtcbiAgICBsZXQgZGVsdGFZID0gMDtcblxuICAgIC8vIENvcnJlY3Rpb25zIGJhc8OpZXMgc3VyIGxhIHBvc2l0aW9uIGRhbnMgbGUgdmlld3BvcnRcbiAgICBpZiAocmVjdC5yaWdodCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgIGRlbHRhWCA9IHZpZXdwb3J0V2lkdGggLSByZWN0LnJpZ2h0O1xuICAgIH0gZWxzZSBpZiAocmVjdC5sZWZ0IDwgMCkge1xuICAgICAgZGVsdGFYID0gLXJlY3QubGVmdDtcbiAgICB9XG5cbiAgICBpZiAocmVjdC5ib3R0b20gPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgZGVsdGFZID0gdmlld3BvcnRIZWlnaHQgLSByZWN0LmJvdHRvbTtcbiAgICB9IGVsc2UgaWYgKHJlY3QudG9wIDwgMCkge1xuICAgICAgZGVsdGFZID0gLXJlY3QudG9wO1xuICAgIH1cblxuICAgIGlmIChkZWx0YVggIT09IDAgfHwgZGVsdGFZICE9PSAwKSB7XG4gICAgICBjb25zdCBwaWNrZXJFbGVtZW50ID0gb3ZlcmxheVBhbmUuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBpY2tlckVsZW1lbnQgPz8gb3ZlcmxheVBhbmUsICd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClgKTtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpIHtcbiAgICBjb25zdCBtYXRJbnB1dCA9IHRoaXMuX21hdElucHV0cy5maXJzdDtcbiAgICBpZiAoIW1hdElucHV0KSByZXR1cm47XG5cbiAgICAvLyBOZWVkIGEgZGVsYXkgdG8gcHJldmVudCBlYXJseSBmb2N1cyBldmVudCwganVzdCBhZnRlciBhIGJsdXIgZXZlbnRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChpc0ZvY3VzYWJsZUVsZW1lbnQobWF0SW5wdXQubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgbWF0SW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoZXZlbnQ/OiBFdmVudCkge1xuICAgIHRoaXMuX3ByZXZlbnRFdmVudChldmVudCk7XG5cbiAgICB0aGlzLl9mb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgZnVuY3Rpb25zIC0tICovXG5cbiAgcHJvdGVjdGVkIF9zZXRGb3JtQ29udHJvbE5hbWUoY29udHJvbE5hbWU6IHN0cmluZykge1xuICAgIGlmICghY29udHJvbE5hbWUgfHwgdGhpcy5fY29udHJvbE5hbWUgPT09IGNvbnRyb2xOYW1lKSByZXR1cm47IC8vIFNraXBcblxuICAgIHRoaXMuX2NvbnRyb2xOYW1lID0gY29udHJvbE5hbWU7XG5cbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXBEaXI/LmZvcm0/LmdldChjb250cm9sTmFtZSkgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICAgIGlmIChjb250cm9sKSB0aGlzLl9zZXRGb3JtQ29udHJvbChjb250cm9sKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc2V0Rm9ybUNvbnRyb2woY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKSB7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47IC8vIFNraXBcblxuICAgIGlmICh0aGlzLl9mb3JtQ29udHJvbCAhPT0gY29udHJvbCkge1xuICAgICAgdGhpcy5fZm9ybUNvbnRyb2wgPSBjb250cm9sO1xuXG4gICAgICAvLyBMaXN0ZW4gc3RhdHVzIGNoYW5nZXMgKHdoZW4gZG9uZSBvdXRzaWRlIHRoZSBjb21wb25lbnQgIC0gZS5nLiB3aGVuIHNldEVycm9ycygpIGlzIGNhbGxpbmcgb24gdGhlIGZvcm1Db250cm9sKVxuICAgICAgdGhpcy5fY29udHJvbFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuX2NvbnRyb2xTdWJzY3JpcHRpb24gPSBjb250cm9sLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChfKSA9PiAhdGhpcy5fcmVhZG9ubHkgJiYgIXRoaXMuX3dyaXRpbmcgJiYgIXRoaXMuX2Rpc2FibGluZykgLy8gU2tpcFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnW21hdC1kYXRlLXRpbWVdIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkgb2Ygc3ViIGNvbnRyb2xzJyk7XG5cbiAgICAgICAgICB0aGlzLmRhdGVDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgIHRoaXMudGltZUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgaWYgKHRoaXMuX2Zvcm1Db250cm9sLnRvdWNoZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRlQ29udHJvbC50b3VjaGVkKSB0aGlzLmRhdGVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy50aW1lQ29udHJvbC50b3VjaGVkKSB0aGlzLnRpbWVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ1ttYXQtZGF0ZS10aW1lXSB0aW1lQ29udHJvbC5lcnJvciA/JywgdGhpcy50aW1lQ29udHJvbC5lcnJvcnMpO1xuICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB2YWxpZGF0b3JzXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbFZhbGlkYXRvcnMoY29udHJvbCwgdGhpcy5fcmVxdWlyZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF91cGRhdGVDb250cm9sVmFsaWRhdG9ycyhjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wsIHJlcXVpcmVkOiBib29sZWFuKSB7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG5cbiAgICAvLyBBZGQgJ3ZhbGlkRGF0ZScgdmFsaWRhdG9yXG4gICAge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5hbGxvd05vVGltZSA/IFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlQWxsb3dOb1RpbWUgOiBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZTtcbiAgICAgIGNvbnN0IGludmVyc2VWYWxpZGF0b3IgPSB0aGlzLmFsbG93Tm9UaW1lID8gU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGUgOiBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZUFsbG93Tm9UaW1lO1xuICAgICAgaWYgKCFjb250cm9sLmhhc1ZhbGlkYXRvcih2YWxpZGF0b3IpKSB7XG4gICAgICAgIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyh2YWxpZGF0b3IpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRyb2wuaGFzVmFsaWRhdG9yKGludmVyc2VWYWxpZGF0b3IpKSB7XG4gICAgICAgIGNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhpbnZlcnNlVmFsaWRhdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgcmVxdWlyZWQgdmFsaWRhdG9yIChpZiBuZWVkKVxuICAgIGlmIChyZXF1aXJlZCkge1xuICAgICAgaWYgKCFjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9vbkRhdGVQaWNrZXJDaGFuZ2UoZXZlbnQ6IE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50PE1vbWVudD4pOiB2b2lkIHtcbiAgICAvL2NvbnNvbGUuZGVidWcoYFske3RoaXMuY29uc3RydWN0b3IubmFtZX0uX29uRGF0ZVBpY2tlckNoYW5nZV1gKTtcblxuICAgIC8vIE1ha2Ugc3VyZSBldmVudCBpcyB2YWxpZFxuICAgIGlmICghZXZlbnQgfHwgKGV2ZW50LnZhbHVlICE9PSBudWxsICYmICFpc01vbWVudChldmVudC52YWx1ZSkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgTWF0RGF0ZXBpY2tlciBldmVudC4gU2tpcHBpbmcnLCBldmVudCk7XG4gICAgICByZXR1cm47IC8vIFNraXBcbiAgICB9XG5cbiAgICBsZXQgbW9tZW50ID0gZXZlbnQudmFsdWU7XG5cbiAgICAvLyBObyB2YWx1ZSwgYnV0IG1vYmlsZSBtb2RlOiB1c2UgdGhlIGN1cnJlbnQgZGF0ZVxuICAgIGlmICghbW9tZW50ICYmIHRoaXMubW9iaWxlKSB7XG4gICAgICB0aGlzLl93cml0aW5nID0gdHJ1ZTtcbiAgICAgIG1vbWVudCA9IERhdGVVdGlscy5yZXNldFRpbWUoRGF0ZVV0aWxzLm1vbWVudCgpLmxvY2FsZSh0aGlzLmxvY2FsZSkpO1xuICAgICAgdGhpcy5fZm9ybUNvbnRyb2wuc2V0VmFsdWUobW9tZW50LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgdG8gdXNhYmxlIGRhdGUsIHRoZW4gY29udmVydCB0byBkYXRlIHBhdHRlcm4gKGUuZyBERC9NTS9ZWVlZKVxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnRcbiAgICAgID8ubG9jYWxlKHRoaXMubG9jYWxlKSAvLyBzZXQgbG9jYWxlXG4gICAgICAuaG91cigwKVxuICAgICAgLm1pbnV0ZSgwKVxuICAgICAgLnNlY29uZHMoMClcbiAgICAgIC5taWxsaXNlY29uZCgwKSAvLyBSZXNldCBob3VyXG4gICAgICAudXRjKHRydWUpO1xuICAgIGNvbnN0IGRhdGVTdHIgPSAoZGF0ZSAmJiB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdChkYXRlLCB0aGlzLmRhdGVQYXR0ZXJuKSkgfHwgbnVsbDtcblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0ZSBjb250cm9sXG4gICAgaWYgKHRoaXMuZGF0ZUNvbnRyb2wudmFsdWUgIT09IGRhdGVTdHIpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvLyBjb25zb2xlLmRlYnVnKFwiW21hdC1kYXRlLXRpbWVdIG9uRGF0ZVBpY2tlckNoYW5nZSgpIG5ldyB2YWx1ZTpcIiwgZGF0ZVN0cik7XG5cbiAgICAgIHRoaXMuZGF0ZUNvbnRyb2wuc2V0VmFsdWUoZGF0ZVN0ciwge1xuICAgICAgICBlbWl0RXZlbnQ6IHRydWUsIC8vIFdpbGwgY2FsbCBvbkZvcm1DaGFuZ2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1vYmlsZSkge1xuICAgICAgLy8gTG9vcCBpZiBpbnZhbGlkXG4gICAgICBpZiAoIWV2ZW50LnZhbHVlICYmIHRoaXMucmVxdWlyZWQpIHtcbiAgICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHRoaXMuX29wZW5EYXRlUGlja2VySWZNb2JpbGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX29wZW5UaW1lUGlja2VySWZNb2JpbGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vblRpbWVQaWNrZXJDaGFuZ2VkKHRpbWVTdHI6IHN0cmluZykge1xuICAgIC8vIFVwZGF0ZSB0aGUgdGltZSBjb250cm9sLCBpZiBuZWVkXG4gICAgaWYgKHRoaXMudGltZUNvbnRyb2wudmFsdWUgIT09IHRpbWVTdHIpIHtcbiAgICAgIC8vIERFQlVHXG4gICAgICAvLyBjb25zb2xlLmRlYnVnKFwiW21hdC1kYXRlLXRpbWVdIG9uVGltZVBpY2tlckNoYW5nZSgpIG5ldyB2YWx1ZTpcIiwgdGltZVN0cik7XG5cbiAgICAgIHRoaXMudGltZUNvbnRyb2wuc2V0VmFsdWUodGltZVN0ciwge1xuICAgICAgICBlbWl0RXZlbnQ6IHRydWUsIC8vIFdpbGwgY2FsbCBvbkZvcm1DaGFuZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfb3BlbkRhdGVQaWNrZXJJZk1vYmlsZShldmVudD86IEV2ZW50LCBkYXRlUGlja2VyPzogTWF0RGF0ZXBpY2tlcjxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLm1vYmlsZSB8fCBldmVudD8uZGVmYXVsdFByZXZlbnRlZCB8fCB0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgLy8gT3BlbiB0aGUgcGlja2VyXG4gICAgdGhpcy5vcGVuRGF0ZVBpY2tlcihudWxsLCBkYXRlUGlja2VyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb3BlblRpbWVQaWNrZXJJZk1vYmlsZShldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLm1vYmlsZSB8fCBldmVudD8uZGVmYXVsdFByZXZlbnRlZCB8fCB0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAvLyBPcGVuIHRoZSBwaWNrZXJcbiAgICB0aGlzLm9wZW5UaW1lUGlja2VyKGV2ZW50KTtcbiAgfVxuXG4gIGZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBjYWxsaW5nIGZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQgLSBldmVudC5kZWZhdWx0UHJldmVudGVkJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIGNhbGxpbmcgZmlsdGVySW5wdXRUZXh0Rm9jdXNFdmVudCcsIGV2ZW50LnJlbGF0ZWRUYXJnZXQpO1xuXG4gICAgLy8gSWdub3JlIGV2ZW50IGZyb20gaW50ZXJuYWwgY29tcG9uZW50XG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJyAvKlRPRE8qLykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIENhbmNlbGxpbmcgZm9jdXMgZXZlbnQnKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgZm9jdXNlZFxuICAgIGlmICh0aGlzLl9mb2N1c2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTtcblxuICAgIC8vIERFQlVHXG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIEVtaXQgZm9jdXMgZXZlbnQnKTtcblxuICAgIC8vIE5lZWQgYSBkZWxheSB0byBwcmV2ZW50IGVhcmx5IGZvY3VzIGV2ZW50LCBqdXN0IGFmdGVyIGEgYmx1ciBldmVudFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSByZXR1cm47IC8vIFNraXAgaWYgYmx1ciBldmVudCByZWNlaXZlZFxuXG4gICAgICB0aGlzLmZvY3VzZWQuZW1pdChldmVudCk7XG4gICAgfSwgMTApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlsdGVySW5wdXRUZXh0Qmx1ckV2ZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICAvLyBERUJVR1xuICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyAnIGZpbHRlcklucHV0VGV4dEJsdXJFdmVudCcsIGV2ZW50KTtcbiAgICBjb25zb2xlLmRlYnVnKHRoaXMubG9nUHJlZml4ICsgJyBmaWx0ZXJJbnB1dFRleHRCbHVyRXZlbnQnLCBldmVudCk7XG5cbiAgICAvLyBJZ25vcmUgZXZlbnQgZnJvbSBpbnRlcm5hbCBjb21wb25lbnRzXG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC5yZWxhdGVkVGFyZ2V0LnRhZ05hbWUgPT09ICdNQVQtT1BUSU9OJyAvKlRPRE8qLykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcblxuICAgICAgLy8gREVCVUdcbiAgICAgIC8vaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5sb2dQcmVmaXggKyBcIiBDYW5jZWxsaW5nIGJsdXIgZXZlbnRcIik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IGJsdXJyZWQ6IHNraXBcbiAgICBpZiAoIXRoaXMuX2ZvY3VzZWQpIHJldHVybjtcblxuICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTtcblxuICAgIC8vIE5lZWQgYSBkZWxheSB0byBwcmV2ZW50IGVhcmx5IGJsdXIgZXZlbnQgd2l0aG91dCB0cmlnZ2VyaW5nIGZvcm1DaGFuZ2UgZXZlbnRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9mb2N1c2VkKSByZXR1cm47IC8vIFNraXAgaWYgZm9jdXMgYWdhaW5cblxuICAgICAgdGhpcy5fb25CbHVyKGV2ZW50KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vbkJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kYXRlQ29udHJvbC50b3VjaGVkIHx8IHRoaXMudGltZUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgY29uc3QgZGF0ZVN0ciA9IHRoaXMuZGF0ZUNvbnRyb2wudmFsdWU7XG5cbiAgICAgIC8vIEF1dG8gZmlsbCBkYXRhIHRpbWUvaW4gY2FzZSBvZiBwYXJ0aWFsIGlucHV0XG4gICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGRhdGVTdHIpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVTdHIgPSB0aGlzLnRpbWVDb250cm9sLnZhbHVlO1xuICAgICAgICBjb25zdCBkYXRlOiBNb21lbnQgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGRhdGVTdHIsIHRoaXMuZGF0ZVBhdHRlcm4pO1xuICAgICAgICBsZXQgdmFsaWREYXRlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aW1lU3RyKSkge1xuICAgICAgICAgIGNvbnN0IGhvdXJQYXJ0cyA9ICh0aW1lU3RyIHx8ICcnKS5zcGxpdCgnOicpO1xuICAgICAgICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChob3VyUGFydHNbMF0gfHwgMCk7XG4gICAgICAgICAgY29uc3QgbWludXRlcyA9IHBhcnNlSW50KGhvdXJQYXJ0c1sxXSB8fCAwKTtcbiAgICAgICAgICBkYXRlLmxvY2FsZSh0aGlzLmxvY2FsZSkuaG91cihob3VyKS5taW51dGUobWludXRlcykuc2Vjb25kcygwKS5taWxsaXNlY29uZCgwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyB0aW1lLCBhbmQgbm90IHJlcXVpcmVkOiBtYXJrXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIERhdGVVdGlscy5tYXJrTm9UaW1lKGRhdGUpO1xuICAgICAgICAgIHZhbGlkRGF0ZSA9IHRoaXMuYWxsb3dOb1RpbWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndyaXRlVmFsdWUoZGF0ZSk7XG5cbiAgICAgICAgaWYgKHZhbGlkRGF0ZSkge1xuICAgICAgICAgIHRoaXMuX2Zvcm1Db250cm9sLnNldFZhbHVlKGRhdGUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYXJrIGNvbnRyb2wgYXMgaW52YWxpZCwgYmVjYXVzZSB0aW1lIGlzIG1pc3NpbmdcbiAgICAgICAgICB0aGlzLl9mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgdGhpcy5fZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgICAgICAgIHZhbGlkRGF0ZTogdHJ1ZSxcbiAgICAgICAgICAgIC4uLnRoaXMuX2Zvcm1Db250cm9sLmVycm9ycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRvdWNoZWRcbiAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuXG4gICAgLy8gRW1pdCBibHVyIGV2ZW50XG4gICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jaGVja0lmVG91Y2hlZCgpIHtcbiAgICBpZiAodGhpcy5kYXRlQ29udHJvbC50b3VjaGVkIHx8IHRoaXMudGltZUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ByZXZlbnRFdmVudChldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKCFldmVudCkgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIG1ldGhvZCAtLSAqL1xuXG4gIHByaXZhdGUgdXBkYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuZGF0ZVBhdHRlcm4gPSB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5EQVRFX1BBVFRFUk4nXSAhPT0gJ0NPTU1PTi5EQVRFX1BBVFRFUk4nID8gdHJhbnNsYXRpb25zWydDT01NT04uREFURV9QQVRURVJOJ10gOiAnREQvTU0vWVlZWSc7XG4gICAgdGhpcy50aW1lUGF0dGVybiA9IHRoaXMudGltZUhvdXJzT25seVxuICAgICAgPyB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5IT1VSX1BBVFRFUk4nXSAhPT0gJ0NPTU1PTi5IT1VSX1BBVFRFUk4nXG4gICAgICAgID8gdHJhbnNsYXRpb25zWydDT01NT04uSE9VUl9QQVRURVJOJ11cbiAgICAgICAgOiAnSEg6MDAnXG4gICAgICA6IHRyYW5zbGF0aW9uc1snQ09NTU9OLlRJTUVfUEFUVEVSTiddICE9PSAnQ09NTU9OLlRJTUVfUEFUVEVSTidcbiAgICAgICAgPyB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5USU1FX1BBVFRFUk4nXVxuICAgICAgICA6ICdISDpNTSc7XG5cbiAgICBjb25zdCBkaXNwbGF5UGF0dGVybiA9XG4gICAgICB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5EQVRFX1RJTUVfUEFUVEVSTiddICE9PSAnQ09NTU9OLkRBVEVfVElNRV9QQVRURVJOJyA/IHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfVElNRV9QQVRURVJOJ10gOiAnTCBMVCc7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5UGF0dGVybihkaXNwbGF5UGF0dGVybik7XG5cbiAgICBjb25zdCBkYXRlUGxhY2Vob2xkZXIgPVxuICAgICAgdHJhbnNsYXRpb25zWydDT01NT04uREFURV9QTEFDRUhPTERFUiddICE9PSAnQ09NTU9OLkRBVEVfUExBQ0VIT0xERVInXG4gICAgICAgID8gdHJhbnNsYXRpb25zWydDT01NT04uREFURV9QTEFDRUhPTERFUiddXG4gICAgICAgIDogdGhpcy5kYXRlUGF0dGVybj8udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnVwZGF0ZURhdGVNYXNrT3B0aW9ucyhkYXRlUGxhY2Vob2xkZXIpO1xuXG4gICAgY29uc3QgdGltZVBsYWNlaG9sZGVyID1cbiAgICAgIHRyYW5zbGF0aW9uc1snQ09NTU9OLlRJTUVfUExBQ0VIT0xERVInXSAhPT0gJ0NPTU1PTi5USU1FX1BMQUNFSE9MREVSJ1xuICAgICAgICA/IHRyYW5zbGF0aW9uc1snQ09NTU9OLlRJTUVfUExBQ0VIT0xERVInXVxuICAgICAgICA6IHRoaXMudGltZVBhdHRlcm4/LnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy51cGRhdGVUaW1lTWFza09wdGlvbnModGltZVBsYWNlaG9sZGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheVBhdHRlcm4oZGlzcGxheVBhdHRlcm46IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRpc3BsYXlQYXR0ZXJuICE9PSBkaXNwbGF5UGF0dGVybikge1xuICAgICAgdGhpcy5kaXNwbGF5UGF0dGVybiA9IGRpc3BsYXlQYXR0ZXJuO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURhdGVNYXNrT3B0aW9ucyhkYXRlUGxhY2Vob2xkZXI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRhdGVQbGFjZWhvbGRlciAhPT0gZGF0ZVBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmRhdGVQbGFjZWhvbGRlciA9IGRhdGVQbGFjZWhvbGRlcjtcblxuICAgICAgY29uc3QgZGF0ZU9wdGlvbnMgPSBtYXNraXRvRGF0ZU9wdGlvbnNHZW5lcmF0b3Ioe1xuICAgICAgICBtb2RlOiB0aGlzLmRhdGVQYXR0ZXJuLnRvTG93ZXJDYXNlKCkgYXMgTWFza2l0b0RhdGVNb2RlLFxuICAgICAgICBzZXBhcmF0b3I6ICcvJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsdWdpbnMsIC8vIHBsdWdpbnMga2VlcHMgY2FyZXQgaW5zaWRlIGFjdHVhbCB2YWx1ZSBhbmQgcmVtb3ZlIHBsYWNlaG9sZGVyIG9uIGJsdXJcbiAgICAgICAgLi4ucGxhY2Vob2xkZXJPcHRpb25zXG4gICAgICAgIC8vIHBhc3MgJ3RydWUnIGFzIHNlY29uZCBhcmd1bWVudCB0byBhZGQgcGx1Z2luIHRvIGhpZGUgcGxhY2Vob2xkZXIgd2hlbiBpbnB1dCBpcyBub3QgZm9jdXNlZFxuICAgICAgfSA9IG1hc2tpdG9XaXRoUGxhY2Vob2xkZXIodGhpcy5kYXRlUGxhY2Vob2xkZXIsIHRydWUpO1xuXG4gICAgICB0aGlzLm1hc2tpdG9EYXRlT3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZGF0ZU9wdGlvbnMsXG4gICAgICAgIHBsdWdpbnM6IHBsdWdpbnMuY29uY2F0KGRhdGVPcHRpb25zLnBsdWdpbnMgfHwgW10pLFxuICAgICAgICBwcmVwcm9jZXNzb3JzOiBbXG4gICAgICAgICAgLy8gQWx3YXlzIHB1dCBpdCBCRUZPUkUgYWxsIG90aGVyIHByZXByb2Nlc3NvcnNcbiAgICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnMucHJlcHJvY2Vzc29ycyxcbiAgICAgICAgICAuLi5kYXRlT3B0aW9ucy5wcmVwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgICBwb3N0cHJvY2Vzc29yczogW1xuICAgICAgICAgIC4uLmRhdGVPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICAgIC8vIEFsd2F5cyBwdXQgaXQgQUZURVIgYWxsIG90aGVyIHBvc3Rwcm9jZXNzb3JzXG4gICAgICAgICAgLi4ucGxhY2Vob2xkZXJPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgfSBhcyBSZXF1aXJlZDxNYXNraXRvT3B0aW9ucz47XG5cbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUaW1lTWFza09wdGlvbnModGltZVBsYWNlaG9sZGVyOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy50aW1lUGxhY2Vob2xkZXIgIT09IHRpbWVQbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy50aW1lUGxhY2Vob2xkZXIgPSB0aW1lUGxhY2Vob2xkZXI7XG5cbiAgICAgIGNvbnN0IHRpbWVPcHRpb25zID0gbWFza2l0b1RpbWVPcHRpb25zR2VuZXJhdG9yKHtcbiAgICAgICAgbW9kZTogdGhpcy50aW1lUGF0dGVybi50b1VwcGVyQ2FzZSgpIGFzIE1hc2tpdG9UaW1lTW9kZSxcbiAgICAgICAgc3RlcDogMSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsdWdpbnMsIC8vIHBsdWdpbnMga2VlcHMgY2FyZXQgaW5zaWRlIGFjdHVhbCB2YWx1ZSBhbmQgcmVtb3ZlIHBsYWNlaG9sZGVyIG9uIGJsdXJcbiAgICAgICAgLi4ucGxhY2Vob2xkZXJPcHRpb25zXG4gICAgICAgIC8vIHBhc3MgJ3RydWUnIGFzIHNlY29uZCBhcmd1bWVudCB0byBhZGQgcGx1Z2luIHRvIGhpZGUgcGxhY2Vob2xkZXIgd2hlbiBpbnB1dCBpcyBub3QgZm9jdXNlZFxuICAgICAgfSA9IG1hc2tpdG9XaXRoUGxhY2Vob2xkZXIodGhpcy50aW1lUGxhY2Vob2xkZXIsIHRydWUpO1xuXG4gICAgICB0aGlzLm1hc2tpdG9UaW1lT3B0aW9ucyA9IHtcbiAgICAgICAgLi4udGltZU9wdGlvbnMsXG4gICAgICAgIHBsdWdpbnM6IHBsdWdpbnMuY29uY2F0KHRpbWVPcHRpb25zLnBsdWdpbnMgfHwgW10pLFxuICAgICAgICBwcmVwcm9jZXNzb3JzOiBbXG4gICAgICAgICAgLy8gQWx3YXlzIHB1dCBpdCBCRUZPUkUgYWxsIG90aGVyIHByZXByb2Nlc3NvcnNcbiAgICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnMucHJlcHJvY2Vzc29ycyxcbiAgICAgICAgICAuLi50aW1lT3B0aW9ucy5wcmVwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgICBwb3N0cHJvY2Vzc29yczogW1xuICAgICAgICAgIC4uLnRpbWVPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICAgIC8vIEFsd2F5cyBwdXQgaXQgQUZURVIgYWxsIG90aGVyIHBvc3Rwcm9jZXNzb3JzXG4gICAgICAgICAgLi4ucGxhY2Vob2xkZXJPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgfSBhcyBSZXF1aXJlZDxNYXNraXRvT3B0aW9ucz47XG5cbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkZvcm1DaGFuZ2UoZGF0ZVN0cjogc3RyaW5nLCB0aW1lU3RyOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwIGlmIGNhbGwgYnkgc2VsZlxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICBpZiAoZGF0ZVN0ciA9PT0gdGhpcy5kYXRlUGxhY2Vob2xkZXIpIHtcbiAgICAgIGRhdGVTdHIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlU3RyID0gbnVsbElmTmlsT3JCbGFuayhkYXRlU3RyKTtcbiAgICB9XG4gICAgaWYgKHRpbWVTdHIgPT09IHRoaXMudGltZVBsYWNlaG9sZGVyKSB7XG4gICAgICB0aW1lU3RyID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZVN0ciA9IG51bGxJZk5pbE9yQmxhbmsodGltZVN0cik7XG4gICAgfVxuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcoYFttYXQtZGF0ZS10aW1lXSBvbkZvcm1DaGFuZ2UoKSAtIGNvbnRyb2xzIHZhbHVlczogYCwgW2RhdGVTdHIsIHRpbWVTdHJdKTtcblxuICAgIGNvbnN0IGluY29tcGxldGVWYWx1ZSA9ICF0aGlzLmFsbG93Tm9UaW1lICYmIGlzTmlsKHRpbWVTdHIpICE9PSBpc05pbChkYXRlU3RyKTtcbiAgICBpZiAoaW5jb21wbGV0ZVZhbHVlIHx8IHRoaXMuZGF0ZUNvbnRyb2wuaW52YWxpZCB8fCB0aGlzLnRpbWVDb250cm9sLmludmFsaWQpIHtcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhgW21hdC1kYXRlLXRpbWVdIG9uRm9ybUNoYW5nZSgpIGVycm9yIC0+IGluY29tcGxldGVWYWx1ZTogJHtpbmNvbXBsZXRlVmFsdWV9YCk7XG5cbiAgICAgIHRoaXMuX2Zvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgIHRoaXMuX2Zvcm1Db250cm9sLnNldEVycm9ycyh7XG4gICAgICAgIHZhbGlkRGF0ZTogaW5jb21wbGV0ZVZhbHVlLFxuICAgICAgICAuLi50aGlzLl9mb3JtQ29udHJvbC5lcnJvcnMsXG4gICAgICAgIC4uLnRoaXMuZGF0ZUNvbnRyb2wuZXJyb3JzLFxuICAgICAgICAuLi50aGlzLnRpbWVDb250cm9sLmVycm9ycyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuZGF0ZUNvbnRyb2wuZGlydHkgfHwgdGhpcy50aW1lQ29udHJvbC5kaXJ0eSkge1xuICAgICAgICB0aGlzLl9mb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgJzAnIGZvciBlbXB0eSBtb250aCAob3RoZXJ3aXNlIG1vbWVudCB3aWxsIHVzZSB0aGUgY3VycmVudCBtb250aClcbiAgICBkYXRlU3RyID0gZGF0ZVN0clxuICAgICAgPy5yZXBsYWNlKC9bXlxcZC9dL2csICcnKSAvLyBLZWVwIG9ubHkgZGlnaXRzIGFuZCBzbGFzaGVzXG4gICAgICAucmVwbGFjZSgnLy8nLCAnLzAvJylcbiAgICAgIC8vIEZvcmNlICcwJyBmb3IgZW1wdHkgeWVhciAob3RoZXJ3aXNlIG1vbWVudCB3aWxsIHVzZSB0aGUgY3VycmVudCB5ZWFyKVxuICAgICAgLnJlcGxhY2UoL1xcLyQvLCAnLzAnKTtcblxuICAgIC8vIFBhcnNlIGRhdGVcbiAgICBjb25zdCBkYXRlOiBNb21lbnQgPSAoZGF0ZVN0ciAmJiB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGRhdGVTdHIsIHRoaXMuZGF0ZVBhdHRlcm4pKSB8fCBudWxsO1xuXG4gICAgLy8gUGFyc2UgdGltZVxuICAgIGNvbnN0IGhvdXJQYXJ0cyA9ICh0aW1lU3RyIHx8ICcnKS5zcGxpdCgnOicpO1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChob3VyUGFydHNbMF0gfHwgJzAnKTtcbiAgICBjb25zdCBtaW51dGVzID0gcGFyc2VJbnQoaG91clBhcnRzWzFdIHx8ICcwJyk7XG4gICAgY29uc3QgZGF0ZVRpbWUgPSBkYXRlXG4gICAgICA/LmxvY2FsZSh0aGlzLmxvY2FsZSkgLy8gc2V0IGFzIHRpbWUgYXMgbG9jYWxlIHRpbWVcbiAgICAgIC5ob3VyKGhvdXIpXG4gICAgICAubWludXRlKG1pbnV0ZXMpIC8vIFNldCBsb2NhbCBob3VyXG4gICAgICAuc2Vjb25kcygwKVxuICAgICAgLm1pbGxpc2Vjb25kKDApIC8vIFJlc2V0IHNlY29uZHMvbWlsbGlzZWNvbmRcbiAgICAgIC51dGMoKTsgLy8gQ29udmVydCB0byBVVEMgKGF2b2lkIFRaIG9mZnNldCBpbiBmaW5hbCBzdHJpbmcpXG5cbiAgICAvLyBTZXQgbW9kZWwgdmFsdWVcbiAgICB0aGlzLmVtaXRDaGFuZ2UoZGF0ZVRpbWUsIGRhdGVTdHIpO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDaGFuZ2UoZGF0ZTogTW9tZW50LCBkZWZhdWx0VmFsdWU/OiBzdHJpbmcpIHtcbiAgICAvLyBDb252ZXJ0IHRvIG1vZGVsIHZhbHVlIChJU08gZGF0ZSBzdHJpbmcpXG4gICAgLy8gSU1QT1JUQU5UOiBJZiBkYXRlIGlzIGludmFsaWQsIHRoZW4ga2VlcCB0aGUgaW52YWxpZCBzdHJpbmcgdmFsdWVcbiAgICAvLyB0byBhbGxvdyBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZSgpIHRvIHJhaXNlIGFuIGVycm9yXG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gZGF0ZT8uaXNWYWxpZCgpID8gdG9EYXRlSVNPU3RyaW5nKGRhdGUpIDogZGVmYXVsdFZhbHVlIHx8IG51bGw7XG5cbiAgICBpZiAodGhpcy5fZm9ybUNvbnRyb2wudmFsdWUgIT09IGNvbnRyb2xWYWx1ZSkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnW21hdC1kYXRlLXRpbWVdIEVtaXQgbmV3IHZhbHVlOiAnICsgY29udHJvbFZhbHVlKTtcblxuICAgICAgLy8gVXBkYXRlIGZvcm1Db250cm9sIHZhbHVlICh0aGlzIGlzIG5lZWQgdG8gdXBkYXRlIGRhdGVQaWNrZXIgYWxzbywgaW4gZGVza3RvcCBtb2RlKVxuICAgICAgaWYgKCF0aGlzLm1vYmlsZSAmJiBkYXRlPy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShjb250cm9sVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hhbmdlcyBjb21lcyBmcm9tIGluc2lkZSBmdW5jdGlvbjogdXNlIHRoZSBjYWxsYmFja1xuICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayhjb250cm9sVmFsdWUpO1xuXG4gICAgICAvLyBDaGVjayBpZiBuZWVkIHRvIHVwZGF0ZSBjb250cm9sc1xuICAgICAgdGhpcy5fY2hlY2tJZlRvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYkluZGV4KCkge1xuICAgIGlmIChpc05pbCh0aGlzLl90YWJpbmRleCkgfHwgdGhpcy5fdGFiaW5kZXggPT09IC0xKSByZXR1cm47IC8vIHNraXBcblxuICAgIC8vIEZvY3VzIHRvIGZpcnN0IGlucHV0XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9tYXRJbnB1dHMuZm9yRWFjaCgoZWxlbWVudFJlZiwgaW5kZXgpID0+IHtcbiAgICAgICAgc2V0VGFiSW5kZXgoZWxlbWVudFJlZiwgdGhpcy5fdGFiaW5kZXggKyBpbmRleCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtBc1RvdWNoZWQob3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLmRhdGVDb250cm9sLm1hcmtBc1RvdWNoZWQob3B0cyk7XG4gICAgdGhpcy50aW1lQ29udHJvbC5tYXJrQXNUb3VjaGVkKG9wdHMpO1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0FzRGlydHkob3B0cz86IGFueSkge1xuICAgIHRoaXMuX2Zvcm1Db250cm9sLm1hcmtBc0RpcnR5KG9wdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPCEtLSByZWFkb25seSAtLT5cbkBpZiAocmVhZG9ubHkpIHtcbiAgPG1hdC1mb3JtLWZpZWxkXG4gICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxuICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgIFtzdWJzY3JpcHRTaXppbmddPVwic3Vic2NyaXB0U2l6aW5nXCJcbiAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXCJcbiAgPlxuICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cblxuICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gdHlwZT1cInRleHRcIiByZWFkb25seSBbZm9ybUNvbnRyb2xdPVwiX2Zvcm1Db250cm9sXCIgLz5cbiAgICA8aW9uLXRleHQ+e3sgX2Zvcm1Db250cm9sLnZhbHVlIHwgZGF0ZUZvcm1hdDogeyBwYXR0ZXJuOiBkaXNwbGF5UGF0dGVybiB9IH19PC9pb24tdGV4dD5cblxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGhpbnRzIC0tPlxuICAgIDxtYXQtaGludCBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJfZm9ybUNvbnRyb2wuaW52YWxpZFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LWhpbnQ+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG59IEBlbHNlIHtcbiAgPCEtLSB3cml0YWJsZSArIHRpbWUgLS0+XG4gIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nIHt7IGFwcGVhcmFuY2UgfX1cIj5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nIG5vLXdyYXBcIj5cbiAgICAgIDwhLS0gRGF5IC0tPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJkYXkgaW9uLW5vLXBhZGRpbmdcIiBbc3R5bGUuLS1idXR0b24tY291bnRdPVwiY2xlYXJhYmxlID8gMiA6IDFcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxuICAgICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxuICAgICAgICAgIFtzdWJzY3JpcHRTaXppbmddPVwiJ2R5bmFtaWMnXCJcbiAgICAgICAgICBbY2xhc3MubWRjLXRleHQtZmllbGQtLWludmFsaWRdPVwiX2Zvcm1Db250cm9sLnRvdWNoZWQgJiYgKGRhdGVDb250cm9sLmludmFsaWQgfHwgX2Zvcm1Db250cm9sLmludmFsaWQpXCJcbiAgICAgICAgICAoY2xpY2spPVwiX29wZW5EYXRlUGlja2VySWZNb2JpbGUoJGV2ZW50LCBkYXRlUGlja2VyKVwiXG4gICAgICAgICAgKGZvY3VzKT1cIl9vcGVuRGF0ZVBpY2tlcklmTW9iaWxlKCRldmVudCwgZGF0ZVBpY2tlcilcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBEYXkgaW5wdXQgKG1vYmlsZSkgLS0+XG4gICAgICAgICAgQGlmIChtb2JpbGUpIHtcbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sIG1kYy10ZXh0LWZpZWxkX19pbnB1dFwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJkYXRlQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIGhpZGRlblxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJfZm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJkYXRlUGlja2VyXCJcbiAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwiZGF0ZVBpY2tlckZpbHRlclwiXG4gICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIl9vbkRhdGVQaWNrZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPCEtLSBEYXkgaW5wdXQgKGRlc2t0b3ApIC0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICNtYXRJbnB1dFxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0LWlucHV0LWVsZW1lbnRcIlxuICAgICAgICAgICAgICBbbWFza2l0b109XCJtYXNraXRvRGF0ZU9wdGlvbnNcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZGF0ZUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZGF0ZVBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cImZpbHRlcklucHV0VGV4dEZvY3VzRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChibHVyKT1cImZpbHRlcklucHV0VGV4dEJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImtleXVwRW50ZXIuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmFycm93RG93bik9XCJvcGVuRGF0ZVBpY2tlcigkZXZlbnQsIGRhdGVQaWNrZXIpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJfcHJldmVudEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIl9mb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgIGhpZGRlblxuICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJkYXRlUGlja2VyXCJcbiAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwiZGF0ZVBpY2tlckZpbHRlclwiXG4gICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIl9vbkRhdGVQaWNrZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EYXRlUGlja2VyKCRldmVudCwgZGF0ZVBpY2tlcilcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIl9mb3JtQ29udHJvbC5kaXNhYmxlZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7IG1vYmlsZSA/ICdkYXRlX3JhbmdlJyA6ICdrZXlib2FyZF9hcnJvd19kb3duJyB9fTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgQGlmIChjbGVhcmFibGUpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2hpZGRlbl09XCJfZm9ybUNvbnRyb2wuZGlzYWJsZWQgfHwgIV9mb3JtQ29udHJvbC52YWx1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPCEtLSBUaGUgZGF0ZSBwaWNrZXIgLS0+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0ZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RvdWNoVWldPVwibW9iaWxlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFydEF0XT1cInN0YXJ0RGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbeFBvc2l0aW9uXT1cIiFtb2JpbGUgPyAnZW5kJyA6IHVuZGVmaW5lZFwiPlxuICAgICAgICAgIDwhLS0gRGF0ZSBwaWNrZXIgYnV0dG9ucyAtLT5cbiAgICAgICAgICBAaWYgKG1vYmlsZSkge1xuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLWFjdGlvbnM+XG4gICAgICAgICAgICAgIDwhLS0gQ2FuY2VsIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgbWF0RGF0ZXBpY2tlckNhbmNlbD5cbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgIDwhLS0gQXBwbHkgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwic29saWRcIiBjb2xvcj1cInRlcnRpYXJ5XCIgbWF0RGF0ZXBpY2tlckFwcGx5PlxuICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+e3sgdGltZUNvbnRyb2wudmFsdWUgfHwgKCdDT01NT04uVElNRScgfCB0cmFuc2xhdGUpIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwiY2hldnJvbi1mb3J3YXJkXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlci1hY3Rpb25zPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgIDwvaW9uLWNvbD5cblxuICAgICAgPCEtLSBIb3VyIC0tPlxuICAgICAgPGlvbi1jb2wgY2xhc3M9XCJob3VyIGlvbi1uby1wYWRkaW5nXCIgW3N0eWxlLi0tYnV0dG9uLWNvdW50XT1cImNvbXBhY3QgPyAwIDogMVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIlxuICAgICAgICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0taW52YWxpZF09XCJfZm9ybUNvbnRyb2wudG91Y2hlZCAmJiAodGltZUNvbnRyb2wuaW52YWxpZCB8fCBfZm9ybUNvbnRyb2wuaW52YWxpZClcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIDxtYXQtbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5USU1FPC9tYXQtbGFiZWw+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBIb3VyIGlucHV0IChtb2JpbGUpIC0tPlxuICAgICAgICAgIEBpZiAobW9iaWxlKSB7XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI21hdElucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbCBtZGMtdGV4dC1maWVsZF9faW5wdXRcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGltZUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRUaW1lXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5UaW1lUGlja2VyKCRldmVudClcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPCEtLSBIaWRlIHRoZSBmaW5hbCAoaGlkZGVuKSBpbnB1dCAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBoaWRkZW5cbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGltZUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICBbbmd4TWF0VGltZXBpY2tlcl09XCJ0aW1lUGlja2VyXCJcbiAgICAgICAgICAgICAgW2Zvcm1hdF09XCIyNFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPCEtLSBIb3VyIGlucHV0IChkZXNrdG9wKSAtLT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGltZUNvbnRyb2xcIlxuICAgICAgICAgICAgICBbbWFza2l0b109XCJtYXNraXRvVGltZU9wdGlvbnNcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1pbnB1dC1lbGVtZW50XCJcbiAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRpbWVQbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFRpbWVcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwia2V5dXBFbnRlci5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuYXJyb3dEb3duKT1cIm9wZW5UaW1lUGlja2VyKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZXNjYXBlKT1cIl9wcmV2ZW50RXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCJmaWx0ZXJJbnB1dFRleHRGb2N1c0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJmaWx0ZXJJbnB1dFRleHRCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleCAhPT0gdW5kZWZpbmVkID8gdGFiaW5kZXggKyAxIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8IS0tIEhpZGUgdGhlIGZpbmFsIChoaWRkZW4pIGlucHV0IC0tPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGhpZGRlblxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0aW1lQ29udHJvbFwiXG4gICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFRpbWVcIlxuICAgICAgICAgICAgICBbbmd4TWF0VGltZXBpY2tlcl09XCJ0aW1lUGlja2VyXCJcbiAgICAgICAgICAgICAgW2Zvcm1hdF09XCIyNFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoIWNvbXBhY3QpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJfZm9ybUNvbnRyb2wuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblRpbWVQaWNrZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj57eyAhY29tcGFjdCAmJiBtb2JpbGUgPyAnYWNjZXNzX3RpbWUnIDogJ2tleWJvYXJkX2Fycm93X2Rvd24nIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8bmd4LW1hdC10aW1lcGlja2VyXG4gICAgICAgICAgICAjdGltZVBpY2tlclxuICAgICAgICAgICAgW2lzRXNjXT1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgW2RlZmF1bHRUaW1lXT1cIicwMDowMCdcIlxuICAgICAgICAgICAgW2NhbmNlbEJ0blRtcGxdPVwidGltZVBpY2tlckNhbmNlbEJ1dHRvblwiXG4gICAgICAgICAgICBbY29uZmlybUJ0blRtcGxdPVwidGltZVBpY2tlck9rQnV0dG9uXCJcbiAgICAgICAgICAgIFtwcmV2ZW50T3ZlcmxheUNsaWNrXT1cIm1vYmlsZVwiXG4gICAgICAgICAgICBbZW5hYmxlS2V5Ym9hcmRJbnB1dF09XCIhbW9iaWxlXCJcbiAgICAgICAgICAgIFtkb3R0ZWRNaW51dGVzSW5HYXBdPVwiZG90dGVkTWludXRlc0luR2FwXCJcbiAgICAgICAgICAgIFtob3Vyc09ubHldPVwidGltZUhvdXJzT25seVwiXG4gICAgICAgICAgICBbYXBwZW5kVG9JbnB1dF09XCIhbW9iaWxlXCJcbiAgICAgICAgICAgICh0aW1lU2V0KT1cIl9vblRpbWVQaWNrZXJDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgY29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgID48L25neC1tYXQtdGltZXBpY2tlcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLWdyaWQ+XG5cbiAgPCEtLSBEbyB0aGUgc2FtZSBhcyBNYXRGb3JtRmllbGQgc2luY2UgYW5ndWxhciAxNSAoc2VlIGNvbXBvbmVudCBzb3VyY2UpLS0+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlclwiXG4gICAgW2NsYXNzLm1hdC1tZGMtZm9ybS1maWVsZC1ib3R0b20tYWxpZ25dPVwic3Vic2NyaXB0U2l6aW5nID09PSAnZml4ZWQnXCJcbiAgICBbY2xhc3MubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC1keW5hbWljLXNpemVdPVwic3Vic2NyaXB0U2l6aW5nID09PSAnZHluYW1pYydcIlxuICA+XG4gICAgQGlmIChfZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBfZm9ybUNvbnRyb2wuZXJyb3JzOyBhcyBlcnJvcnMpIHtcbiAgICAgIDwhLS0gZXJyb3JzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1lcnJvci13cmFwcGVyXCI+XG4gICAgICAgIEBpZiAoZXJyb3JzIHwgbWFwS2V5cyB8IGFycmF5Rmlyc3Q7IGFzIGVycm9yS2V5KSB7XG4gICAgICAgICAgQHN3aXRjaCAoZXJyb3JLZXkpIHtcbiAgICAgICAgICAgIEBjYXNlICgncmVxdWlyZWQnKSB7XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3ZhbGlkRGF0ZScpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfVElNRTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlSXNBZnRlcicpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICB7eyAnRVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfQUZURVInIHwgdHJhbnNsYXRlOiBfZm9ybUNvbnRyb2wuZXJyb3JzLmRhdGVJc0FmdGVyIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlSXNCZWZvcmUnKSB7XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAge3sgJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX0JFRk9SRScgfCB0cmFuc2xhdGU6IF9mb3JtQ29udHJvbC5lcnJvcnMuZGF0ZUlzQmVmb3JlIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdkYXRlUmFuZ2UnKSB7XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3IgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX1JBTkdFPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2RhdGVNYXhEdXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUFYX0RVUkFUSU9OPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2RhdGVNaW5EdXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUlOX0RVUkFUSU9OPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ21zZycpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgX2Zvcm1Db250cm9sLmVycm9ycy5tc2c/LmtleSB8fCBfZm9ybUNvbnRyb2wuZXJyb3JzLm1zZyB8IHRyYW5zbGF0ZTogX2Zvcm1Db250cm9sLmVycm9ycy5tc2c/LnBhcmFtc1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0RXJyb3JUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEVycm9yVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8IS0tIGhpbnRzIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgPC9kaXY+XG59XG5cbjwhLS0gY2FuY2VsIGJ1dHRvbiAtLT5cbjxuZy10ZW1wbGF0ZSAjdGltZVBpY2tlckNhbmNlbEJ1dHRvbj5cbiAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCI+XG4gICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DQU5DRUw8L2lvbi1sYWJlbD5cbiAgPC9pb24tYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBjb25maXJtIGJ1dHRvbiAtLT5cbjxuZy10ZW1wbGF0ZSAjdGltZVBpY2tlck9rQnV0dG9uPlxuICA8aW9uLWJ1dHRvbiBmaWxsPVwic29saWRcIiBjb2xvcj1cInRlcnRpYXJ5XCI+XG4gICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICA8L2lvbi1idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRFcnJvclRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3IsW21hdEVycm9yXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0SGludFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlclwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSxbbWF0SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXNwYWNlclwiPjwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50W2FsaWduPSdlbmQnXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|