@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.
- package/README.md +3 -0
- package/_timepicker-theme.scss +0 -6
- package/fesm2022/dhutaryan-ngx-mat-timepicker.mjs +119 -123
- package/fesm2022/dhutaryan-ngx-mat-timepicker.mjs.map +1 -1
- package/lib/hours-clock-dial.d.ts +1 -1
- package/lib/time-face-base.d.ts +1 -1
- package/lib/time-input-base.d.ts +1 -1
- package/lib/timepicker-actions.d.ts +5 -9
- package/lib/timepicker-base.d.ts +1 -1
- package/lib/timepicker-content.d.ts +9 -9
- package/lib/timepicker-input-base.d.ts +1 -1
- package/package.json +5 -6
- package/themes/_utils.scss +39 -0
- package/themes/m2/_tokens.scss +2 -0
- package/themes/m3/_base.scss +0 -8
- package/themes/m3/_color.scss +0 -11
- package/themes/m3/_tokens.scss +1 -1
- package/esm2022/dhutaryan-ngx-mat-timepicker.mjs +0 -5
- package/esm2022/lib/adapter/index.mjs +0 -34
- package/esm2022/lib/adapter/native-date-time-adapter.mjs +0 -137
- package/esm2022/lib/adapter/time-adapter.mjs +0 -90
- package/esm2022/lib/clock-dial-adnimation.mjs +0 -11
- package/esm2022/lib/clock-dials.mjs +0 -95
- package/esm2022/lib/clock-size.mjs +0 -25
- package/esm2022/lib/hours-clock-dial.mjs +0 -192
- package/esm2022/lib/minutes-clock-dial.mjs +0 -165
- package/esm2022/lib/orientation.mjs +0 -2
- package/esm2022/lib/time-face-base.mjs +0 -318
- package/esm2022/lib/time-input-base.mjs +0 -85
- package/esm2022/lib/time-inputs.mjs +0 -179
- package/esm2022/lib/time-period.mjs +0 -67
- package/esm2022/lib/time-selection-model.mjs +0 -76
- package/esm2022/lib/timepicker-actions-default.mjs +0 -3
- package/esm2022/lib/timepicker-actions.mjs +0 -135
- package/esm2022/lib/timepicker-animations.mjs +0 -22
- package/esm2022/lib/timepicker-base.mjs +0 -458
- package/esm2022/lib/timepicker-content-layout.mjs +0 -23
- package/esm2022/lib/timepicker-content.mjs +0 -127
- package/esm2022/lib/timepicker-input-base.mjs +0 -254
- package/esm2022/lib/timepicker-input.mjs +0 -136
- package/esm2022/lib/timepicker-intl.mjs +0 -39
- package/esm2022/lib/timepicker-scroll-strategy.mjs +0 -15
- package/esm2022/lib/timepicker-toggle.mjs +0 -96
- package/esm2022/lib/timepicker.mjs +0 -33
- package/esm2022/lib/timepicker.module.mjs +0 -138
- package/esm2022/public-api.mjs +0 -23
- package/themes/_base.scss +0 -119
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
import { Directive, EventEmitter, Input, Optional, Output, } from '@angular/core';
|
|
2
|
-
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
|
3
|
-
import { ALL_MINUTES } from './minutes-clock-dial';
|
|
4
|
-
import { ALL_HOURS } from './hours-clock-dial';
|
|
5
|
-
import { DOWN_ARROW, UP_ARROW } from '@angular/cdk/keycodes';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "./adapter";
|
|
8
|
-
export class MatTimeFaceBase {
|
|
9
|
-
/** The currently selected time. */
|
|
10
|
-
get selected() {
|
|
11
|
-
return this._selected;
|
|
12
|
-
}
|
|
13
|
-
set selected(value) {
|
|
14
|
-
this._selected = this._timeAdapter.getValidTimeOrNull(this._timeAdapter.deserialize(value));
|
|
15
|
-
if (!this._selected) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
const hour = this._timeAdapter.getHour(this._selected);
|
|
19
|
-
this.selectedHour = hour > 12 && this.isMeridiem ? hour - 12 : hour;
|
|
20
|
-
if (hour === 0 && this.isMeridiem) {
|
|
21
|
-
this.selectedHour = 12;
|
|
22
|
-
}
|
|
23
|
-
this.selectedMinute = this._timeAdapter.getMinute(this._selected);
|
|
24
|
-
this.availableHours = ALL_HOURS;
|
|
25
|
-
if (this.isMeridiem) {
|
|
26
|
-
this.period = this._timeAdapter.getPeriod(this._selected);
|
|
27
|
-
}
|
|
28
|
-
this.availableMinutes = ALL_MINUTES;
|
|
29
|
-
this._setMinHour();
|
|
30
|
-
this._setMaxHour();
|
|
31
|
-
this._setMinMinute();
|
|
32
|
-
this._setMaxMinute();
|
|
33
|
-
this._moveFocusOnNextTick = this.isMeridiem;
|
|
34
|
-
}
|
|
35
|
-
/** The minimum selectable time. */
|
|
36
|
-
get minTime() {
|
|
37
|
-
return this._minTime;
|
|
38
|
-
}
|
|
39
|
-
set minTime(value) {
|
|
40
|
-
this._minTime = this._timeAdapter.getValidTimeOrNull(this._timeAdapter.deserialize(value));
|
|
41
|
-
if (value) {
|
|
42
|
-
this._setMinHour();
|
|
43
|
-
this._setMinMinute();
|
|
44
|
-
this._setDisabledPeriod();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/** The maximum selectable time. */
|
|
48
|
-
get maxTime() {
|
|
49
|
-
return this._maxTime;
|
|
50
|
-
}
|
|
51
|
-
set maxTime(value) {
|
|
52
|
-
this._maxTime = this._timeAdapter.getValidTimeOrNull(this._timeAdapter.deserialize(value));
|
|
53
|
-
if (value) {
|
|
54
|
-
this._setMaxHour();
|
|
55
|
-
this._setMaxMinute();
|
|
56
|
-
this._setDisabledPeriod();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/** Step over minutes. */
|
|
60
|
-
get minuteInterval() {
|
|
61
|
-
return this._minuteInterval;
|
|
62
|
-
}
|
|
63
|
-
set minuteInterval(value) {
|
|
64
|
-
this._minuteInterval = coerceNumberProperty(value) || 1;
|
|
65
|
-
}
|
|
66
|
-
constructor(_timeAdapter) {
|
|
67
|
-
this._timeAdapter = _timeAdapter;
|
|
68
|
-
this._minuteInterval = 1;
|
|
69
|
-
/** Color palette. */
|
|
70
|
-
this.color = 'primary';
|
|
71
|
-
/** Emits when any hour, minute or period is selected. */
|
|
72
|
-
this._userSelection = new EventEmitter();
|
|
73
|
-
this.selectedChange = new EventEmitter();
|
|
74
|
-
this.selectedHour = 0;
|
|
75
|
-
this.selectedMinute = 0;
|
|
76
|
-
this.disabledPeriod = null;
|
|
77
|
-
this.availableMinutes = ALL_MINUTES;
|
|
78
|
-
this.availableHours = ALL_HOURS;
|
|
79
|
-
/**
|
|
80
|
-
* Used for scheduling that focus should be moved to the active cell on the next tick.
|
|
81
|
-
* We need to schedule it, rather than do it immediately, because we have to wait
|
|
82
|
-
* for Angular to re-evaluate the view children.
|
|
83
|
-
*/
|
|
84
|
-
this._moveFocusOnNextTick = false;
|
|
85
|
-
}
|
|
86
|
-
ngAfterContentInit() {
|
|
87
|
-
if (!this.selected) {
|
|
88
|
-
this.selected = this._timeAdapter.clampTime(this._timeAdapter.now(), this.minTime, this.maxTime);
|
|
89
|
-
this._userSelection.emit(this.selected);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
ngAfterViewChecked() {
|
|
93
|
-
if (this._moveFocusOnNextTick) {
|
|
94
|
-
this._moveFocusOnNextTick = false;
|
|
95
|
-
this.focusActiveCell();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/** Handles hour selection. */
|
|
99
|
-
_onHourSelected(hour) {
|
|
100
|
-
this.selectedHour = hour;
|
|
101
|
-
const selected = this._timeAdapter.updateHour(this.selected, this._getHourBasedOnPeriod(hour));
|
|
102
|
-
this._timeSelected(selected);
|
|
103
|
-
}
|
|
104
|
-
/** Handles minute selection. */
|
|
105
|
-
_onMinuteSelected(minute) {
|
|
106
|
-
this.selectedMinute = minute;
|
|
107
|
-
const selected = this._timeAdapter.updateMinute(this.selected, minute);
|
|
108
|
-
this._timeSelected(selected);
|
|
109
|
-
}
|
|
110
|
-
/** Handles period changing. */
|
|
111
|
-
_onPeriodChanged(period) {
|
|
112
|
-
this.period = period;
|
|
113
|
-
const selected = this._timeAdapter.updateHour(this.selected, this._getHourBasedOnPeriod(this.selectedHour));
|
|
114
|
-
this._timeSelected(selected);
|
|
115
|
-
}
|
|
116
|
-
_getAvailableHours() {
|
|
117
|
-
if (this.isMeridiem) {
|
|
118
|
-
return this.availableHours
|
|
119
|
-
.filter((h) => {
|
|
120
|
-
if (this.period === 'am') {
|
|
121
|
-
return h < 12;
|
|
122
|
-
}
|
|
123
|
-
if (this.period === 'pm') {
|
|
124
|
-
return h >= 12;
|
|
125
|
-
}
|
|
126
|
-
return h;
|
|
127
|
-
})
|
|
128
|
-
.map((h) => {
|
|
129
|
-
if (h > 12) {
|
|
130
|
-
return h - 12;
|
|
131
|
-
}
|
|
132
|
-
if (h === 0) {
|
|
133
|
-
return 12;
|
|
134
|
-
}
|
|
135
|
-
return h;
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
return this.availableHours;
|
|
139
|
-
}
|
|
140
|
-
_onKeydown(event, view) {
|
|
141
|
-
switch (view) {
|
|
142
|
-
case 'hour':
|
|
143
|
-
this._handleHourKeydown(event);
|
|
144
|
-
break;
|
|
145
|
-
case 'minute':
|
|
146
|
-
this._handleMinuteKeydown(event);
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
_handleHourKeydown(event) {
|
|
151
|
-
const hours = this._getAvailableHours();
|
|
152
|
-
const selectedHourIndex = hours.findIndex((hour) => hour === this.selectedHour);
|
|
153
|
-
if (!hours.length) {
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
switch (event.keyCode) {
|
|
157
|
-
case UP_ARROW:
|
|
158
|
-
if (selectedHourIndex + 1 >= hours.length || selectedHourIndex < 0) {
|
|
159
|
-
this._onHourSelected(hours[0]);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
this._onHourSelected(hours[selectedHourIndex + 1]);
|
|
163
|
-
}
|
|
164
|
-
break;
|
|
165
|
-
case DOWN_ARROW:
|
|
166
|
-
if (selectedHourIndex - 1 < 0 || selectedHourIndex < 0) {
|
|
167
|
-
this._onHourSelected(hours[hours.length - 1]);
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
this._onHourSelected(hours[selectedHourIndex - 1]);
|
|
171
|
-
}
|
|
172
|
-
break;
|
|
173
|
-
default:
|
|
174
|
-
break;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
_handleMinuteKeydown(event) {
|
|
178
|
-
const minutes = this.availableMinutes;
|
|
179
|
-
const selectedMinuteIndex = minutes.findIndex((minute) => minute === this.selectedMinute);
|
|
180
|
-
if (!minutes.length) {
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
switch (event.keyCode) {
|
|
184
|
-
case UP_ARROW:
|
|
185
|
-
if (selectedMinuteIndex + this.minuteInterval >= minutes.length ||
|
|
186
|
-
selectedMinuteIndex < 0) {
|
|
187
|
-
const difference = 60 - this.selectedMinute + Math.min(...this.availableMinutes);
|
|
188
|
-
const count = Math.ceil(difference / this.minuteInterval);
|
|
189
|
-
const differenceForValid = count * this.minuteInterval;
|
|
190
|
-
const nextValidValue = this.selectedMinute + differenceForValid;
|
|
191
|
-
const correctIndex = minutes.findIndex((minute) => minute === nextValidValue - 60 // amount of mins
|
|
192
|
-
);
|
|
193
|
-
this._onMinuteSelected(minutes[correctIndex]);
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
this._onMinuteSelected(minutes[selectedMinuteIndex + this.minuteInterval]);
|
|
197
|
-
}
|
|
198
|
-
break;
|
|
199
|
-
case DOWN_ARROW:
|
|
200
|
-
if (selectedMinuteIndex - this.minuteInterval < 0 ||
|
|
201
|
-
selectedMinuteIndex < 0) {
|
|
202
|
-
const difference = 60 + this.selectedMinute - Math.max(...this.availableMinutes);
|
|
203
|
-
const count = Math.ceil(difference / this.minuteInterval);
|
|
204
|
-
const differenceForValid = count * this.minuteInterval;
|
|
205
|
-
const nextValidValue = this.selectedMinute - differenceForValid;
|
|
206
|
-
const correctIndex = minutes.findIndex((minute) => minute === nextValidValue + 60 // amount of mins
|
|
207
|
-
);
|
|
208
|
-
this._onMinuteSelected(minutes[correctIndex]);
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
this._onMinuteSelected(minutes[selectedMinuteIndex - this.minuteInterval]);
|
|
212
|
-
}
|
|
213
|
-
break;
|
|
214
|
-
default:
|
|
215
|
-
break;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
/** Gets a correct hours based on meridiem and period. */
|
|
219
|
-
_getHourBasedOnPeriod(hour) {
|
|
220
|
-
const afterNoon = this.isMeridiem && this.period === 'pm';
|
|
221
|
-
const beforeNoon = this.isMeridiem && this.period === 'am';
|
|
222
|
-
if (afterNoon) {
|
|
223
|
-
return hour === 12 ? hour : hour + 12;
|
|
224
|
-
}
|
|
225
|
-
if (beforeNoon) {
|
|
226
|
-
return hour === 12 ? 0 : hour;
|
|
227
|
-
}
|
|
228
|
-
return hour;
|
|
229
|
-
}
|
|
230
|
-
_timeSelected(value) {
|
|
231
|
-
if (value && !this._timeAdapter.sameTime(value, this.selected)) {
|
|
232
|
-
this.selectedChange.emit(value);
|
|
233
|
-
}
|
|
234
|
-
this._userSelection.emit(value);
|
|
235
|
-
}
|
|
236
|
-
/** Sets min hour. */
|
|
237
|
-
_setMinHour() {
|
|
238
|
-
if (!this.minTime) {
|
|
239
|
-
return;
|
|
240
|
-
}
|
|
241
|
-
const minHour = this._timeAdapter.getHour(this.minTime);
|
|
242
|
-
this.availableHours = this.availableHours.filter((h) => h >= minHour);
|
|
243
|
-
}
|
|
244
|
-
/** Sets max hour. */
|
|
245
|
-
_setMaxHour() {
|
|
246
|
-
if (!this.maxTime) {
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
const maxHour = this._timeAdapter.getHour(this.maxTime);
|
|
250
|
-
this.availableHours = this.availableHours.filter((h) => h <= maxHour);
|
|
251
|
-
}
|
|
252
|
-
/** Sets min minute. */
|
|
253
|
-
_setMinMinute() {
|
|
254
|
-
if (!this.selected || !this.minTime) {
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
const selectedHour = this._timeAdapter.getHour(this.selected);
|
|
258
|
-
const minHour = this._timeAdapter.getHour(this.minTime);
|
|
259
|
-
const minMinute = selectedHour > minHour ? 0 : this._timeAdapter.getMinute(this.minTime);
|
|
260
|
-
this.availableMinutes = this.availableMinutes.filter((minute) => minute >= minMinute);
|
|
261
|
-
if (selectedHour < minHour) {
|
|
262
|
-
this.availableMinutes = [];
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
/** Sets max minute. */
|
|
266
|
-
_setMaxMinute() {
|
|
267
|
-
if (!this.selected || !this.maxTime) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
const selectedHour = this._timeAdapter.getHour(this.selected);
|
|
271
|
-
const maxHour = this._timeAdapter.getHour(this.maxTime);
|
|
272
|
-
const maxMinute = selectedHour < maxHour ? 59 : this._timeAdapter.getMinute(this.maxTime);
|
|
273
|
-
this.availableMinutes = this.availableMinutes.filter((minute) => minute <= maxMinute);
|
|
274
|
-
if (selectedHour > maxHour) {
|
|
275
|
-
this.availableMinutes = [];
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
/** Sets disabled period. */
|
|
279
|
-
_setDisabledPeriod() {
|
|
280
|
-
if (this.minTime) {
|
|
281
|
-
const minHour = this._timeAdapter.getHour(this.minTime);
|
|
282
|
-
if (minHour >= 12) {
|
|
283
|
-
this.disabledPeriod = 'am';
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
if (this.maxTime) {
|
|
287
|
-
const maxHour = this._timeAdapter.getHour(this.maxTime);
|
|
288
|
-
const maxMinute = this._timeAdapter.getHour(this.maxTime);
|
|
289
|
-
if (maxHour < 12 || (maxHour === 12 && maxMinute === 0)) {
|
|
290
|
-
this.disabledPeriod = 'pm';
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimeFaceBase, deps: [{ token: i1.TimeAdapter, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
295
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: MatTimeFaceBase, inputs: { selected: "selected", minTime: "minTime", maxTime: "maxTime", minuteInterval: "minuteInterval", isMeridiem: "isMeridiem", color: "color" }, outputs: { _userSelection: "_userSelection", selectedChange: "selectedChange" }, ngImport: i0 }); }
|
|
296
|
-
}
|
|
297
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimeFaceBase, decorators: [{
|
|
298
|
-
type: Directive
|
|
299
|
-
}], ctorParameters: () => [{ type: i1.TimeAdapter, decorators: [{
|
|
300
|
-
type: Optional
|
|
301
|
-
}] }], propDecorators: { selected: [{
|
|
302
|
-
type: Input
|
|
303
|
-
}], minTime: [{
|
|
304
|
-
type: Input
|
|
305
|
-
}], maxTime: [{
|
|
306
|
-
type: Input
|
|
307
|
-
}], minuteInterval: [{
|
|
308
|
-
type: Input
|
|
309
|
-
}], isMeridiem: [{
|
|
310
|
-
type: Input
|
|
311
|
-
}], color: [{
|
|
312
|
-
type: Input
|
|
313
|
-
}], _userSelection: [{
|
|
314
|
-
type: Output
|
|
315
|
-
}], selectedChange: [{
|
|
316
|
-
type: Output
|
|
317
|
-
}] } });
|
|
318
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1mYWNlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtdGltZXBpY2tlci9zcmMvbGliL3RpbWUtZmFjZS1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQUczRSxNQUFNLE9BQWdCLGVBQWU7SUFHbkMsbUNBQW1DO0lBQ25DLElBQ0ksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsS0FBZTtRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUNyQyxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFD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QUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUxRCxJQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7OEdBMVptQixlQUFlO2tHQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBRHBDLFNBQVM7OzBCQThHSyxRQUFRO3lDQXhHakIsUUFBUTtzQkFEWCxLQUFLO2dCQW9DRixPQUFPO3NCQURWLEtBQUs7Z0JBbUJGLE9BQU87c0JBRFYsS0FBSztnQkFtQkYsY0FBYztzQkFEakIsS0FBSztnQkFVRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHSSxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdDaGVja2VkLFxuICBEaXJlY3RpdmUsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBjb2VyY2VOdW1iZXJQcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5cbmltcG9ydCB7IFRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyJztcbmltcG9ydCB7IE1hdFRpbWVQZXJpb2RUeXBlIH0gZnJvbSAnLi90aW1lLXBlcmlvZCc7XG5pbXBvcnQgeyBBTExfTUlOVVRFUyB9IGZyb20gJy4vbWludXRlcy1jbG9jay1kaWFsJztcbmltcG9ydCB7IEFMTF9IT1VSUyB9IGZyb20gJy4vaG91cnMtY2xvY2stZGlhbCc7XG5pbXBvcnQgeyBET1dOX0FSUk9XLCBFTlRFUiwgU1BBQ0UsIFVQX0FSUk9XIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWF0VGltZUZhY2VCYXNlPFQ+XG4gIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZFxue1xuICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0aW1lLiAqL1xuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWQoKTogVCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuICBzZXQgc2VsZWN0ZWQodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB0aGlzLl90aW1lQWRhcHRlci5nZXRWYWxpZFRpbWVPck51bGwoXG4gICAgICB0aGlzLl90aW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSlcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLl9zZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhvdXIgPSB0aGlzLl90aW1lQWRhcHRlci5nZXRIb3VyKHRoaXMuX3NlbGVjdGVkKTtcbiAgICB0aGlzLnNlbGVjdGVkSG91ciA9IGhvdXIgPiAxMiAmJiB0aGlzLmlzTWVyaWRpZW0gPyBob3VyIC0gMTIgOiBob3VyO1xuICAgIGlmIChob3VyID09PSAwICYmIHRoaXMuaXNNZXJpZGllbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEhvdXIgPSAxMjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldE1pbnV0ZSh0aGlzLl9zZWxlY3RlZCk7XG4gICAgdGhpcy5hdmFpbGFibGVIb3VycyA9IEFMTF9IT1VSUztcblxuICAgIGlmICh0aGlzLmlzTWVyaWRpZW0pIHtcbiAgICAgIHRoaXMucGVyaW9kID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0UGVyaW9kKHRoaXMuX3NlbGVjdGVkKTtcbiAgICB9XG5cbiAgICB0aGlzLmF2YWlsYWJsZU1pbnV0ZXMgPSBBTExfTUlOVVRFUztcbiAgICB0aGlzLl9zZXRNaW5Ib3VyKCk7XG4gICAgdGhpcy5fc2V0TWF4SG91cigpO1xuICAgIHRoaXMuX3NldE1pbk1pbnV0ZSgpO1xuICAgIHRoaXMuX3NldE1heE1pbnV0ZSgpO1xuICAgIHRoaXMuX21vdmVGb2N1c09uTmV4dFRpY2sgPSB0aGlzLmlzTWVyaWRpZW07XG4gIH1cbiAgcHJpdmF0ZSBfc2VsZWN0ZWQ6IFQgfCBudWxsO1xuXG4gIC8qKiBUaGUgbWluaW11bSBzZWxlY3RhYmxlIHRpbWUuICovXG4gIEBJbnB1dCgpXG4gIGdldCBtaW5UaW1lKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWluVGltZTtcbiAgfVxuICBzZXQgbWluVGltZSh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9taW5UaW1lID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0VmFsaWRUaW1lT3JOdWxsKFxuICAgICAgdGhpcy5fdGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpXG4gICAgKTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fc2V0TWluSG91cigpO1xuICAgICAgdGhpcy5fc2V0TWluTWludXRlKCk7XG4gICAgICB0aGlzLl9zZXREaXNhYmxlZFBlcmlvZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9taW5UaW1lOiBUIHwgbnVsbDtcblxuICAvKiogVGhlIG1heGltdW0gc2VsZWN0YWJsZSB0aW1lLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbWF4VGltZSgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21heFRpbWU7XG4gIH1cbiAgc2V0IG1heFRpbWUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fbWF4VGltZSA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldFZhbGlkVGltZU9yTnVsbChcbiAgICAgIHRoaXMuX3RpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKVxuICAgICk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3NldE1heEhvdXIoKTtcbiAgICAgIHRoaXMuX3NldE1heE1pbnV0ZSgpO1xuICAgICAgdGhpcy5fc2V0RGlzYWJsZWRQZXJpb2QoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfbWF4VGltZTogVCB8IG51bGw7XG5cbiAgLyoqIFN0ZXAgb3ZlciBtaW51dGVzLiAqL1xuICBASW5wdXQoKVxuICBnZXQgbWludXRlSW50ZXJ2YWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWludXRlSW50ZXJ2YWw7XG4gIH1cbiAgc2V0IG1pbnV0ZUludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW51dGVJbnRlcnZhbCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKSB8fCAxO1xuICB9XG4gIHByaXZhdGUgX21pbnV0ZUludGVydmFsOiBudW1iZXIgPSAxO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjbG9jayB1c2VzIDEyIGhvdXIgZm9ybWF0LiAqL1xuICBASW5wdXQoKSBpc01lcmlkaWVtOiBib29sZWFuO1xuXG4gIC8qKiBDb2xvciBwYWxldHRlLiAqL1xuICBASW5wdXQoKSBjb2xvcjogVGhlbWVQYWxldHRlID0gJ3ByaW1hcnknO1xuXG4gIC8qKiBFbWl0cyB3aGVuIGFueSBob3VyLCBtaW51dGUgb3IgcGVyaW9kIGlzIHNlbGVjdGVkLiAqL1xuICBAT3V0cHV0KCkgX3VzZXJTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIHNlbGVjdGVkSG91cjogbnVtYmVyID0gMDtcbiAgc2VsZWN0ZWRNaW51dGU6IG51bWJlciA9IDA7XG4gIHBlcmlvZDogTWF0VGltZVBlcmlvZFR5cGU7XG4gIGRpc2FibGVkUGVyaW9kOiBNYXRUaW1lUGVyaW9kVHlwZSB8IG51bGwgPSBudWxsO1xuICBhdmFpbGFibGVNaW51dGVzID0gQUxMX01JTlVURVM7XG4gIGF2YWlsYWJsZUhvdXJzID0gQUxMX0hPVVJTO1xuXG4gIC8qKlxuICAgKiBVc2VkIGZvciBzY2hlZHVsaW5nIHRoYXQgZm9jdXMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBhY3RpdmUgY2VsbCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgKiBXZSBuZWVkIHRvIHNjaGVkdWxlIGl0LCByYXRoZXIgdGhhbiBkbyBpdCBpbW1lZGlhdGVseSwgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXRcbiAgICogZm9yIEFuZ3VsYXIgdG8gcmUtZXZhbHVhdGUgdGhlIHZpZXcgY2hpbGRyZW4uXG4gICAqL1xuICBwcml2YXRlIF9tb3ZlRm9jdXNPbk5leHRUaWNrID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgcHJvdGVjdGVkIF90aW1lQWRhcHRlcjogVGltZUFkYXB0ZXI8VD4pIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuX3RpbWVBZGFwdGVyLmNsYW1wVGltZShcbiAgICAgICAgdGhpcy5fdGltZUFkYXB0ZXIubm93KCksXG4gICAgICAgIHRoaXMubWluVGltZSxcbiAgICAgICAgdGhpcy5tYXhUaW1lXG4gICAgICApO1xuICAgICAgdGhpcy5fdXNlclNlbGVjdGlvbi5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5fbW92ZUZvY3VzT25OZXh0VGljaykge1xuICAgICAgdGhpcy5fbW92ZUZvY3VzT25OZXh0VGljayA9IGZhbHNlO1xuICAgICAgdGhpcy5mb2N1c0FjdGl2ZUNlbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyB0aGUgYWN0aXZlIGNlbGwgYWZ0ZXIgb3IgaW5wdXQgdGhlIG1pY3JvdGFzayBxdWV1ZSBpcyBlbXB0eS5cbiAgICpcbiAgICogQWRkaW5nIGEgMG1zIHNldFRpbWVvdXQgc2VlbXMgdG8gZml4IFZvaWNlb3ZlciBsb3NpbmcgZm9jdXMgd2hlbiBwcmVzc2luZyBQYWdlVXAvUGFnZURvd24uXG4gICAqXG4gICAqIERldGVybWluZWQgYSAwbXMgYnkgZ3JhZHVhbGx5IGluY3JlYXNpbmcgZHVyYXRpb24gZnJvbSAwIGFuZCB0ZXN0aW5nIHR3byB1c2UgY2FzZXMgd2l0aCBzY3JlZW5cbiAgICogcmVhZGVyIGVuYWJsZWQ6XG4gICAqXG4gICAqIDEuIFByZXNzaW5nIFBhZ2VVcC9QYWdlRG93biByZXBlYXRlZGx5IHdpdGggcGF1c2luZyBiZXR3ZWVuIGVhY2gga2V5IHByZXNzLlxuICAgKiAyLiBQcmVzc2luZyBhbmQgaG9sZGluZyB0aGUgUGFnZURvd24ga2V5IHdpdGggcmVwZWF0ZWQga2V5cyBlbmFibGVkLlxuICAgKlxuICAgKiBUZXN0IDEgd29ya2VkIHJvdWdobHkgOTUtOTklIG9mIHRoZSB0aW1lIHdpdGggMG1zIGFuZCBnb3QgYSBsaXR0bGUgYml0IGJldHRlciBhcyB0aGUgZHVyYXRpb25cbiAgICogaW5jcmVhc2VkLiBUZXN0IDIgZ290IHNsaWdodGx5IGJldHRlciB1bnRpbCB0aGUgZHVyYXRpb24gd2FzIGxvbmcgZW5vdWdoIHRvIGludGVyZmVyZSB3aXRoXG4gICAqIHJlcGVhdGVkIGtleXMuIElmIHRoZSByZXBlYXRlZCBrZXkgc3BlZWQgd2FzIGZhc3RlciB0aGFuIHRoZSB0aW1lb3V0IGR1cmF0aW9uLCB0aGVuIHByZXNzaW5nXG4gICAqIGFuZCBob2xkaW5nIHBhZ2Vkb3duIGNhdXNlZCB0aGUgZW50aXJlIHBhZ2UgdG8gc2Nyb2xsLlxuICAgKlxuICAgKiBTaW5jZSByZXBlYXRlZCBrZXkgc3BlZWQgY2FuIHZlcmlmeSBhY3Jvc3MgbWFjaGluZXMsIGRldGVybWluZWQgdGhhdCBhbnkgZHVyYXRpb24gY291bGRcbiAgICogcG90ZW50aWFsbHkgaW50ZXJmZXJlIHdpdGggcmVwZWF0ZWQga2V5cy4gMG1zIHdvdWxkIGJlIGJlc3QgYmVjYXVzZSBpdCBhbG1vc3QgZW50aXJlbHlcbiAgICogZWxpbWluYXRlcyB0aGUgZm9jdXMgYmVpbmcgbG9zdCBpbiBWb2ljZW92ZXIgd2l0aG91dCBjYXVzaW5nIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLlxuICAgKiBBZGRpbmcgZGVsYXkgYWxzbyBjb21wbGljYXRlcyB3cml0aW5nIHRlc3RzLlxuICAgKi9cbiAgYWJzdHJhY3QgZm9jdXNBY3RpdmVDZWxsKCk6IHZvaWQ7XG5cbiAgLyoqIEhhbmRsZXMgaG91ciBzZWxlY3Rpb24uICovXG4gIF9vbkhvdXJTZWxlY3RlZChob3VyOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkSG91ciA9IGhvdXI7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLl90aW1lQWRhcHRlci51cGRhdGVIb3VyKFxuICAgICAgdGhpcy5zZWxlY3RlZCEsXG4gICAgICB0aGlzLl9nZXRIb3VyQmFzZWRPblBlcmlvZChob3VyKVxuICAgICk7XG4gICAgdGhpcy5fdGltZVNlbGVjdGVkKHNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIG1pbnV0ZSBzZWxlY3Rpb24uICovXG4gIF9vbk1pbnV0ZVNlbGVjdGVkKG1pbnV0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZE1pbnV0ZSA9IG1pbnV0ZTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuX3RpbWVBZGFwdGVyLnVwZGF0ZU1pbnV0ZSh0aGlzLnNlbGVjdGVkISwgbWludXRlKTtcbiAgICB0aGlzLl90aW1lU2VsZWN0ZWQoc2VsZWN0ZWQpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXMgcGVyaW9kIGNoYW5naW5nLiAqL1xuICBfb25QZXJpb2RDaGFuZ2VkKHBlcmlvZDogTWF0VGltZVBlcmlvZFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLnBlcmlvZCA9IHBlcmlvZDtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuX3RpbWVBZGFwdGVyLnVwZGF0ZUhvdXIoXG4gICAgICB0aGlzLnNlbGVjdGVkISxcbiAgICAgIHRoaXMuX2dldEhvdXJCYXNlZE9uUGVyaW9kKHRoaXMuc2VsZWN0ZWRIb3VyKVxuICAgICk7XG4gICAgdGhpcy5fdGltZVNlbGVjdGVkKHNlbGVjdGVkKTtcbiAgfVxuXG4gIF9nZXRBdmFpbGFibGVIb3VycygpOiBudW1iZXJbXSB7XG4gICAgaWYgKHRoaXMuaXNNZXJpZGllbSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXZhaWxhYmxlSG91cnNcbiAgICAgICAgLmZpbHRlcigoaCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnBlcmlvZCA9PT0gJ2FtJykge1xuICAgICAgICAgICAgcmV0dXJuIGggPCAxMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5wZXJpb2QgPT09ICdwbScpIHtcbiAgICAgICAgICAgIHJldHVybiBoID49IDEyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBoO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChoKSA9PiB7XG4gICAgICAgICAgaWYgKGggPiAxMikge1xuICAgICAgICAgICAgcmV0dXJuIGggLSAxMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDEyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBoO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVIb3VycztcbiAgfVxuXG4gIF9vbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHZpZXc6ICdob3VyJyB8ICdtaW51dGUnKTogdm9pZCB7XG4gICAgc3dpdGNoICh2aWV3KSB7XG4gICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgdGhpcy5faGFuZGxlSG91cktleWRvd24oZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIHRoaXMuX2hhbmRsZU1pbnV0ZUtleWRvd24oZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVIb3VyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGhvdXJzID0gdGhpcy5fZ2V0QXZhaWxhYmxlSG91cnMoKTtcbiAgICBjb25zdCBzZWxlY3RlZEhvdXJJbmRleCA9IGhvdXJzLmZpbmRJbmRleChcbiAgICAgIChob3VyKSA9PiBob3VyID09PSB0aGlzLnNlbGVjdGVkSG91clxuICAgICk7XG5cbiAgICBpZiAoIWhvdXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgaWYgKHNlbGVjdGVkSG91ckluZGV4ICsgMSA+PSBob3Vycy5sZW5ndGggfHwgc2VsZWN0ZWRIb3VySW5kZXggPCAwKSB7XG4gICAgICAgICAgdGhpcy5fb25Ib3VyU2VsZWN0ZWQoaG91cnNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX29uSG91clNlbGVjdGVkKGhvdXJzW3NlbGVjdGVkSG91ckluZGV4ICsgMV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBET1dOX0FSUk9XOlxuICAgICAgICBpZiAoc2VsZWN0ZWRIb3VySW5kZXggLSAxIDwgMCB8fCBzZWxlY3RlZEhvdXJJbmRleCA8IDApIHtcbiAgICAgICAgICB0aGlzLl9vbkhvdXJTZWxlY3RlZChob3Vyc1tob3Vycy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fb25Ib3VyU2VsZWN0ZWQoaG91cnNbc2VsZWN0ZWRIb3VySW5kZXggLSAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVNaW51dGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgbWludXRlcyA9IHRoaXMuYXZhaWxhYmxlTWludXRlcztcbiAgICBjb25zdCBzZWxlY3RlZE1pbnV0ZUluZGV4ID0gbWludXRlcy5maW5kSW5kZXgoXG4gICAgICAobWludXRlKSA9PiBtaW51dGUgPT09IHRoaXMuc2VsZWN0ZWRNaW51dGVcbiAgICApO1xuXG4gICAgaWYgKCFtaW51dGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSBVUF9BUlJPVzpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkTWludXRlSW5kZXggKyB0aGlzLm1pbnV0ZUludGVydmFsID49IG1pbnV0ZXMubGVuZ3RoIHx8XG4gICAgICAgICAgc2VsZWN0ZWRNaW51dGVJbmRleCA8IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGlmZmVyZW5jZSA9XG4gICAgICAgICAgICA2MCAtIHRoaXMuc2VsZWN0ZWRNaW51dGUgKyBNYXRoLm1pbiguLi50aGlzLmF2YWlsYWJsZU1pbnV0ZXMpO1xuICAgICAgICAgIGNvbnN0IGNvdW50ID0gTWF0aC5jZWlsKGRpZmZlcmVuY2UgLyB0aGlzLm1pbnV0ZUludGVydmFsKTtcbiAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlRm9yVmFsaWQgPSBjb3VudCAqIHRoaXMubWludXRlSW50ZXJ2YWw7XG4gICAgICAgICAgY29uc3QgbmV4dFZhbGlkVmFsdWUgPSB0aGlzLnNlbGVjdGVkTWludXRlICsgZGlmZmVyZW5jZUZvclZhbGlkO1xuICAgICAgICAgIGNvbnN0IGNvcnJlY3RJbmRleCA9IG1pbnV0ZXMuZmluZEluZGV4KFxuICAgICAgICAgICAgKG1pbnV0ZSkgPT4gbWludXRlID09PSBuZXh0VmFsaWRWYWx1ZSAtIDYwIC8vIGFtb3VudCBvZiBtaW5zXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9vbk1pbnV0ZVNlbGVjdGVkKG1pbnV0ZXNbY29ycmVjdEluZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fb25NaW51dGVTZWxlY3RlZChcbiAgICAgICAgICAgIG1pbnV0ZXNbc2VsZWN0ZWRNaW51dGVJbmRleCArIHRoaXMubWludXRlSW50ZXJ2YWxdXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRE9XTl9BUlJPVzpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkTWludXRlSW5kZXggLSB0aGlzLm1pbnV0ZUludGVydmFsIDwgMCB8fFxuICAgICAgICAgIHNlbGVjdGVkTWludXRlSW5kZXggPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRpZmZlcmVuY2UgPVxuICAgICAgICAgICAgNjAgKyB0aGlzLnNlbGVjdGVkTWludXRlIC0gTWF0aC5tYXgoLi4udGhpcy5hdmFpbGFibGVNaW51dGVzKTtcbiAgICAgICAgICBjb25zdCBjb3VudCA9IE1hdGguY2VpbChkaWZmZXJlbmNlIC8gdGhpcy5taW51dGVJbnRlcnZhbCk7XG4gICAgICAgICAgY29uc3QgZGlmZmVyZW5jZUZvclZhbGlkID0gY291bnQgKiB0aGlzLm1pbnV0ZUludGVydmFsO1xuICAgICAgICAgIGNvbnN0IG5leHRWYWxpZFZhbHVlID0gdGhpcy5zZWxlY3RlZE1pbnV0ZSAtIGRpZmZlcmVuY2VGb3JWYWxpZDtcbiAgICAgICAgICBjb25zdCBjb3JyZWN0SW5kZXggPSBtaW51dGVzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChtaW51dGUpID0+IG1pbnV0ZSA9PT0gbmV4dFZhbGlkVmFsdWUgKyA2MCAvLyBhbW91bnQgb2YgbWluc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fb25NaW51dGVTZWxlY3RlZChtaW51dGVzW2NvcnJlY3RJbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX29uTWludXRlU2VsZWN0ZWQoXG4gICAgICAgICAgICBtaW51dGVzW3NlbGVjdGVkTWludXRlSW5kZXggLSB0aGlzLm1pbnV0ZUludGVydmFsXVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKiogR2V0cyBhIGNvcnJlY3QgaG91cnMgYmFzZWQgb24gbWVyaWRpZW0gYW5kIHBlcmlvZC4gKi9cbiAgcHJpdmF0ZSBfZ2V0SG91ckJhc2VkT25QZXJpb2QoaG91cjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBhZnRlck5vb24gPSB0aGlzLmlzTWVyaWRpZW0gJiYgdGhpcy5wZXJpb2QgPT09ICdwbSc7XG4gICAgY29uc3QgYmVmb3JlTm9vbiA9IHRoaXMuaXNNZXJpZGllbSAmJiB0aGlzLnBlcmlvZCA9PT0gJ2FtJztcblxuICAgIGlmIChhZnRlck5vb24pIHtcbiAgICAgIHJldHVybiBob3VyID09PSAxMiA/IGhvdXIgOiBob3VyICsgMTI7XG4gICAgfVxuXG4gICAgaWYgKGJlZm9yZU5vb24pIHtcbiAgICAgIHJldHVybiBob3VyID09PSAxMiA/IDAgOiBob3VyO1xuICAgIH1cblxuICAgIHJldHVybiBob3VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfdGltZVNlbGVjdGVkKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICYmICF0aGlzLl90aW1lQWRhcHRlci5zYW1lVGltZSh2YWx1ZSwgdGhpcy5zZWxlY3RlZCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXNlclNlbGVjdGlvbi5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBTZXRzIG1pbiBob3VyLiAqL1xuICBwcml2YXRlIF9zZXRNaW5Ib3VyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5taW5UaW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWluSG91ciA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldEhvdXIodGhpcy5taW5UaW1lKTtcbiAgICB0aGlzLmF2YWlsYWJsZUhvdXJzID0gdGhpcy5hdmFpbGFibGVIb3Vycy5maWx0ZXIoKGgpID0+IGggPj0gbWluSG91cik7XG4gIH1cblxuICAvKiogU2V0cyBtYXggaG91ci4gKi9cbiAgcHJpdmF0ZSBfc2V0TWF4SG91cigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWF4VGltZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heEhvdXIgPSB0aGlzLl90aW1lQWRhcHRlci5nZXRIb3VyKHRoaXMubWF4VGltZSk7XG4gICAgdGhpcy5hdmFpbGFibGVIb3VycyA9IHRoaXMuYXZhaWxhYmxlSG91cnMuZmlsdGVyKChoKSA9PiBoIDw9IG1heEhvdXIpO1xuICB9XG5cbiAgLyoqIFNldHMgbWluIG1pbnV0ZS4gKi9cbiAgcHJpdmF0ZSBfc2V0TWluTWludXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCB8fCAhdGhpcy5taW5UaW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRIb3VyID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0SG91cih0aGlzLnNlbGVjdGVkKTtcbiAgICBjb25zdCBtaW5Ib3VyID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0SG91cih0aGlzLm1pblRpbWUpO1xuXG4gICAgY29uc3QgbWluTWludXRlID1cbiAgICAgIHNlbGVjdGVkSG91ciA+IG1pbkhvdXIgPyAwIDogdGhpcy5fdGltZUFkYXB0ZXIuZ2V0TWludXRlKHRoaXMubWluVGltZSk7XG5cbiAgICB0aGlzLmF2YWlsYWJsZU1pbnV0ZXMgPSB0aGlzLmF2YWlsYWJsZU1pbnV0ZXMuZmlsdGVyKFxuICAgICAgKG1pbnV0ZSkgPT4gbWludXRlID49IG1pbk1pbnV0ZVxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRIb3VyIDwgbWluSG91cikge1xuICAgICAgdGhpcy5hdmFpbGFibGVNaW51dGVzID0gW107XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgbWF4IG1pbnV0ZS4gKi9cbiAgcHJpdmF0ZSBfc2V0TWF4TWludXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCB8fCAhdGhpcy5tYXhUaW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRIb3VyID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0SG91cih0aGlzLnNlbGVjdGVkKTtcbiAgICBjb25zdCBtYXhIb3VyID0gdGhpcy5fdGltZUFkYXB0ZXIuZ2V0SG91cih0aGlzLm1heFRpbWUpO1xuXG4gICAgY29uc3QgbWF4TWludXRlID1cbiAgICAgIHNlbGVjdGVkSG91ciA8IG1heEhvdXIgPyA1OSA6IHRoaXMuX3RpbWVBZGFwdGVyLmdldE1pbnV0ZSh0aGlzLm1heFRpbWUpO1xuXG4gICAgdGhpcy5hdmFpbGFibGVNaW51dGVzID0gdGhpcy5hdmFpbGFibGVNaW51dGVzLmZpbHRlcihcbiAgICAgIChtaW51dGUpID0+IG1pbnV0ZSA8PSBtYXhNaW51dGVcbiAgICApO1xuXG4gICAgaWYgKHNlbGVjdGVkSG91ciA+IG1heEhvdXIpIHtcbiAgICAgIHRoaXMuYXZhaWxhYmxlTWludXRlcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRzIGRpc2FibGVkIHBlcmlvZC4gKi9cbiAgcHJpdmF0ZSBfc2V0RGlzYWJsZWRQZXJpb2QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWluVGltZSkge1xuICAgICAgY29uc3QgbWluSG91ciA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldEhvdXIodGhpcy5taW5UaW1lKTtcblxuICAgICAgaWYgKG1pbkhvdXIgPj0gMTIpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZFBlcmlvZCA9ICdhbSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWF4VGltZSkge1xuICAgICAgY29uc3QgbWF4SG91ciA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldEhvdXIodGhpcy5tYXhUaW1lKTtcbiAgICAgIGNvbnN0IG1heE1pbnV0ZSA9IHRoaXMuX3RpbWVBZGFwdGVyLmdldEhvdXIodGhpcy5tYXhUaW1lKTtcblxuICAgICAgaWYgKG1heEhvdXIgPCAxMiB8fCAobWF4SG91ciA9PT0gMTIgJiYgbWF4TWludXRlID09PSAwKSkge1xuICAgICAgICB0aGlzLmRpc2FibGVkUGVyaW9kID0gJ3BtJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { Input, Output, EventEmitter, Directive, Inject, HostListener, } from '@angular/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export function withZeroPrefix(value) {
|
|
5
|
-
return value < 10 ? `0${value}` : `${value}`;
|
|
6
|
-
}
|
|
7
|
-
export function withZeroPrefixMeridiem(value, isMeridiem) {
|
|
8
|
-
const newValue = isMeridiem && value === 0 ? 12 : value;
|
|
9
|
-
return withZeroPrefix(newValue);
|
|
10
|
-
}
|
|
11
|
-
const DIGIT_KEYS = Array.from({ length: 10 }, (_, i) => `${i}`);
|
|
12
|
-
const SPECIAL_KEYS = ['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Tab'];
|
|
13
|
-
export class MatTimeInputBase {
|
|
14
|
-
get value() {
|
|
15
|
-
return this._value;
|
|
16
|
-
}
|
|
17
|
-
set value(value) {
|
|
18
|
-
this._value = value;
|
|
19
|
-
if (!this.hasFocus) {
|
|
20
|
-
this.setInputValue(this._value);
|
|
21
|
-
}
|
|
22
|
-
// we need timeout here to set placeholder first time
|
|
23
|
-
setTimeout(() => {
|
|
24
|
-
this.setInputPlaceholder(this._value);
|
|
25
|
-
}, 0);
|
|
26
|
-
}
|
|
27
|
-
_keydown(event) {
|
|
28
|
-
const isAllow = (DIGIT_KEYS.includes(event.key) && !event.shiftKey) ||
|
|
29
|
-
SPECIAL_KEYS.includes(event.code);
|
|
30
|
-
if (!isAllow) {
|
|
31
|
-
event.preventDefault();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
get inputElement() {
|
|
35
|
-
return this.element.nativeElement;
|
|
36
|
-
}
|
|
37
|
-
get hasFocus() {
|
|
38
|
-
return this.element?.nativeElement === this._document.activeElement;
|
|
39
|
-
}
|
|
40
|
-
constructor(element, _cdr, _document) {
|
|
41
|
-
this.element = element;
|
|
42
|
-
this._cdr = _cdr;
|
|
43
|
-
this._document = _document;
|
|
44
|
-
this.timeChanged = new EventEmitter();
|
|
45
|
-
}
|
|
46
|
-
focus() {
|
|
47
|
-
this.setInputValue(null);
|
|
48
|
-
}
|
|
49
|
-
blur() {
|
|
50
|
-
const isNumber = !isNaN(Number(this.inputElement.value));
|
|
51
|
-
const value = this._formatValue(isNumber ? Number(this.inputElement.value || this._value) : this.value);
|
|
52
|
-
this.setInputValue(value);
|
|
53
|
-
this.setInputPlaceholder(value);
|
|
54
|
-
this.timeChanged.emit(value);
|
|
55
|
-
}
|
|
56
|
-
setInputValue(value) {
|
|
57
|
-
if (value !== null) {
|
|
58
|
-
this.inputElement.value = this._withZeroPrefix(value);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
this.inputElement.value = '';
|
|
62
|
-
}
|
|
63
|
-
this._cdr.markForCheck();
|
|
64
|
-
}
|
|
65
|
-
setInputPlaceholder(value) {
|
|
66
|
-
this.inputElement.placeholder = this._withZeroPrefix(value);
|
|
67
|
-
this._cdr.markForCheck();
|
|
68
|
-
}
|
|
69
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimeInputBase, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
70
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.4", type: MatTimeInputBase, inputs: { value: "value" }, outputs: { timeChanged: "timeChanged" }, host: { listeners: { "keydown": "_keydown($event)" } }, ngImport: i0 }); }
|
|
71
|
-
}
|
|
72
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: MatTimeInputBase, decorators: [{
|
|
73
|
-
type: Directive
|
|
74
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
|
|
75
|
-
type: Inject,
|
|
76
|
-
args: [DOCUMENT]
|
|
77
|
-
}] }], propDecorators: { value: [{
|
|
78
|
-
type: Input
|
|
79
|
-
}], timeChanged: [{
|
|
80
|
-
type: Output
|
|
81
|
-
}], _keydown: [{
|
|
82
|
-
type: HostListener,
|
|
83
|
-
args: ['keydown', ['$event']]
|
|
84
|
-
}] } });
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1pbnB1dC1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRpbWVwaWNrZXIvc3JjL2xpYi90aW1lLWlucHV0LWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBR1QsTUFBTSxFQUVOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQzs7QUFFdkIsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFhO0lBQzFDLE9BQU8sS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxLQUFhLEVBQ2IsVUFBbUI7SUFFbkIsTUFBTSxRQUFRLEdBQUcsVUFBVSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBRXhELE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sWUFBWSxHQUFHLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRy9FLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBQ3BDLElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lB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RHJDLFNBQVM7OzBCQXlDTCxNQUFNOzJCQUFDLFFBQVE7eUNBdENkLEtBQUs7c0JBRFIsS0FBSztnQkFnQkksV0FBVztzQkFBcEIsTUFBTTtnQkFFOEIsUUFBUTtzQkFBNUMsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEluamVjdCxcbiAgU2VsZixcbiAgSG9zdExpc3RlbmVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhaZXJvUHJlZml4KHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPCAxMCA/IGAwJHt2YWx1ZX1gIDogYCR7dmFsdWV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhaZXJvUHJlZml4TWVyaWRpZW0oXG4gIHZhbHVlOiBudW1iZXIsXG4gIGlzTWVyaWRpZW06IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBuZXdWYWx1ZSA9IGlzTWVyaWRpZW0gJiYgdmFsdWUgPT09IDAgPyAxMiA6IHZhbHVlO1xuXG4gIHJldHVybiB3aXRoWmVyb1ByZWZpeChuZXdWYWx1ZSk7XG59XG5cbmNvbnN0IERJR0lUX0tFWVMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAgKF8sIGkpID0+IGAke2l9YCk7XG5jb25zdCBTUEVDSUFMX0tFWVMgPSBbJ0JhY2tzcGFjZScsICdEZWxldGUnLCAnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnVGFiJ107XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1hdFRpbWVJbnB1dEJhc2Uge1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdGhpcy5oYXNGb2N1cykge1xuICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgLy8gd2UgbmVlZCB0aW1lb3V0IGhlcmUgdG8gc2V0IHBsYWNlaG9sZGVyIGZpcnN0IHRpbWVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0SW5wdXRQbGFjZWhvbGRlcih0aGlzLl92YWx1ZSk7XG4gICAgfSwgMCk7XG4gIH1cbiAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlcjtcblxuICBAT3V0cHV0KCkgdGltZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgX2tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBpc0FsbG93ID1cbiAgICAgIChESUdJVF9LRVlTLmluY2x1ZGVzKGV2ZW50LmtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5KSB8fFxuICAgICAgU1BFQ0lBTF9LRVlTLmluY2x1ZGVzKGV2ZW50LmNvZGUpO1xuXG4gICAgaWYgKCFpc0FsbG93KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpbnB1dEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIH1cblxuICBnZXQgaGFzRm9jdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudD8ubmF0aXZlRWxlbWVudCA9PT0gdGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PixcbiAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgKSB7fVxuXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuc2V0SW5wdXRWYWx1ZShudWxsKTtcbiAgfVxuXG4gIGJsdXIoKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4oTnVtYmVyKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9mb3JtYXRWYWx1ZShcbiAgICAgIGlzTnVtYmVyID8gTnVtYmVyKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlIHx8IHRoaXMuX3ZhbHVlKSA6IHRoaXMudmFsdWUsXG4gICAgKTtcbiAgICB0aGlzLnNldElucHV0VmFsdWUodmFsdWUpO1xuICAgIHRoaXMuc2V0SW5wdXRQbGFjZWhvbGRlcih2YWx1ZSk7XG4gICAgdGhpcy50aW1lQ2hhbmdlZC5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHNldElucHV0VmFsdWUodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gdGhpcy5fd2l0aFplcm9QcmVmaXgodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0RWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHNldElucHV0UGxhY2Vob2xkZXIodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuaW5wdXRFbGVtZW50LnBsYWNlaG9sZGVyID0gdGhpcy5fd2l0aFplcm9QcmVmaXgodmFsdWUpO1xuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFic3RyYWN0IF93aXRoWmVyb1ByZWZpeCh2YWx1ZTogbnVtYmVyKTogc3RyaW5nO1xuXG4gIGFic3RyYWN0IF9mb3JtYXRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyO1xufVxuIl19
|