@coreui/angular-pro 4.2.23 → 4.2.25

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.
Files changed (26) hide show
  1. package/esm2020/lib/date-picker/date-picker.component.mjs +3 -3
  2. package/esm2020/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +13 -5
  3. package/esm2020/lib/multi-select/multi-select/multi-select.component.mjs +12 -3
  4. package/esm2020/lib/sidebar/sidebar/sidebar.component.mjs +7 -7
  5. package/esm2020/lib/smart-table/smart-table/smart-table.component.mjs +8 -3
  6. package/esm2020/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.mjs +30 -0
  7. package/esm2020/lib/smart-table/smart-table-filter/filter-input.directive.mjs +78 -0
  8. package/esm2020/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +17 -67
  9. package/esm2020/lib/smart-table/smart-table-head/smart-table-head.component.mjs +14 -9
  10. package/esm2020/lib/smart-table/smart-table.module.mjs +8 -2
  11. package/esm2020/lib/time-picker/time-picker.component.mjs +44 -17
  12. package/fesm2015/coreui-angular-pro.mjs +538 -435
  13. package/fesm2015/coreui-angular-pro.mjs.map +1 -1
  14. package/fesm2020/coreui-angular-pro.mjs +534 -431
  15. package/fesm2020/coreui-angular-pro.mjs.map +1 -1
  16. package/lib/date-range-picker/date-range-picker/date-range-picker.component.d.ts +12 -2
  17. package/lib/multi-select/multi-select/multi-select.component.d.ts +14 -1
  18. package/lib/sidebar/sidebar/sidebar.component.d.ts +5 -5
  19. package/lib/smart-table/smart-table/smart-table.component.d.ts +5 -1
  20. package/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.d.ts +11 -0
  21. package/lib/smart-table/smart-table-filter/filter-input.directive.d.ts +24 -0
  22. package/lib/smart-table/smart-table-filter/smart-table-filter.component.d.ts +8 -13
  23. package/lib/smart-table/smart-table-head/smart-table-head.component.d.ts +6 -1
  24. package/lib/smart-table/smart-table.module.d.ts +13 -11
  25. package/lib/time-picker/time-picker.component.d.ts +18 -5
  26. package/package.json +1 -1
@@ -1,8 +1,9 @@
1
- import { Component, ContentChildren, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild } from '@angular/core';
1
+ import { Component, ContentChildren, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild } from '@angular/core';
2
2
  import { FormControl, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
3
3
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
4
4
  import { TemplateIdDirective } from '../shared';
5
5
  import { convert12hTo24h, convert24hTo12h, convertTimeToDate, getAmPm, getDayPeriods, getListOfHours, getListOfMinutes, getListOfSeconds, isHour12, isValidTime } from './time.utils';
6
+ import { DropdownComponent } from '../dropdown';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "@angular/common";
8
9
  import * as i2 from "@angular/forms";
@@ -56,14 +57,15 @@ export class TimePickerComponent {
56
57
  ];
57
58
  this._timeInputValue = this.time?.toLocaleTimeString(this.locale, { timeStyle: this.seconds ? 'medium' : 'short' }) ?? '';
58
59
  this.selectTime = new FormGroup({
59
- selectHours: new FormControl({ value: this.hour, disabled: this.disabled }),
60
- selectMinutes: new FormControl({ value: this.minute, disabled: this.disabled }),
61
- selectSeconds: new FormControl({ value: this.second, disabled: this.disabled }),
62
- selectDayPeriod: new FormControl({ value: this.dayPeriod, disabled: this.disabled })
63
- });
64
- this.timeInput = new FormControl({ value: this.timeInputValue, disabled: this.disabled }, [
65
- Validators.required
66
- ]);
60
+ selectHours: new FormControl({ value: this.hour, disabled: this.disabled }, { validators: [Validators.min(0)] }),
61
+ selectMinutes: new FormControl({ value: this.minute, disabled: this.disabled }, Validators.min(0)),
62
+ selectSeconds: new FormControl({ value: this.second, disabled: this.disabled }, Validators.min(0)),
63
+ selectDayPeriod: new FormControl({ value: this.dayPeriod, disabled: this.disabled }, Validators.required)
64
+ }, { validators: [Validators.required] });
65
+ this.timeInput = new FormControl({
66
+ value: this.timeInputValue,
67
+ disabled: this.disabled
68
+ }, { validators: [Validators.required] });
67
69
  this._hour = -1;
68
70
  this._minute = -1;
69
71
  this._second = -1;
@@ -151,7 +153,7 @@ export class TimePickerComponent {
151
153
  return this._time;
152
154
  }
153
155
  /**
154
- * Toggle the visibility of dropdown menu component.
156
+ * Toggle the visibility of dropdown timepicker menu component.
155
157
  * @type boolean
156
158
  * @default false
157
159
  */
@@ -171,6 +173,13 @@ export class TimePickerComponent {
171
173
  get timeInputValue() {
172
174
  return this._timeInputValue;
173
175
  }
176
+ get timePickerClasses() {
177
+ return {
178
+ 'form-control': this.variant === 'select' && this.valid !== undefined,
179
+ 'is-valid': this.valid === true,
180
+ 'is-invalid': this.valid === false
181
+ };
182
+ }
174
183
  set hour(value) {
175
184
  if (this._hour !== value) {
176
185
  if (value < 0) {
@@ -234,6 +243,7 @@ export class TimePickerComponent {
234
243
  this._second = -1;
235
244
  this.dayPeriod = 'am';
236
245
  this.patchSelectTimeValues();
246
+ this.timeInputValue = '';
237
247
  }
238
248
  emitTime(time) {
239
249
  const timeValue = !!time && isValidTime(time) ? new Date(time.getTime()) : undefined;
@@ -390,7 +400,7 @@ export class TimePickerComponent {
390
400
  }
391
401
  handleTimeInputChange($event) {
392
402
  const value = $event.target?.value;
393
- if (!isValidTime(value)) {
403
+ if (!value || !isValidTime(value)) {
394
404
  this.clearTime();
395
405
  return;
396
406
  }
@@ -400,15 +410,30 @@ export class TimePickerComponent {
400
410
  handleClear($event) {
401
411
  this.clearTime();
402
412
  }
413
+ handleBlur($event) {
414
+ if (this.disabled) {
415
+ return;
416
+ }
417
+ this.dropdownRef?.nativeElement?.classList.remove('show');
418
+ setTimeout(() => {
419
+ this.onBlur();
420
+ }, 100);
421
+ }
422
+ handleFocus($event) {
423
+ if (this.disabled) {
424
+ return;
425
+ }
426
+ this.dropdownRef?.nativeElement?.classList.add('show');
427
+ }
403
428
  }
404
429
  TimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
405
- TimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TimePickerComponent, selector: "c-time-picker", inputs: { cleaner: "cleaner", dateTimeFormatOptions: "dateTimeFormatOptions", disabled: "disabled", filterHours: "filterHours", filterMinutes: "filterMinutes", filterSeconds: "filterSeconds", indicator: "indicator", inputReadOnly: "inputReadOnly", locale: "locale", placeholder: "placeholder", seconds: "seconds", size: "size", time: "time", variant: "variant", visible: "visible" }, outputs: { timeChange: "timeChange" }, host: { listeners: { "blur": "onBlur()" } }, providers: [
430
+ TimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TimePickerComponent, selector: "c-time-picker", inputs: { cleaner: "cleaner", dateTimeFormatOptions: "dateTimeFormatOptions", disabled: "disabled", filterHours: "filterHours", filterMinutes: "filterMinutes", filterSeconds: "filterSeconds", indicator: "indicator", inputReadOnly: "inputReadOnly", locale: "locale", placeholder: "placeholder", seconds: "seconds", size: "size", time: "time", variant: "variant", valid: "valid", visible: "visible" }, outputs: { timeChange: "timeChange" }, host: { listeners: { "blur": "onBlur()" } }, providers: [
406
431
  {
407
432
  provide: NG_VALUE_ACCESSOR,
408
433
  useExisting: forwardRef(() => TimePickerComponent),
409
434
  multi: true
410
435
  }
411
- ], queries: [{ propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true }], viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], exportAs: ["cTimePicker"], usesOnChanges: true, ngImport: i0, template: "<div class=\"date-picker-timepickers\" *ngIf=\"variant==='select'\">\r\n <div class=\"picker time-picker\">\r\n <div [formGroup]=\"selectTime\" class=\"time-picker-body\">\r\n <span class=\"time-picker-inline-icon\"></span>\r\n <select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectHours\" (ngModelChange)=\"handleSelectHoursChange($event)\">\r\n <option *ngFor=\"let hour of listOfHours12; index as i; trackBy: trackByHour\" [ngValue]=\"hour.value\" [attr.disabled]=\"hour.disabled || null\">{{hour.label}}</option>\r\n </select>\r\n {{' :'}}<select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectMinutes\" (ngModelChange)=\"handleSelectMinutesChange($event)\">\r\n <option *ngFor=\"let minute of listOfMinutes\" [ngValue]=\"minute.value\" [attr.disabled]=\"minute.disabled || null\">{{minute.label}}</option>\r\n </select>\r\n <ng-template [ngIf]=\"seconds\">\r\n {{' :'}}<select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectSeconds\" (ngModelChange)=\"handleSelectSecondsChange($event)\">\r\n <option *ngFor=\"let second of listOfSeconds\" [ngValue]=\"second.value\" [attr.disabled]=\"second.disabled || null\">{{second.label}}</option>\r\n </select>\r\n </ng-template>\r\n <ng-template [ngIf]=\"hour12\">\r\n <select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectDayPeriod\" (ngModelChange)=\"handleSelectDayPeriodChange($event)\">\r\n <option *ngFor=\"let dayPeriod of dayPeriods\" [ngValue]=\"dayPeriod.value\" class=\"time-picker-roll-cell\">{{dayPeriod.label}}</option>\r\n </select>\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<c-dropdown #dropdown=\"cDropdown\" [autoClose]=\"'outside'\" class=\"time-picker picker\" *ngIf=\"variant==='roll'\" [visible]=\"visible\">\r\n <c-input-group [caret]=\"false\"\r\n [disabled]=\"disabled ?? dropdown.visible\"\r\n [sizing]=\"size ?? ''\"\r\n cDropdownToggle\r\n class=\"picker-input-group\">\r\n <input (change)=\"handleTimeInputChange($event)\"\r\n [formControl]=\"timeInput\"\r\n [placeholder]=\"placeholder\"\r\n cFormControl\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n [attr.disabled]=\"disabled ? '' : null\"\r\n [attr.pattern]=\"hour12 ? '(((0[1-9])|(1[0-2])):([0-5])([0-9])\\\\s(A|P)M)' : '([01]?[0-9]|2[0-3]):[0-5][0-9]'\"\r\n [readonly]=\"inputReadOnly ?? null\"\r\n >\r\n <span *ngIf=\"indicator || cleaner\" cInputGroupText>\r\n <span *ngIf=\"indicator\" class=\"picker-input-group-indicator\">\r\n <span class=\"picker-input-group-icon time-picker-input-icon\"></span>\r\n </span>\r\n <span (click)=\"!disabled && handleClear($event)\" *ngIf=\"cleaner && time && !disabled\" class=\"picker-input-group-cleaner\" role=\"button\">\r\n <span class=\"picker-input-group-icon time-picker-cleaner-icon\"></span>\r\n </span>\r\n </span>\r\n\r\n </c-input-group>\r\n <div cDropdownMenu #dropdownMenu=\"cDropdownMenu\">\r\n <div class=\"time-picker-body time-picker-roll\" style=\"position: relative;\">\r\n <c-time-picker-roll-col\r\n [elements]=\"listOfHours12\"\r\n [selected]=\"hour\"\r\n (selectedChange)=\"handleSelectHoursChange($event)\"\r\n [disabled]=\"disabled\"\r\n [refresh]=\"dropdownMenu.visible\"\r\n role=\"listbox\"\r\n >\r\n </c-time-picker-roll-col>\r\n <c-time-picker-roll-col\r\n [elements]=\"listOfMinutes\"\r\n [selected]=\"minute\"\r\n (selectedChange)=\"handleSelectMinutesChange($event)\"\r\n [disabled]=\"disabled\"\r\n [refresh]=\"dropdownMenu.visible\"\r\n role=\"listbox\"\r\n >\r\n </c-time-picker-roll-col>\r\n <c-time-picker-roll-col\r\n *ngIf=\"seconds\"\r\n [elements]=\"listOfSeconds\"\r\n [selected]=\"second\"\r\n (selectedChange)=\"handleSelectSecondsChange($event)\"\r\n [disabled]=\"disabled\"\r\n [refresh]=\"dropdownMenu.visible\"\r\n role=\"listbox\"\r\n >\r\n </c-time-picker-roll-col>\r\n <c-time-picker-roll-am-pm\r\n *ngIf=\"hour12\" [elements]=\"dayPeriods\"\r\n [selected]=\"dayPeriod\"\r\n (selectedChange)=\"handleSelectDayPeriodChange($event)\"\r\n [disabled]=\"disabled\"\r\n [refresh]=\"dropdownMenu.visible\"\r\n role=\"listbox\"\r\n >\r\n </c-time-picker-roll-am-pm>\r\n </div>\r\n <div *ngIf=\"templates?.timePickerFooter\" class=\"picker-footer\">\r\n <ng-container *ngTemplateOutlet=\"templates?.timePickerFooter; context: {$implicit: dropdown}\"></ng-container>\r\n </div>\r\n </div>\r\n</c-dropdown>\r\n", styles: [".disabled{pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.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: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormControlDirective, selector: "input[cFormControl], textarea[cFormControl]", inputs: ["sizing", "valid", "type", "plaintext"] }, { kind: "directive", type: i4.FormSelectDirective, selector: "select[cSelect]", inputs: ["sizing", "valid"] }, { kind: "component", type: i5.InputGroupComponent, selector: "c-input-group", inputs: ["sizing"] }, { kind: "directive", type: i6.InputGroupTextDirective, selector: "[cInputGroupText]" }, { kind: "component", type: i7.DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "dark", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: i7.DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "directive", type: i8.DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible", "dark"], exportAs: ["cDropdownMenu"] }, { kind: "component", type: i9.TimePickerRollColComponent, selector: "c-time-picker-roll-col", inputs: ["disabled", "elements", "onClick", "selected", "refresh"], outputs: ["selectedChange"], exportAs: ["cTimePickerRollCol"] }, { kind: "component", type: i10.TimePickerRollAmPmComponent, selector: "c-time-picker-roll-am-pm", inputs: ["disabled", "elements", "onClick", "selected", "refresh"], outputs: ["selectedChange"] }] });
436
+ ], queries: [{ propertyName: "contentTemplates", predicate: TemplateIdDirective, descendants: true }], viewQueries: [{ propertyName: "dropdownRef", first: true, predicate: DropdownComponent, descendants: true, read: ElementRef }], exportAs: ["cTimePicker"], usesOnChanges: true, ngImport: i0, template: "<div class=\"date-picker-timepickers\" *ngIf=\"variant==='select'\">\n <div class=\"picker time-picker\">\n <div [formGroup]=\"selectTime\" class=\"time-picker-body\" [ngClass]=\"timePickerClasses\">\n <span class=\"time-picker-inline-icon\"></span>\n <select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectHours\" (ngModelChange)=\"handleSelectHoursChange($event)\" (blur)=\"onBlur()\" [sizing]=\"size ?? ''\">\n <option *ngFor=\"let hour of listOfHours12; index as i; trackBy: trackByHour\" [ngValue]=\"hour.value\" [attr.disabled]=\"hour.disabled || null\">{{hour.label}}</option>\n </select>\n {{' :'}}<select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectMinutes\" (ngModelChange)=\"handleSelectMinutesChange($event)\" (blur)=\"onBlur()\" [sizing]=\"size ?? ''\">\n <option *ngFor=\"let minute of listOfMinutes\" [ngValue]=\"minute.value\" [attr.disabled]=\"minute.disabled || null\">{{minute.label}}</option>\n </select>\n <ng-template [ngIf]=\"seconds\">\n {{' :'}}<select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectSeconds\" (ngModelChange)=\"handleSelectSecondsChange($event)\" (blur)=\"onBlur()\" [sizing]=\"size ?? ''\">\n <option *ngFor=\"let second of listOfSeconds\" [ngValue]=\"second.value\" [attr.disabled]=\"second.disabled || null\">{{second.label}}</option>\n </select>\n </ng-template>\n <ng-template [ngIf]=\"hour12\">\n <select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectDayPeriod\" (ngModelChange)=\"handleSelectDayPeriodChange($event)\" (blur)=\"onBlur()\" [sizing]=\"size ?? ''\">\n <option *ngFor=\"let dayPeriod of dayPeriods\" [ngValue]=\"dayPeriod.value\" class=\"time-picker-roll-cell\">{{dayPeriod.label}}</option>\n </select>\n </ng-template>\n </div>\n </div>\n</div>\n\n<c-dropdown #dropdown=\"cDropdown\" [autoClose]=\"'outside'\" class=\"time-picker picker\" [ngClass]=\"timePickerClasses\" *ngIf=\"variant==='roll'\" [visible]=\"visible\">\n <c-input-group [caret]=\"false\"\n [disabled]=\"disabled ?? dropdown.visible\"\n [sizing]=\"size ?? ''\"\n cDropdownToggle\n class=\"picker-input-group\">\n <input (blur)=\"handleBlur($event);\"\n (change)=\"handleTimeInputChange($event)\"\n (focus)=\"handleFocus($event)\"\n [formControl]=\"timeInput\"\n [placeholder]=\"placeholder\"\n cFormControl\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.disabled]=\"disabled ? '' : null\"\n [attr.pattern]=\"hour12 ? '(((0[1-9])|(1[0-2])):([0-5])([0-9])\\\\s(A|P)M)' : '([01]?[0-9]|2[0-3]):[0-5][0-9]'\"\n [readonly]=\"inputReadOnly ?? null\"\n [valid]=\"valid\"\n >\n <span *ngIf=\"indicator || cleaner\" cInputGroupText>\n <span *ngIf=\"indicator\" class=\"picker-input-group-indicator\">\n <span class=\"picker-input-group-icon time-picker-input-icon\"></span>\n </span>\n <span (click)=\"!disabled && handleClear($event)\" *ngIf=\"cleaner && time && !disabled\" class=\"picker-input-group-cleaner\" role=\"button\">\n <span class=\"picker-input-group-icon time-picker-cleaner-icon\"></span>\n </span>\n </span>\n\n </c-input-group>\n <div cDropdownMenu #dropdownMenu=\"cDropdownMenu\">\n <div class=\"time-picker-body time-picker-roll\" style=\"position: relative;\">\n <c-time-picker-roll-col\n [elements]=\"listOfHours12\"\n [selected]=\"hour\"\n (selectedChange)=\"handleSelectHoursChange($event)\"\n [disabled]=\"disabled\"\n [refresh]=\"dropdownMenu.visible\"\n role=\"listbox\"\n >\n </c-time-picker-roll-col>\n <c-time-picker-roll-col\n [elements]=\"listOfMinutes\"\n [selected]=\"minute\"\n (selectedChange)=\"handleSelectMinutesChange($event)\"\n [disabled]=\"disabled\"\n [refresh]=\"dropdownMenu.visible\"\n role=\"listbox\"\n >\n </c-time-picker-roll-col>\n <c-time-picker-roll-col\n *ngIf=\"seconds\"\n [elements]=\"listOfSeconds\"\n [selected]=\"second\"\n (selectedChange)=\"handleSelectSecondsChange($event)\"\n [disabled]=\"disabled\"\n [refresh]=\"dropdownMenu.visible\"\n role=\"listbox\"\n >\n </c-time-picker-roll-col>\n <c-time-picker-roll-am-pm\n *ngIf=\"hour12\" [elements]=\"dayPeriods\"\n [selected]=\"dayPeriod\"\n (selectedChange)=\"handleSelectDayPeriodChange($event)\"\n [disabled]=\"disabled\"\n [refresh]=\"dropdownMenu.visible\"\n role=\"listbox\"\n >\n </c-time-picker-roll-am-pm>\n </div>\n <div *ngIf=\"templates?.timePickerFooter\" class=\"picker-footer\">\n <ng-container *ngTemplateOutlet=\"templates?.timePickerFooter; context: {$implicit: dropdown}\"></ng-container>\n </div>\n </div>\n</c-dropdown>\n", styles: [".disabled{pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.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: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormControlDirective, selector: "input[cFormControl], textarea[cFormControl]", inputs: ["sizing", "valid", "type", "plaintext"] }, { kind: "directive", type: i4.FormSelectDirective, selector: "select[cSelect]", inputs: ["sizing", "valid"] }, { kind: "component", type: i5.InputGroupComponent, selector: "c-input-group", inputs: ["sizing"] }, { kind: "directive", type: i6.InputGroupTextDirective, selector: "[cInputGroupText]" }, { kind: "component", type: i7.DropdownComponent, selector: "c-dropdown", inputs: ["alignment", "autoClose", "dark", "direction", "placement", "popper", "popperOptions", "variant", "visible"], outputs: ["visibleChange"], exportAs: ["cDropdown"] }, { kind: "directive", type: i7.DropdownToggleDirective, selector: "[cDropdownToggle]", inputs: ["dropdownComponent", "disabled", "caret", "split"], exportAs: ["cDropdownToggle"] }, { kind: "directive", type: i8.DropdownMenuDirective, selector: "[cDropdownMenu]", inputs: ["alignment", "visible", "dark"], exportAs: ["cDropdownMenu"] }, { kind: "component", type: i9.TimePickerRollColComponent, selector: "c-time-picker-roll-col", inputs: ["disabled", "elements", "onClick", "selected", "refresh"], outputs: ["selectedChange"], exportAs: ["cTimePickerRollCol"] }, { kind: "component", type: i10.TimePickerRollAmPmComponent, selector: "c-time-picker-roll-am-pm", inputs: ["disabled", "elements", "onClick", "selected", "refresh"], outputs: ["selectedChange"] }] });
412
437
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TimePickerComponent, decorators: [{
413
438
  type: Component,
414
439
  args: [{ selector: 'c-time-picker', exportAs: 'cTimePicker', providers: [
@@ -417,7 +442,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
417
442
  useExisting: forwardRef(() => TimePickerComponent),
418
443
  multi: true
419
444
  }
420
- ], template: "<div class=\"date-picker-timepickers\" *ngIf=\"variant==='select'\">\r\n <div class=\"picker time-picker\">\r\n <div [formGroup]=\"selectTime\" class=\"time-picker-body\">\r\n <span class=\"time-picker-inline-icon\"></span>\r\n <select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectHours\" (ngModelChange)=\"handleSelectHoursChange($event)\">\r\n <option *ngFor=\"let hour of listOfHours12; index as i; trackBy: trackByHour\" [ngValue]=\"hour.value\" [attr.disabled]=\"hour.disabled || null\">{{hour.label}}</option>\r\n </select>\r\n {{' :'}}<select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectMinutes\" (ngModelChange)=\"handleSelectMinutesChange($event)\">\r\n <option *ngFor=\"let minute of listOfMinutes\" [ngValue]=\"minute.value\" [attr.disabled]=\"minute.disabled || null\">{{minute.label}}</option>\r\n </select>\r\n <ng-template [ngIf]=\"seconds\">\r\n {{' :'}}<select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectSeconds\" (ngModelChange)=\"handleSelectSecondsChange($event)\">\r\n <option *ngFor=\"let second of listOfSeconds\" [ngValue]=\"second.value\" [attr.disabled]=\"second.disabled || null\">{{second.label}}</option>\r\n </select>\r\n </ng-template>\r\n <ng-template [ngIf]=\"hour12\">\r\n <select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectDayPeriod\" (ngModelChange)=\"handleSelectDayPeriodChange($event)\">\r\n <option *ngFor=\"let dayPeriod of dayPeriods\" [ngValue]=\"dayPeriod.value\" class=\"time-picker-roll-cell\">{{dayPeriod.label}}</option>\r\n </select>\r\n </ng-template>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<c-dropdown #dropdown=\"cDropdown\" [autoClose]=\"'outside'\" class=\"time-picker picker\" *ngIf=\"variant==='roll'\" [visible]=\"visible\">\r\n <c-input-group [caret]=\"false\"\r\n [disabled]=\"disabled ?? dropdown.visible\"\r\n [sizing]=\"size ?? ''\"\r\n cDropdownToggle\r\n class=\"picker-input-group\">\r\n <input (change)=\"handleTimeInputChange($event)\"\r\n [formControl]=\"timeInput\"\r\n [placeholder]=\"placeholder\"\r\n cFormControl\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n [attr.disabled]=\"disabled ? '' : null\"\r\n [attr.pattern]=\"hour12 ? '(((0[1-9])|(1[0-2])):([0-5])([0-9])\\\\s(A|P)M)' : '([01]?[0-9]|2[0-3]):[0-5][0-9]'\"\r\n [readonly]=\"inputReadOnly ?? null\"\r\n >\r\n <span *ngIf=\"indicator || cleaner\" cInputGroupText>\r\n <span *ngIf=\"indicator\" class=\"picker-input-group-indicator\">\r\n <span class=\"picker-input-group-icon time-picker-input-icon\"></span>\r\n </span>\r\n <span (click)=\"!disabled && handleClear($event)\" *ngIf=\"cleaner && time && !disabled\" class=\"picker-input-group-cleaner\" role=\"button\">\r\n <span class=\"picker-input-group-icon time-picker-cleaner-icon\"></span>\r\n </span>\r\n </span>\r\n\r\n </c-input-group>\r\n <div cDropdownMenu #dropdownMenu=\"cDropdownMenu\">\r\n <div class=\"time-picker-body time-picker-roll\" style=\"position: relative;\">\r\n <c-time-picker-roll-col\r\n [elements]=\"listOfHours12\"\r\n [selected]=\"hour\"\r\n (selectedChange)=\"handleSelectHoursChange($event)\"\r\n [disabled]=\"disabled\"\r\n [refresh]=\"dropdownMenu.visible\"\r\n role=\"listbox\"\r\n >\r\n </c-time-picker-roll-col>\r\n <c-time-picker-roll-col\r\n [elements]=\"listOfMinutes\"\r\n [selected]=\"minute\"\r\n (selectedChange)=\"handleSelectMinutesChange($event)\"\r\n [disabled]=\"disabled\"\r\n [refresh]=\"dropdownMenu.visible\"\r\n role=\"listbox\"\r\n >\r\n </c-time-picker-roll-col>\r\n <c-time-picker-roll-col\r\n *ngIf=\"seconds\"\r\n [elements]=\"listOfSeconds\"\r\n [selected]=\"second\"\r\n (selectedChange)=\"handleSelectSecondsChange($event)\"\r\n [disabled]=\"disabled\"\r\n [refresh]=\"dropdownMenu.visible\"\r\n role=\"listbox\"\r\n >\r\n </c-time-picker-roll-col>\r\n <c-time-picker-roll-am-pm\r\n *ngIf=\"hour12\" [elements]=\"dayPeriods\"\r\n [selected]=\"dayPeriod\"\r\n (selectedChange)=\"handleSelectDayPeriodChange($event)\"\r\n [disabled]=\"disabled\"\r\n [refresh]=\"dropdownMenu.visible\"\r\n role=\"listbox\"\r\n >\r\n </c-time-picker-roll-am-pm>\r\n </div>\r\n <div *ngIf=\"templates?.timePickerFooter\" class=\"picker-footer\">\r\n <ng-container *ngTemplateOutlet=\"templates?.timePickerFooter; context: {$implicit: dropdown}\"></ng-container>\r\n </div>\r\n </div>\r\n</c-dropdown>\r\n", styles: [".disabled{pointer-events:none}\n"] }]
445
+ ], template: "<div class=\"date-picker-timepickers\" *ngIf=\"variant==='select'\">\n <div class=\"picker time-picker\">\n <div [formGroup]=\"selectTime\" class=\"time-picker-body\" [ngClass]=\"timePickerClasses\">\n <span class=\"time-picker-inline-icon\"></span>\n <select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectHours\" (ngModelChange)=\"handleSelectHoursChange($event)\" (blur)=\"onBlur()\" [sizing]=\"size ?? ''\">\n <option *ngFor=\"let hour of listOfHours12; index as i; trackBy: trackByHour\" [ngValue]=\"hour.value\" [attr.disabled]=\"hour.disabled || null\">{{hour.label}}</option>\n </select>\n {{' :'}}<select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectMinutes\" (ngModelChange)=\"handleSelectMinutesChange($event)\" (blur)=\"onBlur()\" [sizing]=\"size ?? ''\">\n <option *ngFor=\"let minute of listOfMinutes\" [ngValue]=\"minute.value\" [attr.disabled]=\"minute.disabled || null\">{{minute.label}}</option>\n </select>\n <ng-template [ngIf]=\"seconds\">\n {{' :'}}<select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectSeconds\" (ngModelChange)=\"handleSelectSecondsChange($event)\" (blur)=\"onBlur()\" [sizing]=\"size ?? ''\">\n <option *ngFor=\"let second of listOfSeconds\" [ngValue]=\"second.value\" [attr.disabled]=\"second.disabled || null\">{{second.label}}</option>\n </select>\n </ng-template>\n <ng-template [ngIf]=\"hour12\">\n <select [attr.disabled]=\"disabled || null\" cSelect class=\"ms-0\" formControlName=\"selectDayPeriod\" (ngModelChange)=\"handleSelectDayPeriodChange($event)\" (blur)=\"onBlur()\" [sizing]=\"size ?? ''\">\n <option *ngFor=\"let dayPeriod of dayPeriods\" [ngValue]=\"dayPeriod.value\" class=\"time-picker-roll-cell\">{{dayPeriod.label}}</option>\n </select>\n </ng-template>\n </div>\n </div>\n</div>\n\n<c-dropdown #dropdown=\"cDropdown\" [autoClose]=\"'outside'\" class=\"time-picker picker\" [ngClass]=\"timePickerClasses\" *ngIf=\"variant==='roll'\" [visible]=\"visible\">\n <c-input-group [caret]=\"false\"\n [disabled]=\"disabled ?? dropdown.visible\"\n [sizing]=\"size ?? ''\"\n cDropdownToggle\n class=\"picker-input-group\">\n <input (blur)=\"handleBlur($event);\"\n (change)=\"handleTimeInputChange($event)\"\n (focus)=\"handleFocus($event)\"\n [formControl]=\"timeInput\"\n [placeholder]=\"placeholder\"\n cFormControl\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.disabled]=\"disabled ? '' : null\"\n [attr.pattern]=\"hour12 ? '(((0[1-9])|(1[0-2])):([0-5])([0-9])\\\\s(A|P)M)' : '([01]?[0-9]|2[0-3]):[0-5][0-9]'\"\n [readonly]=\"inputReadOnly ?? null\"\n [valid]=\"valid\"\n >\n <span *ngIf=\"indicator || cleaner\" cInputGroupText>\n <span *ngIf=\"indicator\" class=\"picker-input-group-indicator\">\n <span class=\"picker-input-group-icon time-picker-input-icon\"></span>\n </span>\n <span (click)=\"!disabled && handleClear($event)\" *ngIf=\"cleaner && time && !disabled\" class=\"picker-input-group-cleaner\" role=\"button\">\n <span class=\"picker-input-group-icon time-picker-cleaner-icon\"></span>\n </span>\n </span>\n\n </c-input-group>\n <div cDropdownMenu #dropdownMenu=\"cDropdownMenu\">\n <div class=\"time-picker-body time-picker-roll\" style=\"position: relative;\">\n <c-time-picker-roll-col\n [elements]=\"listOfHours12\"\n [selected]=\"hour\"\n (selectedChange)=\"handleSelectHoursChange($event)\"\n [disabled]=\"disabled\"\n [refresh]=\"dropdownMenu.visible\"\n role=\"listbox\"\n >\n </c-time-picker-roll-col>\n <c-time-picker-roll-col\n [elements]=\"listOfMinutes\"\n [selected]=\"minute\"\n (selectedChange)=\"handleSelectMinutesChange($event)\"\n [disabled]=\"disabled\"\n [refresh]=\"dropdownMenu.visible\"\n role=\"listbox\"\n >\n </c-time-picker-roll-col>\n <c-time-picker-roll-col\n *ngIf=\"seconds\"\n [elements]=\"listOfSeconds\"\n [selected]=\"second\"\n (selectedChange)=\"handleSelectSecondsChange($event)\"\n [disabled]=\"disabled\"\n [refresh]=\"dropdownMenu.visible\"\n role=\"listbox\"\n >\n </c-time-picker-roll-col>\n <c-time-picker-roll-am-pm\n *ngIf=\"hour12\" [elements]=\"dayPeriods\"\n [selected]=\"dayPeriod\"\n (selectedChange)=\"handleSelectDayPeriodChange($event)\"\n [disabled]=\"disabled\"\n [refresh]=\"dropdownMenu.visible\"\n role=\"listbox\"\n >\n </c-time-picker-roll-am-pm>\n </div>\n <div *ngIf=\"templates?.timePickerFooter\" class=\"picker-footer\">\n <ng-container *ngTemplateOutlet=\"templates?.timePickerFooter; context: {$implicit: dropdown}\"></ng-container>\n </div>\n </div>\n</c-dropdown>\n", styles: [".disabled{pointer-events:none}\n"] }]
421
446
  }], ctorParameters: function () { return []; }, propDecorators: { cleaner: [{
422
447
  type: Input
423
448
  }], dateTimeFormatOptions: [{
@@ -446,6 +471,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
446
471
  type: Input
447
472
  }], variant: [{
448
473
  type: Input
474
+ }], valid: [{
475
+ type: Input
449
476
  }], visible: [{
450
477
  type: Input
451
478
  }], timeChange: [{
@@ -453,11 +480,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
453
480
  }], onBlur: [{
454
481
  type: HostListener,
455
482
  args: ['blur']
456
- }], dropdown: [{
483
+ }], dropdownRef: [{
457
484
  type: ViewChild,
458
- args: ['dropdown']
485
+ args: [DropdownComponent, { read: ElementRef }]
459
486
  }], contentTemplates: [{
460
487
  type: ContentChildren,
461
488
  args: [TemplateIdDirective, { descendants: true }]
462
489
  }] } });
463
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RyxPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhELE9BQU8sRUFDTCxlQUFlLEVBQ2YsZUFBZSxFQUNmLGlCQUFpQixFQUdqQixPQUFPLEVBQ1AsYUFBYSxFQUNiLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixXQUFXLEVBRVosTUFBTSxjQUFjLENBQUM7Ozs7Ozs7Ozs7OztBQWV0QixNQUFNLE9BQU8sbUJBQW1CO0lBRTlCO1FBdUJRLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFakM7Ozs7O1dBS0c7UUFDTSwwQkFBcUIsR0FBMEIsRUFBRSxDQUFDO1FBZ0JuRCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBcUMzQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBZ0IzQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUV4Qzs7OztXQUlHO1FBQ00sV0FB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c0JBRFgsS0FBSztnQkFnQkcsV0FBVztzQkFBbkIsS0FBSztnQkFPRyxhQUFhO3NCQUFyQixLQUFLO2dCQU9HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBUUYsU0FBUztzQkFEWixLQUFLO2dCQWlCRixhQUFhO3NCQURoQixLQUFLO2dCQWdCRyxNQUFNO3NCQUFkLEtBQUs7Z0JBT0csV0FBVztzQkFBbkIsS0FBSztnQkFRRixPQUFPO3NCQURWLEtBQUs7Z0JBZ0JHLElBQUk7c0JBQVosS0FBSztnQkFRRixJQUFJO3NCQURQLEtBQUs7Z0JBNkJHLE9BQU87c0JBQWYsS0FBSztnQkFRRixPQUFPO3NCQURWLEtBQUs7Z0JBU0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFFZSxNQUFNO3NCQUEzQixZQUFZO3VCQUFDLE1BQU07Z0JBSUcsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUd3QyxnQkFBZ0I7c0JBQTVFLGVBQWU7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5cclxuaW1wb3J0IHsgVGVtcGxhdGVJZERpcmVjdGl2ZSB9IGZyb20gJy4uL3NoYXJlZCc7XHJcblxyXG5pbXBvcnQge1xyXG4gIGNvbnZlcnQxMmhUbzI0aCxcclxuICBjb252ZXJ0MjRoVG8xMmgsXHJcbiAgY29udmVydFRpbWVUb0RhdGUsXHJcbiAgRGF0ZVRpbWVGb3JtYXRPcHRpb25zLFxyXG4gIERheVBlcmlvZCxcclxuICBnZXRBbVBtLFxyXG4gIGdldERheVBlcmlvZHMsXHJcbiAgZ2V0TGlzdE9mSG91cnMsXHJcbiAgZ2V0TGlzdE9mTWludXRlcyxcclxuICBnZXRMaXN0T2ZTZWNvbmRzLFxyXG4gIGlzSG91cjEyLFxyXG4gIGlzVmFsaWRUaW1lLFxyXG4gIElUaW1lVmFsdWVcclxufSBmcm9tICcuL3RpbWUudXRpbHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjLXRpbWUtcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RpbWUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZXhwb3J0QXM6ICdjVGltZVBpY2tlcicsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUaW1lUGlja2VyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaW1lUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfY2xlYW5lcjogQm9vbGVhbklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaXNhYmxlZDogQm9vbGVhbklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9pbmRpY2F0b3I6IEJvb2xlYW5JbnB1dDtcclxuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaW5wdXRSZWFkT25seTogQm9vbGVhbklucHV0O1xyXG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9zZWNvbmRzOiBCb29sZWFuSW5wdXQ7XHJcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3Zpc2libGU6IEJvb2xlYW5JbnB1dDtcclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIHZpc2liaWxpdHkgb3Igc2V0IHRoZSBjb250ZW50IG9mIHRoZSBjbGVhbmVyIGJ1dHRvbi5cclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGNsZWFuZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2NsZWFuZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNsZWFuZXIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xlYW5lcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFuZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBTZXRzIERhdGVUaW1lIGZvcm1hdCBvcHRpb25zIGluY2x1ZGluZyB0aW1lWm9uZVxyXG4gICAqIEB0eXBlIERhdGVUaW1lRm9ybWF0T3B0aW9uc1xyXG4gICAqIEBkZWZhdWx0IHt9XHJcbiAgICogQG5vdGUgVGhlIGRhdGUgb2JqZWN0IGRvZXNuJ3Qgc3RvcmUgdGltZVpvbmUsIGl0IGtlZXBzIHRoZSBsb2NhbCB0aW1lem9uZSBvZiB0aGUgYnJvd3NlciwgcmVnYXJkbGVzcyBpZiB5b3UgcGFyc2VkIFVUQyBkYXRlcy5cclxuICAgKi9cclxuICBASW5wdXQoKSBkYXRlVGltZUZvcm1hdE9wdGlvbnM6IERhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgdGhlIGRpc2FibGVkIHN0YXRlIGZvciB0aGUgY29tcG9uZW50LlxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgYXZhaWxhYmxlIGhvdXJzIHRvIHBpY2suXHJcbiAgICogQHR5cGUgKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW47XHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICovXHJcbiAgQElucHV0KCkgZmlsdGVySG91cnM/OiAodmFsdWU6IG51bWJlcikgPT4gYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogRmlsdGVyIGF2YWlsYWJsZSBtaW51dGVzIHRvIHBpY2suXHJcbiAgICogQHR5cGUgKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW47XHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICovXHJcbiAgQElucHV0KCkgZmlsdGVyTWludXRlcz86ICh2YWx1ZTogbnVtYmVyKSA9PiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBGaWx0ZXIgYXZhaWxhYmxlIHNlY29uZHMgdG8gcGljay5cclxuICAgKiBAdHlwZSAodmFsdWU6IG51bWJlcikgPT4gYm9vbGVhbjtcclxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcclxuICAgKi9cclxuICBASW5wdXQoKSBmaWx0ZXJTZWNvbmRzPzogKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9yIHNldCB0aGUgY29udGVudCBvZiB0aGUgaW5wdXQgaW5kaWNhdG9yLlxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgaW5kaWNhdG9yKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pbmRpY2F0b3IgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGluZGljYXRvcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmRpY2F0b3I7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbmRpY2F0b3I6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgdGhlIHJlYWRvbmx5IHN0YXRlIGZvciB0aGUgY29tcG9uZW50LlxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGlucHV0UmVhZE9ubHkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lucHV0UmVhZE9ubHkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlucHV0UmVhZE9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5wdXRSZWFkT25seTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lucHV0UmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBsb2NhbGUgZm9yIGNvbXBvbmVudHMuIElmIG5vdCBzZXQsIGl0IGlzIGluaGVyaXRlZCBmcm9tIHRoZSBicm93c2VyLlxyXG4gICAqIEB0eXBlIHN0cmluZ1xyXG4gICAqIEBkZWZhdWx0IGRlZmF1bHRcclxuICAgKi9cclxuICBASW5wdXQoKSBsb2NhbGU6IHN0cmluZyA9ICdkZWZhdWx0JztcclxuXHJcbiAgLyoqXHJcbiAgICogU3BlY2lmaWVzIHNob3J0IGhpbnQgdmlzaWJsZSBpbiB0aW1lIGlucHV0LlxyXG4gICAqIEB0eXBlIHN0cmluZ1xyXG4gICAqIEBkZWZhdWx0ICdTZWxlY3QgdGltZSdcclxuICAgKi9cclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCB0aW1lJztcclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIHNlY29uZHMgdmlzaWJpbGl0eS5cclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzZWNvbmRzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zZWNvbmRzID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBzZWNvbmRzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlY29uZHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZWNvbmRzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNpemUgdGhlIGNvbXBvbmVudCBzbWFsbCBvciBsYXJnZS5cclxuICAgKiBAdHlwZSAnc20nIHwgJ2xnJyB8IHVuZGVmaW5lZFxyXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNpemU/OiAnc20nIHwgJ2xnJztcclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbCBzZWxlY3RlZCB0aW1lLlxyXG4gICAqIEB0eXBlIERhdGUgfCBzdHJpbmcgfCBudWxsIHwgbnVtYmVyXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdGltZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHZhbHVlICYmIGlzVmFsaWRUaW1lKHZhbHVlKSkge1xyXG4gICAgICBjb25zdCB0aW1lID0gY29udmVydFRpbWVUb0RhdGUodmFsdWUpO1xyXG4gICAgICBpZiAoIXRpbWUpIHtcclxuICAgICAgICB0aGlzLmNsZWFyVGltZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRheVBlcmlvZCA9IGdldEFtUG0odGltZSwgdGhpcy5sb2NhbGUpO1xyXG4gICAgICBpZiAodGhpcy5fdGltZT8uZ2V0VGltZSgpICE9PSB0aW1lLmdldFRpbWUoKSkge1xyXG4gICAgICAgIHRoaXMuX3RpbWUgPSBuZXcgRGF0ZSh0aW1lLmdldFRpbWUoKSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xlYXJUaW1lKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgdGltZSgpOiBEYXRlIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl90aW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdGltZT86IERhdGU7XHJcbiAgcHJpdmF0ZSBfdGltZUludGVybmFsPzogRGF0ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB0aW1lIHBpY2tlciB2YXJpYW50IHRvIGEgcm9sbCBvciBzZWxlY3QuXHJcbiAgICogQHR5cGUgJ3JvbGwnIHwgJ3NlbGVjdCdcclxuICAgKiBAZGVmYXVsdCAncm9sbCdcclxuICAgKi9cclxuICBASW5wdXQoKSB2YXJpYW50OiAncm9sbCcgfCAnc2VsZWN0JyA9ICdyb2xsJztcclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIGRyb3Bkb3duIG1lbnUgY29tcG9uZW50LlxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Zpc2libGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gIH1cclxuICBnZXQgdmlzaWJsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xyXG4gIH1cclxuICBwcml2YXRlIF92aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSB0aW1lQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RGF0ZSB8IHVuZGVmaW5lZD4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCB1bmRlZmluZWQ+KGZhbHNlKTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpIG9uQmx1cigpIHtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdkcm9wZG93bicpIGRyb3Bkb3duPzogRWxlbWVudFJlZjtcclxuXHJcbiAgdGVtcGxhdGVzOiBhbnkgPSB7fTtcclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlSWREaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgY29udGVudFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZUlkRGlyZWN0aXZlPjtcclxuXHJcbiAgbGlzdE9mSG91cnMhOiBJVGltZVZhbHVlW107XHJcbiAgbGlzdE9mSG91cnMxMiE6IElUaW1lVmFsdWVbXTtcclxuICBsaXN0T2ZNaW51dGVzITogSVRpbWVWYWx1ZVtdO1xyXG4gIGxpc3RPZlNlY29uZHMhOiBJVGltZVZhbHVlW107XHJcbiAgaG91cjEyOiBib29sZWFuID0gaXNIb3VyMTIodGhpcy5sb2NhbGUpO1xyXG4gIGRheVBlcmlvZHMgPSBbXHJcbiAgICB7IHZhbHVlOiAnYW0nLCBsYWJlbDogJ2FtJyB9LFxyXG4gICAgeyB2YWx1ZTogJ3BtJywgbGFiZWw6ICdwbScgfVxyXG4gIF07XHJcblxyXG4gIHNldCB0aW1lSW5wdXRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRpbWVJbnB1dC5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB0aGlzLl90aW1lSW5wdXRWYWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRpbWVJbnB1dFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGltZUlucHV0VmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90aW1lSW5wdXRWYWx1ZTogc3RyaW5nID0gdGhpcy50aW1lPy50b0xvY2FsZVRpbWVTdHJpbmcodGhpcy5sb2NhbGUsIHsgdGltZVN0eWxlOiB0aGlzLnNlY29uZHMgPyAnbWVkaXVtJyA6ICdzaG9ydCcgfSkgPz8gJyc7XHJcblxyXG4gIHNlbGVjdFRpbWUgPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgIHNlbGVjdEhvdXJzOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdGhpcy5ob3VyLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9KSxcclxuICAgIHNlbGVjdE1pbnV0ZXM6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB0aGlzLm1pbnV0ZSwgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQgfSksXHJcbiAgICBzZWxlY3RTZWNvbmRzOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdGhpcy5zZWNvbmQsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkIH0pLFxyXG4gICAgc2VsZWN0RGF5UGVyaW9kOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogdGhpcy5kYXlQZXJpb2QsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkIH0pXHJcbiAgfSk7XHJcblxyXG4gIHRpbWVJbnB1dCA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB0aGlzLnRpbWVJbnB1dFZhbHVlLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCBbXHJcbiAgICBWYWxpZGF0b3JzLnJlcXVpcmVkXHJcbiAgXSk7XHJcblxyXG4gIHNldCBob3VyKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9ob3VyICE9PSB2YWx1ZSkge1xyXG4gICAgICBpZiAodmFsdWUgPCAwKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhclRpbWUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5faG91ciA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhvdXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9ob3VyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaG91ciA9IC0xO1xyXG5cclxuICBzZXQgbWludXRlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9taW51dGUgIT09IHZhbHVlKSB7XHJcbiAgICAgIGlmICh2YWx1ZSA8IDApIHtcclxuICAgICAgICB0aGlzLmNsZWFyVGltZSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9taW51dGUgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBtaW51dGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9taW51dGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9taW51dGUgPSAtMTtcclxuXHJcbiAgc2V0IHNlY29uZCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fc2Vjb25kICE9PSB2YWx1ZSkge1xyXG4gICAgICBpZiAodmFsdWUgPCAwKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhclRpbWUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fc2Vjb25kID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2Vjb25kKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2Vjb25kO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2Vjb25kID0gLTE7XHJcblxyXG4gIHNldCBkYXlQZXJpb2QodmFsdWUpIHtcclxuICAgIHRoaXMuX2RheVBlcmlvZCA9IHZhbHVlO1xyXG4gICAgdGhpcy5saXN0T2ZIb3VyczEyID0gdGhpcy5ob3VyMTIgPyB0aGlzLmxpc3RPZkhvdXJzPy5maWx0ZXIoaXRlbSA9PiAoaXRlbS5kYXlQZXJpb2QgJiYgaXRlbS5kYXlQZXJpb2QgPT09IHZhbHVlKSB8fCAhaXRlbS5kYXlQZXJpb2QpIDogdGhpcy5saXN0T2ZIb3VycztcclxuICAgIHRoaXMucGF0Y2hTZWxlY3RUaW1lVmFsdWVzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF5UGVyaW9kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RheVBlcmlvZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RheVBlcmlvZDogRGF5UGVyaW9kID0gJ2FtJztcclxuXHJcbiAgc2V0VGltZSgpIHtcclxuICAgIHRoaXMuX2hvdXIgPSB0aGlzLl9ob3VyIDwgMCA/IDAgOiB0aGlzLl9ob3VyO1xyXG4gICAgdGhpcy5fbWludXRlID0gdGhpcy5fbWludXRlIDwgMCA/IDAgOiB0aGlzLl9taW51dGU7XHJcbiAgICB0aGlzLl9zZWNvbmQgPSB0aGlzLl9zZWNvbmQgPCAwID8gMCA6IHRoaXMuX3NlY29uZDtcclxuXHJcbiAgICBjb25zdCB0aW1lID0gbmV3IERhdGUodGhpcy5fdGltZT8uZ2V0VGltZSgpIHx8IG5ldyBEYXRlKCkpO1xyXG4gICAgdGltZS5zZXRIb3Vycyh0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgMCk7XHJcbiAgICB0aGlzLnRpbWUgPSB0aW1lO1xyXG4gICAgdGhpcy5lbWl0VGltZSh0aW1lKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclRpbWUoKSB7XHJcbiAgICBpZiAodGhpcy50aW1lKSB7XHJcbiAgICAgIHRoaXMuX3RpbWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuZW1pdFRpbWUodW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2hvdXIgPSAtMTtcclxuICAgIHRoaXMuX21pbnV0ZSA9IC0xO1xyXG4gICAgdGhpcy5fc2Vjb25kID0gLTE7XHJcbiAgICB0aGlzLmRheVBlcmlvZCA9ICdhbSc7XHJcbiAgICB0aGlzLnBhdGNoU2VsZWN0VGltZVZhbHVlcygpO1xyXG4gIH1cclxuXHJcbiAgZW1pdFRpbWUodGltZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xyXG4gICAgY29uc3QgdGltZVZhbHVlID0gISF0aW1lICYmIGlzVmFsaWRUaW1lKHRpbWUpID8gbmV3IERhdGUodGltZS5nZXRUaW1lKCkpIDogdW5kZWZpbmVkO1xyXG4gICAgaWYgKHRoaXMuX3RpbWVJbnRlcm5hbD8uZ2V0VGltZSgpICE9PSB0aW1lVmFsdWU/LmdldFRpbWUoKSkge1xyXG4gICAgICB0aGlzLnRpbWVDaGFuZ2UuZW1pdCh0aW1lVmFsdWUpO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHRpbWVWYWx1ZSk7XHJcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICAgIHRoaXMuX3RpbWVJbnRlcm5hbCA9IHRpbWVWYWx1ZTtcclxuICAgIH1cclxuICAgIHRoaXMudGltZUlucHV0VmFsdWUgPSB0aGlzLnRpbWU/LnRvTG9jYWxlVGltZVN0cmluZyh0aGlzLmxvY2FsZSwgeyB0aW1lU3R5bGU6IHRoaXMuc2Vjb25kcyA/ICdtZWRpdW0nIDogJ3Nob3J0JyB9KSA/PyAnJztcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRUaW1lTGlzdHMoKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0VGltZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3RpbWUnXSkge1xyXG4gICAgICBpZiAoIWNoYW5nZXNbJ3RpbWUnXS5maXJzdENoYW5nZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl90aW1lSW50ZXJuYWw/LmdldFRpbWUoKSAhPT0gY2hhbmdlc1sndGltZSddLmN1cnJlbnRWYWx1ZT8uZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdFRpbWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNvbnRlbnRUZW1wbGF0ZXMuZm9yRWFjaCgoY2hpbGQ6IFRlbXBsYXRlSWREaXJlY3RpdmUpID0+IHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlc1tjaGlsZC5pZF0gPSBjaGlsZC50ZW1wbGF0ZVJlZjtcclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgc2V0VGltZUxpc3RzKCkge1xyXG4gICAgdGhpcy5kYXlQZXJpb2RzID0gZ2V0RGF5UGVyaW9kcyh0aGlzLmxvY2FsZSwgdGhpcy5kYXRlVGltZUZvcm1hdE9wdGlvbnMpO1xyXG4gICAgdGhpcy5ob3VyMTIgPSBpc0hvdXIxMih0aGlzLmxvY2FsZSk7XHJcbiAgICB0aGlzLmxpc3RPZkhvdXJzID0gdGhpcy5saXN0T2ZUaW1lU2VnbWVudHMoZ2V0TGlzdE9mSG91cnMsIHRoaXMuZmlsdGVySG91cnMpO1xyXG4gICAgdGhpcy5saXN0T2ZNaW51dGVzID0gdGhpcy5saXN0T2ZUaW1lU2VnbWVudHMoZ2V0TGlzdE9mTWludXRlcywgdGhpcy5maWx0ZXJNaW51dGVzKTtcclxuICAgIHRoaXMubGlzdE9mU2Vjb25kcyA9IHRoaXMubGlzdE9mVGltZVNlZ21lbnRzKGdldExpc3RPZlNlY29uZHMsIHRoaXMuZmlsdGVyU2Vjb25kcyk7XHJcbiAgICBpZiAodGhpcy52YXJpYW50ID09PSAnc2VsZWN0Jykge1xyXG4gICAgICBjb25zdCB1bmRlZlNlZ21lbnQgPSB7IHZhbHVlOiAtMSwgbGFiZWw6ICcgLS0nLCBkaXNhYmxlZDogdHJ1ZSB9O1xyXG4gICAgICB0aGlzLmxpc3RPZkhvdXJzLnVuc2hpZnQoeyAuLi51bmRlZlNlZ21lbnQgfSk7XHJcbiAgICAgIHRoaXMubGlzdE9mTWludXRlcy51bnNoaWZ0KHsgLi4udW5kZWZTZWdtZW50IH0pO1xyXG4gICAgICB0aGlzLmxpc3RPZlNlY29uZHMudW5zaGlmdCh7IC4uLnVuZGVmU2VnbWVudCB9KTtcclxuICAgIH1cclxuICAgIHRoaXMubGlzdE9mSG91cnMxMiA9IHRoaXMuaG91cjEyID8gdGhpcy5saXN0T2ZIb3Vycy5maWx0ZXIoaXRlbSA9PiAoaXRlbS5kYXlQZXJpb2QgJiYgaXRlbS5kYXlQZXJpb2QgPT09IHRoaXMuZGF5UGVyaW9kKSB8fCAhaXRlbS5kYXlQZXJpb2QpIDogdGhpcy5saXN0T2ZIb3VycztcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdFRpbWUodGltZSA9IHRoaXMudGltZSkge1xyXG4gICAgaWYgKCEhdGltZSAmJiBpc1ZhbGlkVGltZSh0aW1lKSkge1xyXG4gICAgICBjb25zdCBob3VyID0gdGltZS5nZXRIb3VycygpID8/IDA7XHJcbiAgICAgIGNvbnN0IG1pbnV0ZSA9IHRpbWUuZ2V0TWludXRlcygpID8/IDA7XHJcbiAgICAgIGNvbnN0IHNlY29uZCA9IHRoaXMuc2Vjb25kcyA/ICh0aW1lLmdldFNlY29uZHMoKSA/PyAwKSA6IDA7XHJcblxyXG4gICAgICBjb25zdCBjbG9zZXN0U2Vjb25kID0gdGhpcy5jbG9zZXN0VGltZSh0aGlzLmxpc3RPZlNlY29uZHMsIHNlY29uZCk7XHJcbiAgICAgIGNvbnN0IGNsb3Nlc3RNaW51dGUgPSB0aGlzLmNsb3Nlc3RUaW1lKHRoaXMubGlzdE9mTWludXRlcywgbWludXRlKTtcclxuICAgICAgY29uc3QgY2xvc2VzdEhvdXIgPSB0aGlzLmNsb3Nlc3RUaW1lKHRoaXMubGlzdE9mSG91cnMsIGhvdXIpO1xyXG5cclxuICAgICAgdGhpcy5zZWNvbmQgPSB0aGlzLnNlY29uZHMgPyBjbG9zZXN0U2Vjb25kLnZhbHVlIDogMDtcclxuICAgICAgdGhpcy5taW51dGUgPSBjbG9zZXN0TWludXRlLnZhbHVlO1xyXG4gICAgICB0aGlzLmhvdXIgPSBjbG9zZXN0SG91ci52YWx1ZTtcclxuICAgICAgdGhpcy5zZXRUaW1lKCk7XHJcbiAgICAgIHRoaXMucGF0Y2hTZWxlY3RUaW1lVmFsdWVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZXN0VGltZSh0aW1lQXJyYXk6IElUaW1lVmFsdWVbXSwgdGltZVNlZ21lbnQ6IG51bWJlcikge1xyXG4gICAgbGV0IGFycmF5ID0gdGltZUFycmF5ID8/IFt7IHZhbHVlOiAwLCBsYWJlbDogJzAwJyB9XTtcclxuICAgIGlmICh0aGlzLnRpbWUpIHtcclxuICAgICAgYXJyYXkgPSB0aW1lQXJyYXkuZmlsdGVyKGVsID0+IGVsLnZhbHVlID49IDApO1xyXG4gICAgICBhcnJheSA9IGFycmF5Lmxlbmd0aCA/IGFycmF5IDogdGltZUFycmF5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFycmF5LnJlZHVjZSgoYTogSVRpbWVWYWx1ZSwgYjogSVRpbWVWYWx1ZSkgPT4ge1xyXG4gICAgICByZXR1cm4gTWF0aC5hYnMoYi52YWx1ZSAtIHRpbWVTZWdtZW50KSA8IE1hdGguYWJzKGEudmFsdWUgLSB0aW1lU2VnbWVudCkgPyBiIDogYTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbGlzdE9mVGltZVNlZ21lbnRzKGdldExpc3RPZlRpbWVTZWdtZW50czogKGxvY2FsZTogc3RyaW5nLCBkYXRlVGltZUZvcm1hdE9wdGlvbnM6IERhdGVUaW1lRm9ybWF0T3B0aW9ucykgPT4gSVRpbWVWYWx1ZVtdLCBmaWx0ZXJUaW1lU2VnbWVudHM6ICgodGltZVNlZ21lbnRWYWx1ZTogbnVtYmVyKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZCkge1xyXG4gICAgY29uc3QgbGlzdCA9IGdldExpc3RPZlRpbWVTZWdtZW50cyh0aGlzLmxvY2FsZSwgdGhpcy5kYXRlVGltZUZvcm1hdE9wdGlvbnMpLmZpbHRlcigoc2VnbWVudDogSVRpbWVWYWx1ZSkgPT4ge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIGZpbHRlclRpbWVTZWdtZW50cyA9PT0gJ2Z1bmN0aW9uJyA/IGZpbHRlclRpbWVTZWdtZW50cyhzZWdtZW50LnZhbHVlKSA6IHRydWU7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBsaXN0Lmxlbmd0aCA/IGxpc3QgOiBnZXRMaXN0T2ZUaW1lU2VnbWVudHModGhpcy5sb2NhbGUsIHRoaXMuZGF0ZVRpbWVGb3JtYXRPcHRpb25zKS5zbGljZSgwLCAxKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVNlbGVjdERheVBlcmlvZENoYW5nZShkYXlQZXJpb2Q6IERheVBlcmlvZCkge1xyXG4gICAgaWYgKGRheVBlcmlvZCAhPT0gdGhpcy5kYXlQZXJpb2QpIHtcclxuICAgICAgY29uc3QgaHJzID0gdGhpcy50aW1lPy5nZXRIb3VycygpID8/ICh0aGlzLmhvdXIgPCAwID8gMCA6IHRoaXMuaG91cik7XHJcbiAgICAgIGNvbnN0IGhvdXIgPSBocnMgPiAxMiA/IGNvbnZlcnQyNGhUbzEyaChocnMpIDogY29udmVydDEyaFRvMjRoKGRheVBlcmlvZCwgaHJzKTtcclxuICAgICAgdGhpcy5ob3VyID0gdGhpcy5jbG9zZXN0VGltZSh0aGlzLmxpc3RPZkhvdXJzLCBob3VyKS52YWx1ZTtcclxuICAgICAgaWYgKGhvdXIgPj0gMCkge1xyXG4gICAgICAgIHRoaXMuc2V0VGltZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0VGltZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VsZWN0SG91cnNDaGFuZ2UoaG91cjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmhvdXIgPSBob3VyO1xyXG4gICAgaWYgKGhvdXIgPj0gMCkge1xyXG4gICAgICB0aGlzLnNldFRpbWUoKTtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlU2VsZWN0VGltZSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VsZWN0TWludXRlc0NoYW5nZShtaW51dGU6IG51bWJlcikge1xyXG4gICAgdGhpcy5taW51dGUgPSBtaW51dGU7XHJcbiAgICBpZiAobWludXRlID49IDApIHtcclxuICAgICAgdGhpcy5zZXRUaW1lKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdFRpbWUoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVNlbGVjdFNlY29uZHNDaGFuZ2Uoc2Vjb25kOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2Vjb25kID0gc2Vjb25kO1xyXG4gICAgaWYgKHNlY29uZCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuc2V0VGltZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFNlbGVjdFRpbWVWYWx1ZXMoKSB7XHJcbiAgICBjb25zdCBkYXlQZXJpb2QgPSB0aGlzLnNlbGVjdFRpbWUuZ2V0KCdzZWxlY3REYXlQZXJpb2QnKT8udmFsdWU7XHJcbiAgICBpZiAodGhpcy5kYXlQZXJpb2QgIT09IGRheVBlcmlvZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdFRpbWUucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgc2VsZWN0RGF5UGVyaW9kOiB0aGlzLmRheVBlcmlvZCA/PyAnYW0nXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaG91cnMgPSB0aGlzLnNlbGVjdFRpbWUuZ2V0KCdzZWxlY3RIb3VycycpPy52YWx1ZTtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSB0aGlzLnNlbGVjdFRpbWUuZ2V0KCdzZWxlY3RNaW51dGVzJyk/LnZhbHVlO1xyXG4gICAgY29uc3Qgc2Vjb25kcyA9IHRoaXMuc2VsZWN0VGltZS5nZXQoJ3NlbGVjdFNlY29uZHMnKT8udmFsdWU7XHJcbiAgICBjb25zdCBnb1VwZGF0ZSA9ICh0aGlzLnNlY29uZCA8IDAgJiYgdGhpcy5taW51dGUgPCAwKSB8fCAodGhpcy5ob3VyID49IDAgJiYgdGhpcy5taW51dGUgPj0gMCAmJiB0aGlzLnNlY29uZCA+PSAwKTtcclxuICAgIGNvbnN0IHRpbWVDaGFuZ2VkID0gKHRoaXMuaG91ciAhPT0gaG91cnMpIHx8ICh0aGlzLm1pbnV0ZSAhPT0gbWludXRlcykgfHwgKHRoaXMuc2Vjb25kICE9PSBzZWNvbmRzKTtcclxuICAgIGlmIChnb1VwZGF0ZSAmJiB0aW1lQ2hhbmdlZCkge1xyXG4gICAgICBpZiAodGhpcy5ob3VyICE9PSBob3Vycykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0VGltZS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgIHNlbGVjdEhvdXJzOiB0aGlzLmhvdXIgPz8gMFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm1pbnV0ZSAhPT0gbWludXRlcykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0VGltZS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgIHNlbGVjdE1pbnV0ZXM6IHRoaXMubWludXRlID8/IDBcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zZWNvbmQgIT09IHNlY29uZHMpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdFRpbWUucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICBzZWxlY3RTZWNvbmRzOiB0aGlzLnNlY29uZCA/PyAwXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRyYWNrQnlIb3VyKGluZGV4OiBudW1iZXIsIGhvdXI6IElUaW1lVmFsdWUpIHtcclxuICAgIHJldHVybiBob3VyO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2UgPSAodmFsdWU6IERhdGUgfCB1bmRlZmluZWQpID0+IHt9O1xyXG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudGltZSA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RUaW1lKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlVGltZUlucHV0Q2hhbmdlKCRldmVudDogYW55KSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9ICRldmVudC50YXJnZXQ/LnZhbHVlO1xyXG4gICAgaWYgKCFpc1ZhbGlkVGltZSh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5jbGVhclRpbWUoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGltZSA9IGNvbnZlcnRUaW1lVG9EYXRlKHZhbHVlKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0VGltZSh0aW1lID8/IG5ldyBEYXRlKERhdGUubm93KCkpKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNsZWFyKCRldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5jbGVhclRpbWUoKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci10aW1lcGlja2Vyc1wiICpuZ0lmPVwidmFyaWFudD09PSdzZWxlY3QnXCI+XHJcbiAgPGRpdiBjbGFzcz1cInBpY2tlciB0aW1lLXBpY2tlclwiPlxyXG4gICAgPGRpdiBbZm9ybUdyb3VwXT1cInNlbGVjdFRpbWVcIiBjbGFzcz1cInRpbWUtcGlja2VyLWJvZHlcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXBpY2tlci1pbmxpbmUtaWNvblwiPjwvc3Bhbj5cclxuICAgICAgPHNlbGVjdCBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBudWxsXCIgY1NlbGVjdCBjbGFzcz1cIm1zLTBcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RIb3Vyc1wiIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZVNlbGVjdEhvdXJzQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBob3VyIG9mIGxpc3RPZkhvdXJzMTI7IGluZGV4IGFzIGk7IHRyYWNrQnk6IHRyYWNrQnlIb3VyXCIgW25nVmFsdWVdPVwiaG91ci52YWx1ZVwiIFthdHRyLmRpc2FibGVkXT1cImhvdXIuZGlzYWJsZWQgfHwgbnVsbFwiPnt7aG91ci5sYWJlbH19PC9vcHRpb24+XHJcbiAgICAgIDwvc2VsZWN0PlxyXG4gICAgICB7eycgOid9fTxzZWxlY3QgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiIGNTZWxlY3QgY2xhc3M9XCJtcy0wXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0TWludXRlc1wiIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZVNlbGVjdE1pbnV0ZXNDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbGlzdE9mTWludXRlc1wiIFtuZ1ZhbHVlXT1cIm1pbnV0ZS52YWx1ZVwiIFthdHRyLmRpc2FibGVkXT1cIm1pbnV0ZS5kaXNhYmxlZCB8fCBudWxsXCI+e3ttaW51dGUubGFiZWx9fTwvb3B0aW9uPlxyXG4gICAgPC9zZWxlY3Q+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzZWNvbmRzXCI+XHJcbiAgICAgICAge3snIDonfX08c2VsZWN0IFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIiBjU2VsZWN0IGNsYXNzPVwibXMtMFwiIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdFNlY29uZHNcIiAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RTZWNvbmRzQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBzZWNvbmQgb2YgbGlzdE9mU2Vjb25kc1wiIFtuZ1ZhbHVlXT1cInNlY29uZC52YWx1ZVwiIFthdHRyLmRpc2FibGVkXT1cInNlY29uZC5kaXNhYmxlZCB8fCBudWxsXCI+e3tzZWNvbmQubGFiZWx9fTwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImhvdXIxMlwiPlxyXG4gICAgICAgIDxzZWxlY3QgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiIGNTZWxlY3QgY2xhc3M9XCJtcy0wXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0RGF5UGVyaW9kXCIgKG5nTW9kZWxDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0RGF5UGVyaW9kQ2hhbmdlKCRldmVudClcIj5cclxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGRheVBlcmlvZCBvZiBkYXlQZXJpb2RzXCIgW25nVmFsdWVdPVwiZGF5UGVyaW9kLnZhbHVlXCIgY2xhc3M9XCJ0aW1lLXBpY2tlci1yb2xsLWNlbGxcIj57e2RheVBlcmlvZC5sYWJlbH19PC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48Yy1kcm9wZG93biAjZHJvcGRvd249XCJjRHJvcGRvd25cIiBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIGNsYXNzPVwidGltZS1waWNrZXIgcGlja2VyXCIgKm5nSWY9XCJ2YXJpYW50PT09J3JvbGwnXCIgW3Zpc2libGVdPVwidmlzaWJsZVwiPlxyXG4gIDxjLWlucHV0LWdyb3VwIFtjYXJldF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkID8/IGRyb3Bkb3duLnZpc2libGVcIlxyXG4gICAgICAgICAgICAgICAgIFtzaXppbmddPVwic2l6ZSA/PyAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgY0Ryb3Bkb3duVG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaWNrZXItaW5wdXQtZ3JvdXBcIj5cclxuICAgIDxpbnB1dCAoY2hhbmdlKT1cImhhbmRsZVRpbWVJbnB1dENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwidGltZUlucHV0XCJcclxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgIGNGb3JtQ29udHJvbFxyXG4gICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiAwXCJcclxuICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA/ICcnIDogbnVsbFwiXHJcbiAgICAgICAgICAgW2F0dHIucGF0dGVybl09XCJob3VyMTIgPyAnKCgoMFsxLTldKXwoMVswLTJdKSk6KFswLTVdKShbMC05XSlcXFxccyhBfFApTSknIDogJyhbMDFdP1swLTldfDJbMC0zXSk6WzAtNV1bMC05XSdcIlxyXG4gICAgICAgICAgIFtyZWFkb25seV09XCJpbnB1dFJlYWRPbmx5ID8/IG51bGxcIlxyXG4gICAgPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJpbmRpY2F0b3IgfHwgY2xlYW5lclwiIGNJbnB1dEdyb3VwVGV4dD5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJpbmRpY2F0b3JcIiBjbGFzcz1cInBpY2tlci1pbnB1dC1ncm91cC1pbmRpY2F0b3JcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1pbnB1dC1ncm91cC1pY29uIHRpbWUtcGlja2VyLWlucHV0LWljb25cIj48L3NwYW4+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPHNwYW4gKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBoYW5kbGVDbGVhcigkZXZlbnQpXCIgKm5nSWY9XCJjbGVhbmVyICYmIHRpbWUgJiYgIWRpc2FibGVkXCIgY2xhc3M9XCJwaWNrZXItaW5wdXQtZ3JvdXAtY2xlYW5lclwiIHJvbGU9XCJidXR0b25cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1pbnB1dC1ncm91cC1pY29uIHRpbWUtcGlja2VyLWNsZWFuZXItaWNvblwiPjwvc3Bhbj5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9zcGFuPlxyXG5cclxuICA8L2MtaW5wdXQtZ3JvdXA+XHJcbiAgPGRpdiBjRHJvcGRvd25NZW51ICNkcm9wZG93bk1lbnU9XCJjRHJvcGRvd25NZW51XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItYm9keSB0aW1lLXBpY2tlci1yb2xsXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgIDxjLXRpbWUtcGlja2VyLXJvbGwtY29sXHJcbiAgICAgICAgW2VsZW1lbnRzXT1cImxpc3RPZkhvdXJzMTJcIlxyXG4gICAgICAgIFtzZWxlY3RlZF09XCJob3VyXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0SG91cnNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBbcmVmcmVzaF09XCJkcm9wZG93bk1lbnUudmlzaWJsZVwiXHJcbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvYy10aW1lLXBpY2tlci1yb2xsLWNvbD5cclxuICAgICAgPGMtdGltZS1waWNrZXItcm9sbC1jb2xcclxuICAgICAgICBbZWxlbWVudHNdPVwibGlzdE9mTWludXRlc1wiXHJcbiAgICAgICAgW3NlbGVjdGVkXT1cIm1pbnV0ZVwiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cImhhbmRsZVNlbGVjdE1pbnV0ZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICBbcmVmcmVzaF09XCJkcm9wZG93bk1lbnUudmlzaWJsZVwiXHJcbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvYy10aW1lLXBpY2tlci1yb2xsLWNvbD5cclxuICAgICAgPGMtdGltZS1waWNrZXItcm9sbC1jb2xcclxuICAgICAgICAqbmdJZj1cInNlY29uZHNcIlxyXG4gICAgICAgIFtlbGVtZW50c109XCJsaXN0T2ZTZWNvbmRzXCJcclxuICAgICAgICBbc2VsZWN0ZWRdPVwic2Vjb25kXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0U2Vjb25kc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIFtyZWZyZXNoXT1cImRyb3Bkb3duTWVudS52aXNpYmxlXCJcclxuICAgICAgICByb2xlPVwibGlzdGJveFwiXHJcbiAgICAgID5cclxuICAgICAgPC9jLXRpbWUtcGlja2VyLXJvbGwtY29sPlxyXG4gICAgICA8Yy10aW1lLXBpY2tlci1yb2xsLWFtLXBtXHJcbiAgICAgICAgKm5nSWY9XCJob3VyMTJcIiBbZWxlbWVudHNdPVwiZGF5UGVyaW9kc1wiXHJcbiAgICAgICAgW3NlbGVjdGVkXT1cImRheVBlcmlvZFwiXHJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cImhhbmRsZVNlbGVjdERheVBlcmlvZENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIFtyZWZyZXNoXT1cImRyb3Bkb3duTWVudS52aXNpYmxlXCJcclxuICAgICAgICByb2xlPVwibGlzdGJveFwiXHJcbiAgICAgID5cclxuICAgICAgPC9jLXRpbWUtcGlja2VyLXJvbGwtYW0tcG0+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJ0ZW1wbGF0ZXM/LnRpbWVQaWNrZXJGb290ZXJcIiBjbGFzcz1cInBpY2tlci1mb290ZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlcz8udGltZVBpY2tlckZvb3RlcjsgY29udGV4dDogeyRpbXBsaWNpdDogZHJvcGRvd259XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9jLWRyb3Bkb3duPlxyXG4iXX0=
490
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi90aW1lLXBpY2tlci90aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3RpbWUtcGlja2VyL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0csT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVoRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGVBQWUsRUFDZixpQkFBaUIsRUFHakIsT0FBTyxFQUNQLGFBQWEsRUFDYixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsV0FBVyxFQUVaLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7O0FBZWhELE1BQU0sT0FBTyxtQkFBbUI7SUFFOUI7UUF1QlEsYUFBUSxHQUFZLElBQUksQ0FBQztRQUVqQzs7Ozs7V0FLRztRQUNNLDBCQUFxQixHQUEwQixFQUFFLENBQUM7UUFnQm5ELGNBQVMsR0FBWSxLQUFLLENBQUM7UUFxQzNCLGVBQVUsR0FBWSxJQUFJLENB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QkFEVixLQUFLO2dCQWlCRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBUUYsUUFBUTtzQkFEWCxLQUFLO2dCQWdCRyxXQUFXO3NCQUFuQixLQUFLO2dCQU9HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFRRixTQUFTO3NCQURaLEtBQUs7Z0JBaUJGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBZ0JHLE1BQU07c0JBQWQsS0FBSztnQkFPRyxXQUFXO3NCQUFuQixLQUFLO2dCQVFGLE9BQU87c0JBRFYsS0FBSztnQkFnQkcsSUFBSTtzQkFBWixLQUFLO2dCQVFGLElBQUk7c0JBRFAsS0FBSztnQkE2QkcsT0FBTztzQkFBZixLQUFLO2dCQU9HLEtBQUs7c0JBQWIsS0FBSztnQkFRRixPQUFPO3NCQURWLEtBQUs7Z0JBV0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFFZSxNQUFNO3NCQUEzQixZQUFZO3VCQUFDLE1BQU07Z0JBSWdDLFdBQVc7c0JBQTlELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUdXLGdCQUFnQjtzQkFBNUUsZUFBZTt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcblxuaW1wb3J0IHsgVGVtcGxhdGVJZERpcmVjdGl2ZSB9IGZyb20gJy4uL3NoYXJlZCc7XG5cbmltcG9ydCB7XG4gIGNvbnZlcnQxMmhUbzI0aCxcbiAgY29udmVydDI0aFRvMTJoLFxuICBjb252ZXJ0VGltZVRvRGF0ZSxcbiAgRGF0ZVRpbWVGb3JtYXRPcHRpb25zLFxuICBEYXlQZXJpb2QsXG4gIGdldEFtUG0sXG4gIGdldERheVBlcmlvZHMsXG4gIGdldExpc3RPZkhvdXJzLFxuICBnZXRMaXN0T2ZNaW51dGVzLFxuICBnZXRMaXN0T2ZTZWNvbmRzLFxuICBpc0hvdXIxMixcbiAgaXNWYWxpZFRpbWUsXG4gIElUaW1lVmFsdWVcbn0gZnJvbSAnLi90aW1lLnV0aWxzJztcbmltcG9ydCB7IERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vZHJvcGRvd24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjLXRpbWUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpbWUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGltZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZXhwb3J0QXM6ICdjVGltZVBpY2tlcicsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGltZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBUaW1lUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0IHtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2NsZWFuZXI6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9pbmRpY2F0b3I6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2lucHV0UmVhZE9ubHk6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3NlY29uZHM6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3Zpc2libGU6IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogVG9nZ2xlIHZpc2liaWxpdHkgb3Igc2V0IHRoZSBjb250ZW50IG9mIHRoZSBjbGVhbmVyIGJ1dHRvbi5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgY2xlYW5lcih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NsZWFuZXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGNsZWFuZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsZWFuZXI7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbmVyOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0cyBEYXRlVGltZSBmb3JtYXQgb3B0aW9ucyBpbmNsdWRpbmcgdGltZVpvbmVcbiAgICogQHR5cGUgRGF0ZVRpbWVGb3JtYXRPcHRpb25zXG4gICAqIEBkZWZhdWx0IHt9XG4gICAqIEBub3RlIFRoZSBkYXRlIG9iamVjdCBkb2Vzbid0IHN0b3JlIHRpbWVab25lLCBpdCBrZWVwcyB0aGUgbG9jYWwgdGltZXpvbmUgb2YgdGhlIGJyb3dzZXIsIHJlZ2FyZGxlc3MgaWYgeW91IHBhcnNlZCBVVEMgZGF0ZXMuXG4gICAqL1xuICBASW5wdXQoKSBkYXRlVGltZUZvcm1hdE9wdGlvbnM6IERhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgdGhlIGRpc2FibGVkIHN0YXRlIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRmlsdGVyIGF2YWlsYWJsZSBob3VycyB0byBwaWNrLlxuICAgKiBAdHlwZSAodmFsdWU6IG51bWJlcikgPT4gYm9vbGVhbjtcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJIb3Vycz86ICh2YWx1ZTogbnVtYmVyKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYXZhaWxhYmxlIG1pbnV0ZXMgdG8gcGljay5cbiAgICogQHR5cGUgKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW47XG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgZmlsdGVyTWludXRlcz86ICh2YWx1ZTogbnVtYmVyKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYXZhaWxhYmxlIHNlY29uZHMgdG8gcGljay5cbiAgICogQHR5cGUgKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW47XG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgZmlsdGVyU2Vjb25kcz86ICh2YWx1ZTogbnVtYmVyKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgdmlzaWJpbGl0eSBvciBzZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGlucHV0IGluZGljYXRvci5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgaW5kaWNhdG9yKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5kaWNhdG9yID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBpbmRpY2F0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGljYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgX2luZGljYXRvcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgcmVhZG9ubHkgc3RhdGUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBpbnB1dFJlYWRPbmx5KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5wdXRSZWFkT25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgaW5wdXRSZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXRSZWFkT25seTtcbiAgfVxuXG4gIHByaXZhdGUgX2lucHV0UmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBsb2NhbGUgZm9yIGNvbXBvbmVudHMuIElmIG5vdCBzZXQsIGl0IGlzIGluaGVyaXRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAdHlwZSBzdHJpbmdcbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKi9cbiAgQElucHV0KCkgbG9jYWxlOiBzdHJpbmcgPSAnZGVmYXVsdCc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBzaG9ydCBoaW50IHZpc2libGUgaW4gdGltZSBpbnB1dC5cbiAgICogQHR5cGUgc3RyaW5nXG4gICAqIEBkZWZhdWx0ICdTZWxlY3QgdGltZSdcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VsZWN0IHRpbWUnO1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgc2Vjb25kcyB2aXNpYmlsaXR5LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc2Vjb25kcyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlY29uZHMgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHNlY29uZHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY29uZHM7XG4gIH1cblxuICBwcml2YXRlIF9zZWNvbmRzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNpemUgdGhlIGNvbXBvbmVudCBzbWFsbCBvciBsYXJnZS5cbiAgICogQHR5cGUgJ3NtJyB8ICdsZycgfCB1bmRlZmluZWRcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBzaXplPzogJ3NtJyB8ICdsZyc7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgc2VsZWN0ZWQgdGltZS5cbiAgICogQHR5cGUgRGF0ZSB8IHN0cmluZyB8IG51bGwgfCBudW1iZXJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgdGltZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSAmJiBpc1ZhbGlkVGltZSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHRpbWUgPSBjb252ZXJ0VGltZVRvRGF0ZSh2YWx1ZSk7XG4gICAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXlQZXJpb2QgPSBnZXRBbVBtKHRpbWUsIHRoaXMubG9jYWxlKTtcbiAgICAgIGlmICh0aGlzLl90aW1lPy5nZXRUaW1lKCkgIT09IHRpbWUuZ2V0VGltZSgpKSB7XG4gICAgICAgIHRoaXMuX3RpbWUgPSBuZXcgRGF0ZSh0aW1lLmdldFRpbWUoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWU7XG4gIH1cblxuICBwcml2YXRlIF90aW1lPzogRGF0ZTtcbiAgcHJpdmF0ZSBfdGltZUludGVybmFsPzogRGF0ZTtcblxuICAvKipcbiAgICogU2V0IHRoZSB0aW1lIHBpY2tlciB2YXJpYW50IHRvIGEgcm9sbCBvciBzZWxlY3QuXG4gICAqIEB0eXBlICdyb2xsJyB8ICdzZWxlY3QnXG4gICAqIEBkZWZhdWx0ICdyb2xsJ1xuICAgKi9cbiAgQElucHV0KCkgdmFyaWFudDogJ3JvbGwnIHwgJ3NlbGVjdCcgPSAncm9sbCc7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB2aXN1YWwgdmFsaWRhdGlvbiBmZWVkYmFjay5cbiAgICogQHR5cGUgYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIEBJbnB1dCgpIHZhbGlkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIGRyb3Bkb3duIHRpbWVwaWNrZXIgbWVudSBjb21wb25lbnQuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fdmlzaWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgdmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlzaWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgdGltZUNoYW5nZTogRXZlbnRFbWl0dGVyPERhdGUgfCB1bmRlZmluZWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgdW5kZWZpbmVkPihmYWxzZSk7XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpIG9uQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgQFZpZXdDaGlsZChEcm9wZG93bkNvbXBvbmVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duUmVmITogRWxlbWVudFJlZjtcblxuICB0ZW1wbGF0ZXM6IGFueSA9IHt9O1xuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlSWREaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgY29udGVudFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZUlkRGlyZWN0aXZlPjtcblxuICBsaXN0T2ZIb3VycyE6IElUaW1lVmFsdWVbXTtcbiAgbGlzdE9mSG91cnMxMiE6IElUaW1lVmFsdWVbXTtcbiAgbGlzdE9mTWludXRlcyE6IElUaW1lVmFsdWVbXTtcbiAgbGlzdE9mU2Vjb25kcyE6IElUaW1lVmFsdWVbXTtcbiAgaG91cjEyOiBib29sZWFuID0gaXNIb3VyMTIodGhpcy5sb2NhbGUpO1xuICBkYXlQZXJpb2RzID0gW1xuICAgIHsgdmFsdWU6ICdhbScsIGxhYmVsOiAnYW0nIH0sXG4gICAgeyB2YWx1ZTogJ3BtJywgbGFiZWw6ICdwbScgfVxuICBdO1xuXG4gIHNldCB0aW1lSW5wdXRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy50aW1lSW5wdXQuc2V0VmFsdWUodmFsdWUpO1xuICAgIHRoaXMuX3RpbWVJbnB1dFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgdGltZUlucHV0VmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUlucHV0VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF90aW1lSW5wdXRWYWx1ZTogc3RyaW5nID0gdGhpcy50aW1lPy50b0xvY2FsZVRpbWVTdHJpbmcodGhpcy5sb2NhbGUsIHsgdGltZVN0eWxlOiB0aGlzLnNlY29uZHMgPyAnbWVkaXVtJyA6ICdzaG9ydCcgfSkgPz8gJyc7XG5cbiAgZ2V0IHRpbWVQaWNrZXJDbGFzc2VzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnZm9ybS1jb250cm9sJzogdGhpcy52YXJpYW50ID09PSAnc2VsZWN0JyAmJiB0aGlzLnZhbGlkICE9PSB1bmRlZmluZWQsXG4gICAgICAnaXMtdmFsaWQnOiB0aGlzLnZhbGlkID09PSB0cnVlLFxuICAgICAgJ2lzLWludmFsaWQnOiB0aGlzLnZhbGlkID09PSBmYWxzZVxuICAgIH07XG4gIH1cblxuICBzZWxlY3RUaW1lID0gbmV3IEZvcm1Hcm91cDx7XG4gICAgc2VsZWN0SG91cnM6IEZvcm1Db250cm9sPG51bWJlciB8IG51bGw+LFxuICAgIHNlbGVjdE1pbnV0ZXM6IEZvcm1Db250cm9sPG51bWJlciB8IG51bGw+LFxuICAgIHNlbGVjdFNlY29uZHM/OiBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPixcbiAgICBzZWxlY3REYXlQZXJpb2Q/OiBGb3JtQ29udHJvbDwnYW0nIHwgJ3BtJyB8IG51bGw+XG4gIH0+KHtcbiAgICBzZWxlY3RIb3VyczogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuaG91ciwgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQgfSwgeyB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5taW4oMCldIH0pLFxuICAgIHNlbGVjdE1pbnV0ZXM6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB0aGlzLm1pbnV0ZSwgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQgfSwgVmFsaWRhdG9ycy5taW4oMCkpLFxuICAgIHNlbGVjdFNlY29uZHM6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiB0aGlzLnNlY29uZCwgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQgfSwgVmFsaWRhdG9ycy5taW4oMCkpLFxuICAgIHNlbGVjdERheVBlcmlvZDogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuZGF5UGVyaW9kLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICB9LCB7IHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSB9KTtcblxuICB0aW1lSW5wdXQgPSBuZXcgRm9ybUNvbnRyb2woe1xuICAgIHZhbHVlOiB0aGlzLnRpbWVJbnB1dFZhbHVlLFxuICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkXG4gIH0sIHsgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdIH0pO1xuXG4gIHNldCBob3VyKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5faG91ciAhPT0gdmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5faG91ciA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBob3VyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2hvdXI7XG4gIH1cblxuICBwcml2YXRlIF9ob3VyID0gLTE7XG5cbiAgc2V0IG1pbnV0ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX21pbnV0ZSAhPT0gdmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbWludXRlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1pbnV0ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9taW51dGU7XG4gIH1cblxuICBwcml2YXRlIF9taW51dGUgPSAtMTtcblxuICBzZXQgc2Vjb25kKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fc2Vjb25kICE9PSB2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9zZWNvbmQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2Vjb25kKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY29uZDtcbiAgfVxuXG4gIHByaXZhdGUgX3NlY29uZCA9IC0xO1xuXG4gIHNldCBkYXlQZXJpb2QodmFsdWUpIHtcbiAgICB0aGlzLl9kYXlQZXJpb2QgPSB2YWx1ZTtcbiAgICB0aGlzLmxpc3RPZkhvdXJzMTIgPSB0aGlzLmhvdXIxMiA/IHRoaXMubGlzdE9mSG91cnM/LmZpbHRlcihpdGVtID0+IChpdGVtLmRheVBlcmlvZCAmJiBpdGVtLmRheVBlcmlvZCA9PT0gdmFsdWUpIHx8ICFpdGVtLmRheVBlcmlvZCkgOiB0aGlzLmxpc3RPZkhvdXJzO1xuICAgIHRoaXMucGF0Y2hTZWxlY3RUaW1lVmFsdWVzKCk7XG4gIH1cblxuICBnZXQgZGF5UGVyaW9kKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXlQZXJpb2Q7XG4gIH1cblxuICBwcml2YXRlIF9kYXlQZXJpb2Q6IERheVBlcmlvZCA9ICdhbSc7XG5cbiAgc2V0VGltZSgpIHtcbiAgICB0aGlzLl9ob3VyID0gdGhpcy5faG91ciA8IDAgPyAwIDogdGhpcy5faG91cjtcbiAgICB0aGlzLl9taW51dGUgPSB0aGlzLl9taW51dGUgPCAwID8gMCA6IHRoaXMuX21pbnV0ZTtcbiAgICB0aGlzLl9zZWNvbmQgPSB0aGlzLl9zZWNvbmQgPCAwID8gMCA6IHRoaXMuX3NlY29uZDtcblxuICAgIGNvbnN0IHRpbWUgPSBuZXcgRGF0ZSh0aGlzLl90aW1lPy5nZXRUaW1lKCkgfHwgbmV3IERhdGUoKSk7XG4gICAgdGltZS5zZXRIb3Vycyh0aGlzLmhvdXIsIHRoaXMubWludXRlLCB0aGlzLnNlY29uZCwgMCk7XG4gICAgdGhpcy50aW1lID0gdGltZTtcbiAgICB0aGlzLmVtaXRUaW1lKHRpbWUpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyVGltZSgpIHtcbiAgICBpZiAodGhpcy50aW1lKSB7XG4gICAgICB0aGlzLl90aW1lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5lbWl0VGltZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLl9ob3VyID0gLTE7XG4gICAgdGhpcy5fbWludXRlID0gLTE7XG4gICAgdGhpcy5fc2Vjb25kID0gLTE7XG4gICAgdGhpcy5kYXlQZXJpb2QgPSAnYW0nO1xuICAgIHRoaXMucGF0Y2hTZWxlY3RUaW1lVmFsdWVzKCk7XG4gICAgdGhpcy50aW1lSW5wdXRWYWx1ZSA9ICcnO1xuICB9XG5cbiAgZW1pdFRpbWUodGltZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHRpbWVWYWx1ZSA9ICEhdGltZSAmJiBpc1ZhbGlkVGltZSh0aW1lKSA/IG5ldyBEYXRlKHRpbWUuZ2V0VGltZSgpKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5fdGltZUludGVybmFsPy5nZXRUaW1lKCkgIT09IHRpbWVWYWx1ZT8uZ2V0VGltZSgpKSB7XG4gICAgICB0aGlzLnRpbWVDaGFuZ2UuZW1pdCh0aW1lVmFsdWUpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aW1lVmFsdWUpO1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgIHRoaXMuX3RpbWVJbnRlcm5hbCA9IHRpbWVWYWx1ZTtcbiAgICB9XG4gICAgdGhpcy50aW1lSW5wdXRWYWx1ZSA9IHRoaXMudGltZT8udG9Mb2NhbGVUaW1lU3RyaW5nKHRoaXMubG9jYWxlLCB7IHRpbWVTdHlsZTogdGhpcy5zZWNvbmRzID8gJ21lZGl1bScgOiAnc2hvcnQnIH0pID8/ICcnO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRUaW1lTGlzdHMoKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdFRpbWUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndGltZSddKSB7XG4gICAgICBpZiAoIWNoYW5nZXNbJ3RpbWUnXS5maXJzdENoYW5nZSkge1xuICAgICAgICBpZiAodGhpcy5fdGltZUludGVybmFsPy5nZXRUaW1lKCkgIT09IGNoYW5nZXNbJ3RpbWUnXS5jdXJyZW50VmFsdWU/LmdldFRpbWUoKSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0VGltZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb250ZW50VGVtcGxhdGVzLmZvckVhY2goKGNoaWxkOiBUZW1wbGF0ZUlkRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgIHRoaXMudGVtcGxhdGVzW2NoaWxkLmlkXSA9IGNoaWxkLnRlbXBsYXRlUmVmO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRUaW1lTGlzdHMoKSB7XG4gICAgdGhpcy5kYXlQZXJpb2RzID0gZ2V0RGF5UGVyaW9kcyh0aGlzLmxvY2FsZSwgdGhpcy5kYXRlVGltZUZvcm1hdE9wdGlvbnMpO1xuICAgIHRoaXMuaG91cjEyID0gaXNIb3VyMTIodGhpcy5sb2NhbGUpO1xuICAgIHRoaXMubGlzdE9mSG91cnMgPSB0aGlzLmxpc3RPZlRpbWVTZWdtZW50cyhnZXRMaXN0T2ZIb3VycywgdGhpcy5maWx0ZXJIb3Vycyk7XG4gICAgdGhpcy5saXN0T2ZNaW51dGVzID0gdGhpcy5saXN0T2ZUaW1lU2VnbWVudHMoZ2V0TGlzdE9mTWludXRlcywgdGhpcy5maWx0ZXJNaW51dGVzKTtcbiAgICB0aGlzLmxpc3RPZlNlY29uZHMgPSB0aGlzLmxpc3RPZlRpbWVTZWdtZW50cyhnZXRMaXN0T2ZTZWNvbmRzLCB0aGlzLmZpbHRlclNlY29uZHMpO1xuICAgIGlmICh0aGlzLnZhcmlhbnQgPT09ICdzZWxlY3QnKSB7XG4gICAgICBjb25zdCB1bmRlZlNlZ21lbnQgPSB7IHZhbHVlOiAtMSwgbGFiZWw6ICcgLS0nLCBkaXNhYmxlZDogdHJ1ZSB9O1xuICAgICAgdGhpcy5saXN0T2ZIb3Vycy51bnNoaWZ0KHsgLi4udW5kZWZTZWdtZW50IH0pO1xuICAgICAgdGhpcy5saXN0T2ZNaW51dGVzLnVuc2hpZnQoeyAuLi51bmRlZlNlZ21lbnQgfSk7XG4gICAgICB0aGlzLmxpc3RPZlNlY29uZHMudW5zaGlmdCh7IC4uLnVuZGVmU2VnbWVudCB9KTtcbiAgICB9XG4gICAgdGhpcy5saXN0T2ZIb3VyczEyID0gdGhpcy5ob3VyMTIgPyB0aGlzLmxpc3RPZkhvdXJzLmZpbHRlcihpdGVtID0+IChpdGVtLmRheVBlcmlvZCAmJiBpdGVtLmRheVBlcmlvZCA9PT0gdGhpcy5kYXlQZXJpb2QpIHx8ICFpdGVtLmRheVBlcmlvZCkgOiB0aGlzLmxpc3RPZkhvdXJzO1xuICB9XG5cbiAgdXBkYXRlU2VsZWN0VGltZSh0aW1lID0gdGhpcy50aW1lKSB7XG4gICAgaWYgKCEhdGltZSAmJiBpc1ZhbGlkVGltZSh0aW1lKSkge1xuICAgICAgY29uc3QgaG91ciA9IHRpbWUuZ2V0SG91cnMoKSA/PyAwO1xuICAgICAgY29uc3QgbWludXRlID0gdGltZS5nZXRNaW51dGVzKCkgPz8gMDtcbiAgICAgIGNvbnN0IHNlY29uZCA9IHRoaXMuc2Vjb25kcyA/ICh0aW1lLmdldFNlY29uZHMoKSA/PyAwKSA6IDA7XG5cbiAgICAgIGNvbnN0IGNsb3Nlc3RTZWNvbmQgPSB0aGlzLmNsb3Nlc3RUaW1lKHRoaXMubGlzdE9mU2Vjb25kcywgc2Vjb25kKTtcbiAgICAgIGNvbnN0IGNsb3Nlc3RNaW51dGUgPSB0aGlzLmNsb3Nlc3RUaW1lKHRoaXMubGlzdE9mTWludXRlcywgbWludXRlKTtcbiAgICAgIGNvbnN0IGNsb3Nlc3RIb3VyID0gdGhpcy5jbG9zZXN0VGltZSh0aGlzLmxpc3RPZkhvdXJzLCBob3VyKTtcblxuICAgICAgdGhpcy5zZWNvbmQgPSB0aGlzLnNlY29uZHMgPyBjbG9zZXN0U2Vjb25kLnZhbHVlIDogMDtcbiAgICAgIHRoaXMubWludXRlID0gY2xvc2VzdE1pbnV0ZS52YWx1ZTtcbiAgICAgIHRoaXMuaG91ciA9IGNsb3Nlc3RIb3VyLnZhbHVlO1xuICAgICAgdGhpcy5zZXRUaW1lKCk7XG4gICAgICB0aGlzLnBhdGNoU2VsZWN0VGltZVZhbHVlcygpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3Nlc3RUaW1lKHRpbWVBcnJheTogSVRpbWVWYWx1ZVtdLCB0aW1lU2VnbWVudDogbnVtYmVyKSB7XG4gICAgbGV0IGFycmF5ID0gdGltZUFycmF5ID8/IFt7IHZhbHVlOiAwLCBsYWJlbDogJzAwJyB9XTtcbiAgICBpZiAodGhpcy50aW1lKSB7XG4gICAgICBhcnJheSA9IHRpbWVBcnJheS5maWx0ZXIoZWwgPT4gZWwudmFsdWUgPj0gMCk7XG4gICAgICBhcnJheSA9IGFycmF5Lmxlbmd0aCA/IGFycmF5IDogdGltZUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXkucmVkdWNlKChhOiBJVGltZVZhbHVlLCBiOiBJVGltZVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5hYnMoYi52YWx1ZSAtIHRpbWVTZWdtZW50KSA8IE1hdGguYWJzKGEudmFsdWUgLSB0aW1lU2VnbWVudCkgPyBiIDogYTtcbiAgICB9KTtcbiAgfVxuXG4gIGxpc3RPZlRpbWVTZWdtZW50cyhnZXRMaXN0T2ZUaW1lU2VnbWVudHM6IChsb2NhbGU6IHN0cmluZywgZGF0ZVRpbWVGb3JtYXRPcHRpb25zOiBEYXRlVGltZUZvcm1hdE9wdGlvbnMpID0+IElUaW1lVmFsdWVbXSwgZmlsdGVyVGltZVNlZ21lbnRzOiAoKHRpbWVTZWdtZW50VmFsdWU6IG51bWJlcikgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBsaXN0ID0gZ2V0TGlzdE9mVGltZVNlZ21lbnRzKHRoaXMubG9jYWxlLCB0aGlzLmRhdGVUaW1lRm9ybWF0T3B0aW9ucykuZmlsdGVyKChzZWdtZW50OiBJVGltZVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIGZpbHRlclRpbWVTZWdtZW50cyA9PT0gJ2Z1bmN0aW9uJyA/IGZpbHRlclRpbWVTZWdtZW50cyhzZWdtZW50LnZhbHVlKSA6IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGxpc3QubGVuZ3RoID8gbGlzdCA6IGdldExpc3RPZlRpbWVTZWdtZW50cyh0aGlzLmxvY2FsZSwgdGhpcy5kYXRlVGltZUZvcm1hdE9wdGlvbnMpLnNsaWNlKDAsIDEpO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0RGF5UGVyaW9kQ2hhbmdlKGRheVBlcmlvZDogRGF5UGVyaW9kKSB7XG4gICAgaWYgKGRheVBlcmlvZCAhPT0gdGhpcy5kYXlQZXJpb2QpIHtcbiAgICAgIGNvbnN0IGhycyA9IHRoaXMudGltZT8uZ2V0SG91cnMoKSA/PyAodGhpcy5ob3VyIDwgMCA/IDAgOiB0aGlzLmhvdXIpO1xuICAgICAgY29uc3QgaG91ciA9IGhycyA+IDEyID8gY29udmVydDI0aFRvMTJoKGhycykgOiBjb252ZXJ0MTJoVG8yNGgoZGF5UGVyaW9kLCBocnMpO1xuICAgICAgdGhpcy5ob3VyID0gdGhpcy5jbG9zZXN0VGltZSh0aGlzLmxpc3RPZkhvdXJzLCBob3VyKS52YWx1ZTtcbiAgICAgIGlmIChob3VyID49IDApIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdFRpbWUoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVTZWxlY3RIb3Vyc0NoYW5nZShob3VyOiBudW1iZXIpIHtcbiAgICB0aGlzLmhvdXIgPSBob3VyO1xuICAgIGlmIChob3VyID49IDApIHtcbiAgICAgIHRoaXMuc2V0VGltZSgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdFRpbWUoKTtcbiAgfVxuXG4gIGhhbmRsZVNlbGVjdE1pbnV0ZXNDaGFuZ2UobWludXRlOiBudW1iZXIpIHtcbiAgICB0aGlzLm1pbnV0ZSA9IG1pbnV0ZTtcbiAgICBpZiAobWludXRlID49IDApIHtcbiAgICAgIHRoaXMuc2V0VGltZSgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdFRpbWUoKTtcbiAgfVxuXG4gIGhhbmRsZVNlbGVjdFNlY29uZHNDaGFuZ2Uoc2Vjb25kOiBudW1iZXIpIHtcbiAgICB0aGlzLnNlY29uZCA9IHNlY29uZDtcbiAgICBpZiAoc2Vjb25kID49IDApIHtcbiAgICAgIHRoaXMuc2V0VGltZSgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdFRpbWUoKTtcbiAgfVxuXG4gIHBhdGNoU2VsZWN0VGltZVZhbHVlcygpIHtcbiAgICBjb25zdCBkYXlQZXJpb2QgPSB0aGlzLnNlbGVjdFRpbWUuZ2V0KCdzZWxlY3REYXlQZXJpb2QnKT8udmFsdWU7XG4gICAgaWYgKHRoaXMuZGF5UGVyaW9kICE9PSBkYXlQZXJpb2QpIHtcbiAgICAgIHRoaXMuc2VsZWN0VGltZS5wYXRjaFZhbHVlKHtcbiAgICAgICAgc2VsZWN0RGF5UGVyaW9kOiB0aGlzLmRheVBlcmlvZCA/PyAnYW0nXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaG91cnMgPSB0aGlzLnNlbGVjdFRpbWUuZ2V0KCdzZWxlY3RIb3VycycpPy52YWx1ZTtcbiAgICBjb25zdCBtaW51dGVzID0gdGhpcy5zZWxlY3RUaW1lLmdldCgnc2VsZWN0TWludXRlcycpPy52YWx1ZTtcbiAgICBjb25zdCBzZWNvbmRzID0gdGhpcy5zZWxlY3RUaW1lLmdldCgnc2VsZWN0U2Vjb25kcycpPy52YWx1ZTtcbiAgICBjb25zdCBnb1VwZGF0ZSA9ICh0aGlzLnNlY29uZCA8IDAgJiYgdGhpcy5taW51dGUgPCAwKSB8fCAodGhpcy5ob3VyID49IDAgJiYgdGhpcy5taW51dGUgPj0gMCAmJiB0aGlzLnNlY29uZCA+PSAwKTtcbiAgICBjb25zdCB0aW1lQ2hhbmdlZCA9ICh0aGlzLmhvdXIgIT09IGhvdXJzKSB8fCAodGhpcy5taW51dGUgIT09IG1pbnV0ZXMpIHx8ICh0aGlzLnNlY29uZCAhPT0gc2Vjb25kcyk7XG4gICAgaWYgKGdvVXBkYXRlICYmIHRpbWVDaGFuZ2VkKSB7XG4gICAgICBpZiAodGhpcy5ob3VyICE9PSBob3Vycykge1xuICAgICAgICB0aGlzLnNlbGVjdFRpbWUucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgc2VsZWN0SG91cnM6IHRoaXMuaG91ciA/PyAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWludXRlICE9PSBtaW51dGVzKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0VGltZS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBzZWxlY3RNaW51dGVzOiB0aGlzLm1pbnV0ZSA/PyAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2Vjb25kICE9PSBzZWNvbmRzKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0VGltZS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBzZWxlY3RTZWNvbmRzOiB0aGlzLnNlY29uZCA/PyAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyYWNrQnlIb3VyKGluZGV4OiBudW1iZXIsIGhvdXI6IElUaW1lVmFsdWUpIHtcbiAgICByZXR1cm4gaG91cjtcbiAgfVxuXG4gIG9uQ2hhbmdlID0gKHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkKSA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy50aW1lID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RUaW1lKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgaGFuZGxlVGltZUlucHV0Q2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgY29uc3QgdmFsdWUgPSAkZXZlbnQudGFyZ2V0Py52YWx1ZTtcbiAgICBpZiAoIXZhbHVlIHx8ICFpc1ZhbGlkVGltZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuY2xlYXJUaW1lKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpbWUgPSBjb252ZXJ0VGltZVRvRGF0ZSh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVTZWxlY3RUaW1lKHRpbWUgPz8gbmV3IERhdGUoRGF0ZS5ub3coKSkpO1xuICB9XG5cbiAgaGFuZGxlQ2xlYXIoJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5jbGVhclRpbWUoKTtcbiAgfVxuXG4gIGhhbmRsZUJsdXIoJGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kcm9wZG93blJlZj8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgaGFuZGxlRm9jdXMoJGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kcm9wZG93blJlZj8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItdGltZXBpY2tlcnNcIiAqbmdJZj1cInZhcmlhbnQ9PT0nc2VsZWN0J1wiPlxuICA8ZGl2IGNsYXNzPVwicGlja2VyIHRpbWUtcGlja2VyXCI+XG4gICAgPGRpdiBbZm9ybUdyb3VwXT1cInNlbGVjdFRpbWVcIiBjbGFzcz1cInRpbWUtcGlja2VyLWJvZHlcIiBbbmdDbGFzc109XCJ0aW1lUGlja2VyQ2xhc3Nlc1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXBpY2tlci1pbmxpbmUtaWNvblwiPjwvc3Bhbj5cbiAgICAgIDxzZWxlY3QgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiIGNTZWxlY3QgY2xhc3M9XCJtcy0wXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0SG91cnNcIiAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RIb3Vyc0NoYW5nZSgkZXZlbnQpXCIgKGJsdXIpPVwib25CbHVyKClcIiBbc2l6aW5nXT1cInNpemUgPz8gJydcIj5cbiAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaG91ciBvZiBsaXN0T2ZIb3VyczEyOyBpbmRleCBhcyBpOyB0cmFja0J5OiB0cmFja0J5SG91clwiIFtuZ1ZhbHVlXT1cImhvdXIudmFsdWVcIiBbYXR0ci5kaXNhYmxlZF09XCJob3VyLmRpc2FibGVkIHx8IG51bGxcIj57e2hvdXIubGFiZWx9fTwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgICB7eycgOid9fTxzZWxlY3QgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgbnVsbFwiIGNTZWxlY3QgY2xhc3M9XCJtcy0wXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0TWludXRlc1wiIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZVNlbGVjdE1pbnV0ZXNDaGFuZ2UoJGV2ZW50KVwiIChibHVyKT1cIm9uQmx1cigpXCIgW3NpemluZ109XCJzaXplID8/ICcnXCI+XG4gICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbGlzdE9mTWludXRlc1wiIFtuZ1ZhbHVlXT1cIm1pbnV0ZS52YWx1ZVwiIFthdHRyLmRpc2FibGVkXT1cIm1pbnV0ZS5kaXNhYmxlZCB8fCBudWxsXCI+e3ttaW51dGUubGFiZWx9fTwvb3B0aW9uPlxuICAgIDwvc2VsZWN0PlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInNlY29uZHNcIj5cbiAgICAgICAge3snIDonfX08c2VsZWN0IFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIiBjU2VsZWN0IGNsYXNzPVwibXMtMFwiIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdFNlY29uZHNcIiAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVTZWxlY3RTZWNvbmRzQ2hhbmdlKCRldmVudClcIiAoYmx1cik9XCJvbkJsdXIoKVwiIFtzaXppbmddPVwic2l6ZSA/PyAnJ1wiPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBzZWNvbmQgb2YgbGlzdE9mU2Vjb25kc1wiIFtuZ1ZhbHVlXT1cInNlY29uZC52YWx1ZVwiIFthdHRyLmRpc2FibGVkXT1cInNlY29uZC5kaXNhYmxlZCB8fCBudWxsXCI+e3tzZWNvbmQubGFiZWx9fTwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImhvdXIxMlwiPlxuICAgICAgICA8c2VsZWN0IFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkIHx8IG51bGxcIiBjU2VsZWN0IGNsYXNzPVwibXMtMFwiIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdERheVBlcmlvZFwiIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZVNlbGVjdERheVBlcmlvZENoYW5nZSgkZXZlbnQpXCIgKGJsdXIpPVwib25CbHVyKClcIiBbc2l6aW5nXT1cInNpemUgPz8gJydcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBkYXlQZXJpb2Qgb2YgZGF5UGVyaW9kc1wiIFtuZ1ZhbHVlXT1cImRheVBlcmlvZC52YWx1ZVwiIGNsYXNzPVwidGltZS1waWNrZXItcm9sbC1jZWxsXCI+e3tkYXlQZXJpb2QubGFiZWx9fTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxjLWRyb3Bkb3duICNkcm9wZG93bj1cImNEcm9wZG93blwiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCIgY2xhc3M9XCJ0aW1lLXBpY2tlciBwaWNrZXJcIiBbbmdDbGFzc109XCJ0aW1lUGlja2VyQ2xhc3Nlc1wiICpuZ0lmPVwidmFyaWFudD09PSdyb2xsJ1wiIFt2aXNpYmxlXT1cInZpc2libGVcIj5cbiAgPGMtaW5wdXQtZ3JvdXAgW2NhcmV0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkID8/IGRyb3Bkb3duLnZpc2libGVcIlxuICAgICAgICAgICAgICAgICBbc2l6aW5nXT1cInNpemUgPz8gJydcIlxuICAgICAgICAgICAgICAgICBjRHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJwaWNrZXItaW5wdXQtZ3JvdXBcIj5cbiAgICA8aW5wdXQgKGJsdXIpPVwiaGFuZGxlQmx1cigkZXZlbnQpO1wiXG4gICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlVGltZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAoZm9jdXMpPVwiaGFuZGxlRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0aW1lSW5wdXRcIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICBjRm9ybUNvbnRyb2xcbiAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IDBcIlxuICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA/ICcnIDogbnVsbFwiXG4gICAgICAgICAgIFthdHRyLnBhdHRlcm5dPVwiaG91cjEyID8gJygoKDBbMS05XSl8KDFbMC0yXSkpOihbMC01XSkoWzAtOV0pXFxcXHMoQXxQKU0pJyA6ICcoWzAxXT9bMC05XXwyWzAtM10pOlswLTVdWzAtOV0nXCJcbiAgICAgICAgICAgW3JlYWRvbmx5XT1cImlucHV0UmVhZE9ubHkgPz8gbnVsbFwiXG4gICAgICAgICAgIFt2YWxpZF09XCJ2YWxpZFwiXG4gICAgPlxuICAgIDxzcGFuICpuZ0lmPVwiaW5kaWNhdG9yIHx8IGNsZWFuZXJcIiBjSW5wdXRHcm91cFRleHQ+XG4gICAgICA8c3BhbiAqbmdJZj1cImluZGljYXRvclwiIGNsYXNzPVwicGlja2VyLWlucHV0LWdyb3VwLWluZGljYXRvclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1pbnB1dC1ncm91cC1pY29uIHRpbWUtcGlja2VyLWlucHV0LWljb25cIj48L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiAoY2xpY2spPVwiIWRpc2FibGVkICYmIGhhbmRsZUNsZWFyKCRldmVudClcIiAqbmdJZj1cImNsZWFuZXIgJiYgdGltZSAmJiAhZGlzYWJsZWRcIiBjbGFzcz1cInBpY2tlci1pbnB1dC1ncm91cC1jbGVhbmVyXCIgcm9sZT1cImJ1dHRvblwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBpY2tlci1pbnB1dC1ncm91cC1pY29uIHRpbWUtcGlja2VyLWNsZWFuZXItaWNvblwiPjwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L3NwYW4+XG5cbiAgPC9jLWlucHV0LWdyb3VwPlxuICA8ZGl2IGNEcm9wZG93bk1lbnUgI2Ryb3Bkb3duTWVudT1cImNEcm9wZG93bk1lbnVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItYm9keSB0aW1lLXBpY2tlci1yb2xsXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XG4gICAgICA8Yy10aW1lLXBpY2tlci1yb2xsLWNvbFxuICAgICAgICBbZWxlbWVudHNdPVwibGlzdE9mSG91cnMxMlwiXG4gICAgICAgIFtzZWxlY3RlZF09XCJob3VyXCJcbiAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cImhhbmRsZVNlbGVjdEhvdXJzQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmVmcmVzaF09XCJkcm9wZG93bk1lbnUudmlzaWJsZVwiXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgID5cbiAgICAgIDwvYy10aW1lLXBpY2tlci1yb2xsLWNvbD5cbiAgICAgIDxjLXRpbWUtcGlja2VyLXJvbGwtY29sXG4gICAgICAgIFtlbGVtZW50c109XCJsaXN0T2ZNaW51dGVzXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cIm1pbnV0ZVwiXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJoYW5kbGVTZWxlY3RNaW51dGVzQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmVmcmVzaF09XCJkcm9wZG93bk1lbnUudmlzaWJsZVwiXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgID5cbiAgICAgIDwvYy10aW1lLXBpY2tlci1yb2xsLWNvbD5cbiAgICAgIDxjLXRpbWUtcGlja2VyLXJvbGwtY29sXG4gICAgICAgICpuZ0lmPVwic2Vjb25kc1wiXG4gICAgICAgIFtlbGVtZW50c109XCJsaXN0T2ZTZWNvbmRzXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cInNlY29uZFwiXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJoYW5kbGVTZWxlY3RTZWNvbmRzQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmVmcmVzaF09XCJkcm9wZG93bk1lbnUudmlzaWJsZVwiXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgID5cbiAgICAgIDwvYy10aW1lLXBpY2tlci1yb2xsLWNvbD5cbiAgICAgIDxjLXRpbWUtcGlja2VyLXJvbGwtYW0tcG1cbiAgICAgICAgKm5nSWY9XCJob3VyMTJcIiBbZWxlbWVudHNdPVwiZGF5UGVyaW9kc1wiXG4gICAgICAgIFtzZWxlY3RlZF09XCJkYXlQZXJpb2RcIlxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiaGFuZGxlU2VsZWN0RGF5UGVyaW9kQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmVmcmVzaF09XCJkcm9wZG93bk1lbnUudmlzaWJsZVwiXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgID5cbiAgICAgIDwvYy10aW1lLXBpY2tlci1yb2xsLWFtLXBtPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJ0ZW1wbGF0ZXM/LnRpbWVQaWNrZXJGb290ZXJcIiBjbGFzcz1cInBpY2tlci1mb290ZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZXM/LnRpbWVQaWNrZXJGb290ZXI7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGRyb3Bkb3dufVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvYy1kcm9wZG93bj5cbiJdfQ==