@dereekb/dbx-form 10.1.18 → 10.1.20
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/esm2022/lib/form/form.mjs +9 -1
- package/esm2022/lib/formly/field/value/date/datetime.field.component.mjs +53 -20
- package/esm2022/lib/formly/field/value/date/datetime.field.mjs +4 -2
- package/esm2022/lib/formly/formly.form.component.mjs +12 -13
- package/fesm2022/dereekb-dbx-form.mjs +74 -32
- package/fesm2022/dereekb-dbx-form.mjs.map +1 -1
- package/lib/form/form.d.ts +2 -1
- package/lib/formly/field/value/date/_date.scss +1 -0
- package/lib/formly/field/value/date/datetime.field.component.d.ts +23 -0
- package/mapbox/package.json +1 -1
- package/package.json +1 -1
|
@@ -10,6 +10,7 @@ import { dateTimePreset } from './datetime';
|
|
|
10
10
|
import { DbxDateTimeFieldMenuPresetsService } from './datetime.field.service';
|
|
11
11
|
import { DbxDateTimeValueMode, dbxDateTimeInputValueParseFactory, dbxDateTimeIsSameDateTimeFieldValue, dbxDateTimeOutputValueFactory } from './date.value';
|
|
12
12
|
import { streamValueFromControl } from '../../../../form/form.angular.util';
|
|
13
|
+
import { toggleDisableFormControl } from '../../../../form/form';
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
14
15
|
import * as i1 from "./datetime.field.service";
|
|
15
16
|
import * as i2 from "@angular/common";
|
|
@@ -17,14 +18,13 @@ import * as i3 from "@angular/forms";
|
|
|
17
18
|
import * as i4 from "@angular/material/input";
|
|
18
19
|
import * as i5 from "@angular/material/form-field";
|
|
19
20
|
import * as i6 from "@angular/material/divider";
|
|
20
|
-
import * as i7 from "@
|
|
21
|
-
import * as i8 from "@angular/material/
|
|
22
|
-
import * as i9 from "@angular/material/
|
|
23
|
-
import * as i10 from "@angular/material/
|
|
24
|
-
import * as i11 from "@
|
|
25
|
-
import * as i12 from "@ngbracket/ngx-layout/
|
|
26
|
-
import * as i13 from "@
|
|
27
|
-
import * as i14 from "@dereekb/dbx-core";
|
|
21
|
+
import * as i7 from "@angular/material/button";
|
|
22
|
+
import * as i8 from "@angular/material/datepicker";
|
|
23
|
+
import * as i9 from "@angular/material/menu";
|
|
24
|
+
import * as i10 from "@angular/material/icon";
|
|
25
|
+
import * as i11 from "@ngbracket/ngx-layout/flex";
|
|
26
|
+
import * as i12 from "@ngbracket/ngx-layout/extended";
|
|
27
|
+
import * as i13 from "@dereekb/dbx-core";
|
|
28
28
|
export var DbxDateTimeFieldTimeMode;
|
|
29
29
|
(function (DbxDateTimeFieldTimeMode) {
|
|
30
30
|
/**
|
|
@@ -86,6 +86,12 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
86
86
|
return this.dateTimeField.timeOnly;
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
+
get alwaysShowDateInput() {
|
|
90
|
+
return this.props.alwaysShowDateInput ?? true;
|
|
91
|
+
}
|
|
92
|
+
get autofillDateWhenTimeIsPicked() {
|
|
93
|
+
return this.props.autofillDateWhenTimeIsPicked ?? this.alwaysShowDateInput === false;
|
|
94
|
+
}
|
|
89
95
|
get showDateInput() {
|
|
90
96
|
return !this.timeOnly;
|
|
91
97
|
}
|
|
@@ -140,6 +146,7 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
140
146
|
this.dbxDateTimeFieldConfigService = dbxDateTimeFieldConfigService;
|
|
141
147
|
this._sub = new SubscriptionObject();
|
|
142
148
|
this._valueSub = new SubscriptionObject();
|
|
149
|
+
this._autoFillDateSync = new SubscriptionObject();
|
|
143
150
|
this._config = new BehaviorSubject(undefined);
|
|
144
151
|
this.latestConfig$ = this._config.pipe(switchMapMaybeDefault(), distinctUntilChanged(), shareReplay(1));
|
|
145
152
|
this._syncConfigObs = new BehaviorSubject(undefined);
|
|
@@ -153,6 +160,9 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
153
160
|
this.formControl$ = this._formControlObs.pipe(filterMaybe());
|
|
154
161
|
this._cleared = new Subject();
|
|
155
162
|
this._updateTime = new Subject();
|
|
163
|
+
this._resyncTimeInputSub = new SubscriptionObject();
|
|
164
|
+
this._resyncTimeInput = new Subject();
|
|
165
|
+
this.resyncTimeInput$ = this._resyncTimeInput.pipe(debounceTime(200), shareReplay(1));
|
|
156
166
|
this._configUpdateTimeSync = new SubscriptionObject(this.latestConfig$.pipe(skip(1)).subscribe((x) => {
|
|
157
167
|
this._updateTime.next();
|
|
158
168
|
}));
|
|
@@ -289,6 +299,7 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
289
299
|
}), distinctUntilChanged(), shareReplay(1));
|
|
290
300
|
this.dateInputMin$ = this.dateTimePickerConfig$.pipe(map((x) => (x?.limits?.min ?? null)), distinctUntilChanged(isSameDate), shareReplay(1));
|
|
291
301
|
this.dateInputMax$ = this.dateTimePickerConfig$.pipe(map((x) => (x?.limits?.max ?? null)), distinctUntilChanged(isSameDate), shareReplay(1));
|
|
302
|
+
this.dateMinAndMaxIsSameDay$ = combineLatest([this.dateInputMin$, this.dateInputMax$]).pipe(map(([a, b]) => Boolean(a && b) && isSameDateDay(a, b)), distinctUntilChanged(), shareReplay(1));
|
|
292
303
|
this.pickerFilter$ = this.dateTimePickerConfig$.pipe(distinctUntilChanged(), map((x) => {
|
|
293
304
|
if (x) {
|
|
294
305
|
const filter = dateTimeMinuteWholeDayDecisionFunction(x, false);
|
|
@@ -318,6 +329,10 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
318
329
|
this.hasEmptyDisplayValue$ = this.displayValue$.pipe(map((x) => !x), distinctUntilChanged(), shareReplay(1));
|
|
319
330
|
this.presets$ = this._presets.pipe(switchMapMaybeObs(), map((x) => x.map(dateTimePreset)), shareReplay(1));
|
|
320
331
|
this.showClearButton$ = this.hasEmptyDisplayValue$.pipe(map((x) => Boolean(this.showClearButton && !x)), distinctUntilChanged(), shareReplay(1));
|
|
332
|
+
this.canAutofillDateWithOnlyAvailableDate$ = this.dateMinAndMaxIsSameDay$;
|
|
333
|
+
this.showDateInput$ = this.dateMinAndMaxIsSameDay$.pipe(map((dateMinAndMaxIsSameDay) => {
|
|
334
|
+
return this.showDateInput && (this.alwaysShowDateInput || !dateMinAndMaxIsSameDay);
|
|
335
|
+
}), distinctUntilChanged(), shareReplay(1));
|
|
321
336
|
}
|
|
322
337
|
ngOnInit() {
|
|
323
338
|
this._formControlObs.next(this.formControl);
|
|
@@ -339,6 +354,23 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
339
354
|
this.setTime(x);
|
|
340
355
|
});
|
|
341
356
|
*/
|
|
357
|
+
if (this.autofillDateWhenTimeIsPicked) {
|
|
358
|
+
this._autoFillDateSync.subscription = this.canAutofillDateWithOnlyAvailableDate$
|
|
359
|
+
.pipe(switchMap((canAutofill) => {
|
|
360
|
+
if (canAutofill) {
|
|
361
|
+
// when the time updates the first time, set the current min date
|
|
362
|
+
return this._updateTime.pipe(debounceTime(200), switchMap((x) => this.dateInputMin$), filterMaybe());
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
return of(null); // don't show anything
|
|
366
|
+
}
|
|
367
|
+
}))
|
|
368
|
+
.subscribe((autoDate) => {
|
|
369
|
+
if (autoDate != null) {
|
|
370
|
+
this.dateInputCtrl.setValue(autoDate);
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
}
|
|
342
374
|
this._valueSub.subscription = this.valueInSystemTimezone$
|
|
343
375
|
.pipe(map((x) => (x ? isSameDate(x, startOfDay(x)) : false)), distinctUntilChanged(), switchMap((isInputValueAtMidnight) => {
|
|
344
376
|
hasSetMidnightFromInput = false;
|
|
@@ -363,15 +395,9 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
363
395
|
}
|
|
364
396
|
this._timeDate.next(asObservableFromGetter(this.timeDate));
|
|
365
397
|
// Watch for disabled changes so we can propogate them properly.
|
|
366
|
-
this.formControl.registerOnDisabledChange((
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
this.timeInputCtrl.disable({ emitEvent: false });
|
|
370
|
-
}
|
|
371
|
-
else {
|
|
372
|
-
this.dateInputCtrl.enable({ emitEvent: false });
|
|
373
|
-
this.timeInputCtrl.enable({ emitEvent: false });
|
|
374
|
-
}
|
|
398
|
+
this.formControl.registerOnDisabledChange((isDisabled) => {
|
|
399
|
+
toggleDisableFormControl(this.dateInputCtrl, isDisabled);
|
|
400
|
+
toggleDisableFormControl(this.timeInputCtrl, isDisabled);
|
|
375
401
|
});
|
|
376
402
|
const isFullDayField = this.dateTimeField.fullDayFieldName;
|
|
377
403
|
let fullDayFieldCtrl;
|
|
@@ -404,6 +430,9 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
404
430
|
else {
|
|
405
431
|
this._presets.next(this.dbxDateTimeFieldConfigService.configurations$);
|
|
406
432
|
}
|
|
433
|
+
this._resyncTimeInputSub.subscription = this.resyncTimeInput$.pipe(switchMap((x) => this.timeString$.pipe(first()))).subscribe((x) => {
|
|
434
|
+
this.timeInputCtrl.setValue(x, { emitEvent: false });
|
|
435
|
+
});
|
|
407
436
|
}
|
|
408
437
|
ngOnDestroy() {
|
|
409
438
|
super.ngOnDestroy();
|
|
@@ -412,6 +441,8 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
412
441
|
this._config.complete();
|
|
413
442
|
this._configUpdateTimeSync.destroy();
|
|
414
443
|
this._defaultTimezone.complete();
|
|
444
|
+
this._resyncTimeInputSub.destroy();
|
|
445
|
+
this._autoFillDateSync.destroy();
|
|
415
446
|
this._timeDate.complete();
|
|
416
447
|
this._presets.complete();
|
|
417
448
|
this._fullDayControlObs.complete();
|
|
@@ -419,6 +450,7 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
419
450
|
this._formControlObs.complete();
|
|
420
451
|
this._updateTime.complete();
|
|
421
452
|
this._cleared.complete();
|
|
453
|
+
this._resyncTimeInput.complete();
|
|
422
454
|
this._syncConfigObs.complete();
|
|
423
455
|
}
|
|
424
456
|
selectPreset(preset) {
|
|
@@ -523,6 +555,7 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
523
555
|
}
|
|
524
556
|
focusOutTime() {
|
|
525
557
|
this._updateTime.next();
|
|
558
|
+
this._resyncTimeInput.next();
|
|
526
559
|
}
|
|
527
560
|
addTime() {
|
|
528
561
|
this.setFullDay(false);
|
|
@@ -539,10 +572,10 @@ export class DbxDateTimeFieldComponent extends FieldType {
|
|
|
539
572
|
this._cleared.next();
|
|
540
573
|
}
|
|
541
574
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DbxDateTimeFieldMenuPresetsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
542
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DbxDateTimeFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n <!-- Additional spacing -->\n <dbx-button-spacer *ngIf=\"!dateOnly\"></dbx-button-spacer>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"showDateInput ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\">\n <ng-container [ngSwitch]=\"hasEmptyDisplayValue$ | async\">\n <ng-container *ngSwitchCase=\"true\">\n <span class=\"dbx-small\">No date/time set</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"false\">\n <ng-container [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [required]=\"isDateRequired\" [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <button matSuffix *ngIf=\"showClearButton$ | async\" class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { 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: i4.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: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i7.DbxButtonSpacerDirective, selector: "dbx-button-spacer,[dbxButtonSpacer]" }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i9.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i12.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i12.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i13.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i14.DateDistancePipe, name: "dateDistance" }, { kind: "pipe", type: i14.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i14.GetValuePipe, name: "getValue" }] }); }
|
|
575
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DbxDateTimeFieldComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutGap=\"6px grid\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput$ | async\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"(showDateInput$ | async) ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\">\n <ng-container [ngSwitch]=\"hasEmptyDisplayValue$ | async\">\n <ng-container *ngSwitchCase=\"true\">\n <span class=\"dbx-small\">No date/time set</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"false\">\n <ng-container [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [disabled]=\"disabled\" [required]=\"isDateRequired\" [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <button matSuffix *ngIf=\"showClearButton$ | async\" class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { 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: i4.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: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i11.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i11.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i11.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i12.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i13.DateDistancePipe, name: "dateDistance" }, { kind: "pipe", type: i13.TimeDistancePipe, name: "timeDistance" }, { kind: "pipe", type: i13.GetValuePipe, name: "getValue" }] }); }
|
|
543
576
|
}
|
|
544
577
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DbxDateTimeFieldComponent, decorators: [{
|
|
545
578
|
type: Component,
|
|
546
|
-
args: [{ template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n
|
|
579
|
+
args: [{ template: "<div class=\"dbx-datetime-field\" fxLayout=\"row wrap\" fxLayout.xs=\"column wrap\" fxLayoutGap=\"6px grid\" fxLayoutAlign=\"space-evenly stretch\">\n <!-- Date -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"dateOnly ? '100' : '50'\" *ngIf=\"showDateInput$ | async\">\n <ng-container *ngTemplateOutlet=\"dateInputTemplate\"></ng-container>\n </div>\n <!-- Time -->\n <div class=\"dbx-datetime-row\" fxFlex.lt-sm=\"100\" [fxFlex]=\"(showDateInput$ | async) ? '50' : '100'\">\n <ng-container *ngIf=\"showTimeInput$ | async\">\n <ng-container *ngTemplateOutlet=\"timeMenuAndInputTemplate\"></ng-container>\n </ng-container>\n <div *ngIf=\"showAddTime$ | async\" class=\"add-time-button-wrapper\">\n <button mat-button class=\"mat-datepicker-button-highlight dbx-button-spacer add-time-button\" ngClass.lt-sm=\"add-time-button-full\" (click)=\"addTime()\">\n <mat-icon>timer</mat-icon>\n Add Time\n </button>\n </div>\n </div>\n <div *ngIf=\"!hideDateHint\" class=\"dbx-datetime-row dbx-datetime-hint-row\" fxFlex=\"100\">\n <div class=\"dbx-hint\">\n <ng-container [ngSwitch]=\"hasEmptyDisplayValue$ | async\">\n <ng-container *ngSwitchCase=\"true\">\n <span class=\"dbx-small\">No date/time set</span>\n </ng-container>\n <ng-container *ngSwitchCase=\"false\">\n <ng-container [ngSwitch]=\"fullDay$ | async\">\n <small *ngSwitchCase=\"true\">\n <b class=\"dbx-ok\">{{ allDayLabel }}</b>\n {{ displayValue$ | async | date: 'fullDate' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | dateDistance }})\n </small>\n <small *ngSwitchCase=\"false\">\n <ng-container *ngIf=\"displayValue$ | async\">\n <b class=\"dbx-ok\">{{ atTimeLabel }}</b>\n {{ displayValue$ | async | date: 'medium' }} {{ timezoneAbbreviation$ | async }} ({{ displayValue$ | async | timeDistance }})\n </ng-container>\n </small>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n\n<!-- Date Input Template -->\n<ng-template #dateInputTemplate>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ dateLabel }}</mat-label>\n <input #dateInput matInput [disabled]=\"disabled\" [required]=\"isDateRequired\" [min]=\"dateInputMin$ | async\" [max]=\"dateInputMax$ | async\" [matDatepicker]=\"picker\" [matDatepickerFilter]=\"(pickerFilter$ | async) || defaultPickerFilter\" (dateChange)=\"datePicked($event)\" [value]=\"dateValue$ | async\" (keydown)=\"keydownOnDateInput($event)\" />\n <mat-datepicker #picker></mat-datepicker>\n <button matPrefix class=\"dbx-datetime-row-button\" *ngIf=\"!hideDatePicker\" mat-icon-button (click)=\"picker.open()\" [disabled]=\"disabled\">\n <mat-icon>calendar_today</mat-icon>\n </button>\n <button matSuffix *ngIf=\"showClearButton$ | async\" class=\"dbx-datetime-clear-button\" mat-icon-button aria-label=\"clears the date and time menu\" [disabled]=\"disabled\" (click)=\"clearValue()\">\n <mat-icon>clear</mat-icon>\n </button>\n <span matTextSuffix *ngIf=\"!(showTimeInput$ | async)\">\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Time Menu/Input Template -->\n<ng-template #timeMenuAndInputTemplate>\n <mat-menu #timemenu=\"matMenu\">\n <ng-container *ngIf=\"timeMode === 'optional'\">\n <button mat-menu-item (click)=\"removeTime()\">\n <span>Remove Time</span>\n </button>\n <mat-divider></mat-divider>\n </ng-container>\n <ng-container *ngFor=\"let preset of presets$ | async\">\n <button mat-menu-item (click)=\"selectPreset(preset)\">{{ preset.label | getValue }}</button>\n </ng-container>\n </mat-menu>\n <mat-form-field class=\"dbx-datetime-row-field\">\n <mat-label>{{ timeLabel }}</mat-label>\n <input #timeInput matInput [required]=\"isTimeRequired\" [formControl]=\"timeInputCtrl\" (focus)=\"focusTime()\" (focusout)=\"focusOutTime()\" (keydown)=\"keydownOnTimeInput($event)\" />\n <button matPrefix class=\"dbx-datetime-row-button\" mat-icon-button [matMenuTriggerFor]=\"timemenu\" aria-label=\"opens the time menu\" [disabled]=\"disabled\">\n <mat-icon>timer</mat-icon>\n </button>\n <span matTextSuffix>\n <ng-container *ngTemplateOutlet=\"timezoneSuffixTemplate\"></ng-container>\n </span>\n </mat-form-field>\n</ng-template>\n\n<!-- Timezone Suffix -->\n<ng-template #timezoneSuffixTemplate>\n <span *ngIf=\"showTimezone\" class=\"dbx-datetime-timezone dbx-faint\">{{ timezoneAbbreviation$ | async }}</span>\n</ng-template>\n" }]
|
|
547
580
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DbxDateTimeFieldMenuPresetsService }]; } });
|
|
548
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9kYXRldGltZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2RhdGV0aW1lLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0YsT0FBTyxFQUFFLGlCQUFpQixFQUF5Ryx1QkFBdUIsRUFBb0IsbUJBQW1CLEVBQXFELE1BQU0sZUFBZSxDQUFDO0FBQ3JXLE9BQU8sRUFBRSxtQkFBbUIsRUFBd0Isc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBaUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5WixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZPLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBbUIsV0FBVyxF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QztJQUN4QixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQWdCO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDOytHQWhzQlUseUJBQXlCO21HQUF6Qix5QkFBeUIsMkVDak50Qyw0c0pBMkZBOzs0RkRzSGEseUJBQXlCO2tCQUhyQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBNYXliZSwgdHlwZSBSZWFkYWJsZVRpbWVTdHJpbmcsIHR5cGUgQXJyYXlPclZhbHVlLCB0eXBlIElTTzg2MDFEYXRlU3RyaW5nLCBhc0FycmF5LCBmaWx0ZXJNYXliZVZhbHVlcywgdHlwZSBEZWNpc2lvbkZ1bmN0aW9uLCB0eXBlIE1pbGxpc2Vjb25kcywgdHlwZSBUaW1lem9uZVN0cmluZywgdHlwZSBMb2dpY2FsRGF0ZSwgdHlwZSBEYXRlT3JEYXlTdHJpbmcsIGlzSVNPODYwMURheVN0cmluZ1N0YXJ0LCB0eXBlIE1hcEZ1bmN0aW9uLCBtYXBJZGVudGl0eUZ1bmN0aW9uLCBNaW51dGVPZkRheSwgVW5peERhdGVUaW1lTnVtYmVyLCBJU084NjAxRGF5U3RyaW5nIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBkYXRlRnJvbUxvZ2ljYWxEYXRlLCBEYXRlVGltZU1pbnV0ZUNvbmZpZywgRGF0ZVRpbWVNaW51dGVJbnN0YW5jZSwgZ3Vlc3NDdXJyZW50VGltZXpvbmUsIHJlYWRhYmxlVGltZVN0cmluZ1RvRGF0ZSwgdG9Mb2NhbFJlYWRhYmxlVGltZVN0cmluZywgdXRjRGF5Rm9yRGF0ZSwgc2FmZVRvSnNEYXRlLCBmaW5kTWluRGF0ZSwgZmluZE1heERhdGUsIGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMsIGdldFRpbWV6b25lQWJicmV2aWF0aW9uLCBpc1NhbWVEYXRlRGF5LCBkYXRlVGltZXpvbmVVdGNOb3JtYWwsIERhdGVUaW1lem9uZVV0Y05vcm1hbEluc3RhbmNlLCB0b0pzRGF5RGF0ZSwgaXNTYW1lRGF0ZSwgZGF0ZVRpbWVNaW51dGVXaG9sZURheURlY2lzaW9uRnVuY3Rpb24gfSBmcm9tICdAZGVyZWVrYi9kYXRlJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgc2hhcmVSZXBsYXksIG1hcCwgc3RhcnRXaXRoLCB0YXAsIGZpcnN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZGVib3VuY2VUaW1lLCB0aHJvdHRsZVRpbWUsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgU3ViamVjdCwgbWVyZ2UsIGludGVydmFsLCBvZiwgY29tYmluZUxhdGVzdFdpdGgsIGZpbHRlciwgc2tpcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJ0BuZ3gtZm9ybWx5L21hdGVyaWFsJztcbmltcG9ydCB7IEZpZWxkVHlwZUNvbmZpZywgRm9ybWx5RmllbGRQcm9wcyB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IGFkZE1pbnV0ZXMsIHN0YXJ0T2ZEYXksIGFkZERheXMgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBhc09ic2VydmFibGVGcm9tR2V0dGVyLCBmaWx0ZXJNYXliZSwgT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXIsIHNraXBGaXJzdE1heWJlLCBTdWJzY3JpcHRpb25PYmplY3QsIHN3aXRjaE1hcE1heWJlRGVmYXVsdCwgc3dpdGNoTWFwTWF5YmVPYnMgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IERhdGVUaW1lUHJlc2V0LCBEYXRlVGltZVByZXNldENvbmZpZ3VyYXRpb24sIGRhdGVUaW1lUHJlc2V0IH0gZnJvbSAnLi9kYXRldGltZSc7XG5pbXBvcnQgeyBEYnhEYXRlVGltZUZpZWxkTWVudVByZXNldHNTZXJ2aWNlIH0gZnJvbSAnLi9kYXRldGltZS5maWVsZC5zZXJ2aWNlJztcbmltcG9ydCB7IERieERhdGVUaW1lVmFsdWVNb2RlLCBkYnhEYXRlVGltZUlucHV0VmFsdWVQYXJzZUZhY3RvcnksIGRieERhdGVUaW1lSXNTYW1lRGF0ZVRpbWVGaWVsZFZhbHVlLCBkYnhEYXRlVGltZU91dHB1dFZhbHVlRmFjdG9yeSB9IGZyb20gJy4vZGF0ZS52YWx1ZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbFBhdGgsIHN0cmVhbVZhbHVlRnJvbUNvbnRyb2wgfSBmcm9tICcuLi8uLi8uLi8uLi9mb3JtL2Zvcm0uYW5ndWxhci51dGlsJztcblxuZXhwb3J0IGVudW0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlIHtcbiAgLyoqXG4gICAqIFRpbWUgaXMgcmVxdWlyZWQuXG4gICAqL1xuICBSRVFVSVJFRCA9ICdyZXF1aXJlZCcsXG4gIC8qKlxuICAgKiBUaW1lIGlzIG9wdGlvbmFsLlxuICAgKi9cbiAgT1BUSU9OQUwgPSAnb3B0aW9uYWwnLFxuICAvKipcbiAgICogVGltZSBpcyBwZXJtZW5hbnRseSBvZmYuXG4gICAqL1xuICBOT05FID0gJ25vbmUnXG59XG5cbmV4cG9ydCB0eXBlIERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbiA9IE9taXQ8RGF0ZVRpbWVNaW51dGVDb25maWcsICdkYXRlJz47XG5cbmV4cG9ydCB0eXBlIERieERhdGVUaW1lRmllbGRTeW5jVHlwZSA9ICdiZWZvcmUnIHwgJ2FmdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBEYnhEYXRlVGltZUZpZWxkU3luY0ZpZWxkIHtcbiAgLyoqXG4gICAqIEZpZWxkIGtleS9wYXRoIHRvIHN5bmMgd2l0aC9hZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3luY1dpdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEhvdyB0byBzeW5jIGFnYWluc3QgdGhlIG90aGVyIGZpZWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3luY1R5cGU6IERieERhdGVUaW1lRmllbGRTeW5jVHlwZTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgdGltZSBkYXRlIGZpZWxkIHRoYXQgaGFzIGEgcmVmZXJlbmNlIGFuZCBvcHRpb25hbCBtYXAgZnVuY3Rpb24gdG8gbWFwIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWc8SSA9IHVua25vd24+IHtcbiAgcmVhZG9ubHkgcGF0aDogRm9ybUNvbnRyb2xQYXRoO1xuICByZWFkb25seSBtYXBWYWx1ZT86IE1hcEZ1bmN0aW9uPEksIE1heWJlPERhdGVPckRheVN0cmluZz4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcoaW5wdXQ6IHVua25vd24pOiBpbnB1dCBpcyBEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcge1xuICByZXR1cm4gaW5wdXQgIT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiAoaW5wdXQgYXMgRGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnKS5wYXRoID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYnhEYXRlVGltZUZpZWxkUHJvcHMgZXh0ZW5kcyBGb3JtbHlGaWVsZFByb3BzIHtcbiAgLyoqXG4gICAqIEN1c3RvbSBkYXRlIGxhYmVsLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBEYXRlXG4gICAqL1xuICByZWFkb25seSBkYXRlTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0aW1lIGxhYmVsLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBUaW1lXG4gICAqL1xuICByZWFkb25seSB0aW1lTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExhYmVsIHRvIHVzZSBmb3IgdGhlIGRhdGUgaGludCBmb3IgXCJBbGwgRGF5XCIuIERlZmF1bHRzIHRvIFwiQWxsIERheVwiLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsRGF5TGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExhYmVsIHRvIHVzZSBmb3IgdGhlIGRhdGUgaGludCBmb3IgXCJBdFwiLiBEZWZhdWx0cyB0byBcIkF0XCIuXG4gICAqL1xuICByZWFkb25seSBhdFRpbWVMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogVmFsdWUgbW9kZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gREFURVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVNb2RlPzogRGJ4RGF0ZVRpbWVWYWx1ZU1vZGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBkYXRlIGlzIGhpZGRlbiwgYW5kIGF1dG9tYXRpY2FsbHkgdXNlcyB0b2RheS9pbnB1dCBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZU9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdGltZSBjYW4gYmUgYWRkZWQvcmVtb3ZlZCBvcHRpb25hbGx5LlxuICAgKlxuICAgKiBUaGlzIGlzIGlnbm9yZWQgaWYgdGltZU9ubHkgaXMgc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZU1vZGU/OiBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGU7XG5cbiAgLyoqXG4gICAqIE90aGVyIGZvcm0gY29udHJvbCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHdoZXRoZXIgb3Igbm90IGl0IGlzIGEgZnVsbCBkYXkuXG4gICAqXG4gICAqIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIGlmIHRpbWUgaXMgb3B0aW9uYWwuXG4gICAqXG4gICAqIFdoZW4gdGltZSBpcyBvZmYsIHRoZSBmaWVsZCBpcyBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bGxEYXlGaWVsZE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHBhc3MgdGhlIGRhdGUgdmFsdWUgYXMgYSBVVEMgZGF0ZSwgb3IgYSBkYXRlIGluIHRoZSBjdXJyZW50IHRpbWV6b25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVsbERheUluVVRDPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3Qgb3QgaGlkZSB0aGUgZGF0ZSBoaW50IGluZm8gY29udGVudC5cbiAgICpcbiAgICogRmFsc2UgYnkgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgaGlkZURhdGVIaW50PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gaGlkZSB0aGUgZGF0ZS9jYWxlbmRhciBwaWNrZXIuXG4gICAqL1xuICByZWFkb25seSBoaWRlRGF0ZVBpY2tlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwaWNrZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGlja2VyQ29uZmlnPzogT2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8RGJ4RGF0ZVRpbWVQaWNrZXJDb25maWd1cmF0aW9uPjtcblxuICAvKipcbiAgICogVXNlZCBmb3Igc3luY2luZyB3aXRoIG9uZSBvciBtb3JlIGZpZWxkcyB3aXRoIGEgRGF0ZSB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGdldFN5bmNGaWVsZHNPYnM/OiAoKSA9PiBPYnNlcnZhYmxlPEFycmF5T3JWYWx1ZTxEYnhEYXRlVGltZUZpZWxkU3luY0ZpZWxkPj47XG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgVGhlIGlucHV0IHRpbWV6b25lIHRvIGRlZmF1bHQgdG8uXG4gICAqXG4gICAqIElnbm9yZWQgaWYgZnVsbERheUluVVRDIGlzIHRydWUuXG4gICAqL1xuICByZWFkb25seSB0aW1lem9uZT86IE1heWJlPE9ic2VydmFibGVPclZhbHVlR2V0dGVyPE1heWJlPFRpbWV6b25lU3RyaW5nPj4+O1xuXG4gIC8qKlxuICAgKiAoT3B0aW9uYWwpIFRoZSBkYXRlIHRvIGFwcGx5IHRoZSB0aW1lIHRvLlxuICAgKlxuICAgKiBUaGUgdGltZXpvbmUgYWJicnZpYXRpb24gd2lsbCBhbHNvIHVzZSB0aGlzIGRhdGUgd2hlbiB1c2luZyB0aGUgdGltZS1vbmx5IG1vZGUuXG4gICAqL1xuICByZWFkb25seSB0aW1lRGF0ZT86IE1heWJlPE9ic2VydmFibGVPclZhbHVlR2V0dGVyPE1heWJlPERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyB8IEZvcm1Db250cm9sUGF0aCB8IERhdGVPckRheVN0cmluZz4+PjtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSB0aGUgdGltZXpvbmUuIFRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3dUaW1lem9uZT86IE1heWJlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcHJlc2V0cyB0byBzaG93IGluIHRoZSBkcm9wZG93bi5cbiAgICovXG4gIHJlYWRvbmx5IHByZXNldHM/OiBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYXRlVGltZVByZXNldENvbmZpZ3VyYXRpb25bXT47XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGluIG1zIHRvIHByZXZlbnQgb3V0cHV0IGZyb20gZ29pbmcgb3V0IHdoZW4gdGhlIGlucHV0IHZhbHVlIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBpbnB1dE91dHB1dERlYm91bmNlVGltZT86IE1pbGxpc2Vjb25kcztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSB0aGUgY2xlYXIgZGF0ZSBidXR0b24uIFRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3dDbGVhckJ1dHRvbj86IE1heWJlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgdG8gYWRkL3N1YnRyYWN0IHdoZW4gdXNpbmcgdGhlIGFycm93IGtleXMuXG4gICAqL1xuICByZWFkb25seSBtaW51dGVTdGVwPzogTWF5YmU8bnVtYmVyPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYnhEYXRlVGltZUZpZWxkU3luY1BhcnNlZEZpZWxkIGV4dGVuZHMgUGljazxEYnhEYXRlVGltZUZpZWxkU3luY0ZpZWxkLCAnc3luY1R5cGUnPiB7XG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDxNYXliZTxEYXRlIHwgSVNPODYwMURhdGVTdHJpbmc+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN5bmNDb25maWdWYWx1ZU9icyhwYXJzZUNvbmZpZ3NPYnM6IE9ic2VydmFibGU8RGJ4RGF0ZVRpbWVGaWVsZFN5bmNQYXJzZWRGaWVsZFtdPiwgdHlwZTogRGJ4RGF0ZVRpbWVGaWVsZFN5bmNUeXBlKTogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4ge1xuICByZXR1cm4gcGFyc2VDb25maWdzT2JzLnBpcGUoXG4gICAgc3dpdGNoTWFwKCh4KSA9PiB7XG4gICAgICBjb25zdCBjb25maWcgPSB4LmZpbmQoKHkpID0+IHkuc3luY1R5cGUgPT09IHR5cGUpO1xuICAgICAgbGV0IHJlc3VsdDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD47XG5cbiAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgY29uc3QgeyBjb250cm9sIH0gPSBjb25maWc7XG4gICAgICAgIHJlc3VsdCA9IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoKGNvbnRyb2wudmFsdWUpLFxuICAgICAgICAgIG1hcCgoeCkgPT4gc2FmZVRvSnNEYXRlKHgpID8/IG51bGwpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBvZihudWxsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG59XG5cbmNvbnN0IFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUU6IE1pbGxpc2Vjb25kcyA9IDEwO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICdkYXRldGltZS5maWVsZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGJ4RGF0ZVRpbWVGaWVsZENvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZTxGaWVsZFR5cGVDb25maWc8RGJ4RGF0ZVRpbWVGaWVsZFByb3BzPj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX3N1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfdmFsdWVTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG5cbiAgcHJpdmF0ZSBfY29uZmlnID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBsYXRlc3RDb25maWckID0gdGhpcy5fY29uZmlnLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICBwcml2YXRlIF9zeW5jQ29uZmlnT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPEFycmF5T3JWYWx1ZTxEYnhEYXRlVGltZUZpZWxkU3luY0ZpZWxkPj4+Pih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgX2RlZmF1bHRUaW1lem9uZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+Pj4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfdGltZURhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8TWF5YmU8RGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHwgRm9ybUNvbnRyb2xQYXRoIHwgRGF0ZU9yRGF5U3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9wcmVzZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPYnNlcnZhYmxlPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPj4ob2YoW10pKTtcblxuICBwcml2YXRlIF9mdWxsRGF5SW5wdXRDdHJsPzogRm9ybUNvbnRyb2w7XG4gIHByaXZhdGUgX2Z1bGxEYXlDb250cm9sT2JzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxBYnN0cmFjdENvbnRyb2w8Ym9vbGVhbj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmdWxsRGF5Q29udHJvbCQgPSB0aGlzLl9mdWxsRGF5Q29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHByaXZhdGUgX29mZnNldCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSBfZm9ybUNvbnRyb2xPYnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPEFic3RyYWN0Q29udHJvbDxNYXliZTxEYXRlPj4+Pih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb3JtQ29udHJvbCQgPSB0aGlzLl9mb3JtQ29udHJvbE9icy5waXBlKGZpbHRlck1heWJlKCkpO1xuXG4gIHByaXZhdGUgX2NsZWFyZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF91cGRhdGVUaW1lID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9jb25maWdVcGRhdGVUaW1lU3luYyA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoXG4gICAgdGhpcy5sYXRlc3RDb25maWckLnBpcGUoc2tpcCgxKSkuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgICB9KVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+ID0gdGhpcy5fZGVmYXVsdFRpbWV6b25lLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnBpcGUoXG4gICAgbWFwKChkZWZhdWx0VGltZXpvbmUpID0+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0VGltZXpvbmUgPz8gZ3Vlc3NDdXJyZW50VGltZXpvbmUoKTtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZXpvbmVJbnN0YW5jZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+PiA9IHRoaXMudGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh0aW1lem9uZSkgPT4gKHRpbWV6b25lID8gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKHsgdGltZXpvbmUgfSkgOiB1bmRlZmluZWQpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWVEYXRlJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSB0aGlzLl90aW1lRGF0ZS5waXBlKFxuICAgIHN3aXRjaE1hcE1heWJlRGVmYXVsdCgpLFxuICAgIHN3aXRjaE1hcCgoeCkgPT4ge1xuICAgICAgbGV0IG9iczogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj47XG5cbiAgICAgIGlmICh4KSB7XG4gICAgICAgIC8vIGlmIHRoZSBzdHJpbmcgaXMgbm90IGEgZGF0ZSBzdHJpbmcsIHRoZW4gdHJlYXQgaXQgYXMgYSBwYXRoXG4gICAgICAgIGlmICgodHlwZW9mIHggPT09ICdzdHJpbmcnICYmICFpc0lTTzg2MDFEYXlTdHJpbmdTdGFydCh4KSkgfHwgaXNEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcoeCkpIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIG1hcFZhbHVlIH06IERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyA9IHR5cGVvZiB4ID09PSAnc3RyaW5nJyA/IHsgcGF0aDogeCB9IDogeDtcbiAgICAgICAgICBvYnMgPVxuICAgICAgICAgICAgc3RyZWFtVmFsdWVGcm9tQ29udHJvbDxEYXRlT3JEYXlTdHJpbmc+KHRoaXMuZm9ybSwgcGF0aCk/LnBpcGUoXG4gICAgICAgICAgICAgIG1hcChtYXBWYWx1ZSA/PyBtYXBJZGVudGl0eUZ1bmN0aW9uKCkpLFxuICAgICAgICAgICAgICBtYXAoKHgpID0+ICh4ID8gdG9Kc0RheURhdGUoeCkgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgKSA/PyBvZih1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9icyA9IG9mKHRvSnNEYXlEYXRlKHgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzID0gb2YodW5kZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icztcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHZhbHVlSW5TeXN0ZW1UaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gdGhpcy5mb3JtQ29udHJvbCQucGlwZShcbiAgICBtYXAoKGNvbnRyb2wpID0+IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoPE1heWJlPERhdGUgfCBJU084NjAxRGF5U3RyaW5nIHwgTWludXRlT2ZEYXkgfCBVbml4RGF0ZVRpbWVOdW1iZXI+Pihjb250cm9sLnZhbHVlKSwgc2hhcmVSZXBsYXkoMSkpKSxcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnRpbWV6b25lSW5zdGFuY2UkKSxcbiAgICBzd2l0Y2hNYXAoKFt4LCB0aW1lem9uZUluc3RhbmNlXSkgPT4ge1xuICAgICAgcmV0dXJuIHgucGlwZShtYXAoZGJ4RGF0ZVRpbWVJbnB1dFZhbHVlUGFyc2VGYWN0b3J5KHRoaXMudmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlKSkpO1xuICAgIH0pLFxuICAgIHRocm90dGxlVGltZSgyMCwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pLCAvLyB0aHJvdHRsZSBpbmNvbWluZyB2YWx1ZXMgYW5kIHRpbWV6b25lIGNoYW5nZXNcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHJlZnJlc2hJbnRlcmFsJCA9IGludGVydmFsKDEwICogMTAwMCk7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gdHJpZ2dlci9kaXNwbGF5IHZpc3VhbCB1cGRhdGVzIChzcGVjaWZpY2FsbHkgb24gdGltZURpc3RhbmNlLCBldGMuKS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlWYWx1ZSQgPSB0aGlzLnJlZnJlc2hJbnRlcmFsJC5waXBlKFxuICAgIC8vIGV2ZXJ5IDEwIHNlY29uZHMsIHJlZnJlc2ggdy9pbnRlcnZhbFxuICAgIHN0YXJ0V2l0aCgwKSxcbiAgICBtYXAoKCkgPT4gbmV3IERhdGUoKS5nZXRNaW51dGVzKCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgdGFwKCgpID0+IHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCkpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZVN0cmluZyQ6IE9ic2VydmFibGU8UmVhZGFibGVUaW1lU3RyaW5nIHwgJyc+ID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IHRvTG9jYWxSZWFkYWJsZVRpbWVTdHJpbmcoeCkgOiAnJykpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlSW5wdXRDdHJsID0gbmV3IEZvcm1Db250cm9sPE1heWJlPERhdGU+PihudWxsLCB7XG4gICAgdmFsaWRhdG9yczogW11cbiAgfSk7XG5cbiAgcmVhZG9ubHkgdGltZUlucHV0Q3RybCA9IG5ldyBGb3JtQ29udHJvbDxNYXliZTxSZWFkYWJsZVRpbWVTdHJpbmc+PihudWxsLCB7XG4gICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucGF0dGVybigvXihub3cpJHxeKFswLTldfCgwWzAtOV0pfCgxWzAtOV0pfCgyWzAtM10pKSg6KT8oWzAtNV1bMC05XSk/KFxccyk/KFthcEFQXVtNbV0pPyhcXFxccykqJC8pXVxuICB9KTtcblxuICBnZXQgZGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZGF0ZUxhYmVsID8/ICdEYXRlJztcbiAgfVxuXG4gIGdldCB0aW1lTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy50aW1lTGFiZWwgPz8gJ1RpbWUnO1xuICB9XG5cbiAgZ2V0IGFsbERheUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYWxsRGF5TGFiZWwgPz8gJ0FsbCBEYXknO1xuICB9XG5cbiAgZ2V0IGF0VGltZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYXRUaW1lTGFiZWwgPz8gJ0F0JztcbiAgfVxuXG4gIGdldCBkYXRlT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gIH1cblxuICBnZXQgZGF0ZVRpbWVGaWVsZCgpOiBEYnhEYXRlVGltZUZpZWxkUHJvcHMge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzO1xuICB9XG5cbiAgZ2V0IHRpbWVPbmx5KCk6IE1heWJlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0aW1lVmFsdWVzT25seSA9IHRoaXMudmFsdWVNb2RlID09PSBEYnhEYXRlVGltZVZhbHVlTW9kZS5NSU5VVEVfT0ZfREFZO1xuXG4gICAgaWYgKHRpbWVWYWx1ZXNPbmx5KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGaWVsZC50aW1lT25seTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2hvd0RhdGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudGltZU9ubHk7XG4gIH1cblxuICBnZXQgdmFsdWVNb2RlKCk6IERieERhdGVUaW1lVmFsdWVNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy52YWx1ZU1vZGUgPz8gRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUuREFURTtcbiAgfVxuXG4gIGdldCB0aW1lTW9kZSgpOiBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUge1xuICAgIGNvbnN0IGRhdGVWYWx1ZXNPbmx5ID0gdGhpcy52YWx1ZU1vZGUgPT09IERieERhdGVUaW1lVmFsdWVNb2RlLkRBWV9TVFJJTkc7XG5cbiAgICBpZiAoZGF0ZVZhbHVlc09ubHkpIHtcbiAgICAgIHJldHVybiBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudGltZU9ubHkgPyBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQgOiB0aGlzLmRhdGVUaW1lRmllbGQudGltZU1vZGUgPz8gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0RhdGVSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5yZXF1aXJlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCBpc1RpbWVSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0RhdGVSZXF1aXJlZCAmJiB0aGlzLnRpbWVNb2RlID09PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogTWF5YmU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuZGVzY3JpcHRpb247XG4gIH1cblxuICBnZXQgaGlkZURhdGVIaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLmhpZGVEYXRlSGludCA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCBoaWRlRGF0ZVBpY2tlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5oaWRlRGF0ZVBpY2tlciA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCB0aW1lem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lem9uZTtcbiAgfVxuXG4gIGdldCB0aW1lRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lRGF0ZTtcbiAgfVxuXG4gIGdldCBzaG93VGltZXpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd1RpbWV6b25lID8/IHRydWU7XG4gIH1cblxuICBnZXQgcHJlc2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5wcmVzZXRzO1xuICB9XG5cbiAgZ2V0IHNob3dDbGVhckJ1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5zaG93Q2xlYXJCdXR0b247XG4gIH1cblxuICBnZXQgbWludXRlU3RlcCgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5taW51dGVTdGVwID8/IHRoaXMuZmllbGQucHJvcHMuc3RlcCA/PyA1O1xuICB9XG5cbiAgcmVhZG9ubHkgZnVsbERheSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmZ1bGxEYXlDb250cm9sJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgoY29udHJvbC52YWx1ZSkpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd1RpbWVJbnB1dCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmZ1bGxEYXkkLnBpcGUobWFwKCh4KSA9PiAheCAmJiB0aGlzLnRpbWVNb2RlICE9PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORSkpO1xuXG4gIHJlYWRvbmx5IHNob3dBZGRUaW1lJCA9IHRoaXMuc2hvd1RpbWVJbnB1dCQucGlwZShcbiAgICBtYXAoKHgpID0+ICF4ICYmIHRoaXMudGltZU1vZGUgPT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5PUFRJT05BTCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0ZSQgPSB0aGlzLmRhdGVJbnB1dEN0cmwudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZGF0ZUlucHV0Q3RybC52YWx1ZSksIHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkgZGF0ZSQgPSB0aGlzLmN1cnJlbnREYXRlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSB0aW1lem9uZUFiYnJldmlhdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmN1cnJlbnREYXRlJCwgdGhpcy50aW1lem9uZSQsIHRoaXMudGltZURhdGUkXSkucGlwZShcbiAgICBtYXAoKFtkYXRlLCB0aW1lem9uZSwgdGltZURhdGVdKSA9PiBnZXRUaW1lem9uZUFiYnJldmlhdGlvbih0aW1lem9uZSwgdGltZURhdGUgPz8gZGF0ZSA/PyBuZXcgRGF0ZSgpKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVWYWx1ZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gbWVyZ2UodGhpcy5kYXRlJCwgdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoc2tpcEZpcnN0TWF5YmUoKSkpLnBpcGUoXG4gICAgbWFwKCh4OiBNYXliZTxEYXRlPikgPT4gKHggPyBzdGFydE9mRGF5KHgpIDogbnVsbCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkPE1heWJlPERhdGU+Pihpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWVJbnB1dCQ6IE9ic2VydmFibGU8UmVhZGFibGVUaW1lU3RyaW5nPiA9IHRoaXMuX3VwZGF0ZVRpbWUucGlwZShcbiAgICBkZWJvdW5jZVRpbWUoNSksXG4gICAgbWFwKCgpID0+IHRoaXMudGltZUlucHV0Q3RybC52YWx1ZSB8fCAnJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIHJlYWRvbmx5IHN5bmNDb25maWdPYnMkID0gdGhpcy5fc3luY0NvbmZpZ09icy5waXBlKHN3aXRjaE1hcE1heWJlRGVmYXVsdCgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgcGFyc2VkU3luY0NvbmZpZ3MkOiBPYnNlcnZhYmxlPERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGRbXT4gPSB0aGlzLnN5bmNDb25maWdPYnMkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBsZXQgcGFyc2VkOiBEYnhEYXRlVGltZUZpZWxkU3luY1BhcnNlZEZpZWxkW107XG5cbiAgICAgIGlmICh4KSB7XG4gICAgICAgIHBhcnNlZCA9IGZpbHRlck1heWJlVmFsdWVzKFxuICAgICAgICAgIGFzQXJyYXkoeCkubWFwKCh5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh5LnN5bmNXaXRoKTtcblxuICAgICAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLFxuICAgICAgICAgICAgICAgIC4uLnlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZCA9IFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3luY0NvbmZpZ0JlZm9yZVZhbHVlJDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4gPSBzeW5jQ29uZmlnVmFsdWVPYnModGhpcy5wYXJzZWRTeW5jQ29uZmlncyQsICdiZWZvcmUnKTtcbiAgcmVhZG9ubHkgc3luY0NvbmZpZ0FmdGVyVmFsdWUkOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiA9IHN5bmNDb25maWdWYWx1ZU9icyh0aGlzLnBhcnNlZFN5bmNDb25maWdzJCwgJ2FmdGVyJyk7XG5cbiAgcmVhZG9ubHkgaXNUaW1lQ2xlYXJlZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmN1cnJlbnREYXRlJCwgdGhpcy5fdGltZURhdGUucGlwZShzdGFydFdpdGgobnVsbCkpXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFtkYXRlLCB0aW1lXSkgPT4ge1xuICAgICAgY29uc3QgaXNUaW1lQ2xlYXJlZCA9IEJvb2xlYW4oIWRhdGUgJiYgIXRpbWUpO1xuICAgICAgcmV0dXJuIHRoaXMuX2NsZWFyZWQucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHRydWUpLFxuICAgICAgICBzdGFydFdpdGgoaXNUaW1lQ2xlYXJlZClcbiAgICAgICk7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHJhd0RhdGVUaW1lJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9jb25maWcucGlwZShcbiAgICAgIGZpcnN0KCksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gKHRoaXMudGltZU9ubHkgPyBvZihudWxsKSA6IHRoaXMuZGF0ZVZhbHVlJCkpXG4gICAgKSxcbiAgICB0aGlzLnRpbWVJbnB1dCQucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgIHRoaXMuZnVsbERheSQsXG4gICAgdGhpcy50aW1lRGF0ZSQsXG4gICAgdGhpcy5pc1RpbWVDbGVhcmVkJFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2RhdGUsIHRpbWVTdHJpbmcsIGZ1bGxEYXksIHRpbWVEYXRlLCBpc1RpbWVDbGVhcmVkXSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogTWF5YmU8RGF0ZT47XG5cbiAgICAgIGlmICghaXNUaW1lQ2xlYXJlZCkge1xuICAgICAgICBpZiAoIWRhdGUgfHwgdGhpcy50aW1lT25seSkge1xuICAgICAgICAgIGRhdGUgPSB0aW1lRGF0ZSA/PyBuZXcgRGF0ZSgpOyAvLyB1c2UgdGhlIHRpbWUgZGF0ZSwgb3IgZGVmYXVsdCB0byB0aGUgY3VycmVudCBkYXlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgaWYgKGZ1bGxEYXkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGVUaW1lRmllbGQuZnVsbERheUluVVRDKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHV0Y0RheUZvckRhdGUoZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBzdGFydE9mRGF5KGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGltZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgICAgcmVhZGFibGVUaW1lU3RyaW5nVG9EYXRlKHRpbWVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgICAgIHVzZVN5c3RlbVRpbWV6b25lOiB0cnVlXG4gICAgICAgICAgICAgIH0pID8/IGRhdGU7XG4gICAgICAgICAgfSBlbHNlIGlmICghdGhpcy50aW1lT25seSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZU1vZGUgIT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRCkge1xuICAgICAgICAgICAgICAvLyBvbmx5IGF1dG9maWxsIHRoZSBkYXRlIGlmIHRoZSB0aW1lIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAoYW5kIHRoZSB0aW1lIHN0cmluZyBpcyBlbXB0eSlcbiAgICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVUaW1lUGlja2VyQ29uZmlnJDogT2JzZXJ2YWJsZTxNYXliZTxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2NvbmZpZy5waXBlKHN3aXRjaE1hcE1heWJlT2JzKCkpLCB0aGlzLnN5bmNDb25maWdCZWZvcmVWYWx1ZSQsIHRoaXMuc3luY0NvbmZpZ0FmdGVyVmFsdWUkXSkucGlwZShcbiAgICBtYXAoKFt4LCBkYXRlSW5wdXRNaW4sIGRhdGVJbnB1dE1heF0pID0+IHtcbiAgICAgIGxldCByZXN1bHQ6IE1heWJlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4gPSB4O1xuXG4gICAgICBpZiAoZGF0ZUlucHV0TWluICE9IG51bGwgfHwgZGF0ZUlucHV0TWF4ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtaW46IGxpbWl0TWluLCBtYXg6IGxpbWl0TWF4IH0gPSB4Py5saW1pdHMgPz8ge307XG4gICAgICAgIGNvbnN0IG1pbiA9IGZpbmRNaW5EYXRlKFtkYXRlSW5wdXRNaW4sIGRhdGVGcm9tTG9naWNhbERhdGUobGltaXRNaW4pXSk7XG4gICAgICAgIGNvbnN0IG1heCA9IGZpbmRNYXhEYXRlKFtkYXRlSW5wdXRNYXgsIGRhdGVGcm9tTG9naWNhbERhdGUobGltaXRNYXgpXSk7XG5cbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgIC4uLngsXG4gICAgICAgICAgbGltaXRzOiB7XG4gICAgICAgICAgICAuLi54Py5saW1pdHMsXG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBtYXhcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVJbnB1dE1pbiQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4Py5saW1pdHM/Lm1pbiA/PyBudWxsKSBhcyBEYXRlIHwgbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQ8RGF0ZSB8IG51bGw+KGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZUlucHV0TWF4JDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4gPSB0aGlzLmRhdGVUaW1lUGlja2VyQ29uZmlnJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHg/LmxpbWl0cz8ubWF4ID8/IG51bGwpIGFzIERhdGUgfCBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxEYXRlIHwgbnVsbD4oaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwaWNrZXJGaWx0ZXIkOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZSB8IG51bGw+PiA9IHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGRhdGVUaW1lTWludXRlV2hvbGVEYXlEZWNpc2lvbkZ1bmN0aW9uKHgsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuICh4OiBEYXRlIHwgbnVsbCkgPT4gKHggIT0gbnVsbCA/IGZpbHRlcih4KSA6IHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHRydWU7XG4gICAgICB9XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkZWZhdWx0UGlja2VyRmlsdGVyOiBEZWNpc2lvbkZ1bmN0aW9uPERhdGUgfCBudWxsPiA9ICgpID0+IHRydWU7XG5cbiAgcmVhZG9ubHkgdGltZU91dHB1dCQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gY29tYmluZUxhdGVzdChbdGhpcy5yYXdEYXRlVGltZSQsIHRoaXMuX29mZnNldCwgdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyRdKS5waXBlKFxuICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChjdXJyZW50LCBuZXh0KSA9PiBjdXJyZW50WzBdID09PSBuZXh0WzBdICYmIG5leHRbMV0gPT09IDAgJiYgY3VycmVudFsyXSA9PT0gbmV4dFsyXSksXG4gICAgdGFwKChbLCBzdGVwc09mZnNldF0pID0+IChzdGVwc09mZnNldCA/IHRoaXMuX29mZnNldC5uZXh0KDApIDogMCkpLFxuICAgIG1hcCgoW2RhdGUsIHN0ZXBzT2Zmc2V0LCBjb25maWddKSA9PiB7XG4gICAgICBpZiAoZGF0ZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIHJvdW5kRG93blRvTWludXRlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRhdGUgPSBpbnN0YW5jZS5jbGFtcChkYXRlKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IHN0ZXBzT2Zmc2V0ICogdGhpcy5taW51dGVTdGVwO1xuXG4gICAgICAgIGlmIChtaW51dGVzICE9IDApIHtcbiAgICAgICAgICBkYXRlID0gYWRkTWludXRlcyhkYXRlLCBtaW51dGVzKTtcbiAgICAgICAgICBkYXRlID0gaW5zdGFuY2UuY2xhbXAoZGF0ZSk7IC8vIGNsYW1wIHRoZSBkYXRlIGFnYWluXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBoYXNFbXB0eURpc3BsYXlWYWx1ZSQgPSB0aGlzLmRpc3BsYXlWYWx1ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICF4KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgcHJlc2V0cyQ6IE9ic2VydmFibGU8RGF0ZVRpbWVQcmVzZXRbXT4gPSB0aGlzLl9wcmVzZXRzLnBpcGUoXG4gICAgc3dpdGNoTWFwTWF5YmVPYnMoKSxcbiAgICBtYXAoKHg6IERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdKSA9PiB4Lm1hcChkYXRlVGltZVByZXNldCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0NsZWFyQnV0dG9uJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaGFzRW1wdHlEaXNwbGF5VmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBCb29sZWFuKHRoaXMuc2hvd0NsZWFyQnV0dG9uICYmICF4KSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHJlYWRvbmx5IGRieERhdGVUaW1lRmllbGRDb25maWdTZXJ2aWNlOiBEYnhEYXRlVGltZUZpZWxkTWVudVByZXNldHNTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2Zvcm1Db250cm9sT2JzLm5leHQodGhpcy5mb3JtQ29udHJvbCk7XG5cbiAgICBjb25zdCBpbnB1dFBpY2tlckNvbmZpZyA9IHRoaXMuZGF0ZVRpbWVGaWVsZC5waWNrZXJDb25maWc7XG4gICAgdGhpcy5fY29uZmlnLm5leHQoaW5wdXRQaWNrZXJDb25maWcgPyBhc09ic2VydmFibGVGcm9tR2V0dGVyKGlucHV0UGlja2VyQ29uZmlnKSA6IG9mKHt9KSk7XG4gICAgdGhpcy5fc3luY0NvbmZpZ09icy5uZXh0KHRoaXMuZGF0ZVRpbWVGaWVsZC5nZXRTeW5jRmllbGRzT2JzPy4oKSk7XG5cbiAgICB0aGlzLl9zdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAucGlwZShcbiAgICAgICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy50aW1lem9uZUluc3RhbmNlJC5waXBlKG1hcCgodGltZXpvbmVJbnN0YW5jZSkgPT4gZGJ4RGF0ZVRpbWVPdXRwdXRWYWx1ZUZhY3RvcnkodGhpcy52YWx1ZU1vZGUsIHRpbWV6b25lSW5zdGFuY2UpKSkpLFxuICAgICAgICB0aHJvdHRsZVRpbWUoVElNRV9PVVRQVVRfVEhST1RUTEVfVElNRSwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICAgICAgc3dpdGNoTWFwKChbY3VycmVudFZhbHVlLCB2YWx1ZUZhY3RvcnldKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZU91dHB1dCQucGlwZShcbiAgICAgICAgICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FICogMiwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9KSxcbiAgICAgICAgICAgIHNraXBGaXJzdE1heWJlKCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICAgICAgICAgIG1hcCgoeCkgPT4gdmFsdWVGYWN0b3J5KHgpKSxcbiAgICAgICAgICAgIGZpbHRlcigoeCkgPT4gIWRieERhdGVUaW1lSXNTYW1lRGF0ZVRpbWVGaWVsZFZhbHVlKHgsIGN1cnJlbnRWYWx1ZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfSk7XG5cbiAgICBsZXQgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQgPSBmYWxzZTtcblxuICAgIC8qXG4gICAgdGhpcy5fdmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy50aW1lU3RyaW5nJC5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHRoaXMuc2V0VGltZSh4KTtcbiAgICB9KTtcbiAgICAqL1xuXG4gICAgdGhpcy5fdmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh4KSA9PiAoeCA/IGlzU2FtZURhdGUoeCwgc3RhcnRPZkRheSh4KSkgOiBmYWxzZSkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBzd2l0Y2hNYXAoKGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQpID0+IHtcbiAgICAgICAgICBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVTdHJpbmckLnBpcGUoXG4gICAgICAgICAgICAvLyBza2lwKDEpLFxuICAgICAgICAgICAgbWFwKCh0aW1lU3RyaW5nKSA9PiBbdGltZVN0cmluZywgaXNJbnB1dFZhbHVlQXRNaWRuaWdodF0gYXMgW3N0cmluZywgYm9vbGVhbl0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFt4LCBpc0lucHV0VmFsdWVBdE1pZG5pZ2h0XSkgPT4ge1xuICAgICAgICAvLyBTa2lwIGV2ZW50cyB3aGVyZSB0aGUgdGltZUlucHV0IHZhbHVlIGlzIGNsZWFyZWQsIHVubGVzcyB0aGUgaW5wdXQgdmFsdWUgaXMgYXQgbWlkbmlnaHQgYW5kIHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIGl0IGJlaW5nIGF0IG1pZG5pZ2h0XG4gICAgICAgIGlmICghdGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlICYmIHggPT09ICcxMjowMEFNJyAmJiAoIWlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQgfHwgKGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQgJiYgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgaGFzIHNldCBmbGFnXG4gICAgICAgIGlmICh4ID09PSAnMTI6MDBBTScgJiYgaXNJbnB1dFZhbHVlQXRNaWRuaWdodCkge1xuICAgICAgICAgIGhhc1NldE1pZG5pZ2h0RnJvbUlucHV0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VGltZSh4KTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdGltZXpvbmUgaWYgcHJvdmlkZWQuXG4gICAgaWYgKHRoaXMudGltZXpvbmUgJiYgIXRoaXMuZGF0ZVRpbWVGaWVsZC5mdWxsRGF5SW5VVEMpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRUaW1lem9uZS5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy50aW1lem9uZSkpO1xuICAgIH1cblxuICAgIHRoaXMuX3RpbWVEYXRlLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnRpbWVEYXRlKSk7XG5cbiAgICAvLyBXYXRjaCBmb3IgZGlzYWJsZWQgY2hhbmdlcyBzbyB3ZSBjYW4gcHJvcG9nYXRlIHRoZW0gcHJvcGVybHkuXG4gICAgdGhpcy5mb3JtQ29udHJvbC5yZWdpc3Rlck9uRGlzYWJsZWRDaGFuZ2UoKGRpc2FibGVkKSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kYXRlSW5wdXRDdHJsLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLnRpbWVJbnB1dEN0cmwuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGVJbnB1dEN0cmwuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy50aW1lSW5wdXRDdHJsLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBpc0Z1bGxEYXlGaWVsZCA9IHRoaXMuZGF0ZVRpbWVGaWVsZC5mdWxsRGF5RmllbGROYW1lO1xuICAgIGxldCBmdWxsRGF5RmllbGRDdHJsOiBNYXliZTxBYnN0cmFjdENvbnRyb2w+O1xuXG4gICAgaWYgKGlzRnVsbERheUZpZWxkKSB7XG4gICAgICBmdWxsRGF5RmllbGRDdHJsID0gdGhpcy5mb3JtLmdldChpc0Z1bGxEYXlGaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKCFmdWxsRGF5RmllbGRDdHJsKSB7XG4gICAgICBjb25zdCBpc0Z1bGxEYXkgPSB0aGlzLnRpbWVNb2RlID09PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTtcbiAgICAgIHRoaXMuX2Z1bGxEYXlJbnB1dEN0cmwgPSBuZXcgRm9ybUNvbnRyb2woaXNGdWxsRGF5KTtcblxuICAgICAgLy8gU2V0IHRoZSBjb250cm9sIGluIHRoZSBmb3JtIHRvbyBpZiB0aGUgbmFtZSBpcyBkZWZpbmVkLlxuICAgICAgaWYgKGlzRnVsbERheUZpZWxkKSB7XG4gICAgICAgICh0aGlzLmZvcm0gYXMgRm9ybUdyb3VwKS5hZGRDb250cm9sKGlzRnVsbERheUZpZWxkLCB0aGlzLl9mdWxsRGF5SW5wdXRDdHJsKTtcbiAgICAgIH1cblxuICAgICAgZnVsbERheUZpZWxkQ3RybCA9IHRoaXMuX2Z1bGxEYXlJbnB1dEN0cmw7XG4gICAgfVxuXG4gICAgdGhpcy5fZnVsbERheUNvbnRyb2xPYnMubmV4dChmdWxsRGF5RmllbGRDdHJsKTtcblxuICAgIHN3aXRjaCAodGhpcy50aW1lTW9kZSkge1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuT1BUSU9OQUw6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTpcbiAgICAgICAgdGhpcy5yZW1vdmVUaW1lKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQ6XG4gICAgICAgIHRoaXMuYWRkVGltZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcmVzZXRzICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX3ByZXNldHMubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMucHJlc2V0cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wcmVzZXRzLm5leHQodGhpcy5kYnhEYXRlVGltZUZpZWxkQ29uZmlnU2VydmljZS5jb25maWd1cmF0aW9ucyQpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5fc3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl92YWx1ZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fY29uZmlnLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY29uZmlnVXBkYXRlVGltZVN5bmMuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RlZmF1bHRUaW1lem9uZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3RpbWVEYXRlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcHJlc2V0cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2Z1bGxEYXlDb250cm9sT2JzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fb2Zmc2V0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgICB0aGlzLl91cGRhdGVUaW1lLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY2xlYXJlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3N5bmNDb25maWdPYnMuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNlbGVjdFByZXNldChwcmVzZXQ6IERhdGVUaW1lUHJlc2V0KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSBwcmVzZXQudmFsdWUoKTtcblxuICAgIGlmICh2YWx1ZS5sb2dpY2FsRGF0ZSkge1xuICAgICAgdGhpcy5zZXRMb2dpY2FsVGltZSh2YWx1ZS5sb2dpY2FsRGF0ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS50aW1lU3RyaW5nKSB7XG4gICAgICB0aGlzLnNldFRpbWUodmFsdWUudGltZVN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgZGF0ZVBpY2tlZChldmVudDogTWF0RGF0ZXBpY2tlcklucHV0RXZlbnQ8RGF0ZT4pOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlID0gZXZlbnQudmFsdWU7XG5cbiAgICBpZiAoZGF0ZSkge1xuICAgICAgdGhpcy5zZXREYXRlSW5wdXRWYWx1ZShkYXRlKTtcbiAgICB9XG4gIH1cblxuICBzZXRMb2dpY2FsVGltZSh0aW1lOiBMb2dpY2FsRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGUgPSBkYXRlRnJvbUxvZ2ljYWxEYXRlKHRpbWUpO1xuXG4gICAgaWYgKGRhdGUpIHtcbiAgICAgIHRoaXMuc2V0VGltZUZyb21EYXRlKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGVJbnB1dFZhbHVlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLmRhdGVJbnB1dEN0cmwuc2V0VmFsdWUoZGF0ZSk7XG4gICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gIH1cblxuICBzZXRUaW1lRnJvbURhdGUodGltZURhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lU3RyaW5nID0gdG9Mb2NhbFJlYWRhYmxlVGltZVN0cmluZyh0aW1lRGF0ZSk7XG4gICAgdGhpcy5zZXRUaW1lKHRpbWVTdHJpbmcpO1xuICB9XG5cbiAgc2V0VGltZSh0aW1lOiBSZWFkYWJsZVRpbWVTdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlICE9PSB0aW1lKSB7XG4gICAgICB0aGlzLnRpbWVJbnB1dEN0cmwuc2V0VmFsdWUodGltZSk7XG4gICAgICB0aGlzLl9vZmZzZXQubmV4dCgwKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGtleWRvd25PbkRhdGVJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGxldCBkaXJlY3Rpb24gPSAwO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXk/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBkaXJlY3Rpb24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgb2Zmc2V0ID0gMTtcblxuICAgIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSAzNjU7XG4gICAgfSBlbHNlIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICBvZmZzZXQgPSAzMDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA3O1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZSQsIHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckXSlcbiAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGUsIGNvbmZpZ10pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdEYXRlID0gc3RhcnRPZkRheShhZGREYXlzKGRhdGUsIG9mZnNldCAqIGRpcmVjdGlvbikpO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAgICAgZGF0ZTogbmV3RGF0ZSxcbiAgICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgbmV4dERhdGUgPSBpbnN0YW5jZS5pc0luU2NoZWR1bGUobmV3RGF0ZSkgPyBuZXdEYXRlIDogaW5zdGFuY2UuZmluZE5leHRBdmFpbGFibGVEYXlJblNjaGVkdWxlKG5ld0RhdGUsIGRpcmVjdGlvbiA9PT0gMSA/ICdmdXR1cmUnIDogJ3Bhc3QnKTtcblxuICAgICAgICAgIGlmIChuZXh0RGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldERhdGVJbnB1dFZhbHVlKGluc3RhbmNlLmNsYW1wVG9MaW1pdChuZXh0RGF0ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAga2V5ZG93bk9uVGltZUlucHV0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IGRpcmVjdGlvbiA9IDA7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgIGRpcmVjdGlvbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXJyb3dkb3duJzpcbiAgICAgICAgZGlyZWN0aW9uID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQgPSAxO1xuXG4gICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgb2Zmc2V0ID0gMzAwO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA2MDtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSA1O1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIHRoaXMuX29mZnNldC5uZXh0KHRoaXMuX29mZnNldC52YWx1ZSArIG9mZnNldCAqIGRpcmVjdGlvbik7XG4gICAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c1RpbWUoKTogdm9pZCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgZm9jdXNPdXRUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZVRpbWUubmV4dCgpO1xuICB9XG5cbiAgYWRkVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZ1bGxEYXkoZmFsc2UpO1xuICB9XG5cbiAgcmVtb3ZlVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEZ1bGxEYXkodHJ1ZSk7XG4gIH1cblxuICBzZXRGdWxsRGF5KGZ1bGxEYXk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZ1bGxEYXlDb250cm9sJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgeC5zZXRWYWx1ZShmdWxsRGF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJlZC5uZXh0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtZmllbGRcIiBmeExheW91dD1cInJvdyB3cmFwXCIgZnhMYXlvdXQueHM9XCJjb2x1bW4gd3JhcFwiIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1ldmVubHkgc3RyZXRjaFwiPlxuICA8IS0tIERhdGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93XCIgZnhGbGV4Lmx0LXNtPVwiMTAwXCIgW2Z4RmxleF09XCJkYXRlT25seSA/ICcxMDAnIDogJzUwJ1wiICpuZ0lmPVwic2hvd0RhdGVJbnB1dFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlSW5wdXRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gQWRkaXRpb25hbCBzcGFjaW5nIC0tPlxuICAgIDxkYngtYnV0dG9uLXNwYWNlciAqbmdJZj1cIiFkYXRlT25seVwiPjwvZGJ4LWJ1dHRvbi1zcGFjZXI+XG4gIDwvZGl2PlxuICA8IS0tIFRpbWUgLS0+XG4gIDxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93XCIgZnhGbGV4Lmx0LXNtPVwiMTAwXCIgW2Z4RmxleF09XCJzaG93RGF0ZUlucHV0ID8gJzUwJyA6ICcxMDAnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dUaW1lSW5wdXQkIHwgYXN5bmNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aW1lTWVudUFuZElucHV0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0FkZFRpbWUkIHwgYXN5bmNcIiBjbGFzcz1cImFkZC10aW1lLWJ1dHRvbi13cmFwcGVyXCI+XG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJtYXQtZGF0ZXBpY2tlci1idXR0b24taGlnaGxpZ2h0IGRieC1idXR0b24tc3BhY2VyIGFkZC10aW1lLWJ1dHRvblwiIG5nQ2xhc3MubHQtc209XCJhZGQtdGltZS1idXR0b24tZnVsbFwiIChjbGljayk9XCJhZGRUaW1lKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnRpbWVyPC9tYXQtaWNvbj5cbiAgICAgICAgQWRkIFRpbWVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIiFoaWRlRGF0ZUhpbnRcIiBjbGFzcz1cImRieC1kYXRldGltZS1yb3cgZGJ4LWRhdGV0aW1lLWhpbnQtcm93XCIgZnhGbGV4PVwiMTAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImRieC1oaW50XCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJoYXNFbXB0eURpc3BsYXlWYWx1ZSQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYngtc21hbGxcIj5ObyBkYXRlL3RpbWUgc2V0PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmdWxsRGF5JCB8IGFzeW5jXCI+XG4gICAgICAgICAgICA8c21hbGwgKm5nU3dpdGNoQ2FzZT1cInRydWVcIj5cbiAgICAgICAgICAgICAgPGIgY2xhc3M9XCJkYngtb2tcIj57eyBhbGxEYXlMYWJlbCB9fTwvYj5cbiAgICAgICAgICAgICAge3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgZGF0ZTogJ2Z1bGxEYXRlJyB9fSB7eyB0aW1lem9uZUFiYnJldmlhdGlvbiQgfCBhc3luYyB9fSAoe3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgZGF0ZURpc3RhbmNlIH19KVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDxzbWFsbCAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlWYWx1ZSQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwiZGJ4LW9rXCI+e3sgYXRUaW1lTGFiZWwgfX08L2I+XG4gICAgICAgICAgICAgICAge3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgZGF0ZTogJ21lZGl1bScgfX0ge3sgdGltZXpvbmVBYmJyZXZpYXRpb24kIHwgYXN5bmMgfX0gKHt7IGRpc3BsYXlWYWx1ZSQgfCBhc3luYyB8IHRpbWVEaXN0YW5jZSB9fSlcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIERhdGUgSW5wdXQgVGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2RhdGVJbnB1dFRlbXBsYXRlPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93LWZpZWxkXCI+XG4gICAgPG1hdC1sYWJlbD57eyBkYXRlTGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXQgI2RhdGVJbnB1dCBtYXRJbnB1dCBbcmVxdWlyZWRdPVwiaXNEYXRlUmVxdWlyZWRcIiBbbWluXT1cImRhdGVJbnB1dE1pbiQgfCBhc3luY1wiIFttYXhdPVwiZGF0ZUlucHV0TWF4JCB8IGFzeW5jXCIgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCIgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwiKHBpY2tlckZpbHRlciQgfCBhc3luYykgfHwgZGVmYXVsdFBpY2tlckZpbHRlclwiIChkYXRlQ2hhbmdlKT1cImRhdGVQaWNrZWQoJGV2ZW50KVwiIFt2YWx1ZV09XCJkYXRlVmFsdWUkIHwgYXN5bmNcIiAoa2V5ZG93bik9XCJrZXlkb3duT25EYXRlSW5wdXQoJGV2ZW50KVwiIC8+XG4gICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctYnV0dG9uXCIgKm5nSWY9XCIhaGlkZURhdGVQaWNrZXJcIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInBpY2tlci5vcGVuKClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgIDxtYXQtaWNvbj5jYWxlbmRhcl90b2RheTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXRTdWZmaXggKm5nSWY9XCJzaG93Q2xlYXJCdXR0b24kIHwgYXN5bmNcIiBjbGFzcz1cImRieC1kYXRldGltZS1jbGVhci1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cImNsZWFycyB0aGUgZGF0ZSBhbmQgdGltZSBtZW51XCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgKGNsaWNrKT1cImNsZWFyVmFsdWUoKVwiPlxuICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8c3BhbiBtYXRUZXh0U3VmZml4ICpuZ0lmPVwiIShzaG93VGltZUlucHV0JCB8IGFzeW5jKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpbWV6b25lU3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3NwYW4+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFRpbWUgTWVudS9JbnB1dCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjdGltZU1lbnVBbmRJbnB1dFRlbXBsYXRlPlxuICA8bWF0LW1lbnUgI3RpbWVtZW51PVwibWF0TWVudVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aW1lTW9kZSA9PT0gJ29wdGlvbmFsJ1wiPlxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJyZW1vdmVUaW1lKClcIj5cbiAgICAgICAgPHNwYW4+UmVtb3ZlIFRpbWU8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByZXNldCBvZiBwcmVzZXRzJCB8IGFzeW5jXCI+XG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNlbGVjdFByZXNldChwcmVzZXQpXCI+e3sgcHJlc2V0LmxhYmVsIHwgZ2V0VmFsdWUgfX08L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9tYXQtbWVudT5cbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdy1maWVsZFwiPlxuICAgIDxtYXQtbGFiZWw+e3sgdGltZUxhYmVsIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0ICN0aW1lSW5wdXQgbWF0SW5wdXQgW3JlcXVpcmVkXT1cImlzVGltZVJlcXVpcmVkXCIgW2Zvcm1Db250cm9sXT1cInRpbWVJbnB1dEN0cmxcIiAoZm9jdXMpPVwiZm9jdXNUaW1lKClcIiAoZm9jdXNvdXQpPVwiZm9jdXNPdXRUaW1lKClcIiAoa2V5ZG93bik9XCJrZXlkb3duT25UaW1lSW5wdXQoJGV2ZW50KVwiIC8+XG4gICAgPGJ1dHRvbiBtYXRQcmVmaXggY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93LWJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidGltZW1lbnVcIiBhcmlhLWxhYmVsPVwib3BlbnMgdGhlIHRpbWUgbWVudVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgPG1hdC1pY29uPnRpbWVyPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8c3BhbiBtYXRUZXh0U3VmZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpbWV6b25lU3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3NwYW4+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIFRpbWV6b25lIFN1ZmZpeCAtLT5cbjxuZy10ZW1wbGF0ZSAjdGltZXpvbmVTdWZmaXhUZW1wbGF0ZT5cbiAgPHNwYW4gKm5nSWY9XCJzaG93VGltZXpvbmVcIiBjbGFzcz1cImRieC1kYXRldGltZS10aW1lem9uZSBkYngtZmFpbnRcIj57eyB0aW1lem9uZUFiYnJldmlhdGlvbiQgfCBhc3luYyB9fTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
581
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vc3JjL2xpYi9mb3JtbHkvZmllbGQvdmFsdWUvZGF0ZS9kYXRldGltZS5maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9zcmMvbGliL2Zvcm1seS9maWVsZC92YWx1ZS9kYXRlL2RhdGV0aW1lLmZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBa0YsT0FBTyxFQUFFLGlCQUFpQixFQUF5Ryx1QkFBdUIsRUFBb0IsbUJBQW1CLEVBQXFELE1BQU0sZUFBZSxDQUFDO0FBQ3JXLE9BQU8sRUFBRSxtQkFBbUIsRUFBd0Isc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBaUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5WixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZPLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBbUIsV0FBVyxF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LENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFnQjtRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2pELENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQzsrR0F4dkJVLHlCQUF5QjttR0FBekIseUJBQXlCLDJFQ2xPdEMsK3FKQXlGQTs7NEZEeUlhLHlCQUF5QjtrQkFIckMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgTWF5YmUsIHR5cGUgUmVhZGFibGVUaW1lU3RyaW5nLCB0eXBlIEFycmF5T3JWYWx1ZSwgdHlwZSBJU084NjAxRGF0ZVN0cmluZywgYXNBcnJheSwgZmlsdGVyTWF5YmVWYWx1ZXMsIHR5cGUgRGVjaXNpb25GdW5jdGlvbiwgdHlwZSBNaWxsaXNlY29uZHMsIHR5cGUgVGltZXpvbmVTdHJpbmcsIHR5cGUgTG9naWNhbERhdGUsIHR5cGUgRGF0ZU9yRGF5U3RyaW5nLCBpc0lTTzg2MDFEYXlTdHJpbmdTdGFydCwgdHlwZSBNYXBGdW5jdGlvbiwgbWFwSWRlbnRpdHlGdW5jdGlvbiwgTWludXRlT2ZEYXksIFVuaXhEYXRlVGltZU51bWJlciwgSVNPODYwMURheVN0cmluZyB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgZGF0ZUZyb21Mb2dpY2FsRGF0ZSwgRGF0ZVRpbWVNaW51dGVDb25maWcsIERhdGVUaW1lTWludXRlSW5zdGFuY2UsIGd1ZXNzQ3VycmVudFRpbWV6b25lLCByZWFkYWJsZVRpbWVTdHJpbmdUb0RhdGUsIHRvTG9jYWxSZWFkYWJsZVRpbWVTdHJpbmcsIHV0Y0RheUZvckRhdGUsIHNhZmVUb0pzRGF0ZSwgZmluZE1pbkRhdGUsIGZpbmRNYXhEYXRlLCBpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzLCBnZXRUaW1lem9uZUFiYnJldmlhdGlvbiwgaXNTYW1lRGF0ZURheSwgZGF0ZVRpbWV6b25lVXRjTm9ybWFsLCBEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZSwgdG9Kc0RheURhdGUsIGlzU2FtZURhdGUsIGRhdGVUaW1lTWludXRlV2hvbGVEYXlEZWNpc2lvbkZ1bmN0aW9uIH0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHNoYXJlUmVwbGF5LCBtYXAsIHN0YXJ0V2l0aCwgdGFwLCBmaXJzdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGRlYm91bmNlVGltZSwgdGhyb3R0bGVUaW1lLCBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIFN1YmplY3QsIG1lcmdlLCBpbnRlcnZhbCwgb2YsIGNvbWJpbmVMYXRlc3RXaXRoLCBmaWx0ZXIsIHNraXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9tYXRlcmlhbCc7XG5pbXBvcnQgeyBGaWVsZFR5cGVDb25maWcsIEZvcm1seUZpZWxkUHJvcHMgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBhZGRNaW51dGVzLCBzdGFydE9mRGF5LCBhZGREYXlzIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgYXNPYnNlcnZhYmxlRnJvbUdldHRlciwgZmlsdGVyTWF5YmUsIE9ic2VydmFibGVPclZhbHVlR2V0dGVyLCBza2lwRmlyc3RNYXliZSwgU3Vic2NyaXB0aW9uT2JqZWN0LCBzd2l0Y2hNYXBNYXliZURlZmF1bHQsIHN3aXRjaE1hcE1heWJlT2JzIH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBEYXRlVGltZVByZXNldCwgRGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uLCBkYXRlVGltZVByZXNldCB9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0IHsgRGJ4RGF0ZVRpbWVGaWVsZE1lbnVQcmVzZXRzU2VydmljZSB9IGZyb20gJy4vZGF0ZXRpbWUuZmllbGQuc2VydmljZSc7XG5pbXBvcnQgeyBEYnhEYXRlVGltZVZhbHVlTW9kZSwgZGJ4RGF0ZVRpbWVJbnB1dFZhbHVlUGFyc2VGYWN0b3J5LCBkYnhEYXRlVGltZUlzU2FtZURhdGVUaW1lRmllbGRWYWx1ZSwgZGJ4RGF0ZVRpbWVPdXRwdXRWYWx1ZUZhY3RvcnkgfSBmcm9tICcuL2RhdGUudmFsdWUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xQYXRoLCBzdHJlYW1WYWx1ZUZyb21Db250cm9sIH0gZnJvbSAnLi4vLi4vLi4vLi4vZm9ybS9mb3JtLmFuZ3VsYXIudXRpbCc7XG5pbXBvcnQgeyB0b2dnbGVEaXNhYmxlRm9ybUNvbnRyb2wgfSBmcm9tICcuLi8uLi8uLi8uLi9mb3JtL2Zvcm0nO1xuXG5leHBvcnQgZW51bSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUge1xuICAvKipcbiAgICogVGltZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIFJFUVVJUkVEID0gJ3JlcXVpcmVkJyxcbiAgLyoqXG4gICAqIFRpbWUgaXMgb3B0aW9uYWwuXG4gICAqL1xuICBPUFRJT05BTCA9ICdvcHRpb25hbCcsXG4gIC8qKlxuICAgKiBUaW1lIGlzIHBlcm1lbmFudGx5IG9mZi5cbiAgICovXG4gIE5PTkUgPSAnbm9uZSdcbn1cblxuZXhwb3J0IHR5cGUgRGJ4RGF0ZVRpbWVQaWNrZXJDb25maWd1cmF0aW9uID0gT21pdDxEYXRlVGltZU1pbnV0ZUNvbmZpZywgJ2RhdGUnPjtcblxuZXhwb3J0IHR5cGUgRGJ4RGF0ZVRpbWVGaWVsZFN5bmNUeXBlID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIERieERhdGVUaW1lRmllbGRTeW5jRmllbGQge1xuICAvKipcbiAgICogRmllbGQga2V5L3BhdGggdG8gc3luYyB3aXRoL2FnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBzeW5jV2l0aDogc3RyaW5nO1xuICAvKipcbiAgICogSG93IHRvIHN5bmMgYWdhaW5zdCB0aGUgb3RoZXIgZmllbGQuXG4gICAqL1xuICByZWFkb25seSBzeW5jVHlwZTogRGJ4RGF0ZVRpbWVGaWVsZFN5bmNUeXBlO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB0aW1lIGRhdGUgZmllbGQgdGhhdCBoYXMgYSByZWZlcmVuY2UgYW5kIG9wdGlvbmFsIG1hcCBmdW5jdGlvbiB0byBtYXAgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZzxJID0gdW5rbm93bj4ge1xuICByZWFkb25seSBwYXRoOiBGb3JtQ29udHJvbFBhdGg7XG4gIHJlYWRvbmx5IG1hcFZhbHVlPzogTWFwRnVuY3Rpb248SSwgTWF5YmU8RGF0ZU9yRGF5U3RyaW5nPj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyhpbnB1dDogdW5rbm93bik6IGlucHV0IGlzIERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyB7XG4gIHJldHVybiBpbnB1dCAhPSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChpbnB1dCBhcyBEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcpLnBhdGggPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERieERhdGVUaW1lRmllbGRQcm9wcyBleHRlbmRzIEZvcm1seUZpZWxkUHJvcHMge1xuICAvKipcbiAgICogQ3VzdG9tIGRhdGUgbGFiZWwuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIERhdGVcbiAgICovXG4gIHJlYWRvbmx5IGRhdGVMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIHRpbWUgbGFiZWwuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFRpbWVcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogTGFiZWwgdG8gdXNlIGZvciB0aGUgZGF0ZSBoaW50IGZvciBcIkFsbCBEYXlcIi4gRGVmYXVsdHMgdG8gXCJBbGwgRGF5XCIuXG4gICAqL1xuICByZWFkb25seSBhbGxEYXlMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogTGFiZWwgdG8gdXNlIGZvciB0aGUgZGF0ZSBoaW50IGZvciBcIkF0XCIuIERlZmF1bHRzIHRvIFwiQXRcIi5cbiAgICovXG4gIHJlYWRvbmx5IGF0VGltZUxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBtb2RlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBEQVRFXG4gICAqL1xuICByZWFkb25seSB2YWx1ZU1vZGU/OiBEYnhEYXRlVGltZVZhbHVlTW9kZTtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGRhdGUgaXMgaGlkZGVuLCBhbmQgYXV0b21hdGljYWxseSB1c2VzIHRvZGF5L2lucHV0IGRhdGUuXG4gICAqL1xuICByZWFkb25seSB0aW1lT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIHRpbWVPbmx5IGlzIGZhbHNlLlxuICAgKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbHdheXMgc2hvdyB0aGUgZGF0ZSBpbnB1dCBldmVuIHdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBkYXRlIHRoYXQgY2FuIGJlIHNlbGVjdGVkLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWx3YXlzU2hvd0RhdGVJbnB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGF1dG9maWxsIHRoZSBkYXRlIHdoZW4gdGltZSBpcyBwaWNrZWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b2ZpbGxEYXRlV2hlblRpbWVJc1BpY2tlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB0aW1lIGNhbiBiZSBhZGRlZC9yZW1vdmVkIG9wdGlvbmFsbHkuXG4gICAqXG4gICAqIFRoaXMgaXMgaWdub3JlZCBpZiB0aW1lT25seSBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSB0aW1lTW9kZT86IERieERhdGVUaW1lRmllbGRUaW1lTW9kZTtcblxuICAvKipcbiAgICogT3RoZXIgZm9ybSBjb250cm9sIGZvciBlbmFibGluZy9kaXNhYmxpbmcgd2hldGhlciBvciBub3QgaXQgaXMgYSBmdWxsIGRheS5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaWYgdGltZSBpcyBvcHRpb25hbC5cbiAgICpcbiAgICogV2hlbiB0aW1lIGlzIG9mZiwgdGhlIGZpZWxkIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVsbERheUZpZWxkTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcGFzcyB0aGUgZGF0ZSB2YWx1ZSBhcyBhIFVUQyBkYXRlLCBvciBhIGRhdGUgaW4gdGhlIGN1cnJlbnQgdGltZXpvbmUuXG4gICAqL1xuICByZWFkb25seSBmdWxsRGF5SW5VVEM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBvdCBoaWRlIHRoZSBkYXRlIGhpbnQgaW5mbyBjb250ZW50LlxuICAgKlxuICAgKiBGYWxzZSBieSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBoaWRlRGF0ZUhpbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBoaWRlIHRoZSBkYXRlL2NhbGVuZGFyIHBpY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IGhpZGVEYXRlUGlja2VyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3VzdG9tIHBpY2tlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBwaWNrZXJDb25maWc/OiBPYnNlcnZhYmxlT3JWYWx1ZUdldHRlcjxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+O1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzeW5jaW5nIHdpdGggb25lIG9yIG1vcmUgZmllbGRzIHdpdGggYSBEYXRlIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0U3luY0ZpZWxkc09icz86ICgpID0+IE9ic2VydmFibGU8QXJyYXlPclZhbHVlPERieERhdGVUaW1lRmllbGRTeW5jRmllbGQ+PjtcblxuICAvKipcbiAgICogKE9wdGlvbmFsKSBUaGUgaW5wdXQgdGltZXpvbmUgdG8gZGVmYXVsdCB0by5cbiAgICpcbiAgICogSWdub3JlZCBpZiBmdWxsRGF5SW5VVEMgaXMgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWV6b25lPzogTWF5YmU8T2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8TWF5YmU8VGltZXpvbmVTdHJpbmc+Pj47XG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgVGhlIGRhdGUgdG8gYXBwbHkgdGhlIHRpbWUgdG8uXG4gICAqXG4gICAqIFRoZSB0aW1lem9uZSBhYmJydmlhdGlvbiB3aWxsIGFsc28gdXNlIHRoaXMgZGF0ZSB3aGVuIHVzaW5nIHRoZSB0aW1lLW9ubHkgbW9kZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVEYXRlPzogTWF5YmU8T2JzZXJ2YWJsZU9yVmFsdWVHZXR0ZXI8TWF5YmU8RGJ4RGF0ZVRpbWVGaWVsZFRpbWVEYXRlQ29uZmlnIHwgRm9ybUNvbnRyb2xQYXRoIHwgRGF0ZU9yRGF5U3RyaW5nPj4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSB0aW1lem9uZS4gVHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1RpbWV6b25lPzogTWF5YmU8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBwcmVzZXRzIHRvIHNob3cgaW4gdGhlIGRyb3Bkb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlc2V0cz86IE9ic2VydmFibGVPclZhbHVlR2V0dGVyPERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdPjtcblxuICAvKipcbiAgICogVGhlIHRpbWUgaW4gbXMgdG8gcHJldmVudCBvdXRwdXQgZnJvbSBnb2luZyBvdXQgd2hlbiB0aGUgaW5wdXQgdmFsdWUgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0T3V0cHV0RGVib3VuY2VUaW1lPzogTWlsbGlzZWNvbmRzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSBjbGVhciBkYXRlIGJ1dHRvbi4gVHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd0NsZWFyQnV0dG9uPzogTWF5YmU8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbWludXRlcyB0byBhZGQvc3VidHJhY3Qgd2hlbiB1c2luZyB0aGUgYXJyb3cga2V5cy5cbiAgICovXG4gIHJlYWRvbmx5IG1pbnV0ZVN0ZXA/OiBNYXliZTxudW1iZXI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGQgZXh0ZW5kcyBQaWNrPERieERhdGVUaW1lRmllbGRTeW5jRmllbGQsICdzeW5jVHlwZSc+IHtcbiAgY29udHJvbDogQWJzdHJhY3RDb250cm9sPE1heWJlPERhdGUgfCBJU084NjAxRGF0ZVN0cmluZz4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3luY0NvbmZpZ1ZhbHVlT2JzKHBhcnNlQ29uZmlnc09iczogT2JzZXJ2YWJsZTxEYnhEYXRlVGltZUZpZWxkU3luY1BhcnNlZEZpZWxkW10+LCB0eXBlOiBEYnhEYXRlVGltZUZpZWxkU3luY1R5cGUpOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiB7XG4gIHJldHVybiBwYXJzZUNvbmZpZ3NPYnMucGlwZShcbiAgICBzd2l0Y2hNYXAoKHgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHguZmluZCgoeSkgPT4geS5zeW5jVHlwZSA9PT0gdHlwZSk7XG4gICAgICBsZXQgcmVzdWx0OiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPjtcblxuICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICBjb25zdCB7IGNvbnRyb2wgfSA9IGNvbmZpZztcbiAgICAgICAgcmVzdWx0ID0gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgoY29udHJvbC52YWx1ZSksXG4gICAgICAgICAgbWFwKCh4KSA9PiBzYWZlVG9Kc0RhdGUoeCkgPz8gbnVsbClcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IG9mKG51bGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbn1cblxuY29uc3QgVElNRV9PVVRQVVRfVEhST1RUTEVfVElNRTogTWlsbGlzZWNvbmRzID0gMTA7XG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJ2RhdGV0aW1lLmZpZWxkLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEYnhEYXRlVGltZUZpZWxkQ29tcG9uZW50IGV4dGVuZHMgRmllbGRUeXBlPEZpZWxkVHlwZUNvbmZpZzxEYnhEYXRlVGltZUZpZWxkUHJvcHM+PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfc3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuICBwcml2YXRlIF92YWx1ZVN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfYXV0b0ZpbGxEYXRlU3luYyA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcblxuICBwcml2YXRlIF9jb25maWcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8RGJ4RGF0ZVRpbWVQaWNrZXJDb25maWd1cmF0aW9uPj4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGxhdGVzdENvbmZpZyQgPSB0aGlzLl9jb25maWcucGlwZShzd2l0Y2hNYXBNYXliZURlZmF1bHQoKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHByaXZhdGUgX3N5bmNDb25maWdPYnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPE9ic2VydmFibGU8QXJyYXlPclZhbHVlPERieERhdGVUaW1lRmllbGRTeW5jRmllbGQ+Pj4+KHVuZGVmaW5lZCk7XG5cbiAgcHJpdmF0ZSBfZGVmYXVsdFRpbWV6b25lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNYXliZTxPYnNlcnZhYmxlPE1heWJlPFRpbWV6b25lU3RyaW5nPj4+Pih1bmRlZmluZWQpO1xuICBwcml2YXRlIF90aW1lRGF0ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8T2JzZXJ2YWJsZTxNYXliZTxEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcgfCBGb3JtQ29udHJvbFBhdGggfCBEYXRlT3JEYXlTdHJpbmc+Pj4+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgX3ByZXNldHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9ic2VydmFibGU8RGF0ZVRpbWVQcmVzZXRDb25maWd1cmF0aW9uW10+PihvZihbXSkpO1xuXG4gIHByaXZhdGUgX2Z1bGxEYXlJbnB1dEN0cmw/OiBGb3JtQ29udHJvbDtcbiAgcHJpdmF0ZSBfZnVsbERheUNvbnRyb2xPYnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1heWJlPEFic3RyYWN0Q29udHJvbDxib29sZWFuPj4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGZ1bGxEYXlDb250cm9sJCA9IHRoaXMuX2Z1bGxEYXlDb250cm9sT2JzLnBpcGUoZmlsdGVyTWF5YmUoKSk7XG5cbiAgcHJpdmF0ZSBfb2Zmc2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBwcml2YXRlIF9mb3JtQ29udHJvbE9icyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF5YmU8QWJzdHJhY3RDb250cm9sPE1heWJlPERhdGU+Pj4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGZvcm1Db250cm9sJCA9IHRoaXMuX2Zvcm1Db250cm9sT2JzLnBpcGUoZmlsdGVyTWF5YmUoKSk7XG5cbiAgcHJpdmF0ZSBfY2xlYXJlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX3VwZGF0ZVRpbWUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX3Jlc3luY1RpbWVJbnB1dFN1YiA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoKTtcbiAgcHJpdmF0ZSBfcmVzeW5jVGltZUlucHV0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICByZWFkb25seSByZXN5bmNUaW1lSW5wdXQkID0gdGhpcy5fcmVzeW5jVGltZUlucHV0LnBpcGUoZGVib3VuY2VUaW1lKDIwMCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICBwcml2YXRlIF9jb25maWdVcGRhdGVUaW1lU3luYyA9IG5ldyBTdWJzY3JpcHRpb25PYmplY3QoXG4gICAgdGhpcy5sYXRlc3RDb25maWckLnBpcGUoc2tpcCgxKSkuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgICB9KVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+ID0gdGhpcy5fZGVmYXVsdFRpbWV6b25lLnBpcGUoc3dpdGNoTWFwTWF5YmVEZWZhdWx0KCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnBpcGUoXG4gICAgbWFwKChkZWZhdWx0VGltZXpvbmUpID0+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0VGltZXpvbmUgPz8gZ3Vlc3NDdXJyZW50VGltZXpvbmUoKTtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZXpvbmVJbnN0YW5jZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+PiA9IHRoaXMudGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh0aW1lem9uZSkgPT4gKHRpbWV6b25lID8gZGF0ZVRpbWV6b25lVXRjTm9ybWFsKHsgdGltZXpvbmUgfSkgOiB1bmRlZmluZWQpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWVEYXRlJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSB0aGlzLl90aW1lRGF0ZS5waXBlKFxuICAgIHN3aXRjaE1hcE1heWJlRGVmYXVsdCgpLFxuICAgIHN3aXRjaE1hcCgoeCkgPT4ge1xuICAgICAgbGV0IG9iczogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj47XG5cbiAgICAgIGlmICh4KSB7XG4gICAgICAgIC8vIGlmIHRoZSBzdHJpbmcgaXMgbm90IGEgZGF0ZSBzdHJpbmcsIHRoZW4gdHJlYXQgaXQgYXMgYSBwYXRoXG4gICAgICAgIGlmICgodHlwZW9mIHggPT09ICdzdHJpbmcnICYmICFpc0lTTzg2MDFEYXlTdHJpbmdTdGFydCh4KSkgfHwgaXNEYnhEYXRlVGltZUZpZWxkVGltZURhdGVDb25maWcoeCkpIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIG1hcFZhbHVlIH06IERieERhdGVUaW1lRmllbGRUaW1lRGF0ZUNvbmZpZyA9IHR5cGVvZiB4ID09PSAnc3RyaW5nJyA/IHsgcGF0aDogeCB9IDogeDtcbiAgICAgICAgICBvYnMgPVxuICAgICAgICAgICAgc3RyZWFtVmFsdWVGcm9tQ29udHJvbDxEYXRlT3JEYXlTdHJpbmc+KHRoaXMuZm9ybSwgcGF0aCk/LnBpcGUoXG4gICAgICAgICAgICAgIG1hcChtYXBWYWx1ZSA/PyBtYXBJZGVudGl0eUZ1bmN0aW9uKCkpLFxuICAgICAgICAgICAgICBtYXAoKHgpID0+ICh4ID8gdG9Kc0RheURhdGUoeCkgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgKSA/PyBvZih1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9icyA9IG9mKHRvSnNEYXlEYXRlKHgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzID0gb2YodW5kZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icztcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHZhbHVlSW5TeXN0ZW1UaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gdGhpcy5mb3JtQ29udHJvbCQucGlwZShcbiAgICBtYXAoKGNvbnRyb2wpID0+IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoPE1heWJlPERhdGUgfCBJU084NjAxRGF5U3RyaW5nIHwgTWludXRlT2ZEYXkgfCBVbml4RGF0ZVRpbWVOdW1iZXI+Pihjb250cm9sLnZhbHVlKSwgc2hhcmVSZXBsYXkoMSkpKSxcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnRpbWV6b25lSW5zdGFuY2UkKSxcbiAgICBzd2l0Y2hNYXAoKFt4LCB0aW1lem9uZUluc3RhbmNlXSkgPT4ge1xuICAgICAgcmV0dXJuIHgucGlwZShtYXAoZGJ4RGF0ZVRpbWVJbnB1dFZhbHVlUGFyc2VGYWN0b3J5KHRoaXMudmFsdWVNb2RlLCB0aW1lem9uZUluc3RhbmNlKSkpO1xuICAgIH0pLFxuICAgIHRocm90dGxlVGltZSgyMCwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pLCAvLyB0aHJvdHRsZSBpbmNvbWluZyB2YWx1ZXMgYW5kIHRpbWV6b25lIGNoYW5nZXNcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHJlZnJlc2hJbnRlcmFsJCA9IGludGVydmFsKDEwICogMTAwMCk7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gdHJpZ2dlci9kaXNwbGF5IHZpc3VhbCB1cGRhdGVzIChzcGVjaWZpY2FsbHkgb24gdGltZURpc3RhbmNlLCBldGMuKS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlWYWx1ZSQgPSB0aGlzLnJlZnJlc2hJbnRlcmFsJC5waXBlKFxuICAgIC8vIGV2ZXJ5IDEwIHNlY29uZHMsIHJlZnJlc2ggdy9pbnRlcnZhbFxuICAgIHN0YXJ0V2l0aCgwKSxcbiAgICBtYXAoKCkgPT4gbmV3IERhdGUoKS5nZXRNaW51dGVzKCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgdGFwKCgpID0+IHRoaXMuY2RSZWYubWFya0ZvckNoZWNrKCkpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgdGltZVN0cmluZyQ6IE9ic2VydmFibGU8UmVhZGFibGVUaW1lU3RyaW5nIHwgJyc+ID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IHRvTG9jYWxSZWFkYWJsZVRpbWVTdHJpbmcoeCkgOiAnJykpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlSW5wdXRDdHJsID0gbmV3IEZvcm1Db250cm9sPE1heWJlPERhdGU+PihudWxsLCB7XG4gICAgdmFsaWRhdG9yczogW11cbiAgfSk7XG5cbiAgcmVhZG9ubHkgdGltZUlucHV0Q3RybCA9IG5ldyBGb3JtQ29udHJvbDxNYXliZTxSZWFkYWJsZVRpbWVTdHJpbmc+PihudWxsLCB7XG4gICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucGF0dGVybigvXihub3cpJHxeKFswLTldfCgwWzAtOV0pfCgxWzAtOV0pfCgyWzAtM10pKSg6KT8oWzAtNV1bMC05XSk/KFxccyk/KFthcEFQXVtNbV0pPyhcXFxccykqJC8pXVxuICB9KTtcblxuICBnZXQgZGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZGF0ZUxhYmVsID8/ICdEYXRlJztcbiAgfVxuXG4gIGdldCB0aW1lTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy50aW1lTGFiZWwgPz8gJ1RpbWUnO1xuICB9XG5cbiAgZ2V0IGFsbERheUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYWxsRGF5TGFiZWwgPz8gJ0FsbCBEYXknO1xuICB9XG5cbiAgZ2V0IGF0VGltZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuYXRUaW1lTGFiZWwgPz8gJ0F0JztcbiAgfVxuXG4gIGdldCBkYXRlT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lTW9kZSA9PT0gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLk5PTkU7XG4gIH1cblxuICBnZXQgZGF0ZVRpbWVGaWVsZCgpOiBEYnhEYXRlVGltZUZpZWxkUHJvcHMge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzO1xuICB9XG5cbiAgZ2V0IHRpbWVPbmx5KCk6IE1heWJlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0aW1lVmFsdWVzT25seSA9IHRoaXMudmFsdWVNb2RlID09PSBEYnhEYXRlVGltZVZhbHVlTW9kZS5NSU5VVEVfT0ZfREFZO1xuXG4gICAgaWYgKHRpbWVWYWx1ZXNPbmx5KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGaWVsZC50aW1lT25seTtcbiAgICB9XG4gIH1cblxuICBnZXQgYWx3YXlzU2hvd0RhdGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5hbHdheXNTaG93RGF0ZUlucHV0ID8/IHRydWU7XG4gIH1cblxuICBnZXQgYXV0b2ZpbGxEYXRlV2hlblRpbWVJc1BpY2tlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5hdXRvZmlsbERhdGVXaGVuVGltZUlzUGlja2VkID8/IHRoaXMuYWx3YXlzU2hvd0RhdGVJbnB1dCA9PT0gZmFsc2U7XG4gIH1cblxuICBnZXQgc2hvd0RhdGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudGltZU9ubHk7XG4gIH1cblxuICBnZXQgdmFsdWVNb2RlKCk6IERieERhdGVUaW1lVmFsdWVNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy52YWx1ZU1vZGUgPz8gRGJ4RGF0ZVRpbWVWYWx1ZU1vZGUuREFURTtcbiAgfVxuXG4gIGdldCB0aW1lTW9kZSgpOiBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUge1xuICAgIGNvbnN0IGRhdGVWYWx1ZXNPbmx5ID0gdGhpcy52YWx1ZU1vZGUgPT09IERieERhdGVUaW1lVmFsdWVNb2RlLkRBWV9TVFJJTkc7XG5cbiAgICBpZiAoZGF0ZVZhbHVlc09ubHkpIHtcbiAgICAgIHJldHVybiBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudGltZU9ubHkgPyBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQgOiB0aGlzLmRhdGVUaW1lRmllbGQudGltZU1vZGUgPz8gRGJ4RGF0ZVRpbWVGaWVsZFRpbWVNb2RlLlJFUVVJUkVEO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0RhdGVSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5yZXF1aXJlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCBpc1RpbWVSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0RhdGVSZXF1aXJlZCAmJiB0aGlzLnRpbWVNb2RlID09PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogTWF5YmU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuZGVzY3JpcHRpb247XG4gIH1cblxuICBnZXQgaGlkZURhdGVIaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnByb3BzLmhpZGVEYXRlSGludCA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCBoaWRlRGF0ZVBpY2tlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5oaWRlRGF0ZVBpY2tlciA/PyBmYWxzZTtcbiAgfVxuXG4gIGdldCB0aW1lem9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lem9uZTtcbiAgfVxuXG4gIGdldCB0aW1lRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy50aW1lRGF0ZTtcbiAgfVxuXG4gIGdldCBzaG93VGltZXpvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGQucHJvcHMuc2hvd1RpbWV6b25lID8/IHRydWU7XG4gIH1cblxuICBnZXQgcHJlc2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5wcmVzZXRzO1xuICB9XG5cbiAgZ2V0IHNob3dDbGVhckJ1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5zaG93Q2xlYXJCdXR0b247XG4gIH1cblxuICBnZXQgbWludXRlU3RlcCgpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZC5wcm9wcy5taW51dGVTdGVwID8/IHRoaXMuZmllbGQucHJvcHMuc3RlcCA/PyA1O1xuICB9XG5cbiAgcmVhZG9ubHkgZnVsbERheSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmZ1bGxEYXlDb250cm9sJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShzdGFydFdpdGgoY29udHJvbC52YWx1ZSkpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd1RpbWVJbnB1dCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmZ1bGxEYXkkLnBpcGUobWFwKCh4KSA9PiAheCAmJiB0aGlzLnRpbWVNb2RlICE9PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORSkpO1xuXG4gIHJlYWRvbmx5IHNob3dBZGRUaW1lJCA9IHRoaXMuc2hvd1RpbWVJbnB1dCQucGlwZShcbiAgICBtYXAoKHgpID0+ICF4ICYmIHRoaXMudGltZU1vZGUgPT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5PUFRJT05BTCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0ZSQgPSB0aGlzLmRhdGVJbnB1dEN0cmwudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuZGF0ZUlucHV0Q3RybC52YWx1ZSksIHNoYXJlUmVwbGF5KDEpKTtcbiAgcmVhZG9ubHkgZGF0ZSQgPSB0aGlzLmN1cnJlbnREYXRlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSB0aW1lem9uZUFiYnJldmlhdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmN1cnJlbnREYXRlJCwgdGhpcy50aW1lem9uZSQsIHRoaXMudGltZURhdGUkXSkucGlwZShcbiAgICBtYXAoKFtkYXRlLCB0aW1lem9uZSwgdGltZURhdGVdKSA9PiBnZXRUaW1lem9uZUFiYnJldmlhdGlvbih0aW1lem9uZSwgdGltZURhdGUgPz8gZGF0ZSA/PyBuZXcgRGF0ZSgpKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVWYWx1ZSQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gbWVyZ2UodGhpcy5kYXRlJCwgdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkLnBpcGUoc2tpcEZpcnN0TWF5YmUoKSkpLnBpcGUoXG4gICAgbWFwKCh4OiBNYXliZTxEYXRlPikgPT4gKHggPyBzdGFydE9mRGF5KHgpIDogbnVsbCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkPE1heWJlPERhdGU+Pihpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHRpbWVJbnB1dCQ6IE9ic2VydmFibGU8UmVhZGFibGVUaW1lU3RyaW5nPiA9IHRoaXMuX3VwZGF0ZVRpbWUucGlwZShcbiAgICBkZWJvdW5jZVRpbWUoNSksXG4gICAgbWFwKCgpID0+IHRoaXMudGltZUlucHV0Q3RybC52YWx1ZSB8fCAnJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIHJlYWRvbmx5IHN5bmNDb25maWdPYnMkID0gdGhpcy5fc3luY0NvbmZpZ09icy5waXBlKHN3aXRjaE1hcE1heWJlRGVmYXVsdCgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgcGFyc2VkU3luY0NvbmZpZ3MkOiBPYnNlcnZhYmxlPERieERhdGVUaW1lRmllbGRTeW5jUGFyc2VkRmllbGRbXT4gPSB0aGlzLnN5bmNDb25maWdPYnMkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBsZXQgcGFyc2VkOiBEYnhEYXRlVGltZUZpZWxkU3luY1BhcnNlZEZpZWxkW107XG5cbiAgICAgIGlmICh4KSB7XG4gICAgICAgIHBhcnNlZCA9IGZpbHRlck1heWJlVmFsdWVzKFxuICAgICAgICAgIGFzQXJyYXkoeCkubWFwKCh5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh5LnN5bmNXaXRoKTtcblxuICAgICAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLFxuICAgICAgICAgICAgICAgIC4uLnlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZCA9IFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3luY0NvbmZpZ0JlZm9yZVZhbHVlJDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4gPSBzeW5jQ29uZmlnVmFsdWVPYnModGhpcy5wYXJzZWRTeW5jQ29uZmlncyQsICdiZWZvcmUnKTtcbiAgcmVhZG9ubHkgc3luY0NvbmZpZ0FmdGVyVmFsdWUkOiBPYnNlcnZhYmxlPERhdGUgfCBudWxsPiA9IHN5bmNDb25maWdWYWx1ZU9icyh0aGlzLnBhcnNlZFN5bmNDb25maWdzJCwgJ2FmdGVyJyk7XG5cbiAgcmVhZG9ubHkgaXNUaW1lQ2xlYXJlZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmN1cnJlbnREYXRlJCwgdGhpcy5fdGltZURhdGUucGlwZShzdGFydFdpdGgobnVsbCkpXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFtkYXRlLCB0aW1lXSkgPT4ge1xuICAgICAgY29uc3QgaXNUaW1lQ2xlYXJlZCA9IEJvb2xlYW4oIWRhdGUgJiYgIXRpbWUpO1xuICAgICAgcmV0dXJuIHRoaXMuX2NsZWFyZWQucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHRydWUpLFxuICAgICAgICBzdGFydFdpdGgoaXNUaW1lQ2xlYXJlZClcbiAgICAgICk7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHJhd0RhdGVUaW1lJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9jb25maWcucGlwZShcbiAgICAgIGZpcnN0KCksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gKHRoaXMudGltZU9ubHkgPyBvZihudWxsKSA6IHRoaXMuZGF0ZVZhbHVlJCkpXG4gICAgKSxcbiAgICB0aGlzLnRpbWVJbnB1dCQucGlwZShzdGFydFdpdGgobnVsbCkpLFxuICAgIHRoaXMuZnVsbERheSQsXG4gICAgdGhpcy50aW1lRGF0ZSQsXG4gICAgdGhpcy5pc1RpbWVDbGVhcmVkJFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2RhdGUsIHRpbWVTdHJpbmcsIGZ1bGxEYXksIHRpbWVEYXRlLCBpc1RpbWVDbGVhcmVkXSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogTWF5YmU8RGF0ZT47XG5cbiAgICAgIGlmICghaXNUaW1lQ2xlYXJlZCkge1xuICAgICAgICBpZiAoIWRhdGUgfHwgdGhpcy50aW1lT25seSkge1xuICAgICAgICAgIGRhdGUgPSB0aW1lRGF0ZSA/PyBuZXcgRGF0ZSgpOyAvLyB1c2UgdGhlIHRpbWUgZGF0ZSwgb3IgZGVmYXVsdCB0byB0aGUgY3VycmVudCBkYXlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgaWYgKGZ1bGxEYXkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGVUaW1lRmllbGQuZnVsbERheUluVVRDKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHV0Y0RheUZvckRhdGUoZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBzdGFydE9mRGF5KGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGltZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgICAgcmVhZGFibGVUaW1lU3RyaW5nVG9EYXRlKHRpbWVTdHJpbmcsIHtcbiAgICAgICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgICAgIHVzZVN5c3RlbVRpbWV6b25lOiB0cnVlXG4gICAgICAgICAgICAgIH0pID8/IGRhdGU7XG4gICAgICAgICAgfSBlbHNlIGlmICghdGhpcy50aW1lT25seSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGltZU1vZGUgIT09IERieERhdGVUaW1lRmllbGRUaW1lTW9kZS5SRVFVSVJFRCkge1xuICAgICAgICAgICAgICAvLyBvbmx5IGF1dG9maWxsIHRoZSBkYXRlIGlmIHRoZSB0aW1lIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAoYW5kIHRoZSB0aW1lIHN0cmluZyBpcyBlbXB0eSlcbiAgICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlSG91cnNBbmRNaW51dGVzKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVUaW1lUGlja2VyQ29uZmlnJDogT2JzZXJ2YWJsZTxNYXliZTxEYnhEYXRlVGltZVBpY2tlckNvbmZpZ3VyYXRpb24+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2NvbmZpZy5waXBlKHN3aXRjaE1hcE1heWJlT2JzKCkpLCB0aGlzLnN5bmNDb25maWdCZWZvcmVWYWx1ZSQsIHRoaXMuc3luY0NvbmZpZ0FmdGVyVmFsdWUkXSkucGlwZShcbiAgICBtYXAoKFt4LCBkYXRlSW5wdXRNaW4sIGRhdGVJbnB1dE1heF0pID0+IHtcbiAgICAgIGxldCByZXN1bHQ6IE1heWJlPERieERhdGVUaW1lUGlja2VyQ29uZmlndXJhdGlvbj4gPSB4O1xuXG4gICAgICBpZiAoZGF0ZUlucHV0TWluICE9IG51bGwgfHwgZGF0ZUlucHV0TWF4ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtaW46IGxpbWl0TWluLCBtYXg6IGxpbWl0TWF4IH0gPSB4Py5saW1pdHMgPz8ge307XG4gICAgICAgIGNvbnN0IG1pbiA9IGZpbmRNaW5EYXRlKFtkYXRlSW5wdXRNaW4sIGRhdGVGcm9tTG9naWNhbERhdGUobGltaXRNaW4pXSk7XG4gICAgICAgIGNvbnN0IG1heCA9IGZpbmRNYXhEYXRlKFtkYXRlSW5wdXRNYXgsIGRhdGVGcm9tTG9naWNhbERhdGUobGltaXRNYXgpXSk7XG5cbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgIC4uLngsXG4gICAgICAgICAgbGltaXRzOiB7XG4gICAgICAgICAgICAuLi54Py5saW1pdHMsXG4gICAgICAgICAgICBtaW4sXG4gICAgICAgICAgICBtYXhcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVJbnB1dE1pbiQ6IE9ic2VydmFibGU8RGF0ZSB8IG51bGw+ID0gdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyQucGlwZShcbiAgICBtYXAoKHgpID0+ICh4Py5saW1pdHM/Lm1pbiA/PyBudWxsKSBhcyBEYXRlIHwgbnVsbCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQ8RGF0ZSB8IG51bGw+KGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZUlucHV0TWF4JDogT2JzZXJ2YWJsZTxEYXRlIHwgbnVsbD4gPSB0aGlzLmRhdGVUaW1lUGlja2VyQ29uZmlnJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKHg/LmxpbWl0cz8ubWF4ID8/IG51bGwpIGFzIERhdGUgfCBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZDxEYXRlIHwgbnVsbD4oaXNTYW1lRGF0ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlTWluQW5kTWF4SXNTYW1lRGF5JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF0ZUlucHV0TWluJCwgdGhpcy5kYXRlSW5wdXRNYXgkXSkucGlwZShcbiAgICBtYXAoKFthLCBiXSkgPT4gQm9vbGVhbihhICYmIGIpICYmIGlzU2FtZURhdGVEYXkoYSwgYikpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBwaWNrZXJGaWx0ZXIkOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZSB8IG51bGw+PiA9IHRoaXMuZGF0ZVRpbWVQaWNrZXJDb25maWckLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGRhdGVUaW1lTWludXRlV2hvbGVEYXlEZWNpc2lvbkZ1bmN0aW9uKHgsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuICh4OiBEYXRlIHwgbnVsbCkgPT4gKHggIT0gbnVsbCA/IGZpbHRlcih4KSA6IHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICgpID0+IHRydWU7XG4gICAgICB9XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkZWZhdWx0UGlja2VyRmlsdGVyOiBEZWNpc2lvbkZ1bmN0aW9uPERhdGUgfCBudWxsPiA9ICgpID0+IHRydWU7XG5cbiAgcmVhZG9ubHkgdGltZU91dHB1dCQ6IE9ic2VydmFibGU8TWF5YmU8RGF0ZT4+ID0gY29tYmluZUxhdGVzdChbdGhpcy5yYXdEYXRlVGltZSQsIHRoaXMuX29mZnNldCwgdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyRdKS5waXBlKFxuICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChjdXJyZW50LCBuZXh0KSA9PiBjdXJyZW50WzBdID09PSBuZXh0WzBdICYmIG5leHRbMV0gPT09IDAgJiYgY3VycmVudFsyXSA9PT0gbmV4dFsyXSksXG4gICAgdGFwKChbLCBzdGVwc09mZnNldF0pID0+IChzdGVwc09mZnNldCA/IHRoaXMuX29mZnNldC5uZXh0KDApIDogMCkpLFxuICAgIG1hcCgoW2RhdGUsIHN0ZXBzT2Zmc2V0LCBjb25maWddKSA9PiB7XG4gICAgICBpZiAoZGF0ZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERhdGVUaW1lTWludXRlSW5zdGFuY2Uoe1xuICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIHJvdW5kRG93blRvTWludXRlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRhdGUgPSBpbnN0YW5jZS5jbGFtcChkYXRlKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IHN0ZXBzT2Zmc2V0ICogdGhpcy5taW51dGVTdGVwO1xuXG4gICAgICAgIGlmIChtaW51dGVzICE9IDApIHtcbiAgICAgICAgICBkYXRlID0gYWRkTWludXRlcyhkYXRlLCBtaW51dGVzKTtcbiAgICAgICAgICBkYXRlID0gaW5zdGFuY2UuY2xhbXAoZGF0ZSk7IC8vIGNsYW1wIHRoZSBkYXRlIGFnYWluXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZUhvdXJzQW5kTWludXRlcyksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBoYXNFbXB0eURpc3BsYXlWYWx1ZSQgPSB0aGlzLmRpc3BsYXlWYWx1ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICF4KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgcHJlc2V0cyQ6IE9ic2VydmFibGU8RGF0ZVRpbWVQcmVzZXRbXT4gPSB0aGlzLl9wcmVzZXRzLnBpcGUoXG4gICAgc3dpdGNoTWFwTWF5YmVPYnMoKSxcbiAgICBtYXAoKHg6IERhdGVUaW1lUHJlc2V0Q29uZmlndXJhdGlvbltdKSA9PiB4Lm1hcChkYXRlVGltZVByZXNldCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2hvd0NsZWFyQnV0dG9uJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaGFzRW1wdHlEaXNwbGF5VmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiBCb29sZWFuKHRoaXMuc2hvd0NsZWFyQnV0dG9uICYmICF4KSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGNhbkF1dG9maWxsRGF0ZVdpdGhPbmx5QXZhaWxhYmxlRGF0ZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmRhdGVNaW5BbmRNYXhJc1NhbWVEYXkkO1xuXG4gIHJlYWRvbmx5IHNob3dEYXRlSW5wdXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5kYXRlTWluQW5kTWF4SXNTYW1lRGF5JC5waXBlKFxuICAgIG1hcCgoZGF0ZU1pbkFuZE1heElzU2FtZURheSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd0RhdGVJbnB1dCAmJiAodGhpcy5hbHdheXNTaG93RGF0ZUlucHV0IHx8ICFkYXRlTWluQW5kTWF4SXNTYW1lRGF5KTtcbiAgICB9KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgcmVhZG9ubHkgZGJ4RGF0ZVRpbWVGaWVsZENvbmZpZ1NlcnZpY2U6IERieERhdGVUaW1lRmllbGRNZW51UHJlc2V0c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9ybUNvbnRyb2xPYnMubmV4dCh0aGlzLmZvcm1Db250cm9sKTtcblxuICAgIGNvbnN0IGlucHV0UGlja2VyQ29uZmlnID0gdGhpcy5kYXRlVGltZUZpZWxkLnBpY2tlckNvbmZpZztcbiAgICB0aGlzLl9jb25maWcubmV4dChpbnB1dFBpY2tlckNvbmZpZyA/IGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIoaW5wdXRQaWNrZXJDb25maWcpIDogb2Yoe30pKTtcbiAgICB0aGlzLl9zeW5jQ29uZmlnT2JzLm5leHQodGhpcy5kYXRlVGltZUZpZWxkLmdldFN5bmNGaWVsZHNPYnM/LigpKTtcblxuICAgIHRoaXMuX3N1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnZhbHVlSW5TeXN0ZW1UaW1lem9uZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnRpbWV6b25lSW5zdGFuY2UkLnBpcGUobWFwKCh0aW1lem9uZUluc3RhbmNlKSA9PiBkYnhEYXRlVGltZU91dHB1dFZhbHVlRmFjdG9yeSh0aGlzLnZhbHVlTW9kZSwgdGltZXpvbmVJbnN0YW5jZSkpKSksXG4gICAgICAgIHRocm90dGxlVGltZShUSU1FX09VVFBVVF9USFJPVFRMRV9USU1FLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKFtjdXJyZW50VmFsdWUsIHZhbHVlRmFjdG9yeV0pID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50aW1lT3V0cHV0JC5waXBlKFxuICAgICAgICAgICAgdGhyb3R0bGVUaW1lKFRJTUVfT1VUUFVUX1RIUk9UVExFX1RJTUUgKiAyLCB1bmRlZmluZWQsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgc2tpcEZpcnN0TWF5YmUoKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVIb3Vyc0FuZE1pbnV0ZXMpLFxuICAgICAgICAgICAgbWFwKCh4KSA9PiB2YWx1ZUZhY3RvcnkoeCkpLFxuICAgICAgICAgICAgZmlsdGVyKCh4KSA9PiAhZGJ4RGF0ZVRpbWVJc1NhbWVEYXRlVGltZUZpZWxkVmFsdWUoeCwgY3VycmVudFZhbHVlKSlcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB9KTtcblxuICAgIGxldCBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCA9IGZhbHNlO1xuXG4gICAgLypcbiAgICB0aGlzLl92YWx1ZVN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnRpbWVTdHJpbmckLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgdGhpcy5zZXRUaW1lKHgpO1xuICAgIH0pO1xuICAgICovXG5cbiAgICBpZiAodGhpcy5hdXRvZmlsbERhdGVXaGVuVGltZUlzUGlja2VkKSB7XG4gICAgICB0aGlzLl9hdXRvRmlsbERhdGVTeW5jLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2FuQXV0b2ZpbGxEYXRlV2l0aE9ubHlBdmFpbGFibGVEYXRlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKGNhbkF1dG9maWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FuQXV0b2ZpbGwpIHtcbiAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgdGltZSB1cGRhdGVzIHRoZSBmaXJzdCB0aW1lLCBzZXQgdGhlIGN1cnJlbnQgbWluIGRhdGVcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZVRpbWUucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHgpID0+IHRoaXMuZGF0ZUlucHV0TWluJCksXG4gICAgICAgICAgICAgICAgZmlsdGVyTWF5YmUoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpOyAvLyBkb24ndCBzaG93IGFueXRoaW5nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChhdXRvRGF0ZSkgPT4ge1xuICAgICAgICAgIGlmIChhdXRvRGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVJbnB1dEN0cmwuc2V0VmFsdWUoYXV0b0RhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsdWVTdWIuc3Vic2NyaXB0aW9uID0gdGhpcy52YWx1ZUluU3lzdGVtVGltZXpvbmUkXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh4KSA9PiAoeCA/IGlzU2FtZURhdGUoeCwgc3RhcnRPZkRheSh4KSkgOiBmYWxzZSkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBzd2l0Y2hNYXAoKGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQpID0+IHtcbiAgICAgICAgICBoYXNTZXRNaWRuaWdodEZyb21JbnB1dCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVTdHJpbmckLnBpcGUoXG4gICAgICAgICAgICAvLyBza2lwKDEpLFxuICAgICAgICAgICAgbWFwKCh0aW1lU3RyaW5nKSA9PiBbdGltZVN0cmluZywgaXNJbnB1dFZhbHVlQXRNaWRuaWdodF0gYXMgW3N0cmluZywgYm9vbGVhbl0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFt4LCBpc0lucHV0VmFsdWVBdE1pZG5pZ2h0XSkgPT4ge1xuICAgICAgICAvLyBTa2lwIGV2ZW50cyB3aGVyZSB0aGUgdGltZUlucHV0IHZhbHVlIGlzIGNsZWFyZWQsIHVubGVzcyB0aGUgaW5wdXQgdmFsdWUgaXMgYXQgbWlkbmlnaHQgYW5kIHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkIGl0IGJlaW5nIGF0IG1pZG5pZ2h0XG4gICAgICAgIGlmICghdGhpcy50aW1lSW5wdXRDdHJsLnZhbHVlICYmIHggPT09ICcxMjowMEFNJyAmJiAoIWlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQgfHwgKGlzSW5wdXRWYWx1ZUF0TWlkbmlnaHQgJiYgaGFzU2V0TWlkbmlnaHRGcm9tSW5wdXQpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgaGFzIHNldCBmbGFnXG4gICAgICAgIGlmICh4ID09PSAnMTI6MDBBTScgJiYgaXNJbnB1dFZhbHVlQXRNaWRuaWdodCkge1xuICAgICAgICAgIGhhc1NldE1pZG5pZ2h0RnJvbUlucHV0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VGltZSh4KTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2V0IGRlZmF1bHQgdGltZXpvbmUgaWYgcHJvdmlkZWQuXG4gICAgaWYgKHRoaXMudGltZXpvbmUgJiYgIXRoaXMuZGF0ZVRpbWVGaWVsZC5mdWxsRGF5SW5VVEMpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRUaW1lem9uZS5uZXh0KGFzT2JzZXJ2YWJsZUZyb21HZXR0ZXIodGhpcy50aW1lem9uZSkpO1xuICAgIH1cblxuICAgIHRoaXMuX3RpbWVEYXRlLm5leHQoYXNPYnNlcnZhYmxlRnJvbUdldHRlcih0aGlzLnRpbWVEYXRlKSk7XG5cbiAgICAvLyBXYXRjaCBmb3IgZGlzYWJsZWQgY2hhbmdlcyBzbyB3ZSBjYW4gcHJvcG9nYXRlIHRoZW0gcHJvcGVybHkuXG4gICAgdGhpcy5mb3JtQ29udHJvbC5yZWdpc3Rlck9uRGlzYWJsZWRDaGFuZ2UoKGlzRGlzYWJsZWQpID0+IHtcbiAgICAgIHRvZ2dsZURpc2FibGVGb3JtQ29udHJvbCh0aGlzLmRhdGVJbnB1dEN0cmwsIGlzRGlzYWJsZWQpO1xuICAgICAgdG9nZ2xlRGlzYWJsZUZvcm1Db250cm9sKHRoaXMudGltZUlucHV0Q3RybCwgaXNEaXNhYmxlZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpc0Z1bGxEYXlGaWVsZCA9IHRoaXMuZGF0ZVRpbWVGaWVsZC5mdWxsRGF5RmllbGROYW1lO1xuICAgIGxldCBmdWxsRGF5RmllbGRDdHJsOiBNYXliZTxBYnN0cmFjdENvbnRyb2w+O1xuXG4gICAgaWYgKGlzRnVsbERheUZpZWxkKSB7XG4gICAgICBmdWxsRGF5RmllbGRDdHJsID0gdGhpcy5mb3JtLmdldChpc0Z1bGxEYXlGaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKCFmdWxsRGF5RmllbGRDdHJsKSB7XG4gICAgICBjb25zdCBpc0Z1bGxEYXkgPSB0aGlzLnRpbWVNb2RlID09PSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTtcbiAgICAgIHRoaXMuX2Z1bGxEYXlJbnB1dEN0cmwgPSBuZXcgRm9ybUNvbnRyb2woaXNGdWxsRGF5KTtcblxuICAgICAgLy8gU2V0IHRoZSBjb250cm9sIGluIHRoZSBmb3JtIHRvbyBpZiB0aGUgbmFtZSBpcyBkZWZpbmVkLlxuICAgICAgaWYgKGlzRnVsbERheUZpZWxkKSB7XG4gICAgICAgICh0aGlzLmZvcm0gYXMgRm9ybUdyb3VwKS5hZGRDb250cm9sKGlzRnVsbERheUZpZWxkLCB0aGlzLl9mdWxsRGF5SW5wdXRDdHJsKTtcbiAgICAgIH1cblxuICAgICAgZnVsbERheUZpZWxkQ3RybCA9IHRoaXMuX2Z1bGxEYXlJbnB1dEN0cmw7XG4gICAgfVxuXG4gICAgdGhpcy5fZnVsbERheUNvbnRyb2xPYnMubmV4dChmdWxsRGF5RmllbGRDdHJsKTtcblxuICAgIHN3aXRjaCAodGhpcy50aW1lTW9kZSkge1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuT1BUSU9OQUw6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuTk9ORTpcbiAgICAgICAgdGhpcy5yZW1vdmVUaW1lKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBEYnhEYXRlVGltZUZpZWxkVGltZU1vZGUuUkVRVUlSRUQ6XG4gICAgICAgIHRoaXMuYWRkVGltZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcmVzZXRzICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX3ByZXNldHMubmV4dChhc09ic2VydmFibGVGcm9tR2V0dGVyKHRoaXMucHJlc2V0cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wcmVzZXRzLm5leHQodGhpcy5kYnhEYXRlVGltZUZpZWxkQ29uZmlnU2VydmljZS5jb25maWd1cmF0aW9ucyQpO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc3luY1RpbWVJbnB1dFN1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLnJlc3luY1RpbWVJbnB1dCQucGlwZShzd2l0Y2hNYXAoKHgpID0+IHRoaXMudGltZVN0cmluZyQucGlwZShmaXJzdCgpKSkpLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgdGhpcy50aW1lSW5wdXRDdHJsLnNldFZhbHVlKHgsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5fc3ViLmRlc3Ryb3koKTtcbiAgICB0aGlzLl92YWx1ZVN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fY29uZmlnLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY29uZmlnVXBkYXRlVGltZVN5bmMuZGVzdHJveSgpO1xuICAgIHRoaXMuX2RlZmF1bHRUaW1lem9uZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3Jlc3luY1RpbWVJbnB1dFN1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fYXV0b0ZpbGxEYXRlU3luYy5kZXN0cm95KCk7XG4gICAgdGhpcy5fdGltZURhdGUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9wcmVzZXRzLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZnVsbERheUNvbnRyb2xPYnMuY29tcGxldGUoKTtcbiAgICB0aGlzLl9vZmZzZXQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9mb3JtQ29udHJvbE9icy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3VwZGF0ZVRpbWUuY29tcGxldGUoKTtcbiAgICB0aGlzLl9jbGVhcmVkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fcmVzeW5jVGltZUlucHV0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc3luY0NvbmZpZ09icy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgc2VsZWN0UHJlc2V0KHByZXNldDogRGF0ZVRpbWVQcmVzZXQpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHByZXNldC52YWx1ZSgpO1xuXG4gICAgaWYgKHZhbHVlLmxvZ2ljYWxEYXRlKSB7XG4gICAgICB0aGlzLnNldExvZ2ljYWxUaW1lKHZhbHVlLmxvZ2ljYWxEYXRlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnRpbWVTdHJpbmcpIHtcbiAgICAgIHRoaXMuc2V0VGltZSh2YWx1ZS50aW1lU3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICBkYXRlUGlja2VkKGV2ZW50OiBNYXREYXRlcGlja2VySW5wdXRFdmVudDxEYXRlPik6IHZvaWQge1xuICAgIGNvbnN0IGRhdGUgPSBldmVudC52YWx1ZTtcblxuICAgIGlmIChkYXRlKSB7XG4gICAgICB0aGlzLnNldERhdGVJbnB1dFZhbHVlKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHNldExvZ2ljYWxUaW1lKHRpbWU6IExvZ2ljYWxEYXRlKTogdm9pZCB7XG4gICAgY29uc3QgZGF0ZSA9IGRhdGVGcm9tTG9naWNhbERhdGUodGltZSk7XG5cbiAgICBpZiAoZGF0ZSkge1xuICAgICAgdGhpcy5zZXRUaW1lRnJvbURhdGUoZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGF0ZUlucHV0VmFsdWUoZGF0ZTogRGF0ZSkge1xuICAgIHRoaXMuZGF0ZUlucHV0Q3RybC5zZXRWYWx1ZShkYXRlKTtcbiAgICB0aGlzLl91cGRhdGVUaW1lLm5leHQoKTtcbiAgfVxuXG4gIHNldFRpbWVGcm9tRGF0ZSh0aW1lRGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVTdHJpbmcgPSB0b0xvY2FsUmVhZGFibGVUaW1lU3RyaW5nKHRpbWVEYXRlKTtcbiAgICB0aGlzLnNldFRpbWUodGltZVN0cmluZyk7XG4gIH1cblxuICBzZXRUaW1lKHRpbWU6IFJlYWRhYmxlVGltZVN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVJbnB1dEN0cmwudmFsdWUgIT09IHRpbWUpIHtcbiAgICAgIHRoaXMudGltZUlucHV0Q3RybC5zZXRWYWx1ZSh0aW1lKTtcbiAgICAgIHRoaXMuX29mZnNldC5uZXh0KDApO1xuICAgICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAga2V5ZG93bk9uRGF0ZUlucHV0KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IGRpcmVjdGlvbiA9IDA7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgIGRpcmVjdGlvbiA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXJyb3dkb3duJzpcbiAgICAgICAgZGlyZWN0aW9uID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQgPSAxO1xuXG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDM2NTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIG9mZnNldCA9IDMwO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDc7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gMCkge1xuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5kYXRlJCwgdGhpcy5kYXRlVGltZVBpY2tlckNvbmZpZyRdKVxuICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAuc3Vic2NyaWJlKChbZGF0ZSwgY29uZmlnXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBzdGFydE9mRGF5KGFkZERheXMoZGF0ZSwgb2Zmc2V0ICogZGlyZWN0aW9uKSk7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGF0ZVRpbWVNaW51dGVJbnN0YW5jZSh7XG4gICAgICAgICAgICBkYXRlOiBuZXdEYXRlLFxuICAgICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBuZXh0RGF0ZSA9IGluc3RhbmNlLmlzSW5TY2hlZHVsZShuZXdEYXRlKSA/IG5ld0RhdGUgOiBpbnN0YW5jZS5maW5kTmV4dEF2YWlsYWJsZURheUluU2NoZWR1bGUobmV3RGF0ZSwgZGlyZWN0aW9uID09PSAxID8gJ2Z1dHVyZScgOiAncGFzdCcpO1xuXG4gICAgICAgICAgaWYgKG5leHREYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZUlucHV0VmFsdWUoaW5zdGFuY2UuY2xhbXBUb0xpbWl0KG5leHREYXRlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBrZXlkb3duT25UaW1lSW5wdXQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgZGlyZWN0aW9uID0gMDtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5Py50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICBjYXNlICdhcnJvd3VwJzpcbiAgICAgICAgZGlyZWN0aW9uID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICBkaXJlY3Rpb24gPSAtMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbGV0IG9mZnNldCA9IDE7XG5cbiAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBvZmZzZXQgPSAzMDA7XG4gICAgfSBlbHNlIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDYwO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIG9mZnNldCA9IDU7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gMCkge1xuICAgICAgdGhpcy5fb2Zmc2V0Lm5leHQodGhpcy5fb2Zmc2V0LnZhbHVlICsgb2Zmc2V0ICogZGlyZWN0aW9uKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpbWUubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzVGltZSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBmb2N1c091dFRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlVGltZS5uZXh0KCk7XG4gICAgdGhpcy5fcmVzeW5jVGltZUlucHV0Lm5leHQoKTtcbiAgfVxuXG4gIGFkZFRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRGdWxsRGF5KGZhbHNlKTtcbiAgfVxuXG4gIHJlbW92ZVRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRGdWxsRGF5KHRydWUpO1xuICB9XG5cbiAgc2V0RnVsbERheShmdWxsRGF5OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5mdWxsRGF5Q29udHJvbCQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHguc2V0VmFsdWUoZnVsbERheSk7XG4gICAgfSk7XG4gIH1cblxuICBjbGVhclZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyZWQubmV4dCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGJ4LWRhdGV0aW1lLWZpZWxkXCIgZnhMYXlvdXQ9XCJyb3cgd3JhcFwiIGZ4TGF5b3V0LnhzPVwiY29sdW1uIHdyYXBcIiBmeExheW91dEdhcD1cIjZweCBncmlkXCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWV2ZW5seSBzdHJldGNoXCI+XG4gIDwhLS0gRGF0ZSAtLT5cbiAgPGRpdiBjbGFzcz1cImRieC1kYXRldGltZS1yb3dcIiBmeEZsZXgubHQtc209XCIxMDBcIiBbZnhGbGV4XT1cImRhdGVPbmx5ID8gJzEwMCcgOiAnNTAnXCIgKm5nSWY9XCJzaG93RGF0ZUlucHV0JCB8IGFzeW5jXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRhdGVJbnB1dFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8IS0tIFRpbWUgLS0+XG4gIDxkaXYgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93XCIgZnhGbGV4Lmx0LXNtPVwiMTAwXCIgW2Z4RmxleF09XCIoc2hvd0RhdGVJbnB1dCQgfCBhc3luYykgPyAnNTAnIDogJzEwMCdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1RpbWVJbnB1dCQgfCBhc3luY1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpbWVNZW51QW5kSW5wdXRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgKm5nSWY9XCJzaG93QWRkVGltZSQgfCBhc3luY1wiIGNsYXNzPVwiYWRkLXRpbWUtYnV0dG9uLXdyYXBwZXJcIj5cbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cIm1hdC1kYXRlcGlja2VyLWJ1dHRvbi1oaWdobGlnaHQgZGJ4LWJ1dHRvbi1zcGFjZXIgYWRkLXRpbWUtYnV0dG9uXCIgbmdDbGFzcy5sdC1zbT1cImFkZC10aW1lLWJ1dHRvbi1mdWxsXCIgKGNsaWNrKT1cImFkZFRpbWUoKVwiPlxuICAgICAgICA8bWF0LWljb24+dGltZXI8L21hdC1pY29uPlxuICAgICAgICBBZGQgVGltZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiIWhpZGVEYXRlSGludFwiIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdyBkYngtZGF0ZXRpbWUtaGludC1yb3dcIiBmeEZsZXg9XCIxMDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGJ4LWhpbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImhhc0VtcHR5RGlzcGxheVZhbHVlJCB8IGFzeW5jXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cInRydWVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRieC1zbWFsbFwiPk5vIGRhdGUvdGltZSBzZXQ8L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZ1bGxEYXkkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgIDxzbWFsbCAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8YiBjbGFzcz1cImRieC1va1wiPnt7IGFsbERheUxhYmVsIH19PC9iPlxuICAgICAgICAgICAgICB7eyBkaXNwbGF5VmFsdWUkIHwgYXN5bmMgfCBkYXRlOiAnZnVsbERhdGUnIH19IHt7IHRpbWV6b25lQWJicmV2aWF0aW9uJCB8IGFzeW5jIH19ICh7eyBkaXNwbGF5VmFsdWUkIHwgYXN5bmMgfCBkYXRlRGlzdGFuY2UgfX0pXG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgPHNtYWxsICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheVZhbHVlJCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJkYngtb2tcIj57eyBhdFRpbWVMYWJlbCB9fTwvYj5cbiAgICAgICAgICAgICAgICB7eyBkaXNwbGF5VmFsdWUkIHwgYXN5bmMgfCBkYXRlOiAnbWVkaXVtJyB9fSB7eyB0aW1lem9uZUFiYnJldmlhdGlvbiQgfCBhc3luYyB9fSAoe3sgZGlzcGxheVZhbHVlJCB8IGFzeW5jIHwgdGltZURpc3RhbmNlIH19KVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gRGF0ZSBJbnB1dCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZGF0ZUlucHV0VGVtcGxhdGU+XG4gIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctZmllbGRcIj5cbiAgICA8bWF0LWxhYmVsPnt7IGRhdGVMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCAjZGF0ZUlucHV0IG1hdElucHV0IFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtyZXF1aXJlZF09XCJpc0RhdGVSZXF1aXJlZFwiIFttaW5dPVwiZGF0ZUlucHV0TWluJCB8IGFzeW5jXCIgW21heF09XCJkYXRlSW5wdXRNYXgkIHwgYXN5bmNcIiBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIiBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCIocGlja2VyRmlsdGVyJCB8IGFzeW5jKSB8fCBkZWZhdWx0UGlja2VyRmlsdGVyXCIgKGRhdGVDaGFuZ2UpPVwiZGF0ZVBpY2tlZCgkZXZlbnQpXCIgW3ZhbHVlXT1cImRhdGVWYWx1ZSQgfCBhc3luY1wiIChrZXlkb3duKT1cImtleWRvd25PbkRhdGVJbnB1dCgkZXZlbnQpXCIgLz5cbiAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgIDxidXR0b24gbWF0UHJlZml4IGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXJvdy1idXR0b25cIiAqbmdJZj1cIiFoaWRlRGF0ZVBpY2tlclwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicGlja2VyLm9wZW4oKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgPG1hdC1pY29uPmNhbGVuZGFyX3RvZGF5PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIG1hdFN1ZmZpeCAqbmdJZj1cInNob3dDbGVhckJ1dHRvbiQgfCBhc3luY1wiIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLWNsZWFyLWJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiY2xlYXJzIHRoZSBkYXRlIGFuZCB0aW1lIG1lbnVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoY2xpY2spPVwiY2xlYXJWYWx1ZSgpXCI+XG4gICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxzcGFuIG1hdFRleHRTdWZmaXggKm5nSWY9XCIhKHNob3dUaW1lSW5wdXQkIHwgYXN5bmMpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGltZXpvbmVTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc3Bhbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGltZSBNZW51L0lucHV0IFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICN0aW1lTWVudUFuZElucHV0VGVtcGxhdGU+XG4gIDxtYXQtbWVudSAjdGltZW1lbnU9XCJtYXRNZW51XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRpbWVNb2RlID09PSAnb3B0aW9uYWwnXCI+XG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInJlbW92ZVRpbWUoKVwiPlxuICAgICAgICA8c3Bhbj5SZW1vdmUgVGltZTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJlc2V0IG9mIHByZXNldHMkIHwgYXN5bmNcIj5cbiAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2VsZWN0UHJlc2V0KHByZXNldClcIj57eyBwcmVzZXQubGFiZWwgfCBnZXRWYWx1ZSB9fTwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L21hdC1tZW51PlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJkYngtZGF0ZXRpbWUtcm93LWZpZWxkXCI+XG4gICAgPG1hdC1sYWJlbD57eyB0aW1lTGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXQgI3RpbWVJbnB1dCBtYXRJbnB1dCBbcmVxdWlyZWRdPVwiaXNUaW1lUmVxdWlyZWRcIiBbZm9ybUNvbnRyb2xdPVwidGltZUlucHV0Q3RybFwiIChmb2N1cyk9XCJmb2N1c1RpbWUoKVwiIChmb2N1c291dCk9XCJmb2N1c091dFRpbWUoKVwiIChrZXlkb3duKT1cImtleWRvd25PblRpbWVJbnB1dCgkZXZlbnQpXCIgLz5cbiAgICA8YnV0dG9uIG1hdFByZWZpeCBjbGFzcz1cImRieC1kYXRldGltZS1yb3ctYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJ0aW1lbWVudVwiIGFyaWEtbGFiZWw9XCJvcGVucyB0aGUgdGltZSBtZW51XCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bWF0LWljb24+dGltZXI8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGltZXpvbmVTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc3Bhbj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gVGltZXpvbmUgU3VmZml4IC0tPlxuPG5nLXRlbXBsYXRlICN0aW1lem9uZVN1ZmZpeFRlbXBsYXRlPlxuICA8c3BhbiAqbmdJZj1cInNob3dUaW1lem9uZVwiIGNsYXNzPVwiZGJ4LWRhdGV0aW1lLXRpbWV6b25lIGRieC1mYWludFwiPnt7IHRpbWV6b25lQWJicmV2aWF0aW9uJCB8IGFzeW5jIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|