@dhutaryan/ngx-mat-timepicker 18.0.4 → 19.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +3 -0
  2. package/_timepicker-theme.scss +0 -6
  3. package/fesm2022/dhutaryan-ngx-mat-timepicker.mjs +119 -123
  4. package/fesm2022/dhutaryan-ngx-mat-timepicker.mjs.map +1 -1
  5. package/lib/hours-clock-dial.d.ts +1 -1
  6. package/lib/time-face-base.d.ts +1 -1
  7. package/lib/time-input-base.d.ts +1 -1
  8. package/lib/timepicker-actions.d.ts +5 -9
  9. package/lib/timepicker-base.d.ts +1 -1
  10. package/lib/timepicker-content.d.ts +9 -9
  11. package/lib/timepicker-input-base.d.ts +1 -1
  12. package/package.json +5 -6
  13. package/themes/_utils.scss +39 -0
  14. package/themes/m2/_tokens.scss +2 -0
  15. package/themes/m3/_base.scss +0 -8
  16. package/themes/m3/_color.scss +0 -11
  17. package/themes/m3/_tokens.scss +1 -1
  18. package/esm2022/dhutaryan-ngx-mat-timepicker.mjs +0 -5
  19. package/esm2022/lib/adapter/index.mjs +0 -34
  20. package/esm2022/lib/adapter/native-date-time-adapter.mjs +0 -137
  21. package/esm2022/lib/adapter/time-adapter.mjs +0 -90
  22. package/esm2022/lib/clock-dial-adnimation.mjs +0 -11
  23. package/esm2022/lib/clock-dials.mjs +0 -95
  24. package/esm2022/lib/clock-size.mjs +0 -25
  25. package/esm2022/lib/hours-clock-dial.mjs +0 -192
  26. package/esm2022/lib/minutes-clock-dial.mjs +0 -165
  27. package/esm2022/lib/orientation.mjs +0 -2
  28. package/esm2022/lib/time-face-base.mjs +0 -318
  29. package/esm2022/lib/time-input-base.mjs +0 -85
  30. package/esm2022/lib/time-inputs.mjs +0 -179
  31. package/esm2022/lib/time-period.mjs +0 -67
  32. package/esm2022/lib/time-selection-model.mjs +0 -76
  33. package/esm2022/lib/timepicker-actions-default.mjs +0 -3
  34. package/esm2022/lib/timepicker-actions.mjs +0 -135
  35. package/esm2022/lib/timepicker-animations.mjs +0 -22
  36. package/esm2022/lib/timepicker-base.mjs +0 -458
  37. package/esm2022/lib/timepicker-content-layout.mjs +0 -23
  38. package/esm2022/lib/timepicker-content.mjs +0 -127
  39. package/esm2022/lib/timepicker-input-base.mjs +0 -254
  40. package/esm2022/lib/timepicker-input.mjs +0 -136
  41. package/esm2022/lib/timepicker-intl.mjs +0 -39
  42. package/esm2022/lib/timepicker-scroll-strategy.mjs +0 -15
  43. package/esm2022/lib/timepicker-toggle.mjs +0 -96
  44. package/esm2022/lib/timepicker.mjs +0 -33
  45. package/esm2022/lib/timepicker.module.mjs +0 -138
  46. package/esm2022/public-api.mjs +0 -23
  47. package/themes/_base.scss +0 -119
@@ -1,127 +0,0 @@
1
- import { PortalModule, } from '@angular/cdk/portal';
2
- import { A11yModule } from '@angular/cdk/a11y';
3
- import { Component, ChangeDetectionStrategy, ViewEncapsulation, ViewChild, } from '@angular/core';
4
- import { CommonModule } from '@angular/common';
5
- import { mixinColor } from '@angular/material/core';
6
- import { MatButtonModule } from '@angular/material/button';
7
- import { Subject, Subscription } from 'rxjs';
8
- import { matTimepickerAnimations } from './timepicker-animations';
9
- import { MatClockDials } from './clock-dials';
10
- import { MatTimeInputs } from './time-inputs';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "./timepicker-intl";
13
- import * as i2 from "./time-selection-model";
14
- import * as i3 from "@angular/cdk/portal";
15
- import * as i4 from "@angular/cdk/a11y";
16
- import * as i5 from "@angular/material/button";
17
- // Boilerplate for applying mixins to MatTimepickerContent.
18
- const _MatTimepickerContentBase = mixinColor(class {
19
- constructor(_elementRef) {
20
- this._elementRef = _elementRef;
21
- }
22
- });
23
- export class MatTimepickerContent extends _MatTimepickerContentBase {
24
- constructor(elementRef, intl, _globalModel, _changeDetectorRef) {
25
- super(elementRef);
26
- this._globalModel = _globalModel;
27
- this._changeDetectorRef = _changeDetectorRef;
28
- /** Portal with projected action buttons. */
29
- this._actionsPortal = null;
30
- /** Whether there is an in-progress animation. */
31
- this._isAnimating = false;
32
- /** Emits when an animation has finished. */
33
- this._animationDone = new Subject();
34
- this._subscriptions = new Subscription();
35
- this._closeButtonText = intl.closeTimepickerLabel;
36
- }
37
- ngOnInit() {
38
- this._animationState =
39
- this.timepicker.openAs === 'dialog' ? 'enter-dialog' : 'enter-dropdown';
40
- }
41
- ngAfterViewInit() {
42
- this._subscriptions.add(this.timepicker.stateChanges.subscribe(() => {
43
- this._changeDetectorRef.markForCheck();
44
- }));
45
- (this._dials || this._inputs)?.focusActiveCell();
46
- }
47
- ngOnDestroy() {
48
- this._subscriptions.unsubscribe();
49
- this._animationDone.complete();
50
- }
51
- /** Changes animation state while closing timepicker content. */
52
- _startExitAnimation() {
53
- this._animationState = 'void';
54
- this._changeDetectorRef.markForCheck();
55
- }
56
- _handleAnimationEvent(event) {
57
- this._isAnimating = event.phaseName === 'start';
58
- if (!this._isAnimating) {
59
- this._animationDone.next();
60
- }
61
- }
62
- onToggleMode(mode) {
63
- this.mode = mode;
64
- }
65
- _getSelected() {
66
- return this._model?.selection;
67
- }
68
- /** Applies the current pending selection to the global model. */
69
- _applyPendingSelection() {
70
- if (this._model !== this._globalModel) {
71
- this._globalModel.updateSelection(this._model.selection, this);
72
- }
73
- }
74
- /**
75
- * Assigns a new portal containing the timepicker actions.
76
- * @param portal Portal with the actions to be assigned.
77
- * @param forceRerender Whether a re-render of the portal should be triggered. This isn't
78
- * necessary if the portal is assigned during initialization, but it may be required if it's
79
- * added at a later point.
80
- */
81
- _assignActions(portal, forceRerender) {
82
- // As we have actions, clone the model so that we have the ability to cancel the selection.
83
- // Note that we want to assign this as soon as possible,
84
- // but `_actionsPortal` isn't available in the constructor so we do it in `ngOnInit`.
85
- this._model = this._globalModel.clone();
86
- this._actionsPortal = portal;
87
- if (forceRerender) {
88
- this._changeDetectorRef.detectChanges();
89
- }
90
- }
91
- _handleUserSelection(event) {
92
- const value = event;
93
- this._model.add(value);
94
- }
95
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimepickerContent, deps: [{ token: i0.ElementRef }, { token: i1.MatTimepickerIntl }, { token: i2.MatTimeSelectionModel }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
96
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: MatTimepickerContent, isStandalone: true, selector: "mat-timepicker-content", host: { listeners: { "@transformPanel.start": "_handleAnimationEvent($event)", "@transformPanel.done": "_handleAnimationEvent($event)" }, properties: { "@transformPanel": "_animationState", "class.mat-timepicker-content-touch": "timepicker.touchUi" }, classAttribute: "mat-timepicker-content" }, viewQueries: [{ propertyName: "_dials", first: true, predicate: MatClockDials, descendants: true }, { propertyName: "_inputs", first: true, predicate: MatTimeInputs, descendants: true }], exportAs: ["matTimepickerContent"], usesInheritance: true, ngImport: i0, template: "<div\n cdkTrapFocus\n role=\"dialog\"\n class=\"mat-timepicker-content-container\"\n [attr.aria-modal]=\"true\"\n [attr.aria-labelledby]=\"_dialogLabelId ?? undefined\"\n>\n @switch (mode) {\n @case ('input') {\n <mat-time-inputs\n [id]=\"timepicker.id\"\n [color]=\"color\"\n [isMeridiem]=\"isMeridiem\"\n [selected]=\"_getSelected()\"\n [minTime]=\"timepicker._getMinTime()\"\n [maxTime]=\"timepicker._getMaxTime()\"\n [minuteInterval]=\"minuteInterval\"\n (_userSelection)=\"_handleUserSelection($event)\"\n ></mat-time-inputs>\n\n <div class=\"mat-timepicker-content-actions\">\n @if (showToggleModeButton) {\n <button\n class=\"mat-time-toggle-mode-button\"\n mat-icon-button\n (click)=\"onToggleMode('dial')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" width=\"24\" viewBox=\"0 0 24 24\">\n <path\n d=\"m15.175 16.625 1.475-1.45-3.6-3.6V7.1h-2.075v5.3ZM12 21.95q-2.075 0-3.887-.787-1.813-.788-3.15-2.125-1.338-1.338-2.125-3.151Q2.05 14.075 2.05 12t.788-3.887q.787-1.813 2.125-3.15Q6.3 3.625 8.113 2.837 9.925 2.05 12 2.05t3.887.787q1.813.788 3.151 2.126 1.337 1.337 2.125 3.15.787 1.812.787 3.887t-.787 3.887q-.788 1.813-2.125 3.151-1.338 1.337-3.151 2.125-1.812.787-3.887.787ZM12 12Zm0 7.8q3.225 0 5.513-2.275Q19.8 15.25 19.8 12q0-3.25-2.287-5.525Q15.225 4.2 12 4.2T6.488 6.475Q4.2 8.75 4.2 12q0 3.25 2.288 5.525Q8.775 19.8 12 19.8Z\"\n />\n </svg>\n </button>\n }\n\n <ng-template [cdkPortalOutlet]=\"_actionsPortal\"></ng-template>\n </div>\n }\n\n @case ('dial') {\n <mat-clock-dials\n [id]=\"timepicker.id\"\n [color]=\"color\"\n [isMeridiem]=\"isMeridiem\"\n [selected]=\"_getSelected()\"\n [minTime]=\"timepicker._getMinTime()\"\n [maxTime]=\"timepicker._getMaxTime()\"\n [minuteInterval]=\"minuteInterval\"\n [orientation]=\"orientation\"\n [touchUi]=\"timepicker.touchUi\"\n (_userSelection)=\"_handleUserSelection($event)\"\n ></mat-clock-dials>\n\n <div class=\"mat-timepicker-content-actions\">\n @if (showToggleModeButton) {\n <button\n class=\"mat-time-toggle-mode-button\"\n mat-icon-button\n (click)=\"onToggleMode('input')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" width=\"24\" viewBox=\"0 0 24 24\">\n <path\n d=\"M4 19q-.825 0-1.412-.587Q2 17.825 2 17V7q0-.825.588-1.412Q3.175 5 4 5h16q.825 0 1.413.588Q22 6.175 22 7v10q0 .825-.587 1.413Q20.825 19 20 19Zm0-2h16V7H4v10Zm4-1h8v-2H8Zm-3-3h2v-2H5Zm3 0h2v-2H8Zm3 0h2v-2h-2Zm3 0h2v-2h-2Zm3 0h2v-2h-2ZM5 10h2V8H5Zm3 0h2V8H8Zm3 0h2V8h-2Zm3 0h2V8h-2Zm3 0h2V8h-2ZM4 17V7v10Z\"\n />\n </svg>\n </button>\n }\n\n <ng-template [cdkPortalOutlet]=\"_actionsPortal\"></ng-template>\n </div>\n }\n }\n\n <!-- Invisible close button for screen reader users. -->\n <button\n type=\"button\"\n class=\"mat-timepicker-close-button\"\n mat-raised-button\n [color]=\"color || 'primary'\"\n [class.cdk-visually-hidden]=\"!_closeButtonFocused\"\n (focus)=\"_closeButtonFocused = true\"\n (blur)=\"_closeButtonFocused = false\"\n (click)=\"timepicker.close()\"\n >\n {{ _closeButtonText }}\n </button>\n</div>\n", styles: [".mat-timepicker-content{display:block}.mat-timepicker-content-container{position:relative;display:flex;flex-direction:column;padding:1rem 1.5rem}.mat-timepicker-content-actions{display:flex;justify-content:space-between;margin-right:-1rem;margin-top:1.5rem}.mat-time-toggle-mode-button{width:3.25rem;height:3.25rem;margin-left:-.75rem;margin-bottom:-.25rem}button.mat-timepicker-close-button{position:absolute;top:100%;left:0;margin-top:.5rem}.ng-animating button.mat-timepicker-close-button{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: MatTimeInputs, selector: "mat-time-inputs" }, { kind: "component", type: MatClockDials, selector: "mat-clock-dials", inputs: ["orientation", "touchUi"], exportAs: ["matClockDials"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }], animations: [
97
- matTimepickerAnimations.transformPanel,
98
- matTimepickerAnimations.fadeInTimepicker,
99
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
100
- }
101
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimepickerContent, decorators: [{
102
- type: Component,
103
- args: [{ selector: 'mat-timepicker-content', standalone: true, imports: [
104
- CommonModule,
105
- PortalModule,
106
- A11yModule,
107
- MatTimeInputs,
108
- MatClockDials,
109
- MatButtonModule,
110
- ], exportAs: 'matTimepickerContent', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
111
- class: 'mat-timepicker-content',
112
- '[@transformPanel]': '_animationState',
113
- '(@transformPanel.start)': '_handleAnimationEvent($event)',
114
- '(@transformPanel.done)': '_handleAnimationEvent($event)',
115
- '[class.mat-timepicker-content-touch]': 'timepicker.touchUi',
116
- }, animations: [
117
- matTimepickerAnimations.transformPanel,
118
- matTimepickerAnimations.fadeInTimepicker,
119
- ], template: "<div\n cdkTrapFocus\n role=\"dialog\"\n class=\"mat-timepicker-content-container\"\n [attr.aria-modal]=\"true\"\n [attr.aria-labelledby]=\"_dialogLabelId ?? undefined\"\n>\n @switch (mode) {\n @case ('input') {\n <mat-time-inputs\n [id]=\"timepicker.id\"\n [color]=\"color\"\n [isMeridiem]=\"isMeridiem\"\n [selected]=\"_getSelected()\"\n [minTime]=\"timepicker._getMinTime()\"\n [maxTime]=\"timepicker._getMaxTime()\"\n [minuteInterval]=\"minuteInterval\"\n (_userSelection)=\"_handleUserSelection($event)\"\n ></mat-time-inputs>\n\n <div class=\"mat-timepicker-content-actions\">\n @if (showToggleModeButton) {\n <button\n class=\"mat-time-toggle-mode-button\"\n mat-icon-button\n (click)=\"onToggleMode('dial')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" width=\"24\" viewBox=\"0 0 24 24\">\n <path\n d=\"m15.175 16.625 1.475-1.45-3.6-3.6V7.1h-2.075v5.3ZM12 21.95q-2.075 0-3.887-.787-1.813-.788-3.15-2.125-1.338-1.338-2.125-3.151Q2.05 14.075 2.05 12t.788-3.887q.787-1.813 2.125-3.15Q6.3 3.625 8.113 2.837 9.925 2.05 12 2.05t3.887.787q1.813.788 3.151 2.126 1.337 1.337 2.125 3.15.787 1.812.787 3.887t-.787 3.887q-.788 1.813-2.125 3.151-1.338 1.337-3.151 2.125-1.812.787-3.887.787ZM12 12Zm0 7.8q3.225 0 5.513-2.275Q19.8 15.25 19.8 12q0-3.25-2.287-5.525Q15.225 4.2 12 4.2T6.488 6.475Q4.2 8.75 4.2 12q0 3.25 2.288 5.525Q8.775 19.8 12 19.8Z\"\n />\n </svg>\n </button>\n }\n\n <ng-template [cdkPortalOutlet]=\"_actionsPortal\"></ng-template>\n </div>\n }\n\n @case ('dial') {\n <mat-clock-dials\n [id]=\"timepicker.id\"\n [color]=\"color\"\n [isMeridiem]=\"isMeridiem\"\n [selected]=\"_getSelected()\"\n [minTime]=\"timepicker._getMinTime()\"\n [maxTime]=\"timepicker._getMaxTime()\"\n [minuteInterval]=\"minuteInterval\"\n [orientation]=\"orientation\"\n [touchUi]=\"timepicker.touchUi\"\n (_userSelection)=\"_handleUserSelection($event)\"\n ></mat-clock-dials>\n\n <div class=\"mat-timepicker-content-actions\">\n @if (showToggleModeButton) {\n <button\n class=\"mat-time-toggle-mode-button\"\n mat-icon-button\n (click)=\"onToggleMode('input')\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" width=\"24\" viewBox=\"0 0 24 24\">\n <path\n d=\"M4 19q-.825 0-1.412-.587Q2 17.825 2 17V7q0-.825.588-1.412Q3.175 5 4 5h16q.825 0 1.413.588Q22 6.175 22 7v10q0 .825-.587 1.413Q20.825 19 20 19Zm0-2h16V7H4v10Zm4-1h8v-2H8Zm-3-3h2v-2H5Zm3 0h2v-2H8Zm3 0h2v-2h-2Zm3 0h2v-2h-2Zm3 0h2v-2h-2ZM5 10h2V8H5Zm3 0h2V8H8Zm3 0h2V8h-2Zm3 0h2V8h-2Zm3 0h2V8h-2ZM4 17V7v10Z\"\n />\n </svg>\n </button>\n }\n\n <ng-template [cdkPortalOutlet]=\"_actionsPortal\"></ng-template>\n </div>\n }\n }\n\n <!-- Invisible close button for screen reader users. -->\n <button\n type=\"button\"\n class=\"mat-timepicker-close-button\"\n mat-raised-button\n [color]=\"color || 'primary'\"\n [class.cdk-visually-hidden]=\"!_closeButtonFocused\"\n (focus)=\"_closeButtonFocused = true\"\n (blur)=\"_closeButtonFocused = false\"\n (click)=\"timepicker.close()\"\n >\n {{ _closeButtonText }}\n </button>\n</div>\n", styles: [".mat-timepicker-content{display:block}.mat-timepicker-content-container{position:relative;display:flex;flex-direction:column;padding:1rem 1.5rem}.mat-timepicker-content-actions{display:flex;justify-content:space-between;margin-right:-1rem;margin-top:1.5rem}.mat-time-toggle-mode-button{width:3.25rem;height:3.25rem;margin-left:-.75rem;margin-bottom:-.25rem}button.mat-timepicker-close-button{position:absolute;top:100%;left:0;margin-top:.5rem}.ng-animating button.mat-timepicker-close-button{display:none}\n"] }]
120
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.MatTimepickerIntl }, { type: i2.MatTimeSelectionModel }, { type: i0.ChangeDetectorRef }], propDecorators: { _dials: [{
121
- type: ViewChild,
122
- args: [MatClockDials]
123
- }], _inputs: [{
124
- type: ViewChild,
125
- args: [MatTimeInputs]
126
- }] } });
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci1jb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi90aW1lcGlja2VyLWNvbnRlbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtdGltZXBpY2tlci9zcmMvbGliL3RpbWVwaWNrZXItY29udGVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCxZQUFZLEdBRWIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFFdkIsaUJBQWlCLEVBSWpCLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU03QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7QUFHOUMsMkRBQTJEO0FBQzNELE1BQU0seUJBQXlCLEdBQUcsVUFBVSxDQUMxQztJQUNFLFlBQW1CLFdBQXVCO1FBQXZCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO0lBQUcsQ0FBQztDQUMvQyxDQUNGLENBQUM7QUE4QkYsTUFBTSxPQUFPLG9CQUNYLFNBQVEseUJBQXlCO0lBbURqQyxZQUNFLFVBQXNCLEVBQ3RCLElBQXVCLEVBQ2YsWUFBeUMs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Q3pCLENBQUM7OEdBeElVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLGthQUtwQixhQUFhLDBFQUdiLGFBQWEsMkdDNUUxQixvN0dBdUZBLG9qQkQzQ0ksWUFBWSw4QkFDWixZQUFZLGlNQUNaLFVBQVUsMExBQ1YsYUFBYSw0REFDYixhQUFhLDRIQUNiLGVBQWUsMlRBY0w7WUFDVix1QkFBdUIsQ0FBQyxjQUFjO1lBQ3RDLHVCQUF1QixDQUFDLGdCQUFnQjtTQUN6Qzs7MkZBRVUsb0JBQW9CO2tCQTVCaEMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixVQUFVO3dCQUNWLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixlQUFlO3FCQUNoQixZQUdTLHNCQUFzQixtQkFDZix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CO3dCQUNKLEtBQUssRUFBRSx3QkFBd0I7d0JBQy9CLG1CQUFtQixFQUFFLGlCQUFpQjt3QkFDdEMseUJBQXlCLEVBQUUsK0JBQStCO3dCQUMxRCx3QkFBd0IsRUFBRSwrQkFBK0I7d0JBQ3pELHNDQUFzQyxFQUFFLG9CQUFvQjtxQkFDN0QsY0FDVzt3QkFDVix1QkFBdUIsQ0FBQyxjQUFjO3dCQUN0Qyx1QkFBdUIsQ0FBQyxnQkFBZ0I7cUJBQ3pDO21MQU95QixNQUFNO3NCQUEvQixTQUFTO3VCQUFDLGFBQWE7Z0JBR0UsT0FBTztzQkFBaEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5pbWF0aW9uRXZlbnQgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFBvcnRhbCxcbiAgUG9ydGFsTW9kdWxlLFxuICBUZW1wbGF0ZVBvcnRhbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBBMTF5TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgbWl4aW5Db2xvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBFeHRyYWN0VGltZVR5cGVGcm9tU2VsZWN0aW9uLFxuICBNYXRUaW1lU2VsZWN0aW9uTW9kZWwsXG59IGZyb20gJy4vdGltZS1zZWxlY3Rpb24tbW9kZWwnO1xuaW1wb3J0IHsgbWF0VGltZXBpY2tlckFuaW1hdGlvbnMgfSBmcm9tICcuL3RpbWVwaWNrZXItYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBNYXRUaW1lcGlja2VyQmFzZSwgVGltZXBpY2tlck1vZGUgfSBmcm9tICcuL3RpbWVwaWNrZXItYmFzZSc7XG5pbXBvcnQgeyBNYXRUaW1lcGlja2VySW50bCB9IGZyb20gJy4vdGltZXBpY2tlci1pbnRsJztcbmltcG9ydCB7IE1hdENsb2NrRGlhbHMgfSBmcm9tICcuL2Nsb2NrLWRpYWxzJztcbmltcG9ydCB7IE1hdFRpbWVJbnB1dHMgfSBmcm9tICcuL3RpbWUtaW5wdXRzJztcbmltcG9ydCB7IFRpbWVwaWNrZXJPcmllbnRhdGlvbiB9IGZyb20gJy4vb3JpZW50YXRpb24nO1xuXG4vLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdFRpbWVwaWNrZXJDb250ZW50LlxuY29uc3QgX01hdFRpbWVwaWNrZXJDb250ZW50QmFzZSA9IG1peGluQ29sb3IoXG4gIGNsYXNzIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XG4gIH0sXG4pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtdGltZXBpY2tlci1jb250ZW50JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBQb3J0YWxNb2R1bGUsXG4gICAgQTExeU1vZHVsZSxcbiAgICBNYXRUaW1lSW5wdXRzLFxuICAgIE1hdENsb2NrRGlhbHMsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZXBpY2tlci1jb250ZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90aW1lcGlja2VyLWNvbnRlbnQuc2NzcyddLFxuICBleHBvcnRBczogJ21hdFRpbWVwaWNrZXJDb250ZW50JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ21hdC10aW1lcGlja2VyLWNvbnRlbnQnLFxuICAgICdbQHRyYW5zZm9ybVBhbmVsXSc6ICdfYW5pbWF0aW9uU3RhdGUnLFxuICAgICcoQHRyYW5zZm9ybVBhbmVsLnN0YXJ0KSc6ICdfaGFuZGxlQW5pbWF0aW9uRXZlbnQoJGV2ZW50KScsXG4gICAgJyhAdHJhbnNmb3JtUGFuZWwuZG9uZSknOiAnX2hhbmRsZUFuaW1hdGlvbkV2ZW50KCRldmVudCknLFxuICAgICdbY2xhc3MubWF0LXRpbWVwaWNrZXItY29udGVudC10b3VjaF0nOiAndGltZXBpY2tlci50b3VjaFVpJyxcbiAgfSxcbiAgYW5pbWF0aW9uczogW1xuICAgIG1hdFRpbWVwaWNrZXJBbmltYXRpb25zLnRyYW5zZm9ybVBhbmVsLFxuICAgIG1hdFRpbWVwaWNrZXJBbmltYXRpb25zLmZhZGVJblRpbWVwaWNrZXIsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdFRpbWVwaWNrZXJDb250ZW50PFMsIFQgPSBFeHRyYWN0VGltZVR5cGVGcm9tU2VsZWN0aW9uPFM+PlxuICBleHRlbmRzIF9NYXRUaW1lcGlja2VyQ29udGVudEJhc2VcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXRcbntcbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgY2xvY2sgZGlhbHMgY29tcG9uZW50LiAqL1xuICBAVmlld0NoaWxkKE1hdENsb2NrRGlhbHMpIF9kaWFsczogTWF0Q2xvY2tEaWFsczxUPiB8IHVuZGVmaW5lZDtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCB0aW1lIGlucHV0cyBjb21wb25lbnQuICovXG4gIEBWaWV3Q2hpbGQoTWF0VGltZUlucHV0cykgX2lucHV0czogTWF0VGltZUlucHV0czxUPiB8IHVuZGVmaW5lZDtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSB0aW1lcGlja2VyIHRoYXQgY3JlYXRlZCB0aGUgb3ZlcmxheS4gKi9cbiAgdGltZXBpY2tlcjogTWF0VGltZXBpY2tlckJhc2U8YW55LCBTLCBUPjtcblxuICAvKiogRGlzcGxheSBtb2RlLiAqL1xuICBtb2RlOiBUaW1lcGlja2VyTW9kZTtcblxuICAvKiogQ3VycmVudCBzdGF0ZSBvZiB0aGUgYW5pbWF0aW9uLiAqL1xuICBfYW5pbWF0aW9uU3RhdGU6ICdlbnRlci1kcm9wZG93bicgfCAnZW50ZXItZGlhbG9nJyB8ICd2b2lkJztcblxuICAvKiogV2hldGhlciB0aGUgY2xvY2sgdXNlcyAxMiBob3VyIGZvcm1hdC4gKi9cbiAgaXNNZXJpZGllbTogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciBzaG91bGQgdG9nZ2xlIGZhY2UgYnV0dG9uIGJlIHNob3duLiAqL1xuICBzaG93VG9nZ2xlTW9kZUJ1dHRvbjogYm9vbGVhbjtcblxuICAvKiogU3RlcCBmb3IgbWludXRlcy4gKi9cbiAgbWludXRlSW50ZXJ2YWw6IG51bWJlcjtcblxuICAvKiogT3JpZW50YXRpb24gZm9yIGRpYWwgbW9kZS4gKi9cbiAgb3JpZW50YXRpb246IFRpbWVwaWNrZXJPcmllbnRhdGlvbjtcblxuICAvKiogUG9ydGFsIHdpdGggcHJvamVjdGVkIGFjdGlvbiBidXR0b25zLiAqL1xuICBfYWN0aW9uc1BvcnRhbDogVGVtcGxhdGVQb3J0YWwgfCBDb21wb25lbnRQb3J0YWw8YW55PiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBJZCBvZiB0aGUgbGFiZWwgZm9yIHRoZSBgcm9sZT1cImRpYWxvZ1wiYCBlbGVtZW50LiAqL1xuICBfZGlhbG9nTGFiZWxJZDogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogVGV4dCBmb3IgdGhlIGNsb3NlIGJ1dHRvbi4gKi9cbiAgX2Nsb3NlQnV0dG9uVGV4dDogc3RyaW5nO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjbG9zZSBidXR0b24gY3VycmVudGx5IGhhcyBmb2N1cy4gKi9cbiAgX2Nsb3NlQnV0dG9uRm9jdXNlZDogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciB0aGVyZSBpcyBhbiBpbi1wcm9ncmVzcyBhbmltYXRpb24uICovXG4gIF9pc0FuaW1hdGluZyA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0cyB3aGVuIGFuIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQuICovXG4gIHJlYWRvbmx5IF9hbmltYXRpb25Eb25lID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9tb2RlbDogTWF0VGltZVNlbGVjdGlvbk1vZGVsPFMsIFQ+O1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgaW50bDogTWF0VGltZXBpY2tlckludGwsXG4gICAgcHJpdmF0ZSBfZ2xvYmFsTW9kZWw6IE1hdFRpbWVTZWxlY3Rpb25Nb2RlbDxTLCBUPixcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYpO1xuICAgIHRoaXMuX2Nsb3NlQnV0dG9uVGV4dCA9IGludGwuY2xvc2VUaW1lcGlja2VyTGFiZWw7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9hbmltYXRpb25TdGF0ZSA9XG4gICAgICB0aGlzLnRpbWVwaWNrZXIub3BlbkFzID09PSAnZGlhbG9nJyA/ICdlbnRlci1kaWFsb2cnIDogJ2VudGVyLWRyb3Bkb3duJztcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGltZXBpY2tlci5zdGF0ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KSxcbiAgICApO1xuICAgICh0aGlzLl9kaWFscyB8fCB0aGlzLl9pbnB1dHMpPy5mb2N1c0FjdGl2ZUNlbGwoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9hbmltYXRpb25Eb25lLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKiogQ2hhbmdlcyBhbmltYXRpb24gc3RhdGUgd2hpbGUgY2xvc2luZyB0aW1lcGlja2VyIGNvbnRlbnQuICovXG4gIF9zdGFydEV4aXRBbmltYXRpb24oKSB7XG4gICAgdGhpcy5fYW5pbWF0aW9uU3RhdGUgPSAndm9pZCc7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBfaGFuZGxlQW5pbWF0aW9uRXZlbnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KSB7XG4gICAgdGhpcy5faXNBbmltYXRpbmcgPSBldmVudC5waGFzZU5hbWUgPT09ICdzdGFydCc7XG5cbiAgICBpZiAoIXRoaXMuX2lzQW5pbWF0aW5nKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25Eb25lLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBvblRvZ2dsZU1vZGUobW9kZTogVGltZXBpY2tlck1vZGUpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICB9XG5cbiAgX2dldFNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlbD8uc2VsZWN0aW9uIGFzIHVua25vd24gYXMgVCB8IG51bGw7XG4gIH1cblxuICAvKiogQXBwbGllcyB0aGUgY3VycmVudCBwZW5kaW5nIHNlbGVjdGlvbiB0byB0aGUgZ2xvYmFsIG1vZGVsLiAqL1xuICBfYXBwbHlQZW5kaW5nU2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9tb2RlbCAhPT0gdGhpcy5fZ2xvYmFsTW9kZWwpIHtcbiAgICAgIHRoaXMuX2dsb2JhbE1vZGVsLnVwZGF0ZVNlbGVjdGlvbih0aGlzLl9tb2RlbC5zZWxlY3Rpb24sIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25zIGEgbmV3IHBvcnRhbCBjb250YWluaW5nIHRoZSB0aW1lcGlja2VyIGFjdGlvbnMuXG4gICAqIEBwYXJhbSBwb3J0YWwgUG9ydGFsIHdpdGggdGhlIGFjdGlvbnMgdG8gYmUgYXNzaWduZWQuXG4gICAqIEBwYXJhbSBmb3JjZVJlcmVuZGVyIFdoZXRoZXIgYSByZS1yZW5kZXIgb2YgdGhlIHBvcnRhbCBzaG91bGQgYmUgdHJpZ2dlcmVkLiBUaGlzIGlzbid0XG4gICAqIG5lY2Vzc2FyeSBpZiB0aGUgcG9ydGFsIGlzIGFzc2lnbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbiwgYnV0IGl0IG1heSBiZSByZXF1aXJlZCBpZiBpdCdzXG4gICAqIGFkZGVkIGF0IGEgbGF0ZXIgcG9pbnQuXG4gICAqL1xuICBfYXNzaWduQWN0aW9ucyhcbiAgICBwb3J0YWw6IFRlbXBsYXRlUG9ydGFsPGFueT4gfCBDb21wb25lbnRQb3J0YWw8YW55PiB8IG51bGwsXG4gICAgZm9yY2VSZXJlbmRlcjogYm9vbGVhbixcbiAgKSB7XG4gICAgLy8gQXMgd2UgaGF2ZSBhY3Rpb25zLCBjbG9uZSB0aGUgbW9kZWwgc28gdGhhdCB3ZSBoYXZlIHRoZSBhYmlsaXR5IHRvIGNhbmNlbCB0aGUgc2VsZWN0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCB3ZSB3YW50IHRvIGFzc2lnbiB0aGlzIGFzIHNvb24gYXMgcG9zc2libGUsXG4gICAgLy8gYnV0IGBfYWN0aW9uc1BvcnRhbGAgaXNuJ3QgYXZhaWxhYmxlIGluIHRoZSBjb25zdHJ1Y3RvciBzbyB3ZSBkbyBpdCBpbiBgbmdPbkluaXRgLlxuICAgIHRoaXMuX21vZGVsID0gdGhpcy5fZ2xvYmFsTW9kZWwuY2xvbmUoKTtcblxuICAgIHRoaXMuX2FjdGlvbnNQb3J0YWwgPSBwb3J0YWw7XG5cbiAgICBpZiAoZm9yY2VSZXJlbmRlcikge1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVVc2VyU2VsZWN0aW9uKGV2ZW50OiBUKSB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudDtcbiAgICB0aGlzLl9tb2RlbC5hZGQodmFsdWUpO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNka1RyYXBGb2N1c1xuICByb2xlPVwiZGlhbG9nXCJcbiAgY2xhc3M9XCJtYXQtdGltZXBpY2tlci1jb250ZW50LWNvbnRhaW5lclwiXG4gIFthdHRyLmFyaWEtbW9kYWxdPVwidHJ1ZVwiXG4gIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJfZGlhbG9nTGFiZWxJZCA/PyB1bmRlZmluZWRcIlxuPlxuICBAc3dpdGNoIChtb2RlKSB7XG4gICAgQGNhc2UgKCdpbnB1dCcpIHtcbiAgICAgIDxtYXQtdGltZS1pbnB1dHNcbiAgICAgICAgW2lkXT1cInRpbWVwaWNrZXIuaWRcIlxuICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgICBbaXNNZXJpZGllbV09XCJpc01lcmlkaWVtXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cIl9nZXRTZWxlY3RlZCgpXCJcbiAgICAgICAgW21pblRpbWVdPVwidGltZXBpY2tlci5fZ2V0TWluVGltZSgpXCJcbiAgICAgICAgW21heFRpbWVdPVwidGltZXBpY2tlci5fZ2V0TWF4VGltZSgpXCJcbiAgICAgICAgW21pbnV0ZUludGVydmFsXT1cIm1pbnV0ZUludGVydmFsXCJcbiAgICAgICAgKF91c2VyU2VsZWN0aW9uKT1cIl9oYW5kbGVVc2VyU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgPjwvbWF0LXRpbWUtaW5wdXRzPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LXRpbWVwaWNrZXItY29udGVudC1hY3Rpb25zXCI+XG4gICAgICAgIEBpZiAoc2hvd1RvZ2dsZU1vZGVCdXR0b24pIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm1hdC10aW1lLXRvZ2dsZS1tb2RlLWJ1dHRvblwiXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZ2dsZU1vZGUoJ2RpYWwnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRcIiB3aWR0aD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJtMTUuMTc1IDE2LjYyNSAxLjQ3NS0xLjQ1LTMuNi0zLjZWNy4xaC0yLjA3NXY1LjNaTTEyIDIxLjk1cS0yLjA3NSAwLTMuODg3LS43ODctMS44MTMtLjc4OC0zLjE1LTIuMTI1LTEuMzM4LTEuMzM4LTIuMTI1LTMuMTUxUTIuMDUgMTQuMDc1IDIuMDUgMTJ0Ljc4OC0zLjg4N3EuNzg3LTEuODEzIDIuMTI1LTMuMTVRNi4zIDMuNjI1IDguMTEzIDIuODM3IDkuOTI1IDIuMDUgMTIgMi4wNXQzLjg4Ny43ODdxMS44MTMuNzg4IDMuMTUxIDIuMTI2IDEuMzM3IDEuMzM3IDIuMTI1IDMuMTUuNzg3IDEuODEyLjc4NyAzLjg4N3QtLjc4NyAzLjg4N3EtLjc4OCAxLjgxMy0yLjEyNSAzLjE1MS0xLjMzOCAxLjMzNy0zLjE1MSAyLjEyNS0xLjgxMi43ODctMy44ODcuNzg3Wk0xMiAxMlptMCA3LjhxMy4yMjUgMCA1LjUxMy0yLjI3NVExOS44IDE1LjI1IDE5LjggMTJxMC0zLjI1LTIuMjg3LTUuNTI1UTE1LjIyNSA0LjIgMTIgNC4yVDYuNDg4IDYuNDc1UTQuMiA4Ljc1IDQuMiAxMnEwIDMuMjUgMi4yODggNS41MjVROC43NzUgMTkuOCAxMiAxOS44WlwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbY2RrUG9ydGFsT3V0bGV0XT1cIl9hY3Rpb25zUG9ydGFsXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBjYXNlICgnZGlhbCcpIHtcbiAgICAgIDxtYXQtY2xvY2stZGlhbHNcbiAgICAgICAgW2lkXT1cInRpbWVwaWNrZXIuaWRcIlxuICAgICAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgICAgICBbaXNNZXJpZGllbV09XCJpc01lcmlkaWVtXCJcbiAgICAgICAgW3NlbGVjdGVkXT1cIl9nZXRTZWxlY3RlZCgpXCJcbiAgICAgICAgW21pblRpbWVdPVwidGltZXBpY2tlci5fZ2V0TWluVGltZSgpXCJcbiAgICAgICAgW21heFRpbWVdPVwidGltZXBpY2tlci5fZ2V0TWF4VGltZSgpXCJcbiAgICAgICAgW21pbnV0ZUludGVydmFsXT1cIm1pbnV0ZUludGVydmFsXCJcbiAgICAgICAgW29yaWVudGF0aW9uXT1cIm9yaWVudGF0aW9uXCJcbiAgICAgICAgW3RvdWNoVWldPVwidGltZXBpY2tlci50b3VjaFVpXCJcbiAgICAgICAgKF91c2VyU2VsZWN0aW9uKT1cIl9oYW5kbGVVc2VyU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgPjwvbWF0LWNsb2NrLWRpYWxzPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LXRpbWVwaWNrZXItY29udGVudC1hY3Rpb25zXCI+XG4gICAgICAgIEBpZiAoc2hvd1RvZ2dsZU1vZGVCdXR0b24pIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm1hdC10aW1lLXRvZ2dsZS1tb2RlLWJ1dHRvblwiXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZ2dsZU1vZGUoJ2lucHV0JylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0XCIgd2lkdGg9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTQgMTlxLS44MjUgMC0xLjQxMi0uNTg3UTIgMTcuODI1IDIgMTdWN3EwLS44MjUuNTg4LTEuNDEyUTMuMTc1IDUgNCA1aDE2cS44MjUgMCAxLjQxMy41ODhRMjIgNi4xNzUgMjIgN3YxMHEwIC44MjUtLjU4NyAxLjQxM1EyMC44MjUgMTkgMjAgMTlabTAtMmgxNlY3SDR2MTBabTQtMWg4di0ySDhabS0zLTNoMnYtMkg1Wm0zIDBoMnYtMkg4Wm0zIDBoMnYtMmgtMlptMyAwaDJ2LTJoLTJabTMgMGgydi0yaC0yWk01IDEwaDJWOEg1Wm0zIDBoMlY4SDhabTMgMGgyVjhoLTJabTMgMGgyVjhoLTJabTMgMGgyVjhoLTJaTTQgMTdWN3YxMFpcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctdGVtcGxhdGUgW2Nka1BvcnRhbE91dGxldF09XCJfYWN0aW9uc1BvcnRhbFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cblxuICA8IS0tIEludmlzaWJsZSBjbG9zZSBidXR0b24gZm9yIHNjcmVlbiByZWFkZXIgdXNlcnMuIC0tPlxuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJtYXQtdGltZXBpY2tlci1jbG9zZS1idXR0b25cIlxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgW2NvbG9yXT1cImNvbG9yIHx8ICdwcmltYXJ5J1wiXG4gICAgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIV9jbG9zZUJ1dHRvbkZvY3VzZWRcIlxuICAgIChmb2N1cyk9XCJfY2xvc2VCdXR0b25Gb2N1c2VkID0gdHJ1ZVwiXG4gICAgKGJsdXIpPVwiX2Nsb3NlQnV0dG9uRm9jdXNlZCA9IGZhbHNlXCJcbiAgICAoY2xpY2spPVwidGltZXBpY2tlci5jbG9zZSgpXCJcbiAgPlxuICAgIHt7IF9jbG9zZUJ1dHRvblRleHQgfX1cbiAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
@@ -1,254 +0,0 @@
1
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
- import { Directive, EventEmitter, Input, Optional, Output, } from '@angular/core';
3
- import { Subject, Subscription } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "./adapter";
6
- /**
7
- * An event used for timepicker input and change events. We don't always have access to a native
8
- * input or change event because the event may have been triggered by the user clicking on the
9
- * clock popup. For consistency, we always use MatTimepickerInputEvent instead.
10
- */
11
- export class MatTimepickerInputEvent {
12
- constructor(
13
- /** Reference to the timepicker input component that emitted the event. */
14
- target,
15
- /** Reference to the native input element associated with the timepicker input. */
16
- targetElement) {
17
- this.target = target;
18
- this.targetElement = targetElement;
19
- this.value = this.target.value;
20
- }
21
- }
22
- const TIME_FORMATS = { hour: '2-digit', minute: '2-digit' };
23
- export class MatTimepickerInputBase {
24
- /** The value of the input. */
25
- get value() {
26
- return this._model
27
- ? this._getValueFromModel(this._model.selection)
28
- : this._pendingValue;
29
- }
30
- set value(value) {
31
- this._assignValueProgrammatically(value);
32
- }
33
- /** Whether the timepicker-input is disabled. */
34
- get disabled() {
35
- return !!this._disabled;
36
- }
37
- set disabled(value) {
38
- const newValue = coerceBooleanProperty(value);
39
- const element = this._elementRef.nativeElement;
40
- if (this._disabled !== newValue) {
41
- this._disabled = newValue;
42
- this.stateChanges.next(undefined);
43
- }
44
- // We need to null check the `blur` method, because it's undefined during SSR.
45
- // In Ivy static bindings are invoked earlier, before the element is attached to the DOM.
46
- // This can cause an error to be thrown in some browsers (IE/Edge) which assert that the
47
- // element has been inserted.
48
- if (newValue && this._isInitialized && element.blur) {
49
- // Normally, native input elements automatically blur if they turn disabled. This behavior
50
- // is problematic, because it would mean that it triggers another change detection cycle,
51
- // which then causes a changed after checked error if the input element was focused before.
52
- element.blur();
53
- }
54
- }
55
- constructor(_elementRef, _timeAdapter) {
56
- this._elementRef = _elementRef;
57
- this._timeAdapter = _timeAdapter;
58
- /** Emits when a change event is fired on this <input>. */
59
- this.timeChange = new EventEmitter();
60
- /** Emits when an input event is fired on this <input>. */
61
- this.timeInput = new EventEmitter();
62
- /** Emits when the internal state has changed */
63
- this.stateChanges = new Subject();
64
- this._onTouched = () => { };
65
- this._validatorOnChange = () => { };
66
- this._cvaOnChange = () => { };
67
- this._valueChangesSubscription = Subscription.EMPTY;
68
- /** Whether the last value set on the input was valid. */
69
- this._lastValueValid = false;
70
- /** The form control validator for whether the input parses. */
71
- this._parseValidator = () => {
72
- return this._lastValueValid
73
- ? null
74
- : { matTimepickerParse: { text: this._elementRef.nativeElement.value } };
75
- };
76
- /** The form control validator for the min time. */
77
- this._minValidator = (control) => {
78
- const controlValue = this._timeAdapter.getValidTimeOrNull(this._timeAdapter.deserialize(control.value));
79
- const min = this._getMinTime();
80
- return !min ||
81
- !controlValue ||
82
- this._timeAdapter.compareTime(min, controlValue) <= 0
83
- ? null
84
- : { matTimepickerMin: { min, actual: controlValue } };
85
- };
86
- /** The form control validator for the max time. */
87
- this._maxValidator = (control) => {
88
- const controlValue = this._timeAdapter.getValidTimeOrNull(this._timeAdapter.deserialize(control.value));
89
- const max = this._getMaxTime();
90
- return !max ||
91
- !controlValue ||
92
- this._timeAdapter.compareTime(max, controlValue) >= 0
93
- ? null
94
- : { matTimepickerMax: { max, actual: controlValue } };
95
- };
96
- }
97
- ngOnChanges(changes) {
98
- if (timeInputsHaveChanged(changes, this._timeAdapter)) {
99
- this.stateChanges.next(undefined);
100
- }
101
- }
102
- ngOnDestroy() {
103
- this._valueChangesSubscription.unsubscribe();
104
- this.stateChanges.complete();
105
- }
106
- /** Registers a time selection model with the input. */
107
- _registerModel(model) {
108
- this._model = model;
109
- this._valueChangesSubscription.unsubscribe();
110
- if (this._pendingValue) {
111
- this._assignValue(this._pendingValue);
112
- }
113
- this._valueChangesSubscription = this._model.selectionChanged.subscribe((event) => {
114
- if (this._shouldHandleChangeEvent(event)) {
115
- const value = this._getValueFromModel(event.selection);
116
- this._lastValueValid = this._isValidValue(value);
117
- this._cvaOnChange(value);
118
- this._onTouched();
119
- this._formatValue(value);
120
- this.timeInput.emit(new MatTimepickerInputEvent(this, this._elementRef.nativeElement));
121
- this.timeChange.emit(new MatTimepickerInputEvent(this, this._elementRef.nativeElement));
122
- }
123
- });
124
- }
125
- _onInput(value) {
126
- const lastValueWasValid = this._lastValueValid;
127
- let time = this._timeAdapter.parse(value, TIME_FORMATS);
128
- this._lastValueValid = this._isValidValue(time);
129
- time = this._timeAdapter.getValidTimeOrNull(time);
130
- const hasChanged = !this._timeAdapter.sameTime(time, this.value);
131
- // We need to fire the CVA change event for all
132
- // nulls, otherwise the validators won't run.
133
- if (!time || hasChanged) {
134
- this._cvaOnChange(time);
135
- }
136
- else {
137
- // Call the CVA change handler for invalid values
138
- // since this is what marks the control as dirty.
139
- if (value && !this.value) {
140
- this._cvaOnChange(time);
141
- }
142
- if (lastValueWasValid !== this._lastValueValid) {
143
- this._validatorOnChange();
144
- }
145
- }
146
- if (hasChanged) {
147
- this._assignValue(time);
148
- this.timeInput.emit(new MatTimepickerInputEvent(this, this._elementRef.nativeElement));
149
- }
150
- }
151
- /** Handles change event on the input. */
152
- _onChange() {
153
- this.timeChange.emit(new MatTimepickerInputEvent(this, this._elementRef.nativeElement));
154
- }
155
- /** Handles blur event on the input. */
156
- _onBlur() {
157
- // Reformat the input only if we have a valid value.
158
- if (this.value) {
159
- this._formatValue(this.value);
160
- }
161
- this._onTouched();
162
- }
163
- /** Implemented as part of ControlValueAccessor. */
164
- writeValue(value) {
165
- this.value = value;
166
- }
167
- /** Implemented as part of ControlValueAccessor. */
168
- registerOnChange(fn) {
169
- this._cvaOnChange = fn;
170
- }
171
- /** Implemented as part of ControlValueAccessor. */
172
- registerOnTouched(fn) {
173
- this._onTouched = fn;
174
- }
175
- /** Implemented as part of ControlValueAccessor. */
176
- setDisabledState(isDisabled) {
177
- this.disabled = isDisabled;
178
- }
179
- registerOnValidatorChange(fn) {
180
- this._validatorOnChange = fn;
181
- }
182
- validate(c) {
183
- return this._validator ? this._validator(c) : null;
184
- }
185
- /** Programmatically assigns a value to the input. */
186
- _assignValueProgrammatically(value) {
187
- value = this._timeAdapter.deserialize(value);
188
- this._lastValueValid = this._isValidValue(value);
189
- value = this._timeAdapter.getValidTimeOrNull(value);
190
- this._assignValue(value);
191
- this._formatValue(value);
192
- }
193
- /** Formats a value and sets it on the input element. */
194
- _formatValue(value) {
195
- this._elementRef.nativeElement.value =
196
- value != null ? this._timeAdapter.format(value, TIME_FORMATS) : '';
197
- }
198
- /** Gets the base validator functions. */
199
- _getValidators() {
200
- return [this._parseValidator, this._minValidator, this._maxValidator];
201
- }
202
- /** Whether a value is considered valid. */
203
- _isValidValue(value) {
204
- return !value || this._timeAdapter.isValid(value);
205
- }
206
- /** Assigns a value to the model. */
207
- _assignValue(value) {
208
- // We may get some incoming values before the model was
209
- // assigned. Save the value so that we can assign it later.
210
- if (this._model) {
211
- this._assignValueToModel(value);
212
- this._pendingValue = null;
213
- }
214
- else {
215
- this._pendingValue = value;
216
- }
217
- }
218
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimepickerInputBase, deps: [{ token: i0.ElementRef }, { token: i1.TimeAdapter, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
219
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: MatTimepickerInputBase, inputs: { value: "value", disabled: "disabled" }, outputs: { timeChange: "timeChange", timeInput: "timeInput" }, usesOnChanges: true, ngImport: i0 }); }
220
- }
221
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimepickerInputBase, decorators: [{
222
- type: Directive
223
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.TimeAdapter, decorators: [{
224
- type: Optional
225
- }] }], propDecorators: { value: [{
226
- type: Input
227
- }], disabled: [{
228
- type: Input
229
- }], timeChange: [{
230
- type: Output
231
- }], timeInput: [{
232
- type: Output
233
- }] } });
234
- /**
235
- * Checks whether the `SimpleChanges` object from an `ngOnChanges`
236
- * callback has any changes, accounting for time objects.
237
- */
238
- export function timeInputsHaveChanged(changes, adapter) {
239
- const keys = Object.keys(changes);
240
- for (const key of keys) {
241
- const { previousValue, currentValue } = changes[key];
242
- if (adapter.isTimeInstance(previousValue) &&
243
- adapter.isTimeInstance(currentValue)) {
244
- if (!adapter.sameTime(previousValue, currentValue)) {
245
- return true;
246
- }
247
- }
248
- else {
249
- return true;
250
- }
251
- }
252
- return false;
253
- }
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci1pbnB1dC1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi90aW1lcGlja2VyLWlucHV0LWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBUXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFTN0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFJbEM7SUFDRSwwRUFBMEU7SUFDbkUsTUFBb0M7SUFDM0Msa0ZBQWtGO0lBQzNFLGFBQTBCO1FBRjFCLFdBQU0sR0FBTixNQUFNLENBQThCO1FBRXBDLGtCQUFhLEdBQWIsYUFBYSxDQUFhO1FBRWpDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBRUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUc1RCxNQUFNLE9BQWdCLHNCQUFzQjtJQU0xQyw4QkFBOEI7SUFDOUIsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTTtZQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFVO1FBQ2xCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMz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RyxDQUFDLENBQUM7UUFFckQsSUFDRSxPQUFPLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztZQUNyQyxPQUFPLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUNwQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxuICBWYWxpZGF0b3JGbixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJztcbmltcG9ydCB7XG4gIEV4dHJhY3RUaW1lVHlwZUZyb21TZWxlY3Rpb24sXG4gIE1hdFRpbWVTZWxlY3Rpb25Nb2RlbCxcbiAgVGltZVNlbGVjdGlvbk1vZGVsQ2hhbmdlLFxufSBmcm9tICcuL3RpbWUtc2VsZWN0aW9uLW1vZGVsJztcblxuLyoqXG4gKiBBbiBldmVudCB1c2VkIGZvciB0aW1lcGlja2VyIGlucHV0IGFuZCBjaGFuZ2UgZXZlbnRzLiBXZSBkb24ndCBhbHdheXMgaGF2ZSBhY2Nlc3MgdG8gYSBuYXRpdmVcbiAqIGlucHV0IG9yIGNoYW5nZSBldmVudCBiZWNhdXNlIHRoZSBldmVudCBtYXkgaGF2ZSBiZWVuIHRyaWdnZXJlZCBieSB0aGUgdXNlciBjbGlja2luZyBvbiB0aGVcbiAqIGNsb2NrIHBvcHVwLiBGb3IgY29uc2lzdGVuY3ksIHdlIGFsd2F5cyB1c2UgTWF0VGltZXBpY2tlcklucHV0RXZlbnQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hdFRpbWVwaWNrZXJJbnB1dEV2ZW50PEQsIFMgPSB1bmtub3duPiB7XG4gIC8qKiBUaGUgbmV3IHZhbHVlIGZvciB0aGUgdGFyZ2V0IHRpbWVwaWNrZXIgaW5wdXQuICovXG4gIHZhbHVlOiBEIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogUmVmZXJlbmNlIHRvIHRoZSB0aW1lcGlja2VyIGlucHV0IGNvbXBvbmVudCB0aGF0IGVtaXR0ZWQgdGhlIGV2ZW50LiAqL1xuICAgIHB1YmxpYyB0YXJnZXQ6IE1hdFRpbWVwaWNrZXJJbnB1dEJhc2U8UywgRD4sXG4gICAgLyoqIFJlZmVyZW5jZSB0byB0aGUgbmF0aXZlIGlucHV0IGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aW1lcGlja2VyIGlucHV0LiAqL1xuICAgIHB1YmxpYyB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgKSB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMudGFyZ2V0LnZhbHVlO1xuICB9XG59XG5cbmNvbnN0IFRJTUVfRk9STUFUUyA9IHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9O1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNYXRUaW1lcGlja2VySW5wdXRCYXNlPFxuICAgIFMsXG4gICAgVCA9IEV4dHJhY3RUaW1lVHlwZUZyb21TZWxlY3Rpb248Uz4sXG4gID5cbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvclxue1xuICAvKiogVGhlIHZhbHVlIG9mIHRoZSBpbnB1dC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWxcbiAgICAgID8gdGhpcy5fZ2V0VmFsdWVGcm9tTW9kZWwodGhpcy5fbW9kZWwuc2VsZWN0aW9uKVxuICAgICAgOiB0aGlzLl9wZW5kaW5nVmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl9hc3NpZ25WYWx1ZVByb2dyYW1tYXRpY2FsbHkodmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBfbW9kZWw6IE1hdFRpbWVTZWxlY3Rpb25Nb2RlbDxTLCBUPiB8IHVuZGVmaW5lZDtcblxuICAvKiogV2hldGhlciB0aGUgdGltZXBpY2tlci1pbnB1dCBpcyBkaXNhYmxlZC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAodGhpcy5fZGlzYWJsZWQgIT09IG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IG5ld1ZhbHVlO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCh1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gbnVsbCBjaGVjayB0aGUgYGJsdXJgIG1ldGhvZCwgYmVjYXVzZSBpdCdzIHVuZGVmaW5lZCBkdXJpbmcgU1NSLlxuICAgIC8vIEluIEl2eSBzdGF0aWMgYmluZGluZ3MgYXJlIGludm9rZWQgZWFybGllciwgYmVmb3JlIHRoZSBlbGVtZW50IGlzIGF0dGFjaGVkIHRvIHRoZSBET00uXG4gICAgLy8gVGhpcyBjYW4gY2F1c2UgYW4gZXJyb3IgdG8gYmUgdGhyb3duIGluIHNvbWUgYnJvd3NlcnMgKElFL0VkZ2UpIHdoaWNoIGFzc2VydCB0aGF0IHRoZVxuICAgIC8vIGVsZW1lbnQgaGFzIGJlZW4gaW5zZXJ0ZWQuXG4gICAgaWYgKG5ld1ZhbHVlICYmIHRoaXMuX2lzSW5pdGlhbGl6ZWQgJiYgZWxlbWVudC5ibHVyKSB7XG4gICAgICAvLyBOb3JtYWxseSwgbmF0aXZlIGlucHV0IGVsZW1lbnRzIGF1dG9tYXRpY2FsbHkgYmx1ciBpZiB0aGV5IHR1cm4gZGlzYWJsZWQuIFRoaXMgYmVoYXZpb3JcbiAgICAgIC8vIGlzIHByb2JsZW1hdGljLCBiZWNhdXNlIGl0IHdvdWxkIG1lYW4gdGhhdCBpdCB0cmlnZ2VycyBhbm90aGVyIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUsXG4gICAgICAvLyB3aGljaCB0aGVuIGNhdXNlcyBhIGNoYW5nZWQgYWZ0ZXIgY2hlY2tlZCBlcnJvciBpZiB0aGUgaW5wdXQgZWxlbWVudCB3YXMgZm9jdXNlZCBiZWZvcmUuXG4gICAgICBlbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqIEVtaXRzIHdoZW4gYSBjaGFuZ2UgZXZlbnQgaXMgZmlyZWQgb24gdGhpcyA8aW5wdXQ+LiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdGltZUNoYW5nZTogRXZlbnRFbWl0dGVyPE1hdFRpbWVwaWNrZXJJbnB1dEV2ZW50PFQsIFM+PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxNYXRUaW1lcGlja2VySW5wdXRFdmVudDxULCBTPj4oKTtcblxuICAvKiogRW1pdHMgd2hlbiBhbiBpbnB1dCBldmVudCBpcyBmaXJlZCBvbiB0aGlzIDxpbnB1dD4uICovXG4gIEBPdXRwdXQoKSByZWFkb25seSB0aW1lSW5wdXQ6IEV2ZW50RW1pdHRlcjxNYXRUaW1lcGlja2VySW5wdXRFdmVudDxULCBTPj4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8TWF0VGltZXBpY2tlcklucHV0RXZlbnQ8VCwgUz4+KCk7XG5cbiAgLyoqIEdldHMgdGhlIG1pbmltdW0gdGltZSBmb3IgdGhlIGlucHV0LiBVc2VkIGZvciB2YWxpZGF0aW9uLiAqL1xuICBhYnN0cmFjdCBfZ2V0TWluVGltZSgpOiBUIHwgbnVsbDtcblxuICAvKiogR2V0cyB0aGUgbWF4aW11bSB0aW1lIGZvciB0aGUgaW5wdXQuIFVzZWQgZm9yIHZhbGlkYXRpb24uICovXG4gIGFic3RyYWN0IF9nZXRNYXhUaW1lKCk6IFQgfCBudWxsO1xuXG4gIC8qKiBDb21iaW5lZCBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGlzIGlucHV0LiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX3ZhbGlkYXRvcjogVmFsaWRhdG9yRm4gfCBudWxsO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuICovXG4gIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNpbmNlIHRoZSB2YWx1ZSBpcyBrZXB0IG9uIHRoZSBtb2RlbCB3aGljaCBpcyBhc3NpZ25lZCBpbiBhbiBJbnB1dCxcbiAgICogd2UgbWlnaHQgZ2V0IGEgdmFsdWUgYmVmb3JlIHdlIGhhdmUgYSBtb2RlbC4gVGhpcyBwcm9wZXJ0eSBrZWVwcyB0cmFja1xuICAgKiBvZiB0aGUgdmFsdWUgdW50aWwgd2UgaGF2ZSBzb21ld2hlcmUgdG8gYXNzaWduIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ1ZhbHVlOiBUIHwgbnVsbDtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgaW50ZXJuYWwgc3RhdGUgaGFzIGNoYW5nZWQgKi9cbiAgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBfb25Ub3VjaGVkID0gKCkgPT4ge307XG4gIF92YWxpZGF0b3JPbkNoYW5nZSA9ICgpID0+IHt9O1xuXG4gIHByaXZhdGUgX2N2YU9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIF92YWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBfdGltZUFkYXB0ZXI6IFRpbWVBZGFwdGVyPFQ+LFxuICApIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aW1lSW5wdXRzSGF2ZUNoYW5nZWQoY2hhbmdlcywgdGhpcy5fdGltZUFkYXB0ZXIpKSB7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlcnMgYSB0aW1lIHNlbGVjdGlvbiBtb2RlbCB3aXRoIHRoZSBpbnB1dC4gKi9cbiAgX3JlZ2lzdGVyTW9kZWwobW9kZWw6IE1hdFRpbWVTZWxlY3Rpb25Nb2RlbDxTLCBUPik6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5fdmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAodGhpcy5fcGVuZGluZ1ZhbHVlKSB7XG4gICAgICB0aGlzLl9hc3NpZ25WYWx1ZSh0aGlzLl9wZW5kaW5nVmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuX21vZGVsLnNlbGVjdGlvbkNoYW5nZWQuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudChldmVudCkpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2dldFZhbHVlRnJvbU1vZGVsKGV2ZW50LnNlbGVjdGlvbik7XG4gICAgICAgICAgdGhpcy5fbGFzdFZhbHVlVmFsaWQgPSB0aGlzLl9pc1ZhbGlkVmFsdWUodmFsdWUpO1xuICAgICAgICAgIHRoaXMuX2N2YU9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgICB0aGlzLl9mb3JtYXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgdGhpcy50aW1lSW5wdXQuZW1pdChcbiAgICAgICAgICAgIG5ldyBNYXRUaW1lcGlja2VySW5wdXRFdmVudCh0aGlzLCB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy50aW1lQ2hhbmdlLmVtaXQoXG4gICAgICAgICAgICBuZXcgTWF0VGltZXBpY2tlcklucHV0RXZlbnQodGhpcywgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBfb25JbnB1dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbGFzdFZhbHVlV2FzVmFsaWQgPSB0aGlzLl9sYXN0VmFsdWVWYWxpZDtcbiAgICBsZXQgdGltZSA9IHRoaXMuX3RpbWVBZGFwdGVyLnBhcnNlKHZhbHVlLCBUSU1FX0ZPUk1BVFMpO1xuICAgIHRoaXMuX2xhc3RWYWx1ZVZhbGlkID0gdGhpcy5faXNWYWxpZFZhbHVlKHRpbWUpO1xuICAgIHRpbWUgPSB0aGlzLl90aW1lQWRhcHRlci5nZXRWYWxpZFRpbWVPck51bGwodGltZSk7XG4gICAgY29uc3QgaGFzQ2hhbmdlZCA9ICF0aGlzLl90aW1lQWRhcHRlci5zYW1lVGltZSh0aW1lLCB0aGlzLnZhbHVlKTtcblxuICAgIC8vIFdlIG5lZWQgdG8gZmlyZSB0aGUgQ1ZBIGNoYW5nZSBldmVudCBmb3IgYWxsXG4gICAgLy8gbnVsbHMsIG90aGVyd2lzZSB0aGUgdmFsaWRhdG9ycyB3b24ndCBydW4uXG4gICAgaWYgKCF0aW1lIHx8IGhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2N2YU9uQ2hhbmdlKHRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYWxsIHRoZSBDVkEgY2hhbmdlIGhhbmRsZXIgZm9yIGludmFsaWQgdmFsdWVzXG4gICAgICAvLyBzaW5jZSB0aGlzIGlzIHdoYXQgbWFya3MgdGhlIGNvbnRyb2wgYXMgZGlydHkuXG4gICAgICBpZiAodmFsdWUgJiYgIXRoaXMudmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY3ZhT25DaGFuZ2UodGltZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0VmFsdWVXYXNWYWxpZCAhPT0gdGhpcy5fbGFzdFZhbHVlVmFsaWQpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5fYXNzaWduVmFsdWUodGltZSk7XG4gICAgICB0aGlzLnRpbWVJbnB1dC5lbWl0KFxuICAgICAgICBuZXcgTWF0VGltZXBpY2tlcklucHV0RXZlbnQodGhpcywgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEhhbmRsZXMgY2hhbmdlIGV2ZW50IG9uIHRoZSBpbnB1dC4gKi9cbiAgX29uQ2hhbmdlKCkge1xuICAgIHRoaXMudGltZUNoYW5nZS5lbWl0KFxuICAgICAgbmV3IE1hdFRpbWVwaWNrZXJJbnB1dEV2ZW50KHRoaXMsIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGJsdXIgZXZlbnQgb24gdGhlIGlucHV0LiAqL1xuICBfb25CbHVyKCkge1xuICAgIC8vIFJlZm9ybWF0IHRoZSBpbnB1dCBvbmx5IGlmIHdlIGhhdmUgYSB2YWxpZCB2YWx1ZS5cbiAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5fZm9ybWF0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gIH1cblxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9jdmFPbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICAqL1xuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHZhbGlkYXRlKGM6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yID8gdGhpcy5fdmFsaWRhdG9yKGMpIDogbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBsYXN0IHZhbHVlIHNldCBvbiB0aGUgaW5wdXQgd2FzIHZhbGlkLiAqL1xuICBwcm90ZWN0ZWQgX2xhc3RWYWx1ZVZhbGlkID0gZmFsc2U7XG5cbiAgLyoqIEFzc2lnbnMgYSB2YWx1ZSB0byB0aGUgaW5wdXQncyBtb2RlbC4gKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9hc3NpZ25WYWx1ZVRvTW9kZWwobW9kZWw6IFQgfCBudWxsKTogdm9pZDtcblxuICAvKiogQ29udmVydHMgYSB2YWx1ZSBmcm9tIHRoZSBtb2RlbCBpbnRvIGEgbmF0aXZlIHZhbHVlIGZvciB0aGUgaW5wdXQuICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBfZ2V0VmFsdWVGcm9tTW9kZWwobW9kZWxWYWx1ZTogUyk6IFQgfCBudWxsO1xuXG4gIC8qKiBQcmVkaWNhdGUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGlucHV0IHNob3VsZCBoYW5kbGUgYSBwYXJ0aWN1bGFyIGNoYW5nZSBldmVudC4gKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IF9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudChcbiAgICBldmVudDogVGltZVNlbGVjdGlvbk1vZGVsQ2hhbmdlPFM+LFxuICApOiBib29sZWFuO1xuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGFzc2lnbnMgYSB2YWx1ZSB0byB0aGUgaW5wdXQuICovXG4gIHByb3RlY3RlZCBfYXNzaWduVmFsdWVQcm9ncmFtbWF0aWNhbGx5KHZhbHVlOiBUIHwgbnVsbCkge1xuICAgIHZhbHVlID0gdGhpcy5fdGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgIHRoaXMuX2xhc3RWYWx1ZVZhbGlkID0gdGhpcy5faXNWYWxpZFZhbHVlKHZhbHVlKTtcbiAgICB2YWx1ZSA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldFZhbGlkVGltZU9yTnVsbCh2YWx1ZSk7XG4gICAgdGhpcy5fYXNzaWduVmFsdWUodmFsdWUpO1xuICAgIHRoaXMuX2Zvcm1hdFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBGb3JtYXRzIGEgdmFsdWUgYW5kIHNldHMgaXQgb24gdGhlIGlucHV0IGVsZW1lbnQuICovXG4gIHByb3RlY3RlZCBfZm9ybWF0VmFsdWUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID1cbiAgICAgIHZhbHVlICE9IG51bGwgPyB0aGlzLl90aW1lQWRhcHRlci5mb3JtYXQodmFsdWUsIFRJTUVfRk9STUFUUykgOiAnJztcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBiYXNlIHZhbGlkYXRvciBmdW5jdGlvbnMuICovXG4gIHByb3RlY3RlZCBfZ2V0VmFsaWRhdG9ycygpOiBWYWxpZGF0b3JGbltdIHtcbiAgICByZXR1cm4gW3RoaXMuX3BhcnNlVmFsaWRhdG9yLCB0aGlzLl9taW5WYWxpZGF0b3IsIHRoaXMuX21heFZhbGlkYXRvcl07XG4gIH1cblxuICAvKiogV2hldGhlciBhIHZhbHVlIGlzIGNvbnNpZGVyZWQgdmFsaWQuICovXG4gIHByaXZhdGUgX2lzVmFsaWRWYWx1ZSh2YWx1ZTogVCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXZhbHVlIHx8IHRoaXMuX3RpbWVBZGFwdGVyLmlzVmFsaWQodmFsdWUpO1xuICB9XG5cbiAgLyoqIEFzc2lnbnMgYSB2YWx1ZSB0byB0aGUgbW9kZWwuICovXG4gIHByaXZhdGUgX2Fzc2lnblZhbHVlKHZhbHVlOiBUIHwgbnVsbCkge1xuICAgIC8vIFdlIG1heSBnZXQgc29tZSBpbmNvbWluZyB2YWx1ZXMgYmVmb3JlIHRoZSBtb2RlbCB3YXNcbiAgICAvLyBhc3NpZ25lZC4gU2F2ZSB0aGUgdmFsdWUgc28gdGhhdCB3ZSBjYW4gYXNzaWduIGl0IGxhdGVyLlxuICAgIGlmICh0aGlzLl9tb2RlbCkge1xuICAgICAgdGhpcy5fYXNzaWduVmFsdWVUb01vZGVsKHZhbHVlKTtcbiAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3Igd2hldGhlciB0aGUgaW5wdXQgcGFyc2VzLiAqL1xuICBwcml2YXRlIF9wYXJzZVZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIHJldHVybiB0aGlzLl9sYXN0VmFsdWVWYWxpZFxuICAgICAgPyBudWxsXG4gICAgICA6IHsgbWF0VGltZXBpY2tlclBhcnNlOiB7IHRleHQ6IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSB9IH07XG4gIH07XG5cbiAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB0aGUgbWluIHRpbWUuICovXG4gIHByaXZhdGUgX21pblZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sLFxuICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0VmFsaWRUaW1lT3JOdWxsKFxuICAgICAgdGhpcy5fdGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoY29udHJvbC52YWx1ZSksXG4gICAgKTtcbiAgICBjb25zdCBtaW4gPSB0aGlzLl9nZXRNaW5UaW1lKCk7XG4gICAgcmV0dXJuICFtaW4gfHxcbiAgICAgICFjb250cm9sVmFsdWUgfHxcbiAgICAgIHRoaXMuX3RpbWVBZGFwdGVyLmNvbXBhcmVUaW1lKG1pbiwgY29udHJvbFZhbHVlKSA8PSAwXG4gICAgICA/IG51bGxcbiAgICAgIDogeyBtYXRUaW1lcGlja2VyTWluOiB7IG1pbiwgYWN0dWFsOiBjb250cm9sVmFsdWUgfSB9O1xuICB9O1xuXG4gIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhlIG1heCB0aW1lLiAqL1xuICBwcml2YXRlIF9tYXhWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKFxuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldFZhbGlkVGltZU9yTnVsbChcbiAgICAgIHRoaXMuX3RpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGNvbnRyb2wudmFsdWUpLFxuICAgICk7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5fZ2V0TWF4VGltZSgpO1xuICAgIHJldHVybiAhbWF4IHx8XG4gICAgICAhY29udHJvbFZhbHVlIHx8XG4gICAgICB0aGlzLl90aW1lQWRhcHRlci5jb21wYXJlVGltZShtYXgsIGNvbnRyb2xWYWx1ZSkgPj0gMFxuICAgICAgPyBudWxsXG4gICAgICA6IHsgbWF0VGltZXBpY2tlck1heDogeyBtYXgsIGFjdHVhbDogY29udHJvbFZhbHVlIH0gfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgYFNpbXBsZUNoYW5nZXNgIG9iamVjdCBmcm9tIGFuIGBuZ09uQ2hhbmdlc2BcbiAqIGNhbGxiYWNrIGhhcyBhbnkgY2hhbmdlcywgYWNjb3VudGluZyBmb3IgdGltZSBvYmplY3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZUlucHV0c0hhdmVDaGFuZ2VkKFxuICBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzLFxuICBhZGFwdGVyOiBUaW1lQWRhcHRlcjx1bmtub3duPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY2hhbmdlcyk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHsgcHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlIH0gPSBjaGFuZ2VzW2tleV07XG5cbiAgICBpZiAoXG4gICAgICBhZGFwdGVyLmlzVGltZUluc3RhbmNlKHByZXZpb3VzVmFsdWUpICYmXG4gICAgICBhZGFwdGVyLmlzVGltZUluc3RhbmNlKGN1cnJlbnRWYWx1ZSlcbiAgICApIHtcbiAgICAgIGlmICghYWRhcHRlci5zYW1lVGltZShwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=