@agorapulse/ui-components 0.0.2 → 2.5.2
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/agorapulse-ui-components-2.5.2.tgz +0 -0
- package/agorapulse-ui-components.d.ts +4 -3
- package/agorapulse-ui-components.metadata.json +1 -1
- package/assets/{lib-ui-components/icons → icons}/facebook-icon.png +0 -0
- package/assets/{lib-ui-components/icons → icons}/google-icon.png +0 -0
- package/assets/{lib-ui-components/icons → icons}/instagram-icon.png +0 -0
- package/assets/{lib-ui-components/icons → icons}/linkedin-icon.png +0 -0
- package/assets/{lib-ui-components/icons → icons}/pinterest-icon.png +0 -0
- package/assets/{lib-ui-components/icons → icons}/twitter-icon.png +0 -0
- package/assets/{lib-ui-components/icons → icons}/youtube-icon.png +0 -0
- package/assets/{lib-ui-components/img → img}/default-avatar-organization.png +0 -0
- package/assets/{lib-ui-components/img → img}/default-avatar-user.png +0 -0
- package/assets/{lib-ui-components/img → img}/default-avatar.png +0 -0
- package/assets/{lib-ui-components/img → img}/spinner_animation.gif +0 -0
- package/bundles/agorapulse-ui-components.umd.js +386 -9
- package/bundles/agorapulse-ui-components.umd.js.map +1 -1
- package/esm2015/agorapulse-ui-components.js +5 -4
- package/esm2015/src/lib/agorapulse-ui-components.module.js +7 -1
- package/esm2015/src/lib/directives/default-image.directive.js +2 -2
- package/esm2015/src/lib/edit-tag-modal/edit-tags-modal.component.js +2 -2
- package/esm2015/src/lib/neo-timepicker/neo-timepicker.component.js +371 -0
- package/fesm2015/agorapulse-ui-components.js +375 -4
- package/fesm2015/agorapulse-ui-components.js.map +1 -1
- package/package.json +8 -7
- package/src/lib/neo-timepicker/neo-timepicker.component.d.ts +129 -0
- package/agorapulse-ui-components-0.0.2.tgz +0 -0
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild, } from "@angular/core";
|
|
2
|
+
import format from "date-fns/format";
|
|
3
|
+
import parse from "date-fns/parse";
|
|
4
|
+
import IMask from "imask";
|
|
5
|
+
import { fromEvent, Subject } from "rxjs";
|
|
6
|
+
import { debounceTime, distinctUntilChanged, map, takeUntil, } from "rxjs/operators";
|
|
7
|
+
// FIXME Move these models when we remove the old timepicker
|
|
8
|
+
import { TimeFormat } from "../timepicker/timepicker.component";
|
|
9
|
+
export class NeoTimepickerComponent {
|
|
10
|
+
constructor(changeDetectorRef) {
|
|
11
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
12
|
+
this.i18n = {
|
|
13
|
+
hourLabel: 'Hour',
|
|
14
|
+
minuteLabel: 'Minute',
|
|
15
|
+
meridianLabel: 'AM/PM',
|
|
16
|
+
doneLabel: 'Done',
|
|
17
|
+
cancelLabel: 'Cancel',
|
|
18
|
+
};
|
|
19
|
+
this.disabled = false;
|
|
20
|
+
this.format = TimeFormat.Default;
|
|
21
|
+
this.invalid = false;
|
|
22
|
+
this.placement = 'bottom';
|
|
23
|
+
this.timeModelChange = new EventEmitter();
|
|
24
|
+
this.meridians = ['AM', 'PM'];
|
|
25
|
+
this.imaskDefault = {
|
|
26
|
+
mask: 'HH:MM',
|
|
27
|
+
blocks: {
|
|
28
|
+
HH: {
|
|
29
|
+
mask: IMask.MaskedRange,
|
|
30
|
+
from: 0,
|
|
31
|
+
to: 23,
|
|
32
|
+
autofix: 'pad',
|
|
33
|
+
},
|
|
34
|
+
MM: {
|
|
35
|
+
mask: IMask.MaskedRange,
|
|
36
|
+
from: 0,
|
|
37
|
+
to: 59,
|
|
38
|
+
autofix: 'pad',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
this.imaskMeridian = {
|
|
43
|
+
mask: 'HH:MM AMPM',
|
|
44
|
+
blocks: {
|
|
45
|
+
HH: {
|
|
46
|
+
mask: IMask.MaskedRange,
|
|
47
|
+
from: 1,
|
|
48
|
+
to: 12,
|
|
49
|
+
autofix: 'pad',
|
|
50
|
+
},
|
|
51
|
+
MM: {
|
|
52
|
+
mask: IMask.MaskedRange,
|
|
53
|
+
from: 0,
|
|
54
|
+
to: 59,
|
|
55
|
+
autofix: 'pad',
|
|
56
|
+
},
|
|
57
|
+
AMPM: {
|
|
58
|
+
mask: IMask.MaskedEnum,
|
|
59
|
+
enum: ['AM', 'PM']
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
lazy: false,
|
|
63
|
+
prepare: function (str) {
|
|
64
|
+
return str.toUpperCase();
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
this.ENTER_KEY = 'Enter';
|
|
68
|
+
this.ESCAPE_KEY = 'Escape';
|
|
69
|
+
this.FIX_NUMBER = 10;
|
|
70
|
+
this.HOURS_MAX = 24;
|
|
71
|
+
this.HOURS_MERIDIAN_MAX = 12;
|
|
72
|
+
this.MARGIN = 8;
|
|
73
|
+
this.MINUTES_MAX = 60;
|
|
74
|
+
this.TIME_OPTION_HEIGHT = 387;
|
|
75
|
+
this.TIME_PICKER_DEFAULT_WIDTH = 96;
|
|
76
|
+
this.TIME_PICKER_MERIDIAN_WIDTH = 152;
|
|
77
|
+
this.ROW_HEIGHT = 34;
|
|
78
|
+
this.hours = [];
|
|
79
|
+
this.minutes = [];
|
|
80
|
+
this.position = null;
|
|
81
|
+
this.TimeFormat = TimeFormat;
|
|
82
|
+
}
|
|
83
|
+
onKeypress(event) {
|
|
84
|
+
if (this.timepickerOpened) {
|
|
85
|
+
if (event.code === this.ENTER_KEY) {
|
|
86
|
+
this.onSaveSelection();
|
|
87
|
+
}
|
|
88
|
+
if (event.code === this.ESCAPE_KEY) {
|
|
89
|
+
this.onCancelSelection();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
ngOnInit() {
|
|
94
|
+
this.generateTimeSlots();
|
|
95
|
+
this.onTimeModelChange();
|
|
96
|
+
}
|
|
97
|
+
ngOnChanges(changes) {
|
|
98
|
+
var _a, _b, _c;
|
|
99
|
+
this.generateTimeSlots();
|
|
100
|
+
if ((_a = changes.format) === null || _a === void 0 ? void 0 : _a.currentValue) {
|
|
101
|
+
this.timeFormat = this.format === TimeFormat.Default ? 'HH:mm' : 'hh:mm a';
|
|
102
|
+
if (this.format === TimeFormat.Default && this.meridians.some(meridian => { var _a; return (_a = this.timeModel) === null || _a === void 0 ? void 0 : _a.endsWith(meridian); })) {
|
|
103
|
+
this.timeModel = NeoTimepickerComponent.convert12To24(this.timeModel);
|
|
104
|
+
}
|
|
105
|
+
else if (this.format === TimeFormat.Meridian && this.meridians.every(meridian => { var _a; return !((_a = this.timeModel) === null || _a === void 0 ? void 0 : _a.endsWith(meridian)); })) {
|
|
106
|
+
this.timeModel = NeoTimepickerComponent.convert24To12(this.timeModel);
|
|
107
|
+
}
|
|
108
|
+
setTimeout(() => this.changeDetectorRef.markForCheck());
|
|
109
|
+
}
|
|
110
|
+
if ((_b = changes.placement) === null || _b === void 0 ? void 0 : _b.currentValue) {
|
|
111
|
+
this.updateTimePickerPosition();
|
|
112
|
+
}
|
|
113
|
+
if ((_c = changes.format) === null || _c === void 0 ? void 0 : _c.currentValue) {
|
|
114
|
+
this.updateTimePickerPosition();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
onOpenTimepicker() {
|
|
118
|
+
this.destroy$ = new Subject();
|
|
119
|
+
this.previousValue = this.timeModel;
|
|
120
|
+
this.timepickerOpened = true;
|
|
121
|
+
this.timepickerClosed = false;
|
|
122
|
+
this.updateTimePickerPosition();
|
|
123
|
+
setTimeout(() => {
|
|
124
|
+
this.updateElementPosition('minute', this.selectedMinute, 'auto');
|
|
125
|
+
this.updateElementPosition('hour', this.selectedHour, 'auto');
|
|
126
|
+
this.updateElementPosition('meridian', this.selectedMeridian, 'auto');
|
|
127
|
+
this.inputBox.nativeElement.focus();
|
|
128
|
+
this.inputBox.nativeElement.select();
|
|
129
|
+
}, 1);
|
|
130
|
+
this.changeDetectorRef.markForCheck();
|
|
131
|
+
}
|
|
132
|
+
onTimepickerOpened() {
|
|
133
|
+
this.hoursScrollObserver$ = this.onObserveElementScroll(this.hourOptions.nativeElement);
|
|
134
|
+
this.minutesScrollObserver$ = this.onObserveElementScroll(this.minutesOptions.nativeElement);
|
|
135
|
+
this.hoursScrollObserver$.subscribe((indexToScroll) => {
|
|
136
|
+
this.updateTimeModel(this.hours[indexToScroll], this.selectedMinute, this.selectedMeridian);
|
|
137
|
+
});
|
|
138
|
+
this.minutesScrollObserver$.subscribe((indexToScroll) => {
|
|
139
|
+
this.updateTimeModel(this.selectedHour, this.minutes[indexToScroll], this.selectedMeridian);
|
|
140
|
+
});
|
|
141
|
+
if (this.format === TimeFormat.Meridian) {
|
|
142
|
+
this.meridiansScrollObserver$ = this.onObserveElementScroll(this.meridiansOptions.nativeElement);
|
|
143
|
+
this.meridiansScrollObserver$.subscribe((indexToScroll) => {
|
|
144
|
+
this.updateTimeModel(this.selectedHour, this.selectedMinute, this.meridians[indexToScroll]);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
onObserveElementScroll(element) {
|
|
149
|
+
return fromEvent(element, 'scroll').pipe(debounceTime(150), distinctUntilChanged(), takeUntil(this.destroy$), map(() => {
|
|
150
|
+
return Math.round(element.scrollTop / this.ROW_HEIGHT);
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
onTimePickerClosed() {
|
|
154
|
+
this.onCancelSelection();
|
|
155
|
+
this.destroy$.next();
|
|
156
|
+
this.destroy$.complete();
|
|
157
|
+
}
|
|
158
|
+
onTimeModelChange() {
|
|
159
|
+
let date = new Date();
|
|
160
|
+
if (this.timeModel) {
|
|
161
|
+
date = parse(this.timeModel, this.timeFormat, new Date());
|
|
162
|
+
}
|
|
163
|
+
this.timeModel = format(date, this.timeFormat);
|
|
164
|
+
if (!this.previousValue) {
|
|
165
|
+
this.previousValue = this.timeModel;
|
|
166
|
+
}
|
|
167
|
+
let jsHour = date.getHours();
|
|
168
|
+
if (this.format === TimeFormat.Meridian) {
|
|
169
|
+
if (jsHour > 12) {
|
|
170
|
+
jsHour = jsHour - 12;
|
|
171
|
+
}
|
|
172
|
+
// JS doesn't handle well AM/PM hour so 12:53 PM will be 00:53 ...
|
|
173
|
+
if (jsHour == 0) {
|
|
174
|
+
jsHour = 12;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const hour = NeoTimepickerComponent.toFixed(jsHour.toString(), 10);
|
|
178
|
+
if (hour != this.selectedHour) {
|
|
179
|
+
this.selectedHour = hour;
|
|
180
|
+
this.updateElementPosition('hour', this.selectedHour, 'auto');
|
|
181
|
+
}
|
|
182
|
+
const minute = NeoTimepickerComponent.toFixed(date.getMinutes().toString(), 10);
|
|
183
|
+
if (minute != this.selectedMinute) {
|
|
184
|
+
this.selectedMinute = minute;
|
|
185
|
+
this.updateElementPosition('minute', this.selectedMinute, 'auto');
|
|
186
|
+
}
|
|
187
|
+
if (this.format === TimeFormat.Meridian && this.selectedMeridian !== this.timeModel.split(' ')[1]) {
|
|
188
|
+
this.selectedMeridian = this.timeModel.split(' ')[1];
|
|
189
|
+
this.updateElementPosition('meridian', this.selectedMeridian, 'auto');
|
|
190
|
+
}
|
|
191
|
+
this.changeDetectorRef.markForCheck();
|
|
192
|
+
}
|
|
193
|
+
onSelectHour(hour) {
|
|
194
|
+
this.updateTimeModel(hour, this.selectedMinute, this.selectedMeridian);
|
|
195
|
+
}
|
|
196
|
+
onSelectMinute(minute) {
|
|
197
|
+
this.updateTimeModel(this.selectedHour, minute, this.selectedMeridian);
|
|
198
|
+
}
|
|
199
|
+
onSelectMeridian(meridian) {
|
|
200
|
+
this.updateTimeModel(this.selectedHour, this.selectedMinute, meridian);
|
|
201
|
+
}
|
|
202
|
+
onSaveSelection() {
|
|
203
|
+
this.previousValue = this.timeModel;
|
|
204
|
+
this.timepickerClosed = true;
|
|
205
|
+
this.timepickerOpened = false;
|
|
206
|
+
const timeModelValue = parse(this.timeModel, this.timeFormat, new Date());
|
|
207
|
+
this.timeModelChange.emit({
|
|
208
|
+
hours: timeModelValue.getHours(),
|
|
209
|
+
minutes: timeModelValue.getMinutes(),
|
|
210
|
+
});
|
|
211
|
+
this.changeDetectorRef.markForCheck();
|
|
212
|
+
}
|
|
213
|
+
onCancelSelection() {
|
|
214
|
+
this.timepickerClosed = true;
|
|
215
|
+
this.timepickerOpened = false;
|
|
216
|
+
this.timeModel = this.previousValue;
|
|
217
|
+
this.changeDetectorRef.markForCheck();
|
|
218
|
+
}
|
|
219
|
+
onMaskValidateComplete(value) {
|
|
220
|
+
if (this.timeModel !== value) {
|
|
221
|
+
this.timeModel = value;
|
|
222
|
+
}
|
|
223
|
+
this.onTimeModelChange();
|
|
224
|
+
}
|
|
225
|
+
updateTimeModel(hour, minute, meridian) {
|
|
226
|
+
if (this.format === TimeFormat.Meridian) {
|
|
227
|
+
this.timeModel = `${hour}:${minute} ${meridian}`;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.timeModel = `${hour}:${minute}`;
|
|
231
|
+
}
|
|
232
|
+
this.changeDetectorRef.markForCheck();
|
|
233
|
+
}
|
|
234
|
+
updateElementPosition(elementType, id, scrollBehavior) {
|
|
235
|
+
const element = document.getElementById(`${elementType}-${id}`);
|
|
236
|
+
this.scrollToElement(element, scrollBehavior);
|
|
237
|
+
}
|
|
238
|
+
scrollToElement(element, behavior = 'auto') {
|
|
239
|
+
if (element) {
|
|
240
|
+
setTimeout(() => {
|
|
241
|
+
element.scrollIntoView({
|
|
242
|
+
behavior,
|
|
243
|
+
block: 'center',
|
|
244
|
+
inline: 'center'
|
|
245
|
+
});
|
|
246
|
+
}, 1);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Fullfill minutes and hours arrays like [0, 1, 2 ... 12] and [0, 1, 2, ... 59]
|
|
251
|
+
*/
|
|
252
|
+
generateTimeSlots() {
|
|
253
|
+
this.hours = [];
|
|
254
|
+
this.minutes = [NeoTimepickerComponent.toFixed(0, this.FIX_NUMBER)];
|
|
255
|
+
for (let i = 1; i <= this.HOURS_MERIDIAN_MAX; i++) {
|
|
256
|
+
const indexToAdd = NeoTimepickerComponent.toFixed(i, this.FIX_NUMBER);
|
|
257
|
+
this.hours.push(indexToAdd);
|
|
258
|
+
this.minutes.push(indexToAdd);
|
|
259
|
+
}
|
|
260
|
+
if (this.format === TimeFormat.Default) {
|
|
261
|
+
this.hours = [NeoTimepickerComponent.toFixed(0, this.FIX_NUMBER), ...this.hours];
|
|
262
|
+
for (let i = 13; i < this.HOURS_MAX; i++) {
|
|
263
|
+
this.hours.push(NeoTimepickerComponent.toFixed(i, this.FIX_NUMBER));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
for (let i = 13; i < this.MINUTES_MAX; i++) {
|
|
267
|
+
this.minutes.push(NeoTimepickerComponent.toFixed(i, this.FIX_NUMBER));
|
|
268
|
+
}
|
|
269
|
+
this.changeDetectorRef.markForCheck();
|
|
270
|
+
}
|
|
271
|
+
updateTimePickerPosition() {
|
|
272
|
+
var _a;
|
|
273
|
+
if ((_a = this.inputBox) === null || _a === void 0 ? void 0 : _a.nativeElement) {
|
|
274
|
+
const inputBoxBounds = this.inputBox.nativeElement.getBoundingClientRect();
|
|
275
|
+
const topPosition = inputBoxBounds.top - this.TIME_OPTION_HEIGHT - this.MARGIN;
|
|
276
|
+
const bottomPosition = inputBoxBounds.top + inputBoxBounds.height;
|
|
277
|
+
const timePickerWidth = this.format === TimeFormat.Meridian ? this.TIME_PICKER_MERIDIAN_WIDTH : this.TIME_PICKER_DEFAULT_WIDTH;
|
|
278
|
+
const shift = (timePickerWidth - inputBoxBounds.width) / 2;
|
|
279
|
+
if (this.placement === 'top') {
|
|
280
|
+
this.position = {
|
|
281
|
+
top: topPosition < 0 ? bottomPosition : topPosition,
|
|
282
|
+
left: inputBoxBounds.left - shift,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
this.position = {
|
|
287
|
+
top: bottomPosition + this.TIME_OPTION_HEIGHT + this.MARGIN > window.innerHeight ? topPosition : bottomPosition,
|
|
288
|
+
left: inputBoxBounds.left - shift,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
this.changeDetectorRef.markForCheck();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
static convert12To24(time) {
|
|
295
|
+
const terms = time.split(':');
|
|
296
|
+
const minutes = terms[1].substring(0, 2);
|
|
297
|
+
const meridian = terms[1].trim().slice(-2).toUpperCase();
|
|
298
|
+
let hour = parseInt(terms[0]);
|
|
299
|
+
if (!isNaN(parseInt(terms[0]))) {
|
|
300
|
+
if (meridian === 'PM' && hour < 12) {
|
|
301
|
+
hour = hour + 12;
|
|
302
|
+
}
|
|
303
|
+
if (meridian === 'AM' && hour === 12) {
|
|
304
|
+
hour = 0;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return `${hour}:${minutes}`;
|
|
308
|
+
}
|
|
309
|
+
static convert24To12(time) {
|
|
310
|
+
const terms = time.split(':');
|
|
311
|
+
let meridian = 'AM';
|
|
312
|
+
let hour = parseInt(terms[0]);
|
|
313
|
+
let minute = parseInt(terms[1]);
|
|
314
|
+
if (!isNaN(parseInt(terms[0]))) {
|
|
315
|
+
if (hour >= 12) {
|
|
316
|
+
meridian = 'PM';
|
|
317
|
+
if (hour > 12) {
|
|
318
|
+
hour = hour - 12;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (hour === 0) {
|
|
322
|
+
hour = 12;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const hourStr = NeoTimepickerComponent.toFixed(hour, 10);
|
|
326
|
+
const minuteStr = NeoTimepickerComponent.toFixed(minute, 10);
|
|
327
|
+
return `${hourStr}:${minuteStr} ${meridian}`;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Return 08 for 8, 06 for 6
|
|
331
|
+
* @param num
|
|
332
|
+
* @param fix
|
|
333
|
+
* @private
|
|
334
|
+
*/
|
|
335
|
+
static toFixed(num, fix) {
|
|
336
|
+
let fixedNum = num.toString();
|
|
337
|
+
if (num < fix) {
|
|
338
|
+
fixedNum = `0${fixedNum}`;
|
|
339
|
+
}
|
|
340
|
+
return fixedNum;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
NeoTimepickerComponent.decorators = [
|
|
344
|
+
{ type: Component, args: [{
|
|
345
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
346
|
+
selector: 'ap-neo-timepicker',
|
|
347
|
+
template: "<div class=\"time-picker-container\">\n <ng-template #timeOptionsTemplate>\n <div class=\"time-picker-options\"\n [class.meridian]=\"format === TimeFormat.Meridian\"\n *ngIf=\"timepickerOpened\"\n #timepicker\n >\n <div class=\"header\">\n <span> {{ i18n.hourLabel }} </span>\n <span> {{ i18n.minuteLabel }} </span>\n <span *ngIf=\"format === TimeFormat.Meridian\"> {{ i18n.meridianLabel }} </span>\n </div>\n <div class=\"content\">\n <div class=\"selector\">\n <span>:</span>\n <span *ngIf=\"format === TimeFormat.Meridian\"></span>\n </div>\n <div class=\"options\"\n #hourOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let hour of hours;\"\n class=\"option\"\n [id]=\"'hour-' + hour\"\n [class.selected]=\"hour === selectedHour\"\n (click)=\"onSelectHour(hour)\">\n {{ hour }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n <div class=\"divider\"></div>\n <div class=\"options\"\n #minutesOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let minute of minutes;\"\n class=\"option\"\n [id]=\"'minute-' + minute\"\n [class.selected]=\"minute === selectedMinute\"\n (click)=\"onSelectMinute(minute)\">\n {{ minute }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n <div *ngIf=\"format === TimeFormat.Meridian\"\n class=\"divider\"></div>\n <div *ngIf=\"format === TimeFormat.Meridian\"\n class=\"options\"\n #meridiansOptions>\n <div class=\"invisible-block\"></div>\n <div *ngFor=\"let meridian of meridians;\"\n class=\"option\"\n [id]=\"'meridian-' + meridian\"\n [class.selected]=\"selectedMeridian === meridian\"\n (click)=\"onSelectMeridian(meridian)\">\n {{ meridian }}\n </div>\n <div class=\"invisible-block\"></div>\n </div>\n </div>\n <div class=\"buttons\">\n <button mat-flat-button\n class=\"full-width\"\n color=\"primary\"\n (click)=\"onSaveSelection()\">\n {{ i18n.doneLabel }}\n </button>\n <button mat-flat-button\n class=\"full-width\"\n (click)=\"onCancelSelection()\">\n {{ i18n.cancelLabel }}\n </button>\n </div>\n </div>\n </ng-template>\n <input #inputBox\n class=\"time-input\"\n placement=\"bottom right\"\n color=\"secondary\"\n [class.active]=\"timepickerOpened\"\n [class.invalid]=\"invalid\"\n [apPopmenu]=\"timeOptionsTemplate\"\n [apPopmenuBackground]=\"false\"\n [apPopmenuBorder]=\"false\"\n [apPopmenuDisabled]=\"timepickerOpened\"\n [apTooltipNeo]=\"{content: invalidationMessage, display: invalidationMessage && invalid}\"\n [close]=\"timepickerClosed\"\n [disabled]=\"disabled\"\n [imask]=\"format === TimeFormat.Meridian ? imaskMeridian : imaskDefault\"\n [(ngModel)]=\"timeModel\"\n [pointer]=\"true\"\n [position]=\"position\"\n [rounded]=\"true\"\n [shadow]=\"false\"\n (click)=\"onOpenTimepicker()\"\n (complete)=\"onMaskValidateComplete($event)\"\n (menuClosed)=\"onTimePickerClosed()\"\n (menuOpened)=\"onTimepickerOpened()\">\n</div>\n",
|
|
348
|
+
styles: ["[color=facebook]{color:#1877f2}[bgcolor=facebook],[hcolor=facebook]:hover{background-color:#1877f2}[border=facebook]{border:1px solid #1877f2}[color=google]{color:#4e85e8}[bgcolor=google],[hcolor=google]:hover{background-color:#4e85e8}[border=google]{border:1px solid #4e85e8}[color=instagram]{color:#e1306c}[bgcolor=instagram],[hcolor=instagram]:hover{background-color:#e1306c}[border=instagram]{border:1px solid #e1306c}[color=instagrammagenta]{color:#c13584}[bgcolor=instagrammagenta],[hcolor=instagrammagenta]:hover{background-color:#c13584}[border=instagrammagenta]{border:1px solid #c13584}[color=instagramblue]{color:#5851db}[bgcolor=instagramblue],[hcolor=instagramblue]:hover{background-color:#5851db}[border=instagramblue]{border:1px solid #5851db}[color=instagrampurple]{color:#833ab4}[bgcolor=instagrampurple],[hcolor=instagrampurple]:hover{background-color:#833ab4}[border=instagrampurple]{border:1px solid #833ab4}[color=instagramorange]{color:#f56040}[bgcolor=instagramorange],[hcolor=instagramorange]:hover{background-color:#f56040}[border=instagramorange]{border:1px solid #f56040}[color=instagramyellow]{color:#ffdc80}[bgcolor=instagramyellow],[hcolor=instagramyellow]:hover{background-color:#ffdc80}[border=instagramyellow]{border:1px solid #ffdc80}[color=linkedin]{color:#2c67bc}[bgcolor=linkedin],[hcolor=linkedin]:hover{background-color:#2c67bc}[border=linkedin]{border:1px solid #2c67bc}[color=twitter]{color:#55acee}[bgcolor=twitter],[hcolor=twitter]:hover{background-color:#55acee}[border=twitter]{border:1px solid #55acee}[color=youtube]{color:red}[bgcolor=youtube],[hcolor=youtube]:hover{background-color:red}[border=youtube]{border:1px solid red}[color=blood-orange]{color:#ff4d00}[bgcolor=blood-orange],[hcolor=blood-orange]:hover{background-color:#ff4d00}[border=blood-orange]{border:1px solid #ff4d00}[color=pinkish-orange]{color:#ff7b49}[bgcolor=pinkish-orange],[hcolor=pinkish-orange]:hover{background-color:#ff7b49}[border=pinkish-orange]{border:1px solid #ff7b49}[color=charcoal-grey]{color:#2a2f34}[bgcolor=charcoal-grey],[hcolor=charcoal-grey]:hover{background-color:#2a2f34}[border=charcoal-grey]{border:1px solid #2a2f34}[color=azure]{color:#00aeef}[bgcolor=azure],[hcolor=azure]:hover{background-color:#00aeef}[border=azure]{border:1px solid #00aeef}[color=light-azure]{color:#eaf5fd}[bgcolor=light-azure],[hcolor=light-azure]:hover{background-color:#eaf5fd}[border=light-azure]{border:1px solid #eaf5fd}[color=blue-grey]{color:#8d98a9}[bgcolor=blue-grey],[hcolor=blue-grey]:hover{background-color:#8d98a9}[border=blue-grey]{border:1px solid #8d98a9}[color=silver]{color:#ced0da}[bgcolor=silver],[hcolor=silver]:hover{background-color:#ced0da}[border=silver]{border:1px solid #ced0da}[color=pale-grey]{color:#dfe3e9}[bgcolor=pale-grey],[hcolor=pale-grey]:hover{background-color:#dfe3e9}[border=pale-grey]{border:1px solid #dfe3e9}[color=grey-white]{color:#f5f7f8}[bgcolor=grey-white],[hcolor=grey-white]:hover{background-color:#f5f7f8}[border=grey-white]{border:1px solid #f5f7f8}[color=cool-grey]{color:#b4bbc6}[bgcolor=cool-grey],[hcolor=cool-grey]:hover{background-color:#b4bbc6}[border=cool-grey]{border:1px solid #b4bbc6}[color=black]{color:#344563}[bgcolor=black],[hcolor=black]:hover{background-color:#344563}[border=black]{border:1px solid #344563}[color=grey-blue]{color:#68768c}[bgcolor=grey-blue],[hcolor=grey-blue]:hover{background-color:#68768c}[border=grey-blue]{border:1px solid #68768c}[color=strawberry]{color:#f4282d}[bgcolor=strawberry],[hcolor=strawberry]:hover{background-color:#f4282d}[border=strawberry]{border:1px solid #f4282d}[color=light-strawberry]{color:#f8eded}[bgcolor=light-strawberry],[hcolor=light-strawberry]:hover{background-color:#f8eded}[border=light-strawberry]{border:1px solid #f8eded}[color=white]{color:#fff}[bgcolor=white],[hcolor=white]:hover{background-color:#fff}[border=white]{border:1px solid #fff}[color=cool-green]{color:#33c15d}[bgcolor=cool-green],[hcolor=cool-green]:hover{background-color:#33c15d}[border=cool-green]{border:1px solid #33c15d}[color=light-green]{color:#ebfaef}[bgcolor=light-green],[hcolor=light-green]:hover{background-color:#ebfaef}[border=light-green]{border:1px solid #ebfaef}[color=transparent]{color:#0000}[bgcolor=transparent],[hcolor=transparent]:hover{background-color:initial}[border=transparent]{border:1px solid #0000}[color=c0]{color:#a566a5}[bgcolor=c0],[hcolor=c0]:hover{background-color:#a566a5}[border=c0]{border:1px solid #a566a5}[color=c1]{color:#c7ab82}[bgcolor=c1],[hcolor=c1]:hover{background-color:#c7ab82}[border=c1]{border:1px solid #c7ab82}[color=c2]{color:#f2713c}[bgcolor=c2],[hcolor=c2]:hover{background-color:#f2713c}[border=c2]{border:1px solid #f2713c}[color=c3]{color:#ffd006}[bgcolor=c3],[hcolor=c3]:hover{background-color:#ffd006}[border=c3]{border:1px solid #ffd006}[color=c4]{color:#94c5aa}[bgcolor=c4],[hcolor=c4]:hover{background-color:#94c5aa}[border=c4]{border:1px solid #94c5aa}[color=c5]{color:#2a9d8f}[bgcolor=c5],[hcolor=c5]:hover{background-color:#2a9d8f}[border=c5]{border:1px solid #2a9d8f}[color=c6]{color:#78acd8}[bgcolor=c6],[hcolor=c6]:hover{background-color:#78acd8}[border=c6]{border:1px solid #78acd8}[color=c7]{color:#525a9e}[bgcolor=c7],[hcolor=c7]:hover{background-color:#525a9e}[border=c7]{border:1px solid #525a9e}[color=c8]{color:#6a2459}[bgcolor=c8],[hcolor=c8]:hover{background-color:#6a2459}[border=c8]{border:1px solid #6a2459}[color=c9]{color:#74729e}[bgcolor=c9],[hcolor=c9]:hover{background-color:#74729e}[border=c9]{border:1px solid #74729e}.time-picker-container{display:flex}.time-input{width:80px;max-width:80px;text-align:center;padding:0;margin:0;height:36px;line-height:24px}.time-input.active{border-color:#178dfe}.time-picker-options{display:flex;flex-direction:column;width:96px;margin-top:8px;max-width:96px;height:379px;background:#fff;border-radius:4px;overflow:hidden;box-shadow:0 3px 10px #00000014}.time-picker-options.meridian{width:152px;max-width:152px}.time-picker-options .header{display:flex;align-items:center;min-height:29px;border-bottom:1px solid #eaecef;color:#344563;font-size:12px;line-height:18px}.time-picker-options .header>span{flex:1;text-align:center}.time-picker-options .content{display:flex;position:relative;min-height:252px;overflow:hidden}.time-picker-options .content .selector{display:flex;justify-content:space-evenly;align-items:center;background-color:#f9f9fa;border-top:1px solid #eaecef;border-bottom:1px solid #eaecef;width:100%;height:34px;position:absolute;top:50%;transform:translateY(-50%);z-index:4;box-sizing:border-box}.time-picker-options .content .divider{height:100%;width:1px;background:#eaecef}.time-picker-options .content .options{flex:1;height:100%;overflow-y:scroll;z-index:5;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none}.time-picker-options .content .options::-webkit-scrollbar{display:none}.time-picker-options .content .options .invisible-block{min-height:109px;max-height:109px;width:100%}.time-picker-options .content .options .option{min-height:34px;display:flex;z-index:5;justify-content:center;align-items:center;font-size:14px;line-height:17px;color:#aeb5c1;scroll-snap-align:center;padding-block:1px;box-sizing:border-box}.time-picker-options .content .options .option:hover{color:#178dfe;cursor:pointer}.time-picker-options .content .options .option.selected{color:#344563!important}.time-picker-options .content .meridian{flex:1;display:flex;flex-direction:column;justify-content:center}.time-picker-options .content .meridian>div{min-height:34px;display:flex;justify-content:center;align-items:center;font-size:14px;line-height:17px;color:#aeb5c1;scroll-snap-align:center}.time-picker-options .buttons{display:flex;flex-direction:column;padding:8px;min-height:96px;border-top:1px solid #eaecef;grid-gap:8px;gap:8px}.time-picker-options .buttons button{font-weight:700;min-width:80px}"]
|
|
349
|
+
},] }
|
|
350
|
+
];
|
|
351
|
+
/** @nocollapse */
|
|
352
|
+
NeoTimepickerComponent.ctorParameters = () => [
|
|
353
|
+
{ type: ChangeDetectorRef }
|
|
354
|
+
];
|
|
355
|
+
NeoTimepickerComponent.propDecorators = {
|
|
356
|
+
inputBox: [{ type: ViewChild, args: ['inputBox',] }],
|
|
357
|
+
hourOptions: [{ type: ViewChild, args: ['hourOptions',] }],
|
|
358
|
+
minutesOptions: [{ type: ViewChild, args: ['minutesOptions',] }],
|
|
359
|
+
meridiansOptions: [{ type: ViewChild, args: ['meridiansOptions',] }],
|
|
360
|
+
timepicker: [{ type: ViewChild, args: ['timepicker',] }],
|
|
361
|
+
i18n: [{ type: Input }],
|
|
362
|
+
disabled: [{ type: Input }],
|
|
363
|
+
format: [{ type: Input }],
|
|
364
|
+
invalid: [{ type: Input }],
|
|
365
|
+
invalidationMessage: [{ type: Input }],
|
|
366
|
+
placement: [{ type: Input }],
|
|
367
|
+
timeModel: [{ type: Input }],
|
|
368
|
+
timeModelChange: [{ type: Output }],
|
|
369
|
+
onKeypress: [{ type: HostListener, args: ['window:keydown', ['$event'],] }]
|
|
370
|
+
};
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvLXRpbWVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL3NyYy9saWIvbmVvLXRpbWVwaWNrZXIvbmVvLXRpbWVwaWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUNyQyxPQUFPLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUNuQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUNILFlBQVksRUFDWixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILFNBQVMsR0FDWixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLDREQUE0RDtBQUM1RCxPQUFPLEVBQVEsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFnQnRFLE1BQU0sT0FBTyxzQkFBc0I7SUE2Ry9CLFlBQW1CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBckc5QyxTQUFJLEdBQWdDO1lBQ3pDLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLGFBQWEsRUFBRSxPQUFPO1lBQ3RCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFdBQVcsRUFBRSxRQUFRO1NBQ3hCLENBQUM7UUFDTyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFdBQU0sR0FBZSxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ3hDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFekIs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ICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBmb3JtYXQgZnJvbSBcImRhdGUtZm5zL2Zvcm1hdFwiO1xuaW1wb3J0IHBhcnNlIGZyb20gXCJkYXRlLWZucy9wYXJzZVwiO1xuaW1wb3J0IElNYXNrIGZyb20gXCJpbWFza1wiO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7XG4gICAgZGVib3VuY2VUaW1lLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICAgIG1hcCxcbiAgICB0YWtlVW50aWwsXG59IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuLy8gRklYTUUgTW92ZSB0aGVzZSBtb2RlbHMgd2hlbiB3ZSByZW1vdmUgdGhlIG9sZCB0aW1lcGlja2VyXG5pbXBvcnQgeyBUaW1lLCBUaW1lRm9ybWF0IH0gZnJvbSBcIi4uL3RpbWVwaWNrZXIvdGltZXBpY2tlci5jb21wb25lbnRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lUGlja2VyVHJhbnNsYXRlZFN0cmluZ3Mge1xuICAgIGhvdXJMYWJlbDogc3RyaW5nO1xuICAgIG1pbnV0ZUxhYmVsOiBzdHJpbmc7XG4gICAgbWVyaWRpYW5MYWJlbDogc3RyaW5nO1xuICAgIGRvbmVMYWJlbDogc3RyaW5nO1xuICAgIGNhbmNlbExhYmVsOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHNlbGVjdG9yOiAnYXAtbmVvLXRpbWVwaWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZW8tdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbmVvLXRpbWVwaWNrZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZW9UaW1lcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRCb3gnKSBpbnB1dEJveDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdob3VyT3B0aW9ucycpIGhvdXJPcHRpb25zOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ21pbnV0ZXNPcHRpb25zJykgbWludXRlc09wdGlvbnM6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnbWVyaWRpYW5zT3B0aW9ucycpIG1lcmlkaWFuc09wdGlvbnM6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgndGltZXBpY2tlcicpIHRpbWVwaWNrZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBASW5wdXQoKSBpMThuOiBUaW1lUGlja2VyVHJhbnNsYXRlZFN0cmluZ3MgPSB7XG4gICAgICAgIGhvdXJMYWJlbDogJ0hvdXInLFxuICAgICAgICBtaW51dGVMYWJlbDogJ01pbnV0ZScsXG4gICAgICAgIG1lcmlkaWFuTGFiZWw6ICdBTS9QTScsXG4gICAgICAgIGRvbmVMYWJlbDogJ0RvbmUnLFxuICAgICAgICBjYW5jZWxMYWJlbDogJ0NhbmNlbCcsXG4gICAgfTtcbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGZvcm1hdDogVGltZUZvcm1hdCA9IFRpbWVGb3JtYXQuRGVmYXVsdDtcbiAgICBASW5wdXQoKSBpbnZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgaW52YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHBsYWNlbWVudDogJ3RvcCcgfCAnYm90dG9tJyA9ICdib3R0b20nO1xuICAgIEBJbnB1dCgpIHRpbWVNb2RlbDogc3RyaW5nO1xuXG4gICAgQE91dHB1dCgpIHRpbWVNb2RlbENoYW5nZTogRXZlbnRFbWl0dGVyPFRpbWU+ID0gbmV3IEV2ZW50RW1pdHRlcjxUaW1lPigpO1xuXG4gICAgcmVhZG9ubHkgbWVyaWRpYW5zOiBzdHJpbmdbXSA9IFsnQU0nLCAnUE0nXTtcbiAgICByZWFkb25seSBpbWFza0RlZmF1bHQgPSB7XG4gICAgICAgIG1hc2s6ICdISDpNTScsXG4gICAgICAgIGJsb2Nrczoge1xuICAgICAgICAgICAgSEg6IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBJTWFzay5NYXNrZWRSYW5nZSxcbiAgICAgICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgICAgIHRvOiAyMyxcbiAgICAgICAgICAgICAgICBhdXRvZml4OiAncGFkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBNTToge1xuICAgICAgICAgICAgICAgIG1hc2s6IElNYXNrLk1hc2tlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgICAgICAgdG86IDU5LFxuICAgICAgICAgICAgICAgIGF1dG9maXg6ICdwYWQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJlYWRvbmx5IGltYXNrTWVyaWRpYW4gPSB7XG4gICAgICAgIG1hc2s6ICdISDpNTSBBTVBNJyxcbiAgICAgICAgYmxvY2tzOiB7XG4gICAgICAgICAgICBISDoge1xuICAgICAgICAgICAgICAgIG1hc2s6IElNYXNrLk1hc2tlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGZyb206IDEsXG4gICAgICAgICAgICAgICAgdG86IDEyLFxuICAgICAgICAgICAgICAgIGF1dG9maXg6ICdwYWQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE1NOiB7XG4gICAgICAgICAgICAgICAgbWFzazogSU1hc2suTWFza2VkUmFuZ2UsXG4gICAgICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgICAgICB0bzogNTksXG4gICAgICAgICAgICAgICAgYXV0b2ZpeDogJ3BhZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgQU1QTToge1xuICAgICAgICAgICAgICAgIG1hc2s6IElNYXNrLk1hc2tlZEVudW0sXG4gICAgICAgICAgICAgICAgZW51bTogWydBTScsICdQTSddXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxhenk6IGZhbHNlLFxuICAgICAgICBwcmVwYXJlOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHJlYWRvbmx5IEVOVEVSX0tFWTogc3RyaW5nID0gJ0VudGVyJztcbiAgICByZWFkb25seSBFU0NBUEVfS0VZOiBzdHJpbmcgPSAnRXNjYXBlJztcbiAgICByZWFkb25seSBGSVhfTlVNQkVSOiBudW1iZXIgPSAxMDtcbiAgICByZWFkb25seSBIT1VSU19NQVg6IG51bWJlciA9IDI0O1xuICAgIHJlYWRvbmx5IEhPVVJTX01FUklESUFOX01BWDogbnVtYmVyID0gMTI7XG4gICAgcmVhZG9ubHkgTUFSR0lOOiBudW1iZXIgPSA4O1xuICAgIHJlYWRvbmx5IE1JTlVURVNfTUFYOiBudW1iZXIgPSA2MDtcbiAgICByZWFkb25seSBUSU1FX09QVElPTl9IRUlHSFQ6IG51bWJlciA9IDM4NztcbiAgICByZWFkb25seSBUSU1FX1BJQ0tFUl9ERUZBVUxUX1dJRFRIOiBudW1iZXIgPSA5NjtcbiAgICByZWFkb25seSBUSU1FX1BJQ0tFUl9NRVJJRElBTl9XSURUSDogbnVtYmVyID0gMTUyO1xuICAgIHJlYWRvbmx5IFJPV19IRUlHSFQ6IG51bWJlciA9IDM0O1xuXG4gICAgZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD47XG4gICAgaG91cnM6IHN0cmluZ1tdID0gW107XG4gICAgaG91cnNTY3JvbGxPYnNlcnZlciQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgICBtZXJpZGlhbnNTY3JvbGxPYnNlcnZlciQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgICBtaW51dGVzU2Nyb2xsT2JzZXJ2ZXIkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgbWludXRlczogc3RyaW5nW10gPSBbXTtcbiAgICBwb3NpdGlvbjogeyB0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyIH0gPSBudWxsO1xuICAgIHByZXZpb3VzVmFsdWU6IHN0cmluZztcbiAgICBzZWxlY3RlZEhvdXI6IHN0cmluZztcbiAgICBzZWxlY3RlZE1pbnV0ZTogc3RyaW5nO1xuICAgIHNlbGVjdGVkTWVyaWRpYW46IHN0cmluZztcbiAgICB0aW1lcGlja2VyQ2xvc2VkOiBib29sZWFuO1xuICAgIHRpbWVwaWNrZXJPcGVuZWQ6IGJvb2xlYW47XG4gICAgVGltZUZvcm1hdCA9IFRpbWVGb3JtYXQ7XG4gICAgdGltZUZvcm1hdDogc3RyaW5nO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxuICAgIG9uS2V5cHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZXBpY2tlck9wZW5lZCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IHRoaXMuRU5URVJfS0VZKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblNhdmVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09IHRoaXMuRVNDQVBFX0tFWSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DYW5jZWxTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRpbWVTbG90cygpO1xuICAgICAgICB0aGlzLm9uVGltZU1vZGVsQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUaW1lU2xvdHMoKTtcbiAgICAgICAgaWYgKGNoYW5nZXMuZm9ybWF0Py5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZUZvcm1hdCA9IHRoaXMuZm9ybWF0ID09PSBUaW1lRm9ybWF0LkRlZmF1bHQgPyAnSEg6bW0nIDogJ2hoOm1tIGEnO1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBUaW1lRm9ybWF0LkRlZmF1bHQgJiYgdGhpcy5tZXJpZGlhbnMuc29tZShtZXJpZGlhbiA9PiB0aGlzLnRpbWVNb2RlbD8uZW5kc1dpdGgobWVyaWRpYW4pKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZU1vZGVsID0gTmVvVGltZXBpY2tlckNvbXBvbmVudC5jb252ZXJ0MTJUbzI0KHRoaXMudGltZU1vZGVsKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXQuTWVyaWRpYW4gJiYgdGhpcy5tZXJpZGlhbnMuZXZlcnkobWVyaWRpYW4gPT4gIXRoaXMudGltZU1vZGVsPy5lbmRzV2l0aChtZXJpZGlhbikpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lTW9kZWwgPSBOZW9UaW1lcGlja2VyQ29tcG9uZW50LmNvbnZlcnQyNFRvMTIodGhpcy50aW1lTW9kZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy5wbGFjZW1lbnQ/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lUGlja2VyUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy5mb3JtYXQ/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lUGlja2VyUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uT3BlblRpbWVwaWNrZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSB0aGlzLnRpbWVNb2RlbDtcbiAgICAgICAgdGhpcy50aW1lcGlja2VyT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50aW1lcGlja2VyQ2xvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZVBpY2tlclBvc2l0aW9uKCk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRQb3NpdGlvbignbWludXRlJywgdGhpcy5zZWxlY3RlZE1pbnV0ZSwgJ2F1dG8nKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uKCdob3VyJywgdGhpcy5zZWxlY3RlZEhvdXIsICdhdXRvJyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRQb3NpdGlvbignbWVyaWRpYW4nLCB0aGlzLnNlbGVjdGVkTWVyaWRpYW4sICdhdXRvJyk7XG4gICAgICAgICAgICB0aGlzLmlucHV0Qm94Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRCb3gubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgfSwgMSlcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBvblRpbWVwaWNrZXJPcGVuZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG91cnNTY3JvbGxPYnNlcnZlciQgPSB0aGlzLm9uT2JzZXJ2ZUVsZW1lbnRTY3JvbGwodGhpcy5ob3VyT3B0aW9ucy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5taW51dGVzU2Nyb2xsT2JzZXJ2ZXIkID0gdGhpcy5vbk9ic2VydmVFbGVtZW50U2Nyb2xsKHRoaXMubWludXRlc09wdGlvbnMubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5ob3Vyc1Njcm9sbE9ic2VydmVyJC5zdWJzY3JpYmUoKGluZGV4VG9TY3JvbGwpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZU1vZGVsKHRoaXMuaG91cnNbaW5kZXhUb1Njcm9sbF0sIHRoaXMuc2VsZWN0ZWRNaW51dGUsIHRoaXMuc2VsZWN0ZWRNZXJpZGlhbik7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMubWludXRlc1Njcm9sbE9ic2VydmVyJC5zdWJzY3JpYmUoKGluZGV4VG9TY3JvbGwpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZU1vZGVsKHRoaXMuc2VsZWN0ZWRIb3VyLCB0aGlzLm1pbnV0ZXNbaW5kZXhUb1Njcm9sbF0sIHRoaXMuc2VsZWN0ZWRNZXJpZGlhbik7XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBUaW1lRm9ybWF0Lk1lcmlkaWFuKSB7XG4gICAgICAgICAgICB0aGlzLm1lcmlkaWFuc1Njcm9sbE9ic2VydmVyJCA9IHRoaXMub25PYnNlcnZlRWxlbWVudFNjcm9sbCh0aGlzLm1lcmlkaWFuc09wdGlvbnMubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLm1lcmlkaWFuc1Njcm9sbE9ic2VydmVyJC5zdWJzY3JpYmUoKGluZGV4VG9TY3JvbGwpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVNb2RlbCh0aGlzLnNlbGVjdGVkSG91ciwgdGhpcy5zZWxlY3RlZE1pbnV0ZSwgdGhpcy5tZXJpZGlhbnNbaW5kZXhUb1Njcm9sbF0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgb25PYnNlcnZlRWxlbWVudFNjcm9sbChlbGVtZW50OiBIVE1MRWxlbWVudCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBmcm9tRXZlbnQoZWxlbWVudCwgJ3Njcm9sbCcpLnBpcGUoXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoMTUwKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGVsZW1lbnQuc2Nyb2xsVG9wIC8gdGhpcy5ST1dfSEVJR0hUKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBvblRpbWVQaWNrZXJDbG9zZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DYW5jZWxTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvblRpbWVNb2RlbENoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy50aW1lTW9kZWwpIHtcbiAgICAgICAgICAgIGRhdGUgPSBwYXJzZSh0aGlzLnRpbWVNb2RlbCwgdGhpcy50aW1lRm9ybWF0LCBuZXcgRGF0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVNb2RlbCA9IGZvcm1hdChkYXRlLCB0aGlzLnRpbWVGb3JtYXQpO1xuICAgICAgICBpZiAoIXRoaXMucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdGhpcy50aW1lTW9kZWw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGpzSG91ciA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSBUaW1lRm9ybWF0Lk1lcmlkaWFuKSB7XG4gICAgICAgICAgICBpZiAoanNIb3VyID4gMTIpIHtcbiAgICAgICAgICAgICAgICBqc0hvdXIgPSBqc0hvdXIgLSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEpTIGRvZXNuJ3QgaGFuZGxlIHdlbGwgQU0vUE0gaG91ciBzbyAxMjo1MyBQTSB3aWxsIGJlIDAwOjUzIC4uLlxuICAgICAgICAgICAgaWYgKGpzSG91ciA9PSAwKSB7XG4gICAgICAgICAgICAgICAganNIb3VyID0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob3VyID0gTmVvVGltZXBpY2tlckNvbXBvbmVudC50b0ZpeGVkKGpzSG91ci50b1N0cmluZygpLCAxMCk7XG4gICAgICAgIGlmIChob3VyICE9IHRoaXMuc2VsZWN0ZWRIb3VyKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSG91ciA9IGhvdXI7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRQb3NpdGlvbignaG91cicsIHRoaXMuc2VsZWN0ZWRIb3VyLCAnYXV0bycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWludXRlID0gTmVvVGltZXBpY2tlckNvbXBvbmVudC50b0ZpeGVkKGRhdGUuZ2V0TWludXRlcygpLnRvU3RyaW5nKCksIDEwKTtcbiAgICAgICAgaWYgKG1pbnV0ZSAhPSB0aGlzLnNlbGVjdGVkTWludXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWludXRlID0gbWludXRlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50UG9zaXRpb24oJ21pbnV0ZScsIHRoaXMuc2VsZWN0ZWRNaW51dGUsICdhdXRvJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXQuTWVyaWRpYW4gJiYgdGhpcy5zZWxlY3RlZE1lcmlkaWFuICE9PSB0aGlzLnRpbWVNb2RlbC5zcGxpdCgnICcpWzFdKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVyaWRpYW4gPSB0aGlzLnRpbWVNb2RlbC5zcGxpdCgnICcpWzFdO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50UG9zaXRpb24oJ21lcmlkaWFuJywgdGhpcy5zZWxlY3RlZE1lcmlkaWFuLCAnYXV0bycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdEhvdXIoaG91cjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVGltZU1vZGVsKGhvdXIsIHRoaXMuc2VsZWN0ZWRNaW51dGUsIHRoaXMuc2VsZWN0ZWRNZXJpZGlhbik7XG4gICAgfVxuXG4gICAgb25TZWxlY3RNaW51dGUobWludXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVUaW1lTW9kZWwodGhpcy5zZWxlY3RlZEhvdXIsIG1pbnV0ZSwgdGhpcy5zZWxlY3RlZE1lcmlkaWFuKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdE1lcmlkaWFuKG1lcmlkaWFuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVUaW1lTW9kZWwodGhpcy5zZWxlY3RlZEhvdXIsIHRoaXMuc2VsZWN0ZWRNaW51dGUsIG1lcmlkaWFuKTtcbiAgICB9XG5cbiAgICBvblNhdmVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IHRoaXMudGltZU1vZGVsO1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJDbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRpbWVwaWNrZXJPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgdGltZU1vZGVsVmFsdWUgPSBwYXJzZSh0aGlzLnRpbWVNb2RlbCwgdGhpcy50aW1lRm9ybWF0LCBuZXcgRGF0ZSgpKTtcbiAgICAgICAgdGhpcy50aW1lTW9kZWxDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICBob3VyczogdGltZU1vZGVsVmFsdWUuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IHRpbWVNb2RlbFZhbHVlLmdldE1pbnV0ZXMoKSxcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBvbkNhbmNlbFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50aW1lcGlja2VyQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50aW1lcGlja2VyT3BlbmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGltZU1vZGVsID0gdGhpcy5wcmV2aW91c1ZhbHVlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIG9uTWFza1ZhbGlkYXRlQ29tcGxldGUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZU1vZGVsICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lTW9kZWwgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uVGltZU1vZGVsQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlVGltZU1vZGVsKGhvdXI6IHN0cmluZywgbWludXRlOiBzdHJpbmcsIG1lcmlkaWFuPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gVGltZUZvcm1hdC5NZXJpZGlhbikge1xuICAgICAgICAgICAgdGhpcy50aW1lTW9kZWwgPSBgJHtob3VyfToke21pbnV0ZX0gJHttZXJpZGlhbn1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lTW9kZWwgPSBgJHtob3VyfToke21pbnV0ZX1gO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVFbGVtZW50UG9zaXRpb24oZWxlbWVudFR5cGU6ICdob3VyJyB8ICdtaW51dGUnIHwgJ21lcmlkaWFuJywgaWQ6IHN0cmluZywgc2Nyb2xsQmVoYXZpb3I6ICdhdXRvJyB8ICdzbW9vdGgnKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtlbGVtZW50VHlwZX0tJHtpZH1gKTtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgc2Nyb2xsQmVoYXZpb3JcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgYmVoYXZpb3I6ICdhdXRvJyB8ICdzbW9vdGgnID0gJ2F1dG8nKSB7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IsXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgMSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bGxmaWxsIG1pbnV0ZXMgYW5kIGhvdXJzIGFycmF5cyBsaWtlIFswLCAxLCAyIC4uLiAxMl0gYW5kIFswLCAxLCAyLCAuLi4gNTldXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVRpbWVTbG90cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3VycyA9IFtdO1xuICAgICAgICB0aGlzLm1pbnV0ZXMgPSBbTmVvVGltZXBpY2tlckNvbXBvbmVudC50b0ZpeGVkKDAsIHRoaXMuRklYX05VTUJFUildO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLkhPVVJTX01FUklESUFOX01BWDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleFRvQWRkID0gTmVvVGltZXBpY2tlckNvbXBvbmVudC50b0ZpeGVkKGksIHRoaXMuRklYX05VTUJFUik7XG4gICAgICAgICAgICB0aGlzLmhvdXJzLnB1c2goaW5kZXhUb0FkZCk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMucHVzaChpbmRleFRvQWRkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXQuRGVmYXVsdCkge1xuICAgICAgICAgICAgdGhpcy5ob3VycyA9IFtOZW9UaW1lcGlja2VyQ29tcG9uZW50LnRvRml4ZWQoMCwgdGhpcy5GSVhfTlVNQkVSKSwgLi4udGhpcy5ob3Vyc107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTM7IGkgPCB0aGlzLkhPVVJTX01BWDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3Vycy5wdXNoKE5lb1RpbWVwaWNrZXJDb21wb25lbnQudG9GaXhlZChpLCB0aGlzLkZJWF9OVU1CRVIpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxMzsgaSA8IHRoaXMuTUlOVVRFU19NQVg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5taW51dGVzLnB1c2goTmVvVGltZXBpY2tlckNvbXBvbmVudC50b0ZpeGVkKGksIHRoaXMuRklYX05VTUJFUikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUaW1lUGlja2VyUG9zaXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0Qm94Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dEJveEJvdW5kcyA9IHRoaXMuaW5wdXRCb3gubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvcFBvc2l0aW9uID0gaW5wdXRCb3hCb3VuZHMudG9wIC0gdGhpcy5USU1FX09QVElPTl9IRUlHSFQgLSB0aGlzLk1BUkdJTjtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uID0gaW5wdXRCb3hCb3VuZHMudG9wICsgaW5wdXRCb3hCb3VuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgdGltZVBpY2tlcldpZHRoID0gdGhpcy5mb3JtYXQgPT09IFRpbWVGb3JtYXQuTWVyaWRpYW4gPyB0aGlzLlRJTUVfUElDS0VSX01FUklESUFOX1dJRFRIOiB0aGlzLlRJTUVfUElDS0VSX0RFRkFVTFRfV0lEVEg7XG4gICAgICAgICAgICBjb25zdCBzaGlmdCA9ICh0aW1lUGlja2VyV2lkdGggLSBpbnB1dEJveEJvdW5kcy53aWR0aCkgLyAyO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wbGFjZW1lbnQgPT09ICd0b3AnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiB0b3BQb3NpdGlvbiA8IDAgPyBib3R0b21Qb3NpdGlvbiA6IHRvcFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbnB1dEJveEJvdW5kcy5sZWZ0IC0gc2hpZnQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBib3R0b21Qb3NpdGlvbiArIHRoaXMuVElNRV9PUFRJT05fSEVJR0hUICsgdGhpcy5NQVJHSU4gPiB3aW5kb3cuaW5uZXJIZWlnaHQgPyB0b3BQb3NpdGlvbiA6IGJvdHRvbVBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbnB1dEJveEJvdW5kcy5sZWZ0IC0gc2hpZnQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb252ZXJ0MTJUbzI0KHRpbWUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB0ZXJtcyA9IHRpbWUuc3BsaXQoJzonKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IHRlcm1zWzFdLnN1YnN0cmluZygwLCAyKTtcbiAgICAgICAgY29uc3QgbWVyaWRpYW4gPSB0ZXJtc1sxXS50cmltKCkuc2xpY2UoLTIpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGxldCBob3VyID0gcGFyc2VJbnQodGVybXNbMF0pO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlSW50KHRlcm1zWzBdKSkpIHtcbiAgICAgICAgICAgIGlmIChtZXJpZGlhbiA9PT0gJ1BNJyAmJiBob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gaG91ciArIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lcmlkaWFuID09PSAnQU0nICYmIGhvdXIgPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2hvdXJ9OiR7bWludXRlc31gO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGNvbnZlcnQyNFRvMTIodGltZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRlcm1zID0gdGltZS5zcGxpdCgnOicpO1xuICAgICAgICBsZXQgbWVyaWRpYW4gPSAnQU0nO1xuICAgICAgICBsZXQgaG91ciA9IHBhcnNlSW50KHRlcm1zWzBdKTtcbiAgICAgICAgbGV0IG1pbnV0ZSA9IHBhcnNlSW50KHRlcm1zWzFdKTtcbiAgICAgICAgaWYgKCFpc05hTihwYXJzZUludCh0ZXJtc1swXSkpKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA+PSAxMikge1xuICAgICAgICAgICAgICAgIG1lcmlkaWFuID0gJ1BNJztcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA+IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXIgPSBob3VyIC0gMTI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhvdXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG91clN0ciA9IE5lb1RpbWVwaWNrZXJDb21wb25lbnQudG9GaXhlZChob3VyLCAxMCk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZVN0ciA9IE5lb1RpbWVwaWNrZXJDb21wb25lbnQudG9GaXhlZChtaW51dGUsIDEwKTtcbiAgICAgICAgcmV0dXJuIGAke2hvdXJTdHJ9OiR7bWludXRlU3RyfSAke21lcmlkaWFufWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIDA4IGZvciA4LCAwNiBmb3IgNlxuICAgICAqIEBwYXJhbSBudW1cbiAgICAgKiBAcGFyYW0gZml4XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyB0b0ZpeGVkKG51bSwgZml4KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGZpeGVkTnVtOiBzdHJpbmcgPSBudW0udG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG51bSA8IGZpeCkge1xuICAgICAgICAgICAgZml4ZWROdW0gPSBgMCR7Zml4ZWROdW19YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZml4ZWROdW07XG4gICAgfVxuXG59XG4iXX0=
|