nxt-pick-datetime 18.0.0 → 19.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/fesm2022/nxt-pick-datetime-moment-adapter.mjs +23 -26
  2. package/fesm2022/nxt-pick-datetime-moment-adapter.mjs.map +1 -1
  3. package/fesm2022/nxt-pick-datetime-native-adapter.mjs +22 -24
  4. package/fesm2022/nxt-pick-datetime-native-adapter.mjs.map +1 -1
  5. package/fesm2022/nxt-pick-datetime.mjs +76 -74
  6. package/fesm2022/nxt-pick-datetime.mjs.map +1 -1
  7. package/lib/class/date-time.class.d.ts +1 -1
  8. package/moment-adapter/moment-adapter.module.d.ts +2 -0
  9. package/moment-adapter/public-api.d.ts +1 -1
  10. package/native-adapter/native-adapter.module.d.ts +2 -0
  11. package/native-adapter/public-api.d.ts +1 -1
  12. package/package.json +9 -14
  13. package/esm2022/lib/class/date-time-adapter.class.mjs +0 -97
  14. package/esm2022/lib/class/date-time-format.class.mjs +0 -4
  15. package/esm2022/lib/class/date-time.class.mjs +0 -95
  16. package/esm2022/lib/class/dialog-config.class.mjs +0 -47
  17. package/esm2022/lib/class/dialog-ref.class.mjs +0 -119
  18. package/esm2022/lib/date-time/calendar/calendar.component.mjs +0 -346
  19. package/esm2022/lib/date-time/calendar-body/calendar-body.component.mjs +0 -151
  20. package/esm2022/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +0 -429
  21. package/esm2022/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +0 -358
  22. package/esm2022/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +0 -362
  23. package/esm2022/lib/date-time/date-time-inline/date-time-inline.component.mjs +0 -275
  24. package/esm2022/lib/date-time/date-time-picker/date-time-picker.component.mjs +0 -541
  25. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs +0 -19
  26. package/esm2022/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +0 -389
  27. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +0 -618
  28. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +0 -61
  29. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  30. package/esm2022/lib/date-time/date-time.module.mjs +0 -96
  31. package/esm2022/lib/date-time/number-fixed-len.pipe.mjs +0 -22
  32. package/esm2022/lib/date-time/timer/timer.component.mjs +0 -299
  33. package/esm2022/lib/date-time/timer-box/timer-box.component.mjs +0 -95
  34. package/esm2022/lib/dialog/dialog-container/dialog-container.component.mjs +0 -248
  35. package/esm2022/lib/dialog/dialog.module.mjs +0 -42
  36. package/esm2022/lib/dialog/dialog.service.mjs +0 -251
  37. package/esm2022/lib/utils/object.mjs +0 -24
  38. package/esm2022/moment-adapter/date-time-adapter.class.mjs +0 -220
  39. package/esm2022/moment-adapter/date-time-format.class.mjs +0 -13
  40. package/esm2022/moment-adapter/moment-adapter.module.mjs +0 -37
  41. package/esm2022/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +0 -5
  42. package/esm2022/moment-adapter/public-api.mjs +0 -3
  43. package/esm2022/native-adapter/date-time-adapter.class.mjs +0 -366
  44. package/esm2022/native-adapter/date-time-format.class.mjs +0 -13
  45. package/esm2022/native-adapter/native-adapter.module.mjs +0 -37
  46. package/esm2022/native-adapter/nxt-pick-datetime-native-adapter.mjs +0 -5
  47. package/esm2022/native-adapter/public-api.mjs +0 -2
  48. package/esm2022/nxt-pick-datetime.mjs +0 -5
  49. package/esm2022/public-api.mjs +0 -14
@@ -1,389 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, HostBinding, HostListener, ViewChild } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { CalendarComponent } from '../calendar/calendar.component';
4
- import { TimerComponent } from '../timer/timer.component';
5
- import { dateTimePickerAnimations } from './date-time-picker-container.animations';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../date-time-picker-intl.service";
8
- import * as i2 from "../../class/date-time-adapter.class";
9
- import * as i3 from "@angular/common";
10
- import * as i4 from "@angular/cdk/a11y";
11
- import * as i5 from "../timer/timer.component";
12
- import * as i6 from "../calendar/calendar.component";
13
- /** @internal */
14
- export class DateTimeContainerComponent {
15
- get pickerMoment() {
16
- return this._clamPickerMoment;
17
- }
18
- set pickerMoment(value) {
19
- if (value) {
20
- this._clamPickerMoment = this.dateTimeAdapter.clampDate(value, this.picker?.min, this.picker?.max);
21
- }
22
- this.cdRef.markForCheck();
23
- }
24
- get pickerType() {
25
- return this.picker?.pickerType;
26
- }
27
- get cancelLabel() {
28
- return this.pickerIntl.cancelBtnLabel;
29
- }
30
- get setLabel() {
31
- return this.pickerIntl.setBtnLabel;
32
- }
33
- /**
34
- * The range 'from' label
35
- */
36
- get fromLabel() {
37
- return this.pickerIntl.rangeFromLabel;
38
- }
39
- /**
40
- * The range 'to' label
41
- */
42
- get toLabel() {
43
- return this.pickerIntl.rangeToLabel;
44
- }
45
- /**
46
- * The range 'from' formatted value
47
- */
48
- get fromFormattedValue() {
49
- const value = this.picker?.selecteds[0];
50
- return value
51
- ? this.dateTimeAdapter.format(value, this.picker?.formatString)
52
- : '';
53
- }
54
- /**
55
- * The range 'to' formatted value
56
- */
57
- get toFormattedValue() {
58
- const value = this.picker?.selecteds[1];
59
- return value
60
- ? this.dateTimeAdapter.format(value, this.picker?.formatString)
61
- : '';
62
- }
63
- /**
64
- * Cases in which the control buttons show in the picker
65
- * 1) picker mode is 'dialog'
66
- * 2) picker type is NOT 'calendar' and the picker mode is NOT 'inline'
67
- */
68
- get showControlButtons() {
69
- return (this.picker?.pickerMode === 'dialog' ||
70
- (this.picker?.pickerType !== 'calendar' &&
71
- this.picker?.pickerMode !== 'inline'));
72
- }
73
- get containerElm() {
74
- return this.elmRef.nativeElement;
75
- }
76
- /** @internal */
77
- get containerClass() {
78
- return true;
79
- }
80
- /** @internal */
81
- get popupContainerClass() {
82
- return this.picker?.pickerMode === 'popup';
83
- }
84
- /** @internal */
85
- get dialogContainerClass() {
86
- return this.picker?.pickerMode === 'dialog';
87
- }
88
- /** @internal */
89
- get inlineContainerClass() {
90
- return this.picker?.pickerMode === 'inline';
91
- }
92
- /** @internal */
93
- get containerDisabledClass() {
94
- return !!this.picker?.disabled;
95
- }
96
- /** @internal */
97
- get containerId() {
98
- return this.picker?.id;
99
- }
100
- /** @internal */
101
- get containerAnimation() {
102
- return this.picker?.pickerMode === 'inline' ? '' : 'enter';
103
- }
104
- constructor(cdRef, elmRef, pickerIntl, dateTimeAdapter) {
105
- this.cdRef = cdRef;
106
- this.elmRef = elmRef;
107
- this.pickerIntl = pickerIntl;
108
- this.dateTimeAdapter = dateTimeAdapter;
109
- this.activeSelectedIndex = 0; // The current active SelectedIndex in range select mode (0: 'from', 1: 'to')
110
- /**
111
- * Stream emits when try to hide picker
112
- */
113
- this.hidePicker$ = new Subject();
114
- this.hidePickerStream = this.hidePicker$.asObservable();
115
- /**
116
- * Stream emits when try to confirm the selected value
117
- */
118
- this.confirmSelected$ = new Subject();
119
- this.confirmSelectedStream = this.confirmSelected$.asObservable();
120
- this.pickerOpened$ = new Subject();
121
- this.pickerOpenedStream = this.pickerOpened$.asObservable();
122
- }
123
- ngOnInit() { }
124
- ngAfterContentInit() {
125
- this.initPicker();
126
- }
127
- ngAfterViewInit() {
128
- this.focusPicker();
129
- }
130
- handleContainerAnimationDone(event) {
131
- const toState = event.toState;
132
- if (toState === 'enter') {
133
- this.pickerOpened$.next();
134
- }
135
- }
136
- dateSelected(date) {
137
- let result;
138
- if (this.picker?.isInSingleMode) {
139
- result = this.dateSelectedInSingleMode(date);
140
- if (result) {
141
- this.pickerMoment = result;
142
- this.picker.select(result);
143
- }
144
- else {
145
- // we close the picker when result is undefined and pickerType is calendar.
146
- if (this.pickerType === 'calendar') {
147
- this.hidePicker$.next();
148
- }
149
- }
150
- return;
151
- }
152
- if (this.picker?.isInRangeMode) {
153
- result = this.dateSelectedInRangeMode(date);
154
- if (result) {
155
- this.pickerMoment = result[this.activeSelectedIndex];
156
- this.picker.select(result);
157
- }
158
- }
159
- }
160
- timeSelected(time) {
161
- this.pickerMoment = this.dateTimeAdapter.clone(time);
162
- if (!this.picker?.dateTimeChecker(this.pickerMoment)) {
163
- return;
164
- }
165
- if (this.picker.isInSingleMode) {
166
- this.picker.select(this.pickerMoment);
167
- return;
168
- }
169
- if (this.picker.isInRangeMode) {
170
- const selecteds = [...this.picker?.selecteds || []];
171
- // check if the 'from' is after 'to' or 'to'is before 'from'
172
- // In this case, we set both the 'from' and 'to' the same value
173
- if ((this.activeSelectedIndex === 0 &&
174
- selecteds[1] &&
175
- this.dateTimeAdapter.compare(this.pickerMoment, selecteds[1]) === 1) ||
176
- (this.activeSelectedIndex === 1 &&
177
- selecteds[0] &&
178
- this.dateTimeAdapter.compare(this.pickerMoment, selecteds[0]) === -1)) {
179
- selecteds[0] = this.pickerMoment;
180
- selecteds[1] = this.pickerMoment;
181
- }
182
- else {
183
- selecteds[this.activeSelectedIndex] = this.pickerMoment;
184
- }
185
- this.picker.select(selecteds);
186
- }
187
- }
188
- /**
189
- * Handle click on cancel button
190
- */
191
- onCancelClicked(event) {
192
- this.hidePicker$.next();
193
- event.preventDefault();
194
- return;
195
- }
196
- /**
197
- * Handle click on set button
198
- */
199
- onSetClicked(event) {
200
- if (!this.picker?.dateTimeChecker?.(this.pickerMoment)) {
201
- this.hidePicker$.next();
202
- event.preventDefault();
203
- return;
204
- }
205
- this.confirmSelected$.next(event);
206
- event.preventDefault();
207
- return;
208
- }
209
- /**
210
- * Handle click on inform radio group
211
- */
212
- handleClickOnInfoGroup(event, index) {
213
- this.setActiveSelectedIndex(index);
214
- event.preventDefault();
215
- event.stopPropagation();
216
- }
217
- /**
218
- * Handle click on inform radio group
219
- */
220
- handleKeydownOnInfoGroup(event, next, index) {
221
- switch (event.keyCode) {
222
- case 'ArrowDown':
223
- case 'ArrowRight':
224
- case 'ArrowUp':
225
- case 'ArrowLeft':
226
- next.focus();
227
- this.setActiveSelectedIndex(index === 0 ? 1 : 0);
228
- event.preventDefault();
229
- event.stopPropagation();
230
- break;
231
- case 'Space':
232
- this.setActiveSelectedIndex(index);
233
- event.preventDefault();
234
- event.stopPropagation();
235
- break;
236
- default:
237
- return;
238
- }
239
- }
240
- /**
241
- * Set the value of activeSelectedIndex
242
- */
243
- setActiveSelectedIndex(index) {
244
- if (this.picker?.selectMode === 'range' &&
245
- this.activeSelectedIndex !== index) {
246
- this.activeSelectedIndex = index;
247
- const selected = this.picker?.selecteds[this.activeSelectedIndex];
248
- if (this.picker.selecteds && selected) {
249
- this.pickerMoment = this.dateTimeAdapter.clone(selected);
250
- }
251
- }
252
- return;
253
- }
254
- initPicker() {
255
- this.pickerMoment = this.picker?.startAt || this.dateTimeAdapter.now();
256
- this.activeSelectedIndex = this.picker?.selectMode === 'rangeTo' ? 1 : 0;
257
- }
258
- /**
259
- * Select calendar date in single mode,
260
- * it returns undefined when date is not selected.
261
- */
262
- dateSelectedInSingleMode(date) {
263
- if (this.dateTimeAdapter.isSameDay(date, this.picker?.selected)) {
264
- return undefined;
265
- }
266
- return this.updateAndCheckCalendarDate(date);
267
- }
268
- /**
269
- * Select dates in range Mode
270
- */
271
- dateSelectedInRangeMode(date) {
272
- let from = this.picker?.selecteds[0];
273
- let to = this.picker?.selecteds[1];
274
- const result = this.updateAndCheckCalendarDate(date);
275
- if (!result) {
276
- return;
277
- }
278
- // if the given calendar day is after or equal to 'from',
279
- // set ths given date as 'to'
280
- // otherwise, set it as 'from' and set 'to' to undefined
281
- if (this.picker?.selectMode === 'range') {
282
- if (this.picker.selecteds &&
283
- this.picker.selecteds.length &&
284
- !to &&
285
- from &&
286
- (this.dateTimeAdapter.differenceInCalendarDays(result, from) ?? 0) >= 0) {
287
- to = result;
288
- this.activeSelectedIndex = 1;
289
- }
290
- else {
291
- from = result;
292
- to = undefined;
293
- this.activeSelectedIndex = 0;
294
- }
295
- }
296
- else if (this.picker?.selectMode === 'rangeFrom') {
297
- from = result;
298
- // if the from value is after the to value, set the to value as undefined
299
- if (to && this.dateTimeAdapter.compare(from, to) > 0) {
300
- to = undefined;
301
- }
302
- }
303
- else if (this.picker?.selectMode === 'rangeTo') {
304
- to = result;
305
- // if the from value is after the to value, set the from value as undefined
306
- if (from && this.dateTimeAdapter.compare(from, to) > 0) {
307
- from = undefined;
308
- }
309
- }
310
- return [from, to];
311
- }
312
- /**
313
- * Update the given calendar date's time and check if it is valid
314
- * Because the calendar date has 00:00:00 as default time, if the picker type is 'both',
315
- * we need to update the given calendar date's time before selecting it.
316
- * if it is valid, return the updated dateTime
317
- * if it is not valid, return undefined
318
- */
319
- updateAndCheckCalendarDate(date) {
320
- let result;
321
- // if the picker is 'both', update the calendar date's time value
322
- if (this.picker?.pickerType === 'both') {
323
- result = this.dateTimeAdapter.createDate(this.dateTimeAdapter.getYear(date), this.dateTimeAdapter.getMonth(date), this.dateTimeAdapter.getDate(date), this.dateTimeAdapter.getHours(this.pickerMoment), this.dateTimeAdapter.getMinutes(this.pickerMoment), this.dateTimeAdapter.getSeconds(this.pickerMoment));
324
- result = this.dateTimeAdapter.clampDate(result, this.picker.min, this.picker.max);
325
- }
326
- else {
327
- result = this.dateTimeAdapter.clone(date);
328
- }
329
- // check the updated dateTime
330
- return this.picker?.dateTimeChecker(result) ? result : undefined;
331
- }
332
- /**
333
- * Focus to the picker
334
- */
335
- focusPicker() {
336
- if (this.picker?.pickerMode === 'inline') {
337
- return;
338
- }
339
- if (this.calendar) {
340
- this.calendar.focusActiveCell();
341
- }
342
- else if (this.timer) {
343
- this.timer.focus();
344
- }
345
- }
346
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DateTimeContainerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.DateTimeIntl }, { token: i2.DateTimeAdapter }], target: i0.ɵɵFactoryTarget.Component }); }
347
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: DateTimeContainerComponent, selector: "nxt-date-time-container", host: { listeners: { "@transformPicker.done": "handleContainerAnimationDone($event)" }, properties: { "class.nxt-dt-container": "this.containerClass", "class.nxt-dt-popup-container": "this.popupContainerClass", "class.nxt-dt-dialog-container": "this.dialogContainerClass", "class.nxt-dt-inline-container": "this.inlineContainerClass", "class.nxt-dt-container-disabled": "this.containerDisabledClass", "attr.id": "this.containerId", "@transformPicker": "this.containerAnimation" } }, viewQueries: [{ propertyName: "calendar", first: true, predicate: CalendarComponent, descendants: true }, { propertyName: "timer", first: true, predicate: TimerComponent, descendants: true }], ngImport: i0, template: "<div [cdkTrapFocus]=\"picker?.pickerMode !== 'inline'\"\r\n [@fadeInPicker]=\"picker?.pickerMode === 'inline'? '' : 'enter'\"\r\n class=\"nxt-dt-container-inner\">\r\n\r\n <nxt-date-time-calendar *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\r\n class=\"nxt-dt-container-row\"\r\n [firstDayOfWeek]=\"picker?.firstDayOfWeek ?? 0\"\r\n [(pickerMoment)]=\"pickerMoment\"\r\n [selected]=\"picker?.selected\"\r\n [selecteds]=\"picker?.selecteds ?? []\"\r\n [selectMode]=\"picker?.selectMode\"\r\n [min]=\"picker?.min\"\r\n [max]=\"picker?.max\"\r\n [dateTimeFilter]=\"picker?.dateTimeFilter\"\r\n [startView]=\"picker?.startView ?? 'month'\"\r\n [hideOtherMonths]=\"!!picker?.hideOtherMonths\"\r\n (yearSelected)=\"picker?.selectYear($event)\"\r\n (monthSelected)=\"picker?.selectMonth($event)\"\r\n (selectedChange)=\"dateSelected($event)\"></nxt-date-time-calendar>\r\n\r\n <nxt-date-time-timer *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\r\n class=\"nxt-dt-container-row\"\r\n [pickerMoment]=\"pickerMoment\"\r\n [min]=\"picker?.min\"\r\n [max]=\"picker?.max\"\r\n [showSecondsTimer]=\"!!picker?.showSecondsTimer\"\r\n [hour12Timer]=\"!!picker?.hour12Timer\"\r\n [stepHour]=\"picker?.stepHour ?? 1\"\r\n [stepMinute]=\"picker?.stepMinute ?? 1\"\r\n [stepSecond]=\"picker?.stepSecond ?? 1\"\r\n (selectedChange)=\"timeSelected($event)\"></nxt-date-time-timer>\r\n\r\n <div *ngIf=\"picker?.isInRangeMode\"\r\n role=\"radiogroup\"\r\n class=\"nxt-dt-container-info nxt-dt-container-row\">\r\n <div role=\"radio\"\r\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\r\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\r\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-from\"\r\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 0}\"\r\n (click)=\"handleClickOnInfoGroup($event, 0)\"\r\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\r\n #from>\r\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\r\n tabindex=\"-1\">\r\n <span class=\"nxt-dt-container-info-label\">{{fromLabel}}:</span>\r\n <span class=\"nxt-dt-container-info-value\">{{fromFormattedValue}}</span>\r\n </span>\r\n </div>\r\n <div role=\"radio\"\r\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\r\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\r\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-to\"\r\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 1}\"\r\n (click)=\"handleClickOnInfoGroup($event, 1)\"\r\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\r\n #to>\r\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\r\n tabindex=\"-1\">\r\n <span class=\"nxt-dt-container-info-label\">{{toLabel}}:</span>\r\n <span class=\"nxt-dt-container-info-value\">{{toFormattedValue}}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showControlButtons\"\r\n class=\"nxt-dt-container-buttons nxt-dt-container-row\">\r\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onCancelClicked($event)\">\r\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{cancelLabel}}\r\n </span>\r\n </button>\r\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onSetClicked($event)\">\r\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{setLabel}}\r\n </span>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i5.TimerComponent, selector: "nxt-date-time-timer", inputs: ["pickerMoment", "min", "max", "showSecondsTimer", "hour12Timer", "stepHour", "stepMinute", "stepSecond"], outputs: ["selectedChange"] }, { kind: "component", type: i6.CalendarComponent, selector: "nxt-date-time-calendar", inputs: ["dateTimeFilter", "firstDayOfWeek", "min", "max", "pickerMoment", "selectMode", "selected", "selecteds", "startView", "hideOtherMonths"], outputs: ["pickerMomentChange", "selectedChange", "userSelection", "yearSelected", "monthSelected"] }], animations: [
348
- dateTimePickerAnimations.transformPicker,
349
- dateTimePickerAnimations.fadeInPicker
350
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
351
- }
352
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: DateTimeContainerComponent, decorators: [{
353
- type: Component,
354
- args: [{ selector: 'nxt-date-time-container', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, animations: [
355
- dateTimePickerAnimations.transformPicker,
356
- dateTimePickerAnimations.fadeInPicker
357
- ], template: "<div [cdkTrapFocus]=\"picker?.pickerMode !== 'inline'\"\r\n [@fadeInPicker]=\"picker?.pickerMode === 'inline'? '' : 'enter'\"\r\n class=\"nxt-dt-container-inner\">\r\n\r\n <nxt-date-time-calendar *ngIf=\"pickerType === 'both' || pickerType === 'calendar'\"\r\n class=\"nxt-dt-container-row\"\r\n [firstDayOfWeek]=\"picker?.firstDayOfWeek ?? 0\"\r\n [(pickerMoment)]=\"pickerMoment\"\r\n [selected]=\"picker?.selected\"\r\n [selecteds]=\"picker?.selecteds ?? []\"\r\n [selectMode]=\"picker?.selectMode\"\r\n [min]=\"picker?.min\"\r\n [max]=\"picker?.max\"\r\n [dateTimeFilter]=\"picker?.dateTimeFilter\"\r\n [startView]=\"picker?.startView ?? 'month'\"\r\n [hideOtherMonths]=\"!!picker?.hideOtherMonths\"\r\n (yearSelected)=\"picker?.selectYear($event)\"\r\n (monthSelected)=\"picker?.selectMonth($event)\"\r\n (selectedChange)=\"dateSelected($event)\"></nxt-date-time-calendar>\r\n\r\n <nxt-date-time-timer *ngIf=\"pickerType === 'both' || pickerType === 'timer'\"\r\n class=\"nxt-dt-container-row\"\r\n [pickerMoment]=\"pickerMoment\"\r\n [min]=\"picker?.min\"\r\n [max]=\"picker?.max\"\r\n [showSecondsTimer]=\"!!picker?.showSecondsTimer\"\r\n [hour12Timer]=\"!!picker?.hour12Timer\"\r\n [stepHour]=\"picker?.stepHour ?? 1\"\r\n [stepMinute]=\"picker?.stepMinute ?? 1\"\r\n [stepSecond]=\"picker?.stepSecond ?? 1\"\r\n (selectedChange)=\"timeSelected($event)\"></nxt-date-time-timer>\r\n\r\n <div *ngIf=\"picker?.isInRangeMode\"\r\n role=\"radiogroup\"\r\n class=\"nxt-dt-container-info nxt-dt-container-row\">\r\n <div role=\"radio\"\r\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\r\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\r\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-from\"\r\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 0}\"\r\n (click)=\"handleClickOnInfoGroup($event, 0)\"\r\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\r\n #from>\r\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\r\n tabindex=\"-1\">\r\n <span class=\"nxt-dt-container-info-label\">{{fromLabel}}:</span>\r\n <span class=\"nxt-dt-container-info-value\">{{fromFormattedValue}}</span>\r\n </span>\r\n </div>\r\n <div role=\"radio\"\r\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\r\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\r\n class=\"nxt-dt-control nxt-dt-container-range nxt-dt-container-to\"\r\n [ngClass]=\"{'nxt-dt-container-info-active': activeSelectedIndex === 1}\"\r\n (click)=\"handleClickOnInfoGroup($event, 1)\"\r\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\r\n #to>\r\n <span class=\"nxt-dt-control-content nxt-dt-container-range-content\"\r\n tabindex=\"-1\">\r\n <span class=\"nxt-dt-container-info-label\">{{toLabel}}:</span>\r\n <span class=\"nxt-dt-container-info-value\">{{toFormattedValue}}</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"showControlButtons\"\r\n class=\"nxt-dt-container-buttons nxt-dt-container-row\">\r\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onCancelClicked($event)\">\r\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{cancelLabel}}\r\n </span>\r\n </button>\r\n <button class=\"nxt-dt-control nxt-dt-control-button nxt-dt-container-control-button\"\r\n type=\"button\"\r\n tabindex=\"0\"\r\n (click)=\"onSetClicked($event)\">\r\n <span class=\"nxt-dt-control-content nxt-dt-control-button-content\"\r\n tabindex=\"-1\">\r\n {{setLabel}}\r\n </span>\r\n </button>\r\n </div>\r\n</div>\r\n" }]
358
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.DateTimeIntl }, { type: i2.DateTimeAdapter }], propDecorators: { calendar: [{
359
- type: ViewChild,
360
- args: [CalendarComponent]
361
- }], timer: [{
362
- type: ViewChild,
363
- args: [TimerComponent]
364
- }], containerClass: [{
365
- type: HostBinding,
366
- args: ['class.nxt-dt-container']
367
- }], popupContainerClass: [{
368
- type: HostBinding,
369
- args: ['class.nxt-dt-popup-container']
370
- }], dialogContainerClass: [{
371
- type: HostBinding,
372
- args: ['class.nxt-dt-dialog-container']
373
- }], inlineContainerClass: [{
374
- type: HostBinding,
375
- args: ['class.nxt-dt-inline-container']
376
- }], containerDisabledClass: [{
377
- type: HostBinding,
378
- args: ['class.nxt-dt-container-disabled']
379
- }], containerId: [{
380
- type: HostBinding,
381
- args: ['attr.id']
382
- }], containerAnimation: [{
383
- type: HostBinding,
384
- args: ['@transformPicker']
385
- }], handleContainerAnimationDone: [{
386
- type: HostListener,
387
- args: ['@transformPicker.done', ['$event']]
388
- }] } });
389
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGljay1kYXRldGltZS9zcmMvbGliL2RhdGUtdGltZS9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci9kYXRlLXRpbWUtcGlja2VyLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBbUMsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxXQUFXLEVBQUUsWUFBWSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNoTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBRWxFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQTs7Ozs7Ozs7QUFFbEYsZ0JBQWdCO0FBWWhCLE1BQU0sT0FBTywwQkFBMEI7SUFtQ25DLElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFBO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFvQjtRQUNqQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUNuRCxLQUFLLEVBQ0wsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQ2hCLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUNuQixDQUFBO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDN0IsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUE7SUFDbEMsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUE7SUFDekMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUE7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFBO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksa0JBQWtCO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLE9BQU8sS0FBSztZQUNSLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7WUFDL0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksZ0JBQWdCO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3ZDLE9BQU8sS0FBSztZQUNSLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7WUFDL0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNaLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxrQkFBa0I7UUFDbEIsT0FBTyxDQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLFFBQVE7WUFDcEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxVQUFVO2dCQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FDNUMsQ0FBQTtJQUNMLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFBO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFDSSxjQUFjO1FBQ2QsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQ0ksbUJBQW1CO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssT0FBTyxDQUFBO0lBQzlDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFDSSxvQkFBb0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxRQUFRLENBQUE7SUFDL0MsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUNJLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLFFBQVEsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQ0ksc0JBQXNCO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFBO0lBQ2xDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFDSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQ0ksa0JBQWtCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUM5RCxDQUFDO0lBRUQsWUFDcUIsS0FBd0IsRUFDeEIsTUFBK0IsRUFDL0IsVUFBd0IsRUFDeEIsZUFBbUM7UUFIbkMsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBeUI7UUFDL0IsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBb0I7UUF0SnhELHdCQUFtQixHQUFHLENBQUMsQ0FBQSxDQUFDLDZFQUE2RTtRQUVyRzs7V0FFRztRQUNjLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQTtRQUV6QyxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFBO1FBRTNEOztXQUVHO1FBQ2MscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQVMsQ0FBQTtRQUUvQywwQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUE7UUFFcEQsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFBO1FBRTNDLHVCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUE7SUFxSTNELENBQUM7SUFFTCxRQUFRLEtBQUssQ0FBQztJQUVkLGtCQUFrQjtRQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUN0QixDQUFDO0lBR0QsNEJBQTRCLENBQUMsS0FBcUI7UUFDOUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQTtRQUM3QixJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQzdCLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVE7UUFDakIsSUFBSSxNQUFNLENBQUE7UUFFVixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDOUIsTUFBTSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUM1QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFBO2dCQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM5QixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osMkVBQTJFO2dCQUMzRSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBQzNCLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTTtRQUNWLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDN0IsTUFBTSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMzQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2dCQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM5QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBUTtRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXBELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFNO1FBQ1YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDckMsT0FBTTtRQUNWLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBRW5ELDREQUE0RDtZQUM1RCwrREFBK0Q7WUFDL0QsSUFDSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxDQUFDO2dCQUMzQixTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUN4QixJQUFJLENBQUMsWUFBWSxFQUNqQixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2YsS0FBSyxDQUFDLENBQUM7Z0JBQ1osQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQztvQkFDM0IsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDWixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FDeEIsSUFBSSxDQUFDLFlBQVksRUFDakIsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNmLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDZixDQUFDO2dCQUNDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFBO2dCQUNoQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtZQUNwQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUE7WUFDM0QsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsS0FBWTtRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3ZCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN0QixPQUFNO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLEtBQVk7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUN2QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7WUFDdEIsT0FBTTtRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2pDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN0QixPQUFNO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsc0JBQXNCLENBQUMsS0FBVSxFQUFFLEtBQWE7UUFDNUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2xDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN0QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUE7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCLENBQ3BCLEtBQVUsRUFDVixJQUFTLEVBQ1QsS0FBYTtRQUViLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BCLEtBQUssV0FBVyxDQUFDO1lBQ2pCLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssU0FBUyxDQUFDO1lBQ2YsS0FBSyxXQUFXO2dCQUNaLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtnQkFDWixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDaEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUN0QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUE7Z0JBQ3ZCLE1BQUs7WUFFVCxLQUFLLE9BQU87Z0JBQ1IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7Z0JBQ3RCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQTtnQkFDdkIsTUFBSztZQUVUO2dCQUNJLE9BQU07UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssc0JBQXNCLENBQUMsS0FBYTtRQUN4QyxJQUNJLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLE9BQU87WUFDbkMsSUFBSSxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFDcEMsQ0FBQztZQUNDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7WUFFaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFDakUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM1RCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU07SUFDVixDQUFDO0lBRU8sVUFBVTtRQUNkLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUN0RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssd0JBQXdCLENBQUMsSUFBUTtRQUNyQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxTQUFTLENBQUE7UUFDcEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNLLHVCQUF1QixDQUFDLElBQVE7UUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDcEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXBELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNWLE9BQU07UUFDVixDQUFDO1FBRUQseURBQXlEO1FBQ3pELDZCQUE2QjtRQUM3Qix3REFBd0Q7UUFDeEQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN0QyxJQUNJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTTtnQkFDNUIsQ0FBQyxFQUFFO2dCQUNILElBQUk7Z0JBQ0osQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ3pFLENBQUM7Z0JBQ0MsRUFBRSxHQUFHLE1BQU0sQ0FBQTtnQkFDWCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFBO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLEdBQUcsTUFBTSxDQUFBO2dCQUNiLEVBQUUsR0FBRyxTQUFTLENBQUE7Z0JBQ2QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtZQUNoQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakQsSUFBSSxHQUFHLE1BQU0sQ0FBQTtZQUViLHlFQUF5RTtZQUN6RSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELEVBQUUsR0FBRyxTQUFTLENBQUE7WUFDbEIsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLEVBQUUsR0FBRyxNQUFNLENBQUE7WUFFWCwyRUFBMkU7WUFDM0UsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxJQUFJLEdBQUcsU0FBUyxDQUFBO1lBQ3BCLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssMEJBQTBCLENBQUMsSUFBUTtRQUN2QyxJQUFJLE1BQU0sQ0FBQTtRQUVWLGlFQUFpRTtRQUNqRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3JDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQ2xDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FDckQsQ0FBQTtZQUNELE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FDbkMsTUFBTSxFQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNsQixDQUFBO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUVELDZCQUE2QjtRQUM3QixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxPQUFNO1FBQ1YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDbkMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDdEIsQ0FBQztJQUNMLENBQUM7OEdBemJRLDBCQUEwQjtrR0FBMUIsMEJBQTBCLDRrQkFFeEIsaUJBQWlCLHdFQUdqQixjQUFjLGdEQzNCN0Isd3VJQXVGQSx5N0JEdEVnQjtZQUNSLHdCQUF3QixDQUFDLGVBQWU7WUFDeEMsd0JBQXdCLENBQUMsWUFBWTtTQUN4Qzs7MkZBRVEsMEJBQTBCO2tCQVh0QyxTQUFTOytCQUNJLHlCQUF5QixtQkFHbEIsdUJBQXVCLENBQUMsTUFBTSx1QkFDMUIsS0FBSyxjQUNkO3dCQUNSLHdCQUF3QixDQUFDLGVBQWU7d0JBQ3hDLHdCQUF3QixDQUFDLFlBQVk7cUJBQ3hDO3dLQUtELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBSTVCLEtBQUs7c0JBREosU0FBUzt1QkFBQyxjQUFjO2dCQThHckIsY0FBYztzQkFEakIsV0FBVzt1QkFBQyx3QkFBd0I7Z0JBT2pDLG1CQUFtQjtzQkFEdEIsV0FBVzt1QkFBQyw4QkFBOEI7Z0JBT3ZDLG9CQUFvQjtzQkFEdkIsV0FBVzt1QkFBQywrQkFBK0I7Z0JBT3hDLG9CQUFvQjtzQkFEdkIsV0FBVzt1QkFBQywrQkFBK0I7Z0JBT3hDLHNCQUFzQjtzQkFEekIsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBTzFDLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxTQUFTO2dCQU9sQixrQkFBa0I7c0JBRHJCLFdBQVc7dUJBQUMsa0JBQWtCO2dCQXVCL0IsNEJBQTRCO3NCQUQzQixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5pbWF0aW9uRXZlbnQgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJ1xyXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi4vLi4vY2xhc3MvZGF0ZS10aW1lLWFkYXB0ZXIuY2xhc3MnXHJcbmltcG9ydCB7IERhdGVUaW1lRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vY2xhc3MvZGF0ZS10aW1lLmNsYXNzJ1xyXG5pbXBvcnQgeyBDYWxlbmRhckNvbXBvbmVudCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudCdcclxuaW1wb3J0IHsgRGF0ZVRpbWVJbnRsIH0gZnJvbSAnLi4vZGF0ZS10aW1lLXBpY2tlci1pbnRsLnNlcnZpY2UnXHJcbmltcG9ydCB7IFRpbWVyQ29tcG9uZW50IH0gZnJvbSAnLi4vdGltZXIvdGltZXIuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBkYXRlVGltZVBpY2tlckFuaW1hdGlvbnMgfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmFuaW1hdGlvbnMnXHJcblxyXG4vKiogQGludGVybmFsICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdueHQtZGF0ZS10aW1lLWNvbnRhaW5lcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci1jb250YWluZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbiAgICBhbmltYXRpb25zOiBbXHJcbiAgICAgICAgZGF0ZVRpbWVQaWNrZXJBbmltYXRpb25zLnRyYW5zZm9ybVBpY2tlcixcclxuICAgICAgICBkYXRlVGltZVBpY2tlckFuaW1hdGlvbnMuZmFkZUluUGlja2VyXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gICAgQFZpZXdDaGlsZChDYWxlbmRhckNvbXBvbmVudClcclxuICAgIGNhbGVuZGFyPzogQ2FsZW5kYXJDb21wb25lbnQ8VD5cclxuXHJcbiAgICBAVmlld0NoaWxkKFRpbWVyQ29tcG9uZW50KVxyXG4gICAgdGltZXI/OiBUaW1lckNvbXBvbmVudDxUPlxyXG5cclxuICAgIHBpY2tlcj86IERhdGVUaW1lRGlyZWN0aXZlPFQ+XHJcbiAgICBhY3RpdmVTZWxlY3RlZEluZGV4ID0gMCAvLyBUaGUgY3VycmVudCBhY3RpdmUgU2VsZWN0ZWRJbmRleCBpbiByYW5nZSBzZWxlY3QgbW9kZSAoMDogJ2Zyb20nLCAxOiAndG8nKVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RyZWFtIGVtaXRzIHdoZW4gdHJ5IHRvIGhpZGUgcGlja2VyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGlkZVBpY2tlciQgPSBuZXcgU3ViamVjdDx2b2lkPigpXHJcblxyXG4gICAgcmVhZG9ubHkgaGlkZVBpY2tlclN0cmVhbSA9IHRoaXMuaGlkZVBpY2tlciQuYXNPYnNlcnZhYmxlKClcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0cmVhbSBlbWl0cyB3aGVuIHRyeSB0byBjb25maXJtIHRoZSBzZWxlY3RlZCB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpcm1TZWxlY3RlZCQgPSBuZXcgU3ViamVjdDxFdmVudD4oKVxyXG5cclxuICAgIHJlYWRvbmx5IGNvbmZpcm1TZWxlY3RlZFN0cmVhbSA9IHRoaXMuY29uZmlybVNlbGVjdGVkJC5hc09ic2VydmFibGUoKVxyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGlja2VyT3BlbmVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcclxuXHJcbiAgICByZWFkb25seSBwaWNrZXJPcGVuZWRTdHJlYW0gPSB0aGlzLnBpY2tlck9wZW5lZCQuYXNPYnNlcnZhYmxlKClcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IHBpY2tlciBtb21lbnQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCB0aW1lIHBlcmlvZCBpcyBzaG93biBhbmQgd2hpY2ggZGF0ZSBpc1xyXG4gICAgICogaGlnaGxpZ2h0ZWQgd2hlbiB1c2luZyBrZXlib2FyZCBuYXZpZ2F0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9jbGFtUGlja2VyTW9tZW50PzogVFxyXG5cclxuICAgIGdldCBwaWNrZXJNb21lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYW1QaWNrZXJNb21lbnRcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcGlja2VyTW9tZW50KHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsYW1QaWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbGFtcERhdGUoXHJcbiAgICAgICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyPy5taW4sXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlcj8ubWF4XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwaWNrZXJUeXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlcj8ucGlja2VyVHlwZVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYW5jZWxMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwuY2FuY2VsQnRuTGFiZWxcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLnNldEJ0bkxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ2Zyb20nIGxhYmVsXHJcbiAgICAgKi9cclxuICAgIGdldCBmcm9tTGFiZWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXJJbnRsLnJhbmdlRnJvbUxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ3RvJyBsYWJlbFxyXG4gICAgICovXHJcbiAgICBnZXQgdG9MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlckludGwucmFuZ2VUb0xhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ2Zyb20nIGZvcm1hdHRlZCB2YWx1ZVxyXG4gICAgICovXHJcbiAgICBnZXQgZnJvbUZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnBpY2tlcj8uc2VsZWN0ZWRzWzBdXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlXHJcbiAgICAgICAgICAgID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aGlzLnBpY2tlcj8uZm9ybWF0U3RyaW5nKVxyXG4gICAgICAgICAgICA6ICcnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmFuZ2UgJ3RvJyBmb3JtYXR0ZWQgdmFsdWVcclxuICAgICAqL1xyXG4gICAgZ2V0IHRvRm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucGlja2VyPy5zZWxlY3RlZHNbMV1cclxuICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgPyB0aGlzLmRhdGVUaW1lQWRhcHRlci5mb3JtYXQodmFsdWUsIHRoaXMucGlja2VyPy5mb3JtYXRTdHJpbmcpXHJcbiAgICAgICAgICAgIDogJydcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhc2VzIGluIHdoaWNoIHRoZSBjb250cm9sIGJ1dHRvbnMgc2hvdyBpbiB0aGUgcGlja2VyXHJcbiAgICAgKiAxKSBwaWNrZXIgbW9kZSBpcyAnZGlhbG9nJ1xyXG4gICAgICogMikgcGlja2VyIHR5cGUgaXMgTk9UICdjYWxlbmRhcicgYW5kIHRoZSBwaWNrZXIgbW9kZSBpcyBOT1QgJ2lubGluZSdcclxuICAgICAqL1xyXG4gICAgZ2V0IHNob3dDb250cm9sQnV0dG9ucygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlcj8ucGlja2VyTW9kZSA9PT0gJ2RpYWxvZycgfHxcclxuICAgICAgICAgICAgKHRoaXMucGlja2VyPy5waWNrZXJUeXBlICE9PSAnY2FsZW5kYXInICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlcj8ucGlja2VyTW9kZSAhPT0gJ2lubGluZScpXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250YWluZXJFbG0oKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsbVJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ueHQtZHQtY29udGFpbmVyJylcclxuICAgIGdldCBjb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubnh0LWR0LXBvcHVwLWNvbnRhaW5lcicpXHJcbiAgICBnZXQgcG9wdXBDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXI/LnBpY2tlck1vZGUgPT09ICdwb3B1cCdcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm54dC1kdC1kaWFsb2ctY29udGFpbmVyJylcclxuICAgIGdldCBkaWFsb2dDb250YWluZXJDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5waWNrZXI/LnBpY2tlck1vZGUgPT09ICdkaWFsb2cnXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ueHQtZHQtaW5saW5lLWNvbnRhaW5lcicpXHJcbiAgICBnZXQgaW5saW5lQ29udGFpbmVyQ2xhc3MoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5waWNrZXJNb2RlID09PSAnaW5saW5lJ1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubnh0LWR0LWNvbnRhaW5lci1kaXNhYmxlZCcpXHJcbiAgICBnZXQgY29udGFpbmVyRGlzYWJsZWRDbGFzcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLnBpY2tlcj8uZGlzYWJsZWRcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxyXG4gICAgZ2V0IGNvbnRhaW5lcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5pZFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIEBIb3N0QmluZGluZygnQHRyYW5zZm9ybVBpY2tlcicpXHJcbiAgICBnZXQgY29udGFpbmVyQW5pbWF0aW9uKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGlja2VyPy5waWNrZXJNb2RlID09PSAnaW5saW5lJyA/ICcnIDogJ2VudGVyJ1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZWxtUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHBpY2tlckludGw6IERhdGVUaW1lSW50bCxcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGVUaW1lQWRhcHRlcjogRGF0ZVRpbWVBZGFwdGVyPFQ+XHJcbiAgICApIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCkgeyB9XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdFBpY2tlcigpXHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9jdXNQaWNrZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ0B0cmFuc2Zvcm1QaWNrZXIuZG9uZScsIFsnJGV2ZW50J10pXHJcbiAgICBoYW5kbGVDb250YWluZXJBbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRvU3RhdGUgPSBldmVudC50b1N0YXRlXHJcbiAgICAgICAgaWYgKHRvU3RhdGUgPT09ICdlbnRlcicpIHtcclxuICAgICAgICAgICAgdGhpcy5waWNrZXJPcGVuZWQkLm5leHQoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkYXRlU2VsZWN0ZWQoZGF0ZT86IFQpOiB2b2lkIHtcclxuICAgICAgICBsZXQgcmVzdWx0XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlcj8uaXNJblNpbmdsZU1vZGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5kYXRlU2VsZWN0ZWRJblNpbmdsZU1vZGUoZGF0ZSlcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSByZXN1bHRcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLnNlbGVjdChyZXN1bHQpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3ZSBjbG9zZSB0aGUgcGlja2VyIHdoZW4gcmVzdWx0IGlzIHVuZGVmaW5lZCBhbmQgcGlja2VyVHlwZSBpcyBjYWxlbmRhci5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBpY2tlclR5cGUgPT09ICdjYWxlbmRhcicpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGlja2VyPy5pc0luUmFuZ2VNb2RlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVNlbGVjdGVkSW5SYW5nZU1vZGUoZGF0ZSlcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSByZXN1bHRbdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4XVxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHJlc3VsdClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aW1lU2VsZWN0ZWQodGltZT86IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBpY2tlck1vbWVudCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKHRpbWUpXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5waWNrZXI/LmRhdGVUaW1lQ2hlY2tlcih0aGlzLnBpY2tlck1vbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5waWNrZXIuaXNJblNpbmdsZU1vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0KHRoaXMucGlja2VyTW9tZW50KVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBpY2tlci5pc0luUmFuZ2VNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkcyA9IFsuLi50aGlzLnBpY2tlcj8uc2VsZWN0ZWRzIHx8IFtdXVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlICdmcm9tJyBpcyBhZnRlciAndG8nIG9yICd0bydpcyBiZWZvcmUgJ2Zyb20nXHJcbiAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugc2V0IGJvdGggdGhlICdmcm9tJyBhbmQgJ3RvJyB0aGUgc2FtZSB2YWx1ZVxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAodGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID09PSAwICYmXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRzWzFdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkc1sxXVxyXG4gICAgICAgICAgICAgICAgICAgICkgPT09IDEpIHx8XHJcbiAgICAgICAgICAgICAgICAodGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID09PSAxICYmXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRzWzBdICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkc1swXVxyXG4gICAgICAgICAgICAgICAgICAgICkgPT09IC0xKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkc1swXSA9IHRoaXMucGlja2VyTW9tZW50XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZHNbMV0gPSB0aGlzLnBpY2tlck1vbWVudFxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRzW3RoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleF0gPSB0aGlzLnBpY2tlck1vbWVudFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBpY2tlci5zZWxlY3Qoc2VsZWN0ZWRzKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBjbGljayBvbiBjYW5jZWwgYnV0dG9uXHJcbiAgICAgKi9cclxuICAgIG9uQ2FuY2VsQ2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmhpZGVQaWNrZXIkLm5leHQoKVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBjbGljayBvbiBzZXQgYnV0dG9uXHJcbiAgICAgKi9cclxuICAgIG9uU2V0Q2xpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGlja2VyPy5kYXRlVGltZUNoZWNrZXI/Lih0aGlzLnBpY2tlck1vbWVudCkpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlUGlja2VyJC5uZXh0KClcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlybVNlbGVjdGVkJC5uZXh0KGV2ZW50KVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZSBjbGljayBvbiBpbmZvcm0gcmFkaW8gZ3JvdXBcclxuICAgICAqL1xyXG4gICAgaGFuZGxlQ2xpY2tPbkluZm9Hcm91cChldmVudDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4KVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIGNsaWNrIG9uIGluZm9ybSByYWRpbyBncm91cFxyXG4gICAgICovXHJcbiAgICBoYW5kbGVLZXlkb3duT25JbmZvR3JvdXAoXHJcbiAgICAgICAgZXZlbnQ6IGFueSxcclxuICAgICAgICBuZXh0OiBhbnksXHJcbiAgICAgICAgaW5kZXg6IG51bWJlclxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICAgICAgICAgIG5leHQuZm9jdXMoKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4ID09PSAwID8gMSA6IDApXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlJzpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlU2VsZWN0ZWRJbmRleChpbmRleClcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYWN0aXZlU2VsZWN0ZWRJbmRleFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5waWNrZXI/LnNlbGVjdE1vZGUgPT09ICdyYW5nZScgJiZcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ICE9PSBpbmRleFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPSBpbmRleFxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnBpY2tlcj8uc2VsZWN0ZWRzW3RoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleF1cclxuICAgICAgICAgICAgaWYgKHRoaXMucGlja2VyLnNlbGVjdGVkcyAmJiBzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbG9uZShzZWxlY3RlZClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQaWNrZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5waWNrZXJNb21lbnQgPSB0aGlzLnBpY2tlcj8uc3RhcnRBdCB8fCB0aGlzLmRhdGVUaW1lQWRhcHRlci5ub3coKVxyXG4gICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IHRoaXMucGlja2VyPy5zZWxlY3RNb2RlID09PSAncmFuZ2VUbycgPyAxIDogMFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0IGNhbGVuZGFyIGRhdGUgaW4gc2luZ2xlIG1vZGUsXHJcbiAgICAgKiBpdCByZXR1cm5zIHVuZGVmaW5lZCB3aGVuIGRhdGUgaXMgbm90IHNlbGVjdGVkLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGRhdGVTZWxlY3RlZEluU2luZ2xlTW9kZShkYXRlPzogVCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGVUaW1lQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgdGhpcy5waWNrZXI/LnNlbGVjdGVkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0IGRhdGVzIGluIHJhbmdlIE1vZGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkYXRlU2VsZWN0ZWRJblJhbmdlTW9kZShkYXRlPzogVCk6IEFycmF5PFQgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBsZXQgZnJvbSA9IHRoaXMucGlja2VyPy5zZWxlY3RlZHNbMF1cclxuICAgICAgICBsZXQgdG8gPSB0aGlzLnBpY2tlcj8uc2VsZWN0ZWRzWzFdXHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudXBkYXRlQW5kQ2hlY2tDYWxlbmRhckRhdGUoZGF0ZSlcclxuXHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiB0aGUgZ2l2ZW4gY2FsZW5kYXIgZGF5IGlzIGFmdGVyIG9yIGVxdWFsIHRvICdmcm9tJyxcclxuICAgICAgICAvLyBzZXQgdGhzIGdpdmVuIGRhdGUgYXMgJ3RvJ1xyXG4gICAgICAgIC8vIG90aGVyd2lzZSwgc2V0IGl0IGFzICdmcm9tJyBhbmQgc2V0ICd0bycgdG8gdW5kZWZpbmVkXHJcbiAgICAgICAgaWYgKHRoaXMucGlja2VyPy5zZWxlY3RNb2RlID09PSAncmFuZ2UnKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHRoaXMucGlja2VyLnNlbGVjdGVkcyAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5waWNrZXIuc2VsZWN0ZWRzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICAgICAgIXRvICYmXHJcbiAgICAgICAgICAgICAgICBmcm9tICYmXHJcbiAgICAgICAgICAgICAgICAodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKHJlc3VsdCwgZnJvbSkgPz8gMCkgPj0gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRvID0gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPSAxXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmcm9tID0gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICB0byA9IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID0gMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlcj8uc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScpIHtcclxuICAgICAgICAgICAgZnJvbSA9IHJlc3VsdFxyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlIGZyb20gdmFsdWUgaXMgYWZ0ZXIgdGhlIHRvIHZhbHVlLCBzZXQgdGhlIHRvIHZhbHVlIGFzIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICBpZiAodG8gJiYgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShmcm9tLCB0bykgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0byA9IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBpY2tlcj8uc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nKSB7XHJcbiAgICAgICAgICAgIHRvID0gcmVzdWx0XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGUgZnJvbSB2YWx1ZSBpcyBhZnRlciB0aGUgdG8gdmFsdWUsIHNldCB0aGUgZnJvbSB2YWx1ZSBhcyB1bmRlZmluZWRcclxuICAgICAgICAgICAgaWYgKGZyb20gJiYgdGhpcy5kYXRlVGltZUFkYXB0ZXIuY29tcGFyZShmcm9tLCB0bykgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmcm9tID0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbZnJvbSwgdG9dXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIGdpdmVuIGNhbGVuZGFyIGRhdGUncyB0aW1lIGFuZCBjaGVjayBpZiBpdCBpcyB2YWxpZFxyXG4gICAgICogQmVjYXVzZSB0aGUgY2FsZW5kYXIgZGF0ZSBoYXMgMDA6MDA6MDAgYXMgZGVmYXVsdCB0aW1lLCBpZiB0aGUgcGlja2VyIHR5cGUgaXMgJ2JvdGgnLFxyXG4gICAgICogd2UgbmVlZCB0byB1cGRhdGUgdGhlIGdpdmVuIGNhbGVuZGFyIGRhdGUncyB0aW1lIGJlZm9yZSBzZWxlY3RpbmcgaXQuXHJcbiAgICAgKiBpZiBpdCBpcyB2YWxpZCwgcmV0dXJuIHRoZSB1cGRhdGVkIGRhdGVUaW1lXHJcbiAgICAgKiBpZiBpdCBpcyBub3QgdmFsaWQsIHJldHVybiB1bmRlZmluZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVBbmRDaGVja0NhbGVuZGFyRGF0ZShkYXRlPzogVCk6IFQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGxldCByZXN1bHRcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIHBpY2tlciBpcyAnYm90aCcsIHVwZGF0ZSB0aGUgY2FsZW5kYXIgZGF0ZSdzIHRpbWUgdmFsdWVcclxuICAgICAgICBpZiAodGhpcy5waWNrZXI/LnBpY2tlclR5cGUgPT09ICdib3RoJykge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKGRhdGUpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZShkYXRlKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldEhvdXJzKHRoaXMucGlja2VyTW9tZW50KSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmdldE1pbnV0ZXModGhpcy5waWNrZXJNb21lbnQpLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLnBpY2tlck1vbWVudClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5jbGFtcERhdGUoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5taW4sXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBpY2tlci5tYXhcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmNsb25lKGRhdGUpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayB0aGUgdXBkYXRlZCBkYXRlVGltZVxyXG4gICAgICAgIHJldHVybiB0aGlzLnBpY2tlcj8uZGF0ZVRpbWVDaGVja2VyKHJlc3VsdCkgPyByZXN1bHQgOiB1bmRlZmluZWRcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzIHRvIHRoZSBwaWNrZXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmb2N1c1BpY2tlcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5waWNrZXI/LnBpY2tlck1vZGUgPT09ICdpbmxpbmUnKSB7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhci5mb2N1c0FjdGl2ZUNlbGwoKVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50aW1lcikge1xyXG4gICAgICAgICAgICB0aGlzLnRpbWVyLmZvY3VzKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBbY2RrVHJhcEZvY3VzXT1cInBpY2tlcj8ucGlja2VyTW9kZSAhPT0gJ2lubGluZSdcIlxyXG4gICAgW0BmYWRlSW5QaWNrZXJdPVwicGlja2VyPy5waWNrZXJNb2RlID09PSAnaW5saW5lJz8gJycgOiAnZW50ZXInXCJcclxuICAgIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1pbm5lclwiPlxyXG5cclxuICAgIDxueHQtZGF0ZS10aW1lLWNhbGVuZGFyICpuZ0lmPVwicGlja2VyVHlwZSA9PT0gJ2JvdGgnIHx8IHBpY2tlclR5cGUgPT09ICdjYWxlbmRhcidcIlxyXG4gICAgICAgIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1yb3dcIlxyXG4gICAgICAgIFtmaXJzdERheU9mV2Vla109XCJwaWNrZXI/LmZpcnN0RGF5T2ZXZWVrID8/IDBcIlxyXG4gICAgICAgIFsocGlja2VyTW9tZW50KV09XCJwaWNrZXJNb21lbnRcIlxyXG4gICAgICAgIFtzZWxlY3RlZF09XCJwaWNrZXI/LnNlbGVjdGVkXCJcclxuICAgICAgICBbc2VsZWN0ZWRzXT1cInBpY2tlcj8uc2VsZWN0ZWRzID8/IFtdXCJcclxuICAgICAgICBbc2VsZWN0TW9kZV09XCJwaWNrZXI/LnNlbGVjdE1vZGVcIlxyXG4gICAgICAgIFttaW5dPVwicGlja2VyPy5taW5cIlxyXG4gICAgICAgIFttYXhdPVwicGlja2VyPy5tYXhcIlxyXG4gICAgICAgIFtkYXRlVGltZUZpbHRlcl09XCJwaWNrZXI/LmRhdGVUaW1lRmlsdGVyXCJcclxuICAgICAgICBbc3RhcnRWaWV3XT1cInBpY2tlcj8uc3RhcnRWaWV3ID8/ICdtb250aCdcIlxyXG4gICAgICAgIFtoaWRlT3RoZXJNb250aHNdPVwiISFwaWNrZXI/LmhpZGVPdGhlck1vbnRoc1wiXHJcbiAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJwaWNrZXI/LnNlbGVjdFllYXIoJGV2ZW50KVwiXHJcbiAgICAgICAgKG1vbnRoU2VsZWN0ZWQpPVwicGlja2VyPy5zZWxlY3RNb250aCgkZXZlbnQpXCJcclxuICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwiZGF0ZVNlbGVjdGVkKCRldmVudClcIj48L254dC1kYXRlLXRpbWUtY2FsZW5kYXI+XHJcblxyXG4gICAgPG54dC1kYXRlLXRpbWUtdGltZXIgKm5nSWY9XCJwaWNrZXJUeXBlID09PSAnYm90aCcgfHwgcGlja2VyVHlwZSA9PT0gJ3RpbWVyJ1wiXHJcbiAgICAgICAgY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLXJvd1wiXHJcbiAgICAgICAgW3BpY2tlck1vbWVudF09XCJwaWNrZXJNb21lbnRcIlxyXG4gICAgICAgIFttaW5dPVwicGlja2VyPy5taW5cIlxyXG4gICAgICAgIFttYXhdPVwicGlja2VyPy5tYXhcIlxyXG4gICAgICAgIFtzaG93U2Vjb25kc1RpbWVyXT1cIiEhcGlja2VyPy5zaG93U2Vjb25kc1RpbWVyXCJcclxuICAgICAgICBbaG91cjEyVGltZXJdPVwiISFwaWNrZXI/LmhvdXIxMlRpbWVyXCJcclxuICAgICAgICBbc3RlcEhvdXJdPVwicGlja2VyPy5zdGVwSG91ciA/PyAxXCJcclxuICAgICAgICBbc3RlcE1pbnV0ZV09XCJwaWNrZXI/LnN0ZXBNaW51dGUgPz8gMVwiXHJcbiAgICAgICAgW3N0ZXBTZWNvbmRdPVwicGlja2VyPy5zdGVwU2Vjb25kID8/IDFcIlxyXG4gICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJ0aW1lU2VsZWN0ZWQoJGV2ZW50KVwiPjwvbnh0LWRhdGUtdGltZS10aW1lcj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwicGlja2VyPy5pc0luUmFuZ2VNb2RlXCJcclxuICAgICAgICByb2xlPVwicmFkaW9ncm91cFwiXHJcbiAgICAgICAgY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8gbnh0LWR0LWNvbnRhaW5lci1yb3dcIj5cclxuICAgICAgICA8ZGl2IHJvbGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJhY3RpdmVTZWxlY3RlZEluZGV4ID09PSAwID8gMCA6IC0xXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm54dC1kdC1jb250cm9sIG54dC1kdC1jb250YWluZXItcmFuZ2Ugbnh0LWR0LWNvbnRhaW5lci1mcm9tXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydueHQtZHQtY29udGFpbmVyLWluZm8tYWN0aXZlJzogYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMH1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2tPbkluZm9Hcm91cCgkZXZlbnQsIDApXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bk9uSW5mb0dyb3VwKCRldmVudCwgdG8sIDApXCJcclxuICAgICAgICAgICAgI2Zyb20+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtY29udGVudCBueHQtZHQtY29udGFpbmVyLXJhbmdlLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8tbGFiZWxcIj57e2Zyb21MYWJlbH19Ojwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRhaW5lci1pbmZvLXZhbHVlXCI+e3tmcm9tRm9ybWF0dGVkVmFsdWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgcm9sZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDEgPyAwIDogLTFcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wgbnh0LWR0LWNvbnRhaW5lci1yYW5nZSBueHQtZHQtY29udGFpbmVyLXRvXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydueHQtZHQtY29udGFpbmVyLWluZm8tYWN0aXZlJzogYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMX1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2tPbkluZm9Hcm91cCgkZXZlbnQsIDEpXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bk9uSW5mb0dyb3VwKCRldmVudCwgZnJvbSwgMSlcIlxyXG4gICAgICAgICAgICAjdG8+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibnh0LWR0LWNvbnRyb2wtY29udGVudCBueHQtZHQtY29udGFpbmVyLXJhbmdlLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udGFpbmVyLWluZm8tbGFiZWxcIj57e3RvTGFiZWx9fTo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm54dC1kdC1jb250YWluZXItaW5mby12YWx1ZVwiPnt7dG9Gb3JtYXR0ZWRWYWx1ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0NvbnRyb2xCdXR0b25zXCJcclxuICAgICAgICBjbGFzcz1cIm54dC1kdC1jb250YWluZXItYnV0dG9ucyBueHQtZHQtY29udGFpbmVyLXJvd1wiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJueHQtZHQtY29udHJvbCBueHQtZHQtY29udHJvbC1idXR0b24gbnh0LWR0LWNvbnRhaW5lci1jb250cm9sLWJ1dHRvblwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25DYW5jZWxDbGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJueHQtZHQtY29udHJvbC1jb250ZW50IG54dC1kdC1jb250cm9sLWJ1dHRvbi1jb250ZW50XCJcclxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgIHt7Y2FuY2VsTGFiZWx9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm54dC1kdC1jb250cm9sIG54dC1kdC1jb250cm9sLWJ1dHRvbiBueHQtZHQtY29udGFpbmVyLWNvbnRyb2wtYnV0dG9uXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNldENsaWNrZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm54dC1kdC1jb250cm9sLWNvbnRlbnQgbnh0LWR0LWNvbnRyb2wtYnV0dG9uLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICAgICAge3tzZXRMYWJlbH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19