ng-wsl-library 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/wsl-datetime-picker/wsl-datetime-picker.component.mjs +51 -16
- package/fesm2015/ng-wsl-library.mjs +50 -15
- package/fesm2015/ng-wsl-library.mjs.map +1 -1
- package/fesm2020/ng-wsl-library.mjs +50 -15
- package/fesm2020/ng-wsl-library.mjs.map +1 -1
- package/lib/components/wsl-datetime-picker/wsl-datetime-picker.component.d.ts +2 -1
- package/package.json +1 -1
- package/src/lib/components/wsl-datetime-picker/README.md +73 -5
|
@@ -20,6 +20,7 @@ export class WslDatetimePickerComponent {
|
|
|
20
20
|
this.minutesStep = TIME_STEPS.MINUTES;
|
|
21
21
|
this.secondsStep = TIME_STEPS.SECONDS;
|
|
22
22
|
this.disabled = false;
|
|
23
|
+
this.disableCalendar = false;
|
|
23
24
|
this.internalFormat = INPUT_DATE_FORMATS.DATE_ONLY;
|
|
24
25
|
this._standardFormat = INPUT_DATE_FORMATS.EU_DATE_DASH;
|
|
25
26
|
this.placeholder = '';
|
|
@@ -145,7 +146,7 @@ export class WslDatetimePickerComponent {
|
|
|
145
146
|
}
|
|
146
147
|
toggleCalendar(event) {
|
|
147
148
|
event.stopPropagation();
|
|
148
|
-
if (!this.disabled) {
|
|
149
|
+
if (!this.disabled && !this.disableCalendar) {
|
|
149
150
|
this.showCalendar = !this.showCalendar;
|
|
150
151
|
if (this.showCalendar) {
|
|
151
152
|
this.generateCalendar();
|
|
@@ -247,17 +248,15 @@ export class WslDatetimePickerComponent {
|
|
|
247
248
|
if (this.allowedDates &&
|
|
248
249
|
this.allowedDates.length === 1 &&
|
|
249
250
|
this.allowedDates[0].day === -1) {
|
|
250
|
-
return false;
|
|
251
|
-
}
|
|
252
|
-
if (selectedDate > today) {
|
|
253
251
|
return selectedDate > today;
|
|
254
252
|
}
|
|
255
253
|
if (!this.allowedDates || this.allowedDates.length === 0) {
|
|
256
254
|
return true;
|
|
257
255
|
}
|
|
258
|
-
|
|
256
|
+
const isAllowed = this.allowedDates.find((dayAllowed) => dayAllowed.year === date.year &&
|
|
259
257
|
dayAllowed.month === date.month &&
|
|
260
258
|
dayAllowed.day === date.day);
|
|
259
|
+
return !isAllowed;
|
|
261
260
|
}
|
|
262
261
|
isSameDate(date1, date2) {
|
|
263
262
|
return (date1.getFullYear() === date2.getFullYear() &&
|
|
@@ -277,14 +276,31 @@ export class WslDatetimePickerComponent {
|
|
|
277
276
|
if (this.disabled)
|
|
278
277
|
return;
|
|
279
278
|
const currentValue = this.datetime[field] || 0;
|
|
280
|
-
let newValue
|
|
279
|
+
let newValue;
|
|
280
|
+
if (step > 0) {
|
|
281
|
+
newValue = currentValue + step;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
const stepSize = Math.abs(step);
|
|
285
|
+
newValue = currentValue - stepSize;
|
|
286
|
+
}
|
|
281
287
|
switch (field) {
|
|
282
288
|
case 'hours':
|
|
283
|
-
|
|
289
|
+
if (newValue < 0) {
|
|
290
|
+
newValue = 24 + (newValue % 24);
|
|
291
|
+
}
|
|
292
|
+
else if (newValue > 23) {
|
|
293
|
+
newValue = newValue % 24;
|
|
294
|
+
}
|
|
284
295
|
break;
|
|
285
296
|
case 'minutes':
|
|
286
297
|
case 'seconds':
|
|
287
|
-
|
|
298
|
+
if (newValue < 0) {
|
|
299
|
+
newValue = 60 + (newValue % 60);
|
|
300
|
+
}
|
|
301
|
+
else if (newValue > 59) {
|
|
302
|
+
newValue = newValue % 60;
|
|
303
|
+
}
|
|
288
304
|
break;
|
|
289
305
|
}
|
|
290
306
|
this.datetime[field] = newValue;
|
|
@@ -293,11 +309,28 @@ export class WslDatetimePickerComponent {
|
|
|
293
309
|
}
|
|
294
310
|
onTimeFieldChange(field, event) {
|
|
295
311
|
const input = event.target;
|
|
296
|
-
|
|
297
|
-
if (
|
|
298
|
-
|
|
299
|
-
this.setDateStringModel();
|
|
312
|
+
let value = parseInt(input.value, 10);
|
|
313
|
+
if (isNaN(value)) {
|
|
314
|
+
value = 0;
|
|
300
315
|
}
|
|
316
|
+
switch (field) {
|
|
317
|
+
case 'hours':
|
|
318
|
+
if (value < 0)
|
|
319
|
+
value = 0;
|
|
320
|
+
if (value > 23)
|
|
321
|
+
value = 23;
|
|
322
|
+
break;
|
|
323
|
+
case 'minutes':
|
|
324
|
+
case 'seconds':
|
|
325
|
+
if (value < 0)
|
|
326
|
+
value = 0;
|
|
327
|
+
if (value > 59)
|
|
328
|
+
value = 59;
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
input.value = value.toString().padStart(2, '0');
|
|
332
|
+
this.datetime[field] = value;
|
|
333
|
+
this.setDateStringModel();
|
|
301
334
|
}
|
|
302
335
|
scheduleUpdate() {
|
|
303
336
|
if (!this._isInitialized || this._updatePending)
|
|
@@ -628,13 +661,13 @@ export class WslDatetimePickerComponent {
|
|
|
628
661
|
}
|
|
629
662
|
}
|
|
630
663
|
WslDatetimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WslDatetimePickerComponent, deps: [{ token: i0.Injector }, { token: i1.WslConfigService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
631
|
-
WslDatetimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: WslDatetimePickerComponent, selector: "wsl-datetime-picker", inputs: { dateString: "dateString", inputDatetimeFormat: "inputDatetimeFormat", hoursStep: "hoursStep", minutesStep: "minutesStep", secondsStep: "secondsStep", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", allowedDates: "allowedDates", standardFormat: "standardFormat", seconds: "seconds" }, outputs: { monthChanged: "monthChanged", calendarStateChange: "calendarStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
|
|
664
|
+
WslDatetimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: WslDatetimePickerComponent, selector: "wsl-datetime-picker", inputs: { dateString: "dateString", inputDatetimeFormat: "inputDatetimeFormat", hoursStep: "hoursStep", minutesStep: "minutesStep", secondsStep: "secondsStep", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", disableCalendar: "disableCalendar", allowedDates: "allowedDates", standardFormat: "standardFormat", seconds: "seconds" }, outputs: { monthChanged: "monthChanged", calendarStateChange: "calendarStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
|
|
632
665
|
{
|
|
633
666
|
provide: NG_VALUE_ACCESSOR,
|
|
634
667
|
useExisting: forwardRef(() => WslDatetimePickerComponent),
|
|
635
668
|
multi: true,
|
|
636
669
|
},
|
|
637
|
-
], usesOnChanges: true, ngImport: i0, template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{'ng-valid': ngControl?.valid === true, 'ng-invalid': ngControl?.invalid === true, 'ng-disabled': disabled}\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"/>\n </div>\n\n <button type=\"button\" \n class=\"calendar-icon\" \n [disabled]=\"disabled || !(allowedDates?.length > 0 || (allowedDates?.length === 1 && allowedDates[0]?.day === -1))\"\n [ngClass]=\"{'disabled-btn': disabled || !(allowedDates?.length > 0 || (allowedDates?.length === 1 && allowedDates[0]?.day === -1))}\"\n (click)=\"toggleCalendar($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\" (click)=\"$event.stopPropagation()\">\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">{{ month }}</option>\n </select>\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n \n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">{{ day }}</div>\n </div>\n \n <div class=\"days\">\n <div class=\"day-cell\" \n *ngFor=\"let day of calendarDays\" \n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n \n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n \n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n \n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || 'HH' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.hours || 0\" \n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"23\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\">:</div>\n \n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || 'mm' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.minutes || 0\" \n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n \n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || 'ss' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.seconds || 0\" \n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div class=\"calendar-backdrop\" \n [class.show]=\"showCalendar\" \n (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:inherit;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.datetime-picker-container{position:unset}.calendar-popover{left:50%}.calendar-popover.show{transform:translate(-50%)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.WslTooltipDirective, selector: "[wslTooltip]", inputs: ["tooltipPlacement", "tooltipOffset", "tooltipIconOverlap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
670
|
+
], usesOnChanges: true, ngImport: i0, template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{'ng-valid': ngControl?.valid === true, 'ng-invalid': ngControl?.invalid === true, 'ng-disabled': disabled}\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"/>\n </div>\n\n <button type=\"button\" \n class=\"calendar-icon\" \n [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{'disabled-btn': disabled || disableCalendar}\"\n (click)=\"toggleCalendar($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\" (click)=\"$event.stopPropagation()\">\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">{{ month }}</option>\n </select>\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n \n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">{{ day }}</div>\n </div>\n \n <div class=\"days\">\n <div class=\"day-cell\" \n *ngFor=\"let day of calendarDays\" \n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n \n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n \n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n \n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || 'HH' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.hours || 0\" \n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"23\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\">:</div>\n \n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || 'mm' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.minutes || 0\" \n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n \n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || 'ss' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.seconds || 0\" \n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div class=\"calendar-backdrop\" \n [class.show]=\"showCalendar\" \n (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:inherit;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.datetime-picker-container{position:unset}.calendar-popover{left:50%}.calendar-popover.show{transform:translate(-50%)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.WslTooltipDirective, selector: "[wslTooltip]", inputs: ["tooltipPlacement", "tooltipOffset", "tooltipIconOverlap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
638
671
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WslDatetimePickerComponent, decorators: [{
|
|
639
672
|
type: Component,
|
|
640
673
|
args: [{ selector: 'wsl-datetime-picker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
@@ -643,7 +676,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
643
676
|
useExisting: forwardRef(() => WslDatetimePickerComponent),
|
|
644
677
|
multi: true,
|
|
645
678
|
},
|
|
646
|
-
], template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{'ng-valid': ngControl?.valid === true, 'ng-invalid': ngControl?.invalid === true, 'ng-disabled': disabled}\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"/>\n </div>\n\n <button type=\"button\" \n class=\"calendar-icon\" \n [disabled]=\"disabled || !(allowedDates?.length > 0 || (allowedDates?.length === 1 && allowedDates[0]?.day === -1))\"\n [ngClass]=\"{'disabled-btn': disabled || !(allowedDates?.length > 0 || (allowedDates?.length === 1 && allowedDates[0]?.day === -1))}\"\n (click)=\"toggleCalendar($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\" (click)=\"$event.stopPropagation()\">\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">{{ month }}</option>\n </select>\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n \n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">{{ day }}</div>\n </div>\n \n <div class=\"days\">\n <div class=\"day-cell\" \n *ngFor=\"let day of calendarDays\" \n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n \n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n \n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n \n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || 'HH' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.hours || 0\" \n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"23\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\">:</div>\n \n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || 'mm' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.minutes || 0\" \n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n \n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || 'ss' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.seconds || 0\" \n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div class=\"calendar-backdrop\" \n [class.show]=\"showCalendar\" \n (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:inherit;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.datetime-picker-container{position:unset}.calendar-popover{left:50%}.calendar-popover.show{transform:translate(-50%)}}\n"] }]
|
|
679
|
+
], template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{'ng-valid': ngControl?.valid === true, 'ng-invalid': ngControl?.invalid === true, 'ng-disabled': disabled}\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"/>\n </div>\n\n <button type=\"button\" \n class=\"calendar-icon\" \n [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{'disabled-btn': disabled || disableCalendar}\"\n (click)=\"toggleCalendar($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\" (click)=\"$event.stopPropagation()\">\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">{{ month }}</option>\n </select>\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n \n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">{{ day }}</div>\n </div>\n \n <div class=\"days\">\n <div class=\"day-cell\" \n *ngFor=\"let day of calendarDays\" \n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n \n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n \n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n \n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || 'HH' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.hours || 0\" \n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"23\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\">:</div>\n \n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || 'mm' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.minutes || 0\" \n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n \n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || 'ss' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.seconds || 0\" \n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div class=\"calendar-backdrop\" \n [class.show]=\"showCalendar\" \n (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:inherit;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.datetime-picker-container{position:unset}.calendar-popover{left:50%}.calendar-popover.show{transform:translate(-50%)}}\n"] }]
|
|
647
680
|
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.WslConfigService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { dateString: [{
|
|
648
681
|
type: Input
|
|
649
682
|
}], inputDatetimeFormat: [{
|
|
@@ -660,6 +693,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
660
693
|
type: Input
|
|
661
694
|
}], minDate: [{
|
|
662
695
|
type: Input
|
|
696
|
+
}], disableCalendar: [{
|
|
697
|
+
type: Input
|
|
663
698
|
}], allowedDates: [{
|
|
664
699
|
type: Input
|
|
665
700
|
}], monthChanged: [{
|
|
@@ -674,4 +709,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
674
709
|
type: HostListener,
|
|
675
710
|
args: ['document:click', ['$event']]
|
|
676
711
|
}] } });
|
|
677
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy13c2wtbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvd3NsLWRhdGV0aW1lLXBpY2tlci93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy93c2wtZGF0ZXRpbWUtcGlja2VyL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFFWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFDaEYsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsR0FDbkIsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7O0FBK0JuRCxNQUFNLE9BQU8sMEJBQTBCO0lBOEZyQyxZQUNVLEdBQWEsRUFDYixhQUErQixFQUMvQixHQUFzQjtRQUZ0QixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBM0Z4QixtQkFBYyxHQUFHLEtBQUss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WUFDekQsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGLCtDQy9ESCx3MU9BNkpxQzsyRkQ1RnhCLDBCQUEwQjtrQkFidEMsU0FBUzsrQkFDRSxxQkFBcUIsbUJBR2QsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwyQkFBMkIsQ0FBQzs0QkFDekQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7OEpBS1EsVUFBVTtzQkFBbEIsS0FBSztnQkFNRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBV0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUtGLFlBQVk7c0JBRGYsS0FBSztnQkFzQkksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBb0JILGNBQWM7c0JBRGpCLEtBQUs7Z0JBWUYsT0FBTztzQkFEVixLQUFLO2dCQXdDTixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub29wIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBEYXRlVGltZU1vZGVsLFxuICBXc2xEYXRlU3RydWN0LFxuICBXc2xUaW1lU3RydWN0LFxufSBmcm9tICcuLi8uLi9tb2RlbHMvd3NsLWRhdGUtdGltZS5tb2RlbCc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nQ29udHJvbCxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXREYXRlRm9ybWF0Q29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dzbC1kYXRlLWZvcm1hdHMnO1xuaW1wb3J0IHsgRGF0ZUZvcm1hdENvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGF0ZS1mb3JtYXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFdzbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvd3NsLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0Q3VycmVudERhdGUsIGdldEN1cnJlbnREYXRlVGltZU1vZGVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZS10aW1lJztcbmltcG9ydCB7XG4gIFRJTUVfU1RFUFMsXG4gIElOUFVUX0RBVEVfRk9STUFUUyxcbn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RhdGV0aW1lLXBpY2tlci5jb25zdGFudHMnO1xuXG4vLyBXU0wgaW50ZXJmYWNlcyBmb3IgY29tcG9uZW50LXNwZWNpZmljIHR5cGVzXG5leHBvcnQgaW50ZXJmYWNlIFdzbERhdGVwaWNrZXJOYXZpZ2F0ZUV2ZW50IHtcbiAgY3VycmVudDogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfTtcbiAgbmV4dDogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckRheSB7XG4gIGRheTogbnVtYmVyO1xuICBtb250aDogbnVtYmVyO1xuICB5ZWFyOiBudW1iZXI7XG4gIG90aGVyTW9udGg6IGJvb2xlYW47XG4gIHNlbGVjdGVkOiBib29sZWFuO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgdG9kYXk6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzbC1kYXRldGltZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vd3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gV3NsRGF0ZXRpbWVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgV3NsRGF0ZXRpbWVQaWNrZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xue1xuICBASW5wdXQoKSBkYXRlU3RyaW5nITogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2lucHV0RGF0ZXRpbWVGb3JtYXQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgaW5wdXREYXRldGltZUZvcm1hdCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5faW5wdXREYXRldGltZUZvcm1hdCA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBpbnB1dERhdGV0aW1lRm9ybWF0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQ7XG4gIH1cblxuICBASW5wdXQoKSBob3Vyc1N0ZXA6IG51bWJlciA9IFRJTUVfU1RFUFMuSE9VUlM7XG4gIEBJbnB1dCgpIG1pbnV0ZXNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLk1JTlVURVM7XG4gIEBJbnB1dCgpIHNlY29uZHNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLlNFQ09ORFM7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1heERhdGU6IFdzbERhdGVTdHJ1Y3Q7XG4gIEBJbnB1dCgpIG1pbkRhdGU6IFdzbERhdGVTdHJ1Y3Q7XG5cbiAgcHJpdmF0ZSBfYWxsb3dlZERhdGVzITogV3NsRGF0ZVN0cnVjdFtdO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBhbGxvd2VkRGF0ZXModmFsdWU6IFdzbERhdGVTdHJ1Y3RbXSkge1xuICAgIHRoaXMuX2FsbG93ZWREYXRlcyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYWxsb3dlZERhdGVzKCk6IFdzbERhdGVTdHJ1Y3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93ZWREYXRlcztcbiAgfVxuXG4gIGludGVybmFsRm9ybWF0OiBzdHJpbmcgPSBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZO1xuICBwcml2YXRlIF9zdGFuZGFyZEZvcm1hdDogc3RyaW5nID0gSU5QVVRfREFURV9GT1JNQVRTLkVVX0RBVEVfREFTSDtcblxuICBwbGFjZWhvbGRlciA9ICcnO1xuICBzdGFydERhdGU6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH0gPSB7IHllYXI6IDAsIG1vbnRoOiAwIH07XG4gIHNob3dUaW1lUGlja2VyVG9nZ2xlID0gZmFsc2U7XG4gIGRhdGV0aW1lOiBEYXRlVGltZU1vZGVsID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcbiAgbmdDb250cm9sOiBOZ0NvbnRyb2wgfCBudWxsID0gbnVsbDtcbiAgZGF0ZUNvbmZpZyE6IERhdGVGb3JtYXRDb25maWc7XG5cbiAgQE91dHB1dCgpIG1vbnRoQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY2FsZW5kYXJTdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIG9uQ2hhbmdlOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBsYW5ndWFnZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHNob3dUaW1lQ29udHJvbHMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2Vjb25kcyA9IGZhbHNlO1xuICBwcml2YXRlIF91cGRhdGVQZW5kaW5nID0gZmFsc2U7XG5cbiAgc2hvd0NhbGVuZGFyID0gZmFsc2U7XG4gIGN1cnJlbnRZZWFyOiBudW1iZXI7XG4gIGN1cnJlbnRNb250aDogbnVtYmVyO1xuICBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcbiAgd2Vla2RheUxhYmVsczogc3RyaW5nW10gPSBbXTtcblxuICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xuICBkZWZhdWx0WWVhclJhbmdlID0geyBzdGFydDogMjAwMCwgZW5kOiAyMDUwIH07XG5cbiAgQElucHV0KClcbiAgc2V0IHN0YW5kYXJkRm9ybWF0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fc3RhbmRhcmRGb3JtYXQgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5fc3RhbmRhcmRGb3JtYXQgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBnZXQgc3RhbmRhcmRGb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhbmRhcmRGb3JtYXQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc2Vjb25kcyh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9zZWNvbmRzID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuX3NlY29uZHMgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBnZXQgc2Vjb25kcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vjb25kcztcbiAgfVxuXG4gIGlzRGF0ZU9ubHkgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGluajogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBXc2xDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGdldEN1cnJlbnREYXRlKCk7XG4gICAgdGhpcy5jdXJyZW50WWVhciA9IGN1cnJlbnREYXRlLnllYXI7XG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBjdXJyZW50RGF0ZS5tb250aDtcblxuICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJyk7XG5cbiAgICB0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uID0gdGhpcy5jb25maWdTZXJ2aWNlXG4gICAgICAud2F0Y2hMYW5ndWFnZSgpXG4gICAgICAuc3Vic2NyaWJlKChsYW5ndWFnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcobGFuZ3VhZ2UgfHwgJ2VuJyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVXZWVrZGF5TGFiZWxzKCk7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVXZWVrZGF5TGFiZWxzKCk7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dDYWxlbmRhcikge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgY2FsZW5kYXJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhbGVuZGFyLXBvcG92ZXInKTtcbiAgICAgIGNvbnN0IGJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FsZW5kYXItaWNvbicpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGNhbGVuZGFyRWxlbWVudCAmJlxuICAgICAgICBidXR0b25FbGVtZW50ICYmXG4gICAgICAgICFjYWxlbmRhckVsZW1lbnQuY29udGFpbnModGFyZ2V0KSAmJlxuICAgICAgICAhYnV0dG9uRWxlbWVudC5jb250YWlucyh0YXJnZXQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jbG9zZUNhbGVuZGFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluai5nZXQoTmdDb250cm9sKTtcbiAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB0aGlzLmluaXRpYWxpemVNb250aHNBbmRZZWFycygpO1xuICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplTGFuZ3VhZ2VDb25maWd1cmF0aW9uKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2UgPSB0aGlzLmNvbmZpZ1NlcnZpY2UubGFuZ3VhZ2U7XG4gICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKGN1cnJlbnRMYW5ndWFnZSB8fCAnZW4nKTtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydtaW5EYXRlJ10gfHwgY2hhbmdlc1snbWF4RGF0ZSddKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVNb250aHNBbmRZZWFycygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2FsbG93ZWREYXRlcyddKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYW5ndWFnZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sYW5ndWFnZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUNhbGVuZGFyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5zaG93Q2FsZW5kYXIgPSAhdGhpcy5zaG93Q2FsZW5kYXI7XG4gICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgLy8gRW1pdCBhZnRlciBET00gdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQodGhpcy5zaG93Q2FsZW5kYXIpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VDYWxlbmRhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIEVtaXQgYWZ0ZXIgRE9NIHVwZGF0ZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgbmF2aWdhdGVNb250aChkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudE1vbnRoICs9IGRpcmVjdGlvbjtcbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGggPiAxMikge1xuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxO1xuICAgICAgdGhpcy5jdXJyZW50WWVhcisrO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50TW9udGggPCAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IDEyO1xuICAgICAgdGhpcy5jdXJyZW50WWVhci0tO1xuICAgIH1cblxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQodGhpcy5jdXJyZW50TW9udGgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5KTogdm9pZCB7XG4gICAgaWYgKGRheS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlOiBXc2xEYXRlU3RydWN0ID0ge1xuICAgICAgeWVhcjogZGF5LnllYXIsXG4gICAgICBtb250aDogZGF5Lm1vbnRoLFxuICAgICAgZGF5OiBkYXkuZGF5LFxuICAgIH07XG5cbiAgICB0aGlzLm9uRGF0ZUNoYW5nZShzZWxlY3RlZERhdGUpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoIC0gMSwgMSk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZmlyc3REYXkpO1xuXG4gICAgY29uc3Qgd2Vla1N0YXJ0ID0gdGhpcy5kYXRlQ29uZmlnPy53ZWVrU3RhcnQgfHwgMTtcbiAgICBjb25zdCBkYXlPZldlZWsgPSAoZmlyc3REYXkuZ2V0RGF5KCkgKyA3IC0gd2Vla1N0YXJ0KSAlIDc7XG4gICAgc3RhcnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSAtIGRheU9mV2Vlayk7XG5cbiAgICB0aGlzLmNhbGVuZGFyRGF5cyA9IFtdO1xuICAgIGNvbnN0IHRvZGF5RGF0ZSA9IGdldEN1cnJlbnREYXRlKCk7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSh0b2RheURhdGUueWVhciwgdG9kYXlEYXRlLm1vbnRoIC0gMSwgdG9kYXlEYXRlLmRheSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQyOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICAgIGN1cnJlbnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSArIGkpO1xuXG4gICAgICBjb25zdCBkYXlTdHJ1Y3Q6IFdzbERhdGVTdHJ1Y3QgPSB7XG4gICAgICAgIHllYXI6IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgZGF5OiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjYWxlbmRhckRheTogQ2FsZW5kYXJEYXkgPSB7XG4gICAgICAgIGRheTogY3VycmVudERhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICBtb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgIHllYXI6IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIG90aGVyTW9udGg6IGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxICE9PSB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuaXNEYXRlU2VsZWN0ZWQoZGF5U3RydWN0KSxcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF5U3RydWN0KSxcbiAgICAgICAgdG9kYXk6IHRoaXMuaXNTYW1lRGF0ZShjdXJyZW50RGF0ZSwgdG9kYXkpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYWxlbmRhckRheXMucHVzaChjYWxlbmRhckRheSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVTZWxlY3RlZChkYXRlOiBXc2xEYXRlU3RydWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5kYXRldGltZSAmJlxuICAgICAgdGhpcy5kYXRldGltZS55ZWFyID09PSBkYXRlLnllYXIgJiZcbiAgICAgIHRoaXMuZGF0ZXRpbWUubW9udGggPT09IGRhdGUubW9udGggJiZcbiAgICAgIHRoaXMuZGF0ZXRpbWUuZGF5ID09PSBkYXRlLmRheVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZURpc2FibGVkKGRhdGU6IFdzbERhdGVTdHJ1Y3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXRlLnllYXIsIGRhdGUubW9udGggLSAxLCBkYXRlLmRheSk7XG4gICAgY29uc3QgdG9kYXlEYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKHRvZGF5RGF0ZS55ZWFyLCB0b2RheURhdGUubW9udGggLSAxLCB0b2RheURhdGUuZGF5KTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcbiAgICAgIGNvbnN0IG1heERhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgdGhpcy5tYXhEYXRlLnllYXIsXG4gICAgICAgIHRoaXMubWF4RGF0ZS5tb250aCAtIDEsXG4gICAgICAgIHRoaXMubWF4RGF0ZS5kYXlcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWREYXRlID4gbWF4RGF0ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5EYXRlKSB7XG4gICAgICBjb25zdCBtaW5EYXRlID0gbmV3IERhdGUoXG4gICAgICAgIHRoaXMubWluRGF0ZS55ZWFyLFxuICAgICAgICB0aGlzLm1pbkRhdGUubW9udGggLSAxLFxuICAgICAgICB0aGlzLm1pbkRhdGUuZGF5XG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkRGF0ZSA8IG1pbkRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgJiZcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXNbMF0uZGF5ID09PSAtMVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzZWxlY3RlZERhdGUgPiB0b2RheSkge1xuICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0ZSA+IHRvZGF5O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hbGxvd2VkRGF0ZXMgfHwgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIXRoaXMuYWxsb3dlZERhdGVzLmZpbmQoXG4gICAgICAoZGF5QWxsb3dlZCkgPT5cbiAgICAgICAgZGF5QWxsb3dlZC55ZWFyID09PSBkYXRlLnllYXIgJiZcbiAgICAgICAgZGF5QWxsb3dlZC5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxuICAgICAgICBkYXlBbGxvd2VkLmRheSA9PT0gZGF0ZS5kYXlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVEYXRlKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBkYXRlMS5nZXRGdWxsWWVhcigpID09PSBkYXRlMi5nZXRGdWxsWWVhcigpICYmXG4gICAgICBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpICYmXG4gICAgICBkYXRlMS5nZXREYXRlKCkgPT09IGRhdGUyLmdldERhdGUoKVxuICAgICk7XG4gIH1cblxuICBnZXRNb250aE5hbWUobW9udGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhJbmRleCA9IG1vbnRoIC0gMTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy5tb250aE5hbWVzPy5bbW9udGhJbmRleF0gfHxcbiAgICAgIGdldERhdGVGb3JtYXRDb25maWcoJ2VuJykubW9udGhOYW1lc1ttb250aEluZGV4XVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVdlZWtkYXlMYWJlbHMoKTogdm9pZCB7XG4gICAgdGhpcy53ZWVrZGF5TGFiZWxzID1cbiAgICAgIHRoaXMuZGF0ZUNvbmZpZz8ud2Vla2RheUxhYmVscyB8fCBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpLndlZWtkYXlMYWJlbHM7XG4gIH1cblxuICBhZGp1c3RUaW1lKGZpZWxkOiAnaG91cnMnIHwgJ21pbnV0ZXMnIHwgJ3NlY29uZHMnLCBzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5kYXRldGltZVtmaWVsZF0gfHwgMDtcbiAgICBsZXQgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgKyBzdGVwO1xuXG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlIDwgMCA/IDIzIDogbmV3VmFsdWUgPiAyMyA/IDAgOiBuZXdWYWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlIDwgMCA/IDU5IDogbmV3VmFsdWUgPiA1OSA/IDAgOiBuZXdWYWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRldGltZVtmaWVsZF0gPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25UaW1lRmllbGRDaGFuZ2UoXG4gICAgZmllbGQ6ICdob3VycycgfCAnbWludXRlcycgfCAnc2Vjb25kcycsXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChpbnB1dC52YWx1ZSwgMTApO1xuXG4gICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWVbZmllbGRdID0gdmFsdWU7XG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVVcGRhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8IHRoaXMuX3VwZGF0ZVBlbmRpbmcpIHJldHVybjtcblxuICAgIHRoaXMuX3VwZGF0ZVBlbmRpbmcgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlUGVuZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5kZXRlY3RUaW1lQ29tcG9uZW50cygpO1xuICAgIHRoaXMuc2V0U3RhbmRhcmRGb3JtYXQoKTtcbiAgICB0aGlzLnNldFBsYWNlaG9sZGVyKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdFRpbWVDb21wb25lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGhhc1RpbWVGb3JtYXQgPSB0aGlzLmhhc1RpbWVJbkZvcm1hdCh0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQpO1xuXG4gICAgICBpZiAoIWhhc1RpbWVGb3JtYXQpIHtcbiAgICAgICAgdGhpcy5zaG93VGltZUNvbnRyb2xzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NlY29uZHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0RhdGVPbmx5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3dUaW1lQ29udHJvbHMgPSB0cnVlO1xuICAgICAgdGhpcy5pc0RhdGVPbmx5ID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZWNvbmRzID0gdGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0LmluY2x1ZGVzKCc6c3MnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93VGltZUNvbnRyb2xzID0gdGhpcy5fc2Vjb25kcztcbiAgICAgIHRoaXMuaXNEYXRlT25seSA9ICF0aGlzLl9zZWNvbmRzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzVGltZUluRm9ybWF0KGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZvcm1hdC5pbmNsdWRlcygnSEg6JykgfHxcbiAgICAgIGZvcm1hdC5pbmNsdWRlcygnaGg6JykgfHxcbiAgICAgIGZvcm1hdC5pbmNsdWRlcygnOm1tJykgfHxcbiAgICAgIGZvcm1hdC5pbmNsdWRlcygnOnNzJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGFuZGFyZEZvcm1hdCgpOiB2b2lkIHtcbiAgICB0aGlzLmludGVybmFsRm9ybWF0ID1cbiAgICAgIHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCB8fCBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZO1xuICAgIHRoaXMuX3N0YW5kYXJkRm9ybWF0ID0gdGhpcy5pbnRlcm5hbEZvcm1hdDtcblxuICAgIGlmICh0aGlzLnNob3dUaW1lQ29udHJvbHMgJiYgIXRoaXMuaGFzVGltZUluRm9ybWF0KHRoaXMuX3N0YW5kYXJkRm9ybWF0KSkge1xuICAgICAgdGhpcy5fc3RhbmRhcmRGb3JtYXQgKz0gdGhpcy5fc2Vjb25kcyA/ICcgSEg6bW06c3MnIDogJyBISDptbSc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRQbGFjZWhvbGRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID1cbiAgICAgIHRoaXMuZGF0ZUNvbmZpZz8ucGxhY2Vob2xkZXI/LnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICh0aGlzLnNob3dUaW1lQ29udHJvbHMpIHtcbiAgICAgIHRoaXMucGxhY2Vob2xkZXIgKz0gdGhpcy5fc2Vjb25kcyA/ICcgaGg6bW06c3MnIDogJyBoaDptbSc7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZShuZXdNb2RlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKG5ld01vZGVsKSB7XG4gICAgICAvLyBQYXJzZSB3aXRob3V0IHRpbWV6b25lIGNvbnZlcnNpb25cbiAgICAgIGNvbnN0IHBhcnNlZE1vZGVsID0gRGF0ZVRpbWVNb2RlbC5mcm9tTG9jYWxTdHJpbmcobmV3TW9kZWwsIGZhbHNlKTtcblxuICAgICAgaWYgKHBhcnNlZE1vZGVsICYmIHR5cGVvZiBwYXJzZWRNb2RlbC55ZWFyID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLmRhdGV0aW1lID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICB0aGlzLmRhdGV0aW1lIHx8IG5ldyBEYXRlVGltZU1vZGVsKCksXG4gICAgICAgICAgcGFyc2VkTW9kZWxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5kYXRlU3RyaW5nID0gbmV3TW9kZWw7XG4gICAgICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBuZXcgRGF0ZVRpbWVNb2RlbCgpO1xuICAgICAgdGhpcy5kYXRlU3RyaW5nID0gJyc7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBuYXZpZ2F0ZShldmVudDogV3NsRGF0ZXBpY2tlck5hdmlnYXRlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQ/LmN1cnJlbnQgJiYgZXZlbnQ/LmN1cnJlbnQubW9udGggIT09IGV2ZW50Py5uZXh0Lm1vbnRoKSB7XG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KGV2ZW50Py5uZXh0Lm1vbnRoKTtcbiAgICB9XG4gIH1cblxuICBpc0Rpc2FibGVkKFxuICAgIGRhdGVzOiBXc2xEYXRlU3RydWN0W11cbiAgKTogKFxuICAgIGRhdGU6IFdzbERhdGVTdHJ1Y3QsXG4gICAgY3VycmVudD86IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH1cbiAgKSA9PiBib29sZWFuIHtcbiAgICByZXR1cm4gKHBpY2tlckRhdGU6IFdzbERhdGVTdHJ1Y3QpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQWxsb3dlZERhdGVzID0gdGhpcy5hbGxvd2VkRGF0ZXM7XG4gICAgICB0aGlzLmFsbG93ZWREYXRlcyA9IGRhdGVzO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5pc0RhdGVEaXNhYmxlZChwaWNrZXJEYXRlKTtcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzID0gb3JpZ2luYWxBbGxvd2VkRGF0ZXM7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgdG9nZ2xlRGF0ZVRpbWVTdGF0ZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXNWYWxpZERhdGUoKSkge1xuICAgICAgdGhpcy5zaG93VGltZVBpY2tlclRvZ2dsZSA9ICF0aGlzLnNob3dUaW1lUGlja2VyVG9nZ2xlO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWxpbWl0ZXIoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kYXRlQ29uZmlnPy5mb3JtYXQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kYXRlQ29uZmlnLmZvcm1hdC5tYXRjaCgvW15hLXpBLVowLTldLyk7XG4gICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMF0pIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzBdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRlQ29uZmlnPy5kYXRlU2VwYXJhdG9yIHx8ICctJztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VEYXRlKHZhbHVlOiBzdHJpbmcpOiBXc2xEYXRlU3RydWN0IHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsaW1pdGVyID0gdGhpcy5nZXREZWxpbWl0ZXIoKTtcbiAgICBjb25zdCBkYXRlID0gdmFsdWUuc3BsaXQoZGVsaW1pdGVyKTtcblxuICAgIGlmIChkYXRlLmxlbmd0aCA8IDMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5kYXRlQ29uZmlnPy5kYXlGaXJzdCkge1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXRlWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVsxXSwgMTApO1xuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZGF0ZVsyXSwgMTApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc05hTihkYXkpIHx8XG4gICAgICAgICAgaXNOYU4obW9udGgpIHx8XG4gICAgICAgICAgaXNOYU4oeWVhcikgfHxcbiAgICAgICAgICBkYXkgPCAxIHx8XG4gICAgICAgICAgZGF5ID4gMzEgfHxcbiAgICAgICAgICBtb250aCA8IDEgfHxcbiAgICAgICAgICBtb250aCA+IDEyXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZGF5LCBtb250aCwgeWVhciB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9ybWF0OiBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZICh5eXl5LU1NLWRkKVxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZGF0ZVswXSwgMTApO1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KGRhdGVbMV0sIDEwKTtcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQoZGF0ZVsyXSwgMTApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc05hTihkYXkpIHx8XG4gICAgICAgICAgaXNOYU4obW9udGgpIHx8XG4gICAgICAgICAgaXNOYU4oeWVhcikgfHxcbiAgICAgICAgICBkYXkgPCAxIHx8XG4gICAgICAgICAgZGF5ID4gMzEgfHxcbiAgICAgICAgICBtb250aCA8IDEgfHxcbiAgICAgICAgICBtb250aCA+IDEyXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgeWVhciwgbW9udGgsIGRheSB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZTogV3NsRGF0ZVN0cnVjdCB8IG51bGwpOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGltaXRlciA9IHRoaXMuZ2V0RGVsaW1pdGVyKCk7XG4gICAgY29uc3QgZGF5Rm9ybWF0dGVkID0gZGF0ZS5kYXkgPCAxMCA/ICcwJyArIGRhdGUuZGF5IDogZGF0ZS5kYXkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBtb250aEZvcm1hdHRlZCA9XG4gICAgICBkYXRlLm1vbnRoIDwgMTAgPyAnMCcgKyBkYXRlLm1vbnRoIDogZGF0ZS5tb250aC50b1N0cmluZygpO1xuICAgIGNvbnN0IHllYXJGb3JtYXR0ZWQgPSBkYXRlLnllYXIudG9TdHJpbmcoKTtcblxuICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmRheUZpcnN0KSB7XG4gICAgICByZXR1cm4gYCR7ZGF5Rm9ybWF0dGVkfSR7ZGVsaW1pdGVyfSR7bW9udGhGb3JtYXR0ZWR9JHtkZWxpbWl0ZXJ9JHt5ZWFyRm9ybWF0dGVkfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3llYXJGb3JtYXR0ZWR9JHtkZWxpbWl0ZXJ9JHttb250aEZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke2RheUZvcm1hdHRlZH1gO1xuICB9XG5cbiAgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG5cbiAgICBpZiAodmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKCk7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSAnJztcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRlU3RyaW5nKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLnBhcnNlRGF0ZSh2YWx1ZSk7XG4gICAgaWYgKHBhcnNlZERhdGUpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBuZXcgRGF0ZVRpbWVNb2RlbCh7XG4gICAgICAgIHllYXI6IHBhcnNlZERhdGUueWVhcixcbiAgICAgICAgbW9udGg6IHBhcnNlZERhdGUubW9udGgsXG4gICAgICAgIGRheTogcGFyc2VkRGF0ZS5kYXksXG4gICAgICAgIGhvdXJzOiB0aGlzLmRhdGV0aW1lPy5ob3VycyB8fCAwLFxuICAgICAgICBtaW51dGVzOiB0aGlzLmRhdGV0aW1lPy5taW51dGVzIHx8IDAsXG4gICAgICAgIHNlY29uZHM6IHRoaXMuZGF0ZXRpbWU/LnNlY29uZHMgfHwgMCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWVNb2RlbC5mcm9tTG9jYWxTdHJpbmcodmFsdWUpO1xuICAgIGlmIChkdCAmJiBkdC55ZWFyKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gZHQ7XG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGF0ZUNoYW5nZShldmVudDogc3RyaW5nIHwgV3NsRGF0ZVN0cnVjdCk6IHZvaWQge1xuICAgIGxldCBkYXRlOiBEYXRlVGltZU1vZGVsO1xuXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZVRpbWVNb2RlbCh0aGlzLnBhcnNlRGF0ZShldmVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gbmV3IERhdGVUaW1lTW9kZWwoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmICghZGF0ZSB8fCAhZGF0ZS55ZWFyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGV0aW1lKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gZGF0ZTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGV0aW1lLnllYXIgPSBkYXRlLnllYXI7XG4gICAgdGhpcy5kYXRldGltZS5tb250aCA9IGRhdGUubW9udGg7XG4gICAgdGhpcy5kYXRldGltZS5kYXkgPSBkYXRlLmRheTtcblxuICAgIHRoaXMuY3VycmVudFllYXIgPSBkYXRlLnllYXI7XG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBkYXRlLm1vbnRoO1xuXG4gICAgdGhpcy5zdGFydERhdGUgPSB7XG4gICAgICB5ZWFyOiBkYXRlLnllYXIsXG4gICAgICBtb250aDogZGF0ZS5tb250aCxcbiAgICB9O1xuXG4gICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgfVxuXG4gIHNldERhdGVTdHJpbmdNb2RlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRldGltZSAmJiB0eXBlb2YgdGhpcy5kYXRldGltZS55ZWFyID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5kYXRlU3RyaW5nID0gdGhpcy5kYXRldGltZS50b1N0cmluZygpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSAnJztcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRlU3RyaW5nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGV0aW1lICYmIHRoaXMuZGF0ZXRpbWUueWVhcikge1xuICAgICAgY29uc3QgZGF0ZVN0cnVjdDogV3NsRGF0ZVN0cnVjdCA9IHtcbiAgICAgICAgeWVhcjogdGhpcy5kYXRldGltZS55ZWFyLFxuICAgICAgICBtb250aDogdGhpcy5kYXRldGltZS5tb250aCxcbiAgICAgICAgZGF5OiB0aGlzLmRhdGV0aW1lLmRheSxcbiAgICAgIH07XG5cbiAgICAgIGxldCBkaXNwbGF5VmFsdWUgPSB0aGlzLmZvcm1hdERhdGUoZGF0ZVN0cnVjdCk7XG5cbiAgICAgIGlmICh0aGlzLnNob3dUaW1lQ29udHJvbHMgJiYgIXRoaXMuaXNEYXRlT25seSkge1xuICAgICAgICBjb25zdCBob3VyID1cbiAgICAgICAgICB0aGlzLmRhdGV0aW1lLmhvdXJzICE9PSB1bmRlZmluZWQgPyB0aGlzLmRhdGV0aW1lLmhvdXJzIDogMDtcbiAgICAgICAgY29uc3QgbWludXRlID1cbiAgICAgICAgICB0aGlzLmRhdGV0aW1lLm1pbnV0ZXMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUubWludXRlcyA6IDA7XG4gICAgICAgIGNvbnN0IHNlY29uZCA9XG4gICAgICAgICAgdGhpcy5kYXRldGltZS5zZWNvbmRzICE9PSB1bmRlZmluZWQgPyB0aGlzLmRhdGV0aW1lLnNlY29uZHMgOiAwO1xuXG4gICAgICAgIGNvbnN0IGhvdXJGb3JtYXR0ZWQgPSBob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91ci50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBtaW51dGVGb3JtYXR0ZWQgPSBtaW51dGUgPCAxMCA/ICcwJyArIG1pbnV0ZSA6IG1pbnV0ZS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBzZWNvbmRGb3JtYXR0ZWQgPSBzZWNvbmQgPCAxMCA/ICcwJyArIHNlY29uZCA6IHNlY29uZC50b1N0cmluZygpO1xuXG4gICAgICAgIGRpc3BsYXlWYWx1ZSArPSBgICR7aG91ckZvcm1hdHRlZH06JHttaW51dGVGb3JtYXR0ZWR9YDtcblxuICAgICAgICBpZiAodGhpcy5zZWNvbmRzKSB7XG4gICAgICAgICAgZGlzcGxheVZhbHVlICs9IGA6JHtzZWNvbmRGb3JtYXR0ZWR9YDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlzcGxheVZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIGdldEVmZmVjdGl2ZUZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGxldCBmb3JtYXQgPSB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQgfHwgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWTtcblxuICAgIGlmICh0aGlzLnNob3dUaW1lQ29udHJvbHMgJiYgIXRoaXMuaGFzVGltZUluRm9ybWF0KGZvcm1hdCkpIHtcbiAgICAgIGZvcm1hdCArPSB0aGlzLl9zZWNvbmRzID8gJyBISDptbTpzcycgOiAnIEhIOm1tJztcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgb25UaW1lQ2hhbmdlKGV2ZW50OiBXc2xUaW1lU3RydWN0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIHRoaXMuZGF0ZXRpbWUgPSBuZXcgRGF0ZVRpbWVNb2RlbCh7XG4gICAgICAuLi50aGlzLmRhdGV0aW1lLFxuICAgICAgaG91cnM6IGV2ZW50LmhvdXJzLFxuICAgICAgbWludXRlczogZXZlbnQubWludXRlcyxcbiAgICAgIHNlY29uZHM6IGV2ZW50LnNlY29uZHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaGFzVmFsaWREYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZGF0ZXRpbWUgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmRhdGV0aW1lLnllYXIgPT09ICdudW1iZXInICYmXG4gICAgICB0eXBlb2YgdGhpcy5kYXRldGltZS5tb250aCA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmRhdGV0aW1lLmRheSA9PT0gJ251bWJlcidcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplTW9udGhzQW5kWWVhcnMoKTogdm9pZCB7XG4gICAgLy8gSW5pdGlhbGl6ZSBtb250aHNcbiAgICB0aGlzLm1vbnRocyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDEyIH0sIChfLCBpKSA9PlxuICAgICAgdGhpcy5nZXRNb250aE5hbWUoaSArIDEpXG4gICAgKTtcblxuICAgIC8vIEluaXRpYWxpemUgeWVhcnMgYmFzZWQgb24gbWluL21heCBkYXRlcyBvciBkZWZhdWx0IHJhbmdlXG4gICAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3Qgc3RhcnRZZWFyID0gdGhpcy5taW5EYXRlPy55ZWFyIHx8IGN1cnJlbnRZZWFyIC0gNTA7XG4gICAgY29uc3QgZW5kWWVhciA9IHRoaXMubWF4RGF0ZT8ueWVhciB8fCBjdXJyZW50WWVhciArIDUwO1xuXG4gICAgLy8gQ3JlYXRlIGFycmF5IG9mIHllYXJzIGluIGRlc2NlbmRpbmcgb3JkZXJcbiAgICB0aGlzLnllYXJzID0gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBlbmRZZWFyIC0gc3RhcnRZZWFyICsgMSB9LFxuICAgICAgKF8sIGkpID0+IGVuZFllYXIgLSBpXG4gICAgKS5zb3J0KChhLCBiKSA9PiBiIC0gYSk7IC8vIFNvcnQgaW4gZGVzY2VuZGluZyBvcmRlclxuICB9XG5cbiAgb25Nb250aFNlbGVjdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3QgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XG4gICAgY29uc3QgbmV3TW9udGggPSBwYXJzZUludChzZWxlY3QudmFsdWUsIDEwKTtcbiAgICBpZiAobmV3TW9udGggIT09IHRoaXMuY3VycmVudE1vbnRoKSB7XG4gICAgICBjb25zdCBvbGRNb250aCA9IHRoaXMuY3VycmVudE1vbnRoO1xuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXdNb250aDtcbiAgICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQobmV3TW9udGgpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICB0aGlzLm5hdmlnYXRlKHtcbiAgICAgICAgY3VycmVudDogeyB5ZWFyOiB0aGlzLmN1cnJlbnRZZWFyLCBtb250aDogb2xkTW9udGggfSxcbiAgICAgICAgbmV4dDogeyB5ZWFyOiB0aGlzLmN1cnJlbnRZZWFyLCBtb250aDogbmV3TW9udGggfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uWWVhclNlbGVjdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3QgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XG4gICAgY29uc3QgbmV3WWVhciA9IHBhcnNlSW50KHNlbGVjdC52YWx1ZSwgMTApO1xuICAgIGlmIChuZXdZZWFyICE9PSB0aGlzLmN1cnJlbnRZZWFyKSB7XG4gICAgICBjb25zdCBvbGRZZWFyID0gdGhpcy5jdXJyZW50WWVhcjtcbiAgICAgIHRoaXMuY3VycmVudFllYXIgPSBuZXdZZWFyO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICB0aGlzLm5hdmlnYXRlKHtcbiAgICAgICAgY3VycmVudDogeyB5ZWFyOiBvbGRZZWFyLCBtb250aDogdGhpcy5jdXJyZW50TW9udGggfSxcbiAgICAgICAgbmV4dDogeyB5ZWFyOiBuZXdZZWFyLCBtb250aDogdGhpcy5jdXJyZW50TW9udGggfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRhdGV0aW1lLXBpY2tlci1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lclwiPlxuICAgIDxpbnB1dFxuICAgICAgI2RhdGVJbnB1dFxuICAgICAgW25nQ2xhc3NdPVwieyduZy12YWxpZCc6IG5nQ29udHJvbD8udmFsaWQgPT09IHRydWUsICduZy1pbnZhbGlkJzogbmdDb250cm9sPy5pbnZhbGlkID09PSB0cnVlLCAnbmctZGlzYWJsZWQnOiBkaXNhYmxlZH1cIlxuICAgICAgY2xhc3M9XCJkYXRldGltZS1pbnB1dFwiXG4gICAgICAoYmx1cik9XCJpbnB1dEJsdXIoKVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgW25nTW9kZWxdPVwiZ2V0RGlzcGxheVZhbHVlKClcIlxuICAgICAgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIHdzbFRvb2x0aXBcbiAgICAgIFt0b29sdGlwSWNvbk92ZXJsYXBdPVwiMTJcIlxuICAgICAgdG9vbHRpcFBsYWNlbWVudD1cInRvcFwiLz5cbiAgPC9kaXY+XG5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgXG4gICAgY2xhc3M9XCJjYWxlbmRhci1pY29uXCIgXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8ICEoYWxsb3dlZERhdGVzPy5sZW5ndGggPiAwIHx8IChhbGxvd2VkRGF0ZXM/Lmxlbmd0aCA9PT0gMSAmJiBhbGxvd2VkRGF0ZXNbMF0/LmRheSA9PT0gLTEpKVwiXG4gICAgW25nQ2xhc3NdPVwieydkaXNhYmxlZC1idG4nOiBkaXNhYmxlZCB8fCAhKGFsbG93ZWREYXRlcz8ubGVuZ3RoID4gMCB8fCAoYWxsb3dlZERhdGVzPy5sZW5ndGggPT09IDEgJiYgYWxsb3dlZERhdGVzWzBdPy5kYXkgPT09IC0xKSl9XCJcbiAgICAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoJGV2ZW50KVwiPlxuICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgZmEtbGdcIj48L2k+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gQ3VzdG9tIENhbGVuZGFyIFBvcG92ZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1wb3BvdmVyXCIgW2NsYXNzLnNob3ddPVwic2hvd0NhbGVuZGFyXCIgW2NsYXNzLmhpZGRlbl09XCIhc2hvd0NhbGVuZGFyXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnRcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd1RpbWVQaWNrZXJUb2dnbGVcIj5cbiAgICAgICAgPCEtLSBDdXN0b20gRGF0ZSBQaWNrZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tZGF0ZXBpY2tlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWhlYWRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuYXYtYnRuXCIgKGNsaWNrKT1cIm5hdmlnYXRlTW9udGgoLTEpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1zZWxlY3RzXCI+XG4gICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJtb250aC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImN1cnJlbnRNb250aFwiIChjaGFuZ2UpPVwib25Nb250aFNlbGVjdCgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCIgW3ZhbHVlXT1cImkgKyAxXCI+e3sgbW9udGggfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJ5ZWFyLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiY3VycmVudFllYXJcIiAoY2hhbmdlKT1cIm9uWWVhclNlbGVjdCgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyc1wiIFt2YWx1ZV09XCJ5ZWFyXCI+e3sgeWVhciB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuYXYtYnRuXCIgKGNsaWNrKT1cIm5hdmlnYXRlTW9udGgoMSlcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0XCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrZGF5c1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheVwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla2RheUxhYmVsc1wiPnt7IGRheSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXlzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXktY2VsbFwiIFxuICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2YgY2FsZW5kYXJEYXlzXCIgXG4gICAgICAgICAgICAgICAgICAgW2NsYXNzLm90aGVyLW1vbnRoXT1cImRheS5vdGhlck1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5LnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGF5LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiZGF5LnRvZGF5XCJcbiAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXkpXCI+XG4gICAgICAgICAgICAgICAge3sgZGF5LmRheSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dUaW1lQ29udHJvbHMgJiYgIWlzRGF0ZU9ubHlcIlxuICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLXRpbWUtYnRuXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVRpbWVTdGF0ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jbG9jayBmYS1jbG9jay1vIGZhLWxnXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1RpbWVQaWNrZXJUb2dnbGVcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd1RpbWVDb250cm9scyAmJiAhaXNEYXRlT25seVwiXG4gICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtY2FsZW5kYXItYnRuXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVRpbWVTdGF0ZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBmYS1sZ1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItY29udGFpbmVyXCIgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCI+XG4gICAgICAgICAgPCEtLSBDdXN0b20gVGltZSBQaWNrZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lcGlja2VyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1jb250cm9sc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LmhvdXJzIHx8ICdISCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ2hvdXJzJywgaG91cnNTdGVwIHx8IDEpXCIgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGV0aW1lPy5ob3VycyB8fCAwXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVGaWVsZENoYW5nZSgnaG91cnMnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIwXCIgbWF4PVwiMjNcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCAtKGhvdXJzU3RlcCB8fCAxKSlcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCI+OjwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtZmllbGRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZGF0ZUNvbmZpZz8udG9rZW5zPy5taW51dGVzIHx8ICdtbScgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ21pbnV0ZXMnLCBtaW51dGVzU3RlcCB8fCAxKVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJkYXRldGltZT8ubWludXRlcyB8fCAwXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVGaWVsZENoYW5nZSgnbWludXRlcycsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIiBtYXg9XCI1OVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0aW1lLWJ0blwiIChjbGljayk9XCJhZGp1c3RUaW1lKCdtaW51dGVzJywgLShtaW51dGVzU3RlcCB8fCAxKSlcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCIgKm5nSWY9XCJzZWNvbmRzXCI+OjwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtZmllbGRcIiAqbmdJZj1cInNlY29uZHNcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZGF0ZUNvbmZpZz8udG9rZW5zPy5zZWNvbmRzIHx8ICdzcycgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ3NlY29uZHMnLCBzZWNvbmRzU3RlcCB8fCAxKVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJkYXRldGltZT8uc2Vjb25kcyB8fCAwXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVGaWVsZENoYW5nZSgnc2Vjb25kcycsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIiBtYXg9XCI1OVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0aW1lLWJ0blwiIChjbGljayk9XCJhZGp1c3RUaW1lKCdzZWNvbmRzJywgLShzZWNvbmRzU3RlcCB8fCAxKSlcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gQmFja2Ryb3AgZm9yIGNsb3NpbmcgcG9wb3ZlciAtLT5cbjxkaXYgY2xhc3M9XCJjYWxlbmRhci1iYWNrZHJvcFwiIFxuICAgICBbY2xhc3Muc2hvd109XCJzaG93Q2FsZW5kYXJcIiBcbiAgICAgKGNsaWNrKT1cImNsb3NlQ2FsZW5kYXIoKVwiPjwvZGl2PiJdfQ==
|
|
712
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy13c2wtbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvd3NsLWRhdGV0aW1lLXBpY2tlci93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy93c2wtZGF0ZXRpbWUtcGlja2VyL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFFWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFDaEYsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsR0FDbkIsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7O0FBK0JuRCxNQUFNLE9BQU8sMEJBQTBCO0lBK0ZyQyxZQUNVLEdBQWEsRUFDYixhQUErQixFQUMvQixHQUFzQjtRQUZ0QixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBNUZ4QixtQkFBYyxHQUFHLEtBQUss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QkFDWjtxQkFDRjs4SkFLUSxVQUFVO3NCQUFsQixLQUFLO2dCQU1GLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFXRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFLRixZQUFZO3NCQURmLEtBQUs7Z0JBc0JJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQW9CSCxjQUFjO3NCQURqQixLQUFLO2dCQVlGLE9BQU87c0JBRFYsS0FBSztnQkF3Q04sZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9vcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRGF0ZVRpbWVNb2RlbCxcbiAgV3NsRGF0ZVN0cnVjdCxcbiAgV3NsVGltZVN0cnVjdCxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3dzbC1kYXRlLXRpbWUubW9kZWwnO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0RGF0ZUZvcm1hdENvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy93c2wtZGF0ZS1mb3JtYXRzJztcbmltcG9ydCB7IERhdGVGb3JtYXRDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RhdGUtZm9ybWF0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBXc2xDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnL3dzbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGdldEN1cnJlbnREYXRlLCBnZXRDdXJyZW50RGF0ZVRpbWVNb2RlbCB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGUtdGltZSc7XG5pbXBvcnQge1xuICBUSU1FX1NURVBTLFxuICBJTlBVVF9EQVRFX0ZPUk1BVFMsXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cy9kYXRldGltZS1waWNrZXIuY29uc3RhbnRzJztcblxuLy8gV1NMIGludGVyZmFjZXMgZm9yIGNvbXBvbmVudC1zcGVjaWZpYyB0eXBlc1xuZXhwb3J0IGludGVyZmFjZSBXc2xEYXRlcGlja2VyTmF2aWdhdGVFdmVudCB7XG4gIGN1cnJlbnQ6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH07XG4gIG5leHQ6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJEYXkge1xuICBkYXk6IG51bWJlcjtcbiAgbW9udGg6IG51bWJlcjtcbiAgeWVhcjogbnVtYmVyO1xuICBvdGhlck1vbnRoOiBib29sZWFuO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHRvZGF5OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3c2wtZGF0ZXRpbWUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFdzbERhdGV0aW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFdzbERhdGV0aW1lUGlja2VyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcbntcbiAgQElucHV0KCkgZGF0ZVN0cmluZyE6IHN0cmluZztcblxuICBwcml2YXRlIF9pbnB1dERhdGV0aW1lRm9ybWF0Pzogc3RyaW5nO1xuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGlucHV0RGF0ZXRpbWVGb3JtYXQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pbnB1dERhdGV0aW1lRm9ybWF0ID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBnZXQgaW5wdXREYXRldGltZUZvcm1hdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dERhdGV0aW1lRm9ybWF0O1xuICB9XG5cbiAgQElucHV0KCkgaG91cnNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLkhPVVJTO1xuICBASW5wdXQoKSBtaW51dGVzU3RlcDogbnVtYmVyID0gVElNRV9TVEVQUy5NSU5VVEVTO1xuICBASW5wdXQoKSBzZWNvbmRzU3RlcDogbnVtYmVyID0gVElNRV9TVEVQUy5TRUNPTkRTO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhEYXRlOiBXc2xEYXRlU3RydWN0O1xuICBASW5wdXQoKSBtaW5EYXRlOiBXc2xEYXRlU3RydWN0O1xuICBASW5wdXQoKSBkaXNhYmxlQ2FsZW5kYXIgPSBmYWxzZTtcblxuICBwcml2YXRlIF9hbGxvd2VkRGF0ZXMhOiBXc2xEYXRlU3RydWN0W107XG5cbiAgQElucHV0KClcbiAgc2V0IGFsbG93ZWREYXRlcyh2YWx1ZTogV3NsRGF0ZVN0cnVjdFtdKSB7XG4gICAgdGhpcy5fYWxsb3dlZERhdGVzID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxvd2VkRGF0ZXMoKTogV3NsRGF0ZVN0cnVjdFtdIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZERhdGVzO1xuICB9XG5cbiAgaW50ZXJuYWxGb3JtYXQ6IHN0cmluZyA9IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XG4gIHByaXZhdGUgX3N0YW5kYXJkRm9ybWF0OiBzdHJpbmcgPSBJTlBVVF9EQVRFX0ZPUk1BVFMuRVVfREFURV9EQVNIO1xuXG4gIHBsYWNlaG9sZGVyID0gJyc7XG4gIHN0YXJ0RGF0ZTogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfSA9IHsgeWVhcjogMCwgbW9udGg6IDAgfTtcbiAgc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcbiAgZGF0ZXRpbWU6IERhdGVUaW1lTW9kZWwgPSBuZXcgRGF0ZVRpbWVNb2RlbCgpO1xuICBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuICBkYXRlQ29uZmlnITogRGF0ZUZvcm1hdENvbmZpZztcblxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjYWxlbmRhclN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25DaGFuZ2U6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIGxhbmd1YWdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgc2hvd1RpbWVDb250cm9scyA9IGZhbHNlO1xuICBwcml2YXRlIF9zZWNvbmRzID0gZmFsc2U7XG4gIHByaXZhdGUgX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICBzaG93Q2FsZW5kYXIgPSBmYWxzZTtcbiAgY3VycmVudFllYXI6IG51bWJlcjtcbiAgY3VycmVudE1vbnRoOiBudW1iZXI7XG4gIGNhbGVuZGFyRGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xuICB3ZWVrZGF5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIG1vbnRoczogc3RyaW5nW10gPSBbXTtcbiAgeWVhcnM6IG51bWJlcltdID0gW107XG4gIGRlZmF1bHRZZWFyUmFuZ2UgPSB7IHN0YXJ0OiAyMDAwLCBlbmQ6IDIwNTAgfTtcblxuICBASW5wdXQoKVxuICBzZXQgc3RhbmRhcmRGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9zdGFuZGFyZEZvcm1hdCA9PT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBzdGFuZGFyZEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFuZGFyZEZvcm1hdDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzZWNvbmRzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX3NlY29uZHMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5fc2Vjb25kcyA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBzZWNvbmRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWNvbmRzO1xuICB9XG5cbiAgaXNEYXRlT25seSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IFdzbENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICB0aGlzLmN1cnJlbnRZZWFyID0gY3VycmVudERhdGUueWVhcjtcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IGN1cnJlbnREYXRlLm1vbnRoO1xuXG4gICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmNvbmZpZ1NlcnZpY2VcbiAgICAgIC53YXRjaExhbmd1YWdlKClcbiAgICAgIC5zdWJzY3JpYmUoKGxhbmd1YWdlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZyhsYW5ndWFnZSB8fCAnZW4nKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVdlZWtkYXlMYWJlbHMoKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVdlZWtkYXlMYWJlbHMoKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0NhbGVuZGFyKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBjYWxlbmRhckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FsZW5kYXItcG9wb3ZlcicpO1xuICAgICAgY29uc3QgYnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci1pY29uJyk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgY2FsZW5kYXJFbGVtZW50ICYmXG4gICAgICAgIGJ1dHRvbkVsZW1lbnQgJiZcbiAgICAgICAgIWNhbGVuZGFyRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmXG4gICAgICAgICFidXR0b25FbGVtZW50LmNvbnRhaW5zKHRhcmdldClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qLmdldChOZ0NvbnRyb2wpO1xuICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxhbmd1YWdlQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XG4gICAgdGhpcy51cGRhdGVXZWVrZGF5TGFiZWxzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZSA9IHRoaXMuY29uZmlnU2VydmljZS5sYW5ndWFnZTtcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoY3VycmVudExhbmd1YWdlIHx8ICdlbicpO1xuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJyk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21pbkRhdGUnXSB8fCBjaGFuZ2VzWydtYXhEYXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snYWxsb3dlZERhdGVzJ10pIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLmRpc2FibGVDYWxlbmRhcikge1xuICAgICAgdGhpcy5zaG93Q2FsZW5kYXIgPSAhdGhpcy5zaG93Q2FsZW5kYXI7XG4gICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgLy8gRW1pdCBhZnRlciBET00gdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQodGhpcy5zaG93Q2FsZW5kYXIpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VDYWxlbmRhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIEVtaXQgYWZ0ZXIgRE9NIHVwZGF0ZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgbmF2aWdhdGVNb250aChkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudE1vbnRoICs9IGRpcmVjdGlvbjtcbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGggPiAxMikge1xuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxO1xuICAgICAgdGhpcy5jdXJyZW50WWVhcisrO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50TW9udGggPCAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IDEyO1xuICAgICAgdGhpcy5jdXJyZW50WWVhci0tO1xuICAgIH1cblxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQodGhpcy5jdXJyZW50TW9udGgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5KTogdm9pZCB7XG4gICAgaWYgKGRheS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlOiBXc2xEYXRlU3RydWN0ID0ge1xuICAgICAgeWVhcjogZGF5LnllYXIsXG4gICAgICBtb250aDogZGF5Lm1vbnRoLFxuICAgICAgZGF5OiBkYXkuZGF5LFxuICAgIH07XG5cbiAgICB0aGlzLm9uRGF0ZUNoYW5nZShzZWxlY3RlZERhdGUpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoIC0gMSwgMSk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZmlyc3REYXkpO1xuXG4gICAgY29uc3Qgd2Vla1N0YXJ0ID0gdGhpcy5kYXRlQ29uZmlnPy53ZWVrU3RhcnQgfHwgMTtcbiAgICBjb25zdCBkYXlPZldlZWsgPSAoZmlyc3REYXkuZ2V0RGF5KCkgKyA3IC0gd2Vla1N0YXJ0KSAlIDc7XG4gICAgc3RhcnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSAtIGRheU9mV2Vlayk7XG5cbiAgICB0aGlzLmNhbGVuZGFyRGF5cyA9IFtdO1xuICAgIGNvbnN0IHRvZGF5RGF0ZSA9IGdldEN1cnJlbnREYXRlKCk7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSh0b2RheURhdGUueWVhciwgdG9kYXlEYXRlLm1vbnRoIC0gMSwgdG9kYXlEYXRlLmRheSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQyOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICAgIGN1cnJlbnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSArIGkpO1xuXG4gICAgICBjb25zdCBkYXlTdHJ1Y3Q6IFdzbERhdGVTdHJ1Y3QgPSB7XG4gICAgICAgIHllYXI6IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgZGF5OiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjYWxlbmRhckRheTogQ2FsZW5kYXJEYXkgPSB7XG4gICAgICAgIGRheTogY3VycmVudERhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICBtb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgIHllYXI6IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIG90aGVyTW9udGg6IGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxICE9PSB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuaXNEYXRlU2VsZWN0ZWQoZGF5U3RydWN0KSxcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF5U3RydWN0KSxcbiAgICAgICAgdG9kYXk6IHRoaXMuaXNTYW1lRGF0ZShjdXJyZW50RGF0ZSwgdG9kYXkpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYWxlbmRhckRheXMucHVzaChjYWxlbmRhckRheSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVTZWxlY3RlZChkYXRlOiBXc2xEYXRlU3RydWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5kYXRldGltZSAmJlxuICAgICAgdGhpcy5kYXRldGltZS55ZWFyID09PSBkYXRlLnllYXIgJiZcbiAgICAgIHRoaXMuZGF0ZXRpbWUubW9udGggPT09IGRhdGUubW9udGggJiZcbiAgICAgIHRoaXMuZGF0ZXRpbWUuZGF5ID09PSBkYXRlLmRheVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZURpc2FibGVkKGRhdGU6IFdzbERhdGVTdHJ1Y3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXRlLnllYXIsIGRhdGUubW9udGggLSAxLCBkYXRlLmRheSk7XG4gICAgY29uc3QgdG9kYXlEYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKHRvZGF5RGF0ZS55ZWFyLCB0b2RheURhdGUubW9udGggLSAxLCB0b2RheURhdGUuZGF5KTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcbiAgICAgIGNvbnN0IG1heERhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgdGhpcy5tYXhEYXRlLnllYXIsXG4gICAgICAgIHRoaXMubWF4RGF0ZS5tb250aCAtIDEsXG4gICAgICAgIHRoaXMubWF4RGF0ZS5kYXlcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWREYXRlID4gbWF4RGF0ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5EYXRlKSB7XG4gICAgICBjb25zdCBtaW5EYXRlID0gbmV3IERhdGUoXG4gICAgICAgIHRoaXMubWluRGF0ZS55ZWFyLFxuICAgICAgICB0aGlzLm1pbkRhdGUubW9udGggLSAxLFxuICAgICAgICB0aGlzLm1pbkRhdGUuZGF5XG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkRGF0ZSA8IG1pbkRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgJiZcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXNbMF0uZGF5ID09PSAtMVxuICAgICkge1xuICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0ZSA+IHRvZGF5O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hbGxvd2VkRGF0ZXMgfHwgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0FsbG93ZWQgPSB0aGlzLmFsbG93ZWREYXRlcy5maW5kKFxuICAgICAgKGRheUFsbG93ZWQpID0+XG4gICAgICAgIGRheUFsbG93ZWQueWVhciA9PT0gZGF0ZS55ZWFyICYmXG4gICAgICAgIGRheUFsbG93ZWQubW9udGggPT09IGRhdGUubW9udGggJiZcbiAgICAgICAgZGF5QWxsb3dlZC5kYXkgPT09IGRhdGUuZGF5XG4gICAgKTtcblxuICAgIHJldHVybiAhaXNBbGxvd2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVEYXRlKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBkYXRlMS5nZXRGdWxsWWVhcigpID09PSBkYXRlMi5nZXRGdWxsWWVhcigpICYmXG4gICAgICBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpICYmXG4gICAgICBkYXRlMS5nZXREYXRlKCkgPT09IGRhdGUyLmdldERhdGUoKVxuICAgICk7XG4gIH1cblxuICBnZXRNb250aE5hbWUobW9udGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhJbmRleCA9IG1vbnRoIC0gMTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy5tb250aE5hbWVzPy5bbW9udGhJbmRleF0gfHxcbiAgICAgIGdldERhdGVGb3JtYXRDb25maWcoJ2VuJykubW9udGhOYW1lc1ttb250aEluZGV4XVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVdlZWtkYXlMYWJlbHMoKTogdm9pZCB7XG4gICAgdGhpcy53ZWVrZGF5TGFiZWxzID1cbiAgICAgIHRoaXMuZGF0ZUNvbmZpZz8ud2Vla2RheUxhYmVscyB8fCBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpLndlZWtkYXlMYWJlbHM7XG4gIH1cblxuICBhZGp1c3RUaW1lKGZpZWxkOiAnaG91cnMnIHwgJ21pbnV0ZXMnIHwgJ3NlY29uZHMnLCBzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5kYXRldGltZVtmaWVsZF0gfHwgMDtcbiAgICBsZXQgbmV3VmFsdWU6IG51bWJlcjtcblxuICAgIGlmIChzdGVwID4gMCkge1xuICAgICAgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgKyBzdGVwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdGVwU2l6ZSA9IE1hdGguYWJzKHN0ZXApO1xuICAgICAgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgLSBzdGVwU2l6ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGlmIChuZXdWYWx1ZSA8IDApIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IDI0ICsgKG5ld1ZhbHVlICUgMjQpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID4gMjMpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlICUgMjQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBpZiAobmV3VmFsdWUgPCAwKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSA2MCArIChuZXdWYWx1ZSAlIDYwKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdWYWx1ZSA+IDU5KSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZSAlIDYwO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZXRpbWVbZmllbGRdID0gbmV3VmFsdWU7XG4gICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uVGltZUZpZWxkQ2hhbmdlKFxuICAgIGZpZWxkOiAnaG91cnMnIHwgJ21pbnV0ZXMnIHwgJ3NlY29uZHMnLFxuICAgIGV2ZW50OiBFdmVudFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlSW50KGlucHV0LnZhbHVlLCAxMCk7XG5cbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IDA7XG4gICAgfVxuXG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSA+IDIzKSB2YWx1ZSA9IDIzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMDtcbiAgICAgICAgaWYgKHZhbHVlID4gNTkpIHZhbHVlID0gNTk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlucHV0LnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuXG4gICAgdGhpcy5kYXRldGltZVtmaWVsZF0gPSB2YWx1ZTtcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgdGhpcy5fdXBkYXRlUGVuZGluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5fdXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29uZmlndXJhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmRldGVjdFRpbWVDb21wb25lbnRzKCk7XG4gICAgdGhpcy5zZXRTdGFuZGFyZEZvcm1hdCgpO1xuICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0VGltZUNvbXBvbmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCkge1xuICAgICAgY29uc3QgaGFzVGltZUZvcm1hdCA9IHRoaXMuaGFzVGltZUluRm9ybWF0KHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCk7XG5cbiAgICAgIGlmICghaGFzVGltZUZvcm1hdCkge1xuICAgICAgICB0aGlzLnNob3dUaW1lQ29udHJvbHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2Vjb25kcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRGF0ZU9ubHkgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IHRydWU7XG4gICAgICB0aGlzLmlzRGF0ZU9ubHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3NlY29uZHMgPSB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQuaW5jbHVkZXMoJzpzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dUaW1lQ29udHJvbHMgPSB0aGlzLl9zZWNvbmRzO1xuICAgICAgdGhpcy5pc0RhdGVPbmx5ID0gIXRoaXMuX3NlY29uZHM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNUaW1lSW5Gb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCdISDonKSB8fFxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCdoaDonKSB8fFxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCc6bW0nKSB8fFxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCc6c3MnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YW5kYXJkRm9ybWF0KCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxGb3JtYXQgPVxuICAgICAgdGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0IHx8IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XG4gICAgdGhpcy5fc3RhbmRhcmRGb3JtYXQgPSB0aGlzLmludGVybmFsRm9ybWF0O1xuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5oYXNUaW1lSW5Gb3JtYXQodGhpcy5fc3RhbmRhcmRGb3JtYXQpKSB7XG4gICAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCArPSB0aGlzLl9zZWNvbmRzID8gJyBISDptbTpzcycgOiAnIEhIOm1tJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFBsYWNlaG9sZGVyKCk6IHZvaWQge1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPVxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy5wbGFjZWhvbGRlcj8udG9Mb3dlckNhc2UoKSB8fFxuICAgICAgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scykge1xuICAgICAgdGhpcy5wbGFjZWhvbGRlciArPSB0aGlzLl9zZWNvbmRzID8gJyBoaDptbTpzcycgOiAnIGhoOm1tJztcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKG5ld01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobmV3TW9kZWwpIHtcbiAgICAgIC8vIFBhcnNlIHdpdGhvdXQgdGltZXpvbmUgY29udmVyc2lvblxuICAgICAgY29uc3QgcGFyc2VkTW9kZWwgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyhuZXdNb2RlbCwgZmFsc2UpO1xuXG4gICAgICBpZiAocGFyc2VkTW9kZWwgJiYgdHlwZW9mIHBhcnNlZE1vZGVsLnllYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuZGF0ZXRpbWUgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUgfHwgbmV3IERhdGVUaW1lTW9kZWwoKSxcbiAgICAgICAgICBwYXJzZWRNb2RlbFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGVTdHJpbmcgPSBuZXdNb2RlbDtcbiAgICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKCk7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSAnJztcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlKGV2ZW50OiBXc2xEYXRlcGlja2VyTmF2aWdhdGVFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudD8uY3VycmVudCAmJiBldmVudD8uY3VycmVudC5tb250aCAhPT0gZXZlbnQ/Lm5leHQubW9udGgpIHtcbiAgICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQoZXZlbnQ/Lm5leHQubW9udGgpO1xuICAgIH1cbiAgfVxuXG4gIGlzRGlzYWJsZWQoXG4gICAgZGF0ZXM6IFdzbERhdGVTdHJ1Y3RbXVxuICApOiAoXG4gICAgZGF0ZTogV3NsRGF0ZVN0cnVjdCxcbiAgICBjdXJyZW50PzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfVxuICApID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiAocGlja2VyRGF0ZTogV3NsRGF0ZVN0cnVjdCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxBbGxvd2VkRGF0ZXMgPSB0aGlzLmFsbG93ZWREYXRlcztcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzID0gZGF0ZXM7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKHBpY2tlckRhdGUpO1xuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgPSBvcmlnaW5hbEFsbG93ZWREYXRlcztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICB0b2dnbGVEYXRlVGltZVN0YXRlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1ZhbGlkRGF0ZSgpKSB7XG4gICAgICB0aGlzLnNob3dUaW1lUGlja2VyVG9nZ2xlID0gIXRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGU7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlbGltaXRlcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmZvcm1hdCkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGVDb25maWcuZm9ybWF0Lm1hdGNoKC9bXmEtekEtWjAtOV0vKTtcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGVDb25maWc/LmRhdGVTZXBhcmF0b3IgfHwgJy0nO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZURhdGUodmFsdWU6IHN0cmluZyk6IFdzbERhdGVTdHJ1Y3QgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxpbWl0ZXIgPSB0aGlzLmdldERlbGltaXRlcigpO1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZS5zcGxpdChkZWxpbWl0ZXIpO1xuXG4gICAgaWYgKGRhdGUubGVuZ3RoIDwgMykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmRheUZpcnN0KSB7XG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KGRhdGVbMF0sIDEwKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChkYXRlWzFdLCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxuICAgICAgICAgIGRheSA8IDEgfHxcbiAgICAgICAgICBkYXkgPiAzMSB8fFxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxuICAgICAgICAgIG1vbnRoID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkYXksIG1vbnRoLCB5ZWFyIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3JtYXQ6IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFkgKHl5eXktTU0tZGQpXG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVsxXSwgMTApO1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxuICAgICAgICAgIGRheSA8IDEgfHxcbiAgICAgICAgICBkYXkgPiAzMSB8fFxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxuICAgICAgICAgIG1vbnRoID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkYXRlOiBXc2xEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsaW1pdGVyID0gdGhpcy5nZXREZWxpbWl0ZXIoKTtcbiAgICBjb25zdCBkYXlGb3JtYXR0ZWQgPSBkYXRlLmRheSA8IDEwID8gJzAnICsgZGF0ZS5kYXkgOiBkYXRlLmRheS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1vbnRoRm9ybWF0dGVkID1cbiAgICAgIGRhdGUubW9udGggPCAxMCA/ICcwJyArIGRhdGUubW9udGggOiBkYXRlLm1vbnRoLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgeWVhckZvcm1hdHRlZCA9IGRhdGUueWVhci50b1N0cmluZygpO1xuXG4gICAgaWYgKHRoaXMuZGF0ZUNvbmZpZz8uZGF5Rmlyc3QpIHtcbiAgICAgIHJldHVybiBgJHtkYXlGb3JtYXR0ZWR9JHtkZWxpbWl0ZXJ9JHttb250aEZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke3llYXJGb3JtYXR0ZWR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7eWVhckZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke21vbnRoRm9ybWF0dGVkfSR7ZGVsaW1pdGVyfSR7ZGF5Rm9ybWF0dGVkfWA7XG4gIH1cblxuICBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblxuICAgIGlmICh2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcbiAgICBpZiAocGFyc2VkRGF0ZSkge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcbiAgICAgICAgeWVhcjogcGFyc2VkRGF0ZS55ZWFyLFxuICAgICAgICBtb250aDogcGFyc2VkRGF0ZS5tb250aCxcbiAgICAgICAgZGF5OiBwYXJzZWREYXRlLmRheSxcbiAgICAgICAgaG91cnM6IHRoaXMuZGF0ZXRpbWU/LmhvdXJzIHx8IDAsXG4gICAgICAgIG1pbnV0ZXM6IHRoaXMuZGF0ZXRpbWU/Lm1pbnV0ZXMgfHwgMCxcbiAgICAgICAgc2Vjb25kczogdGhpcy5kYXRldGltZT8uc2Vjb25kcyB8fCAwLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHQgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyh2YWx1ZSk7XG4gICAgaWYgKGR0ICYmIGR0LnllYXIpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkdDtcbiAgICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBzdHJpbmcgfCBXc2xEYXRlU3RydWN0KTogdm9pZCB7XG4gICAgbGV0IGRhdGU6IERhdGVUaW1lTW9kZWw7XG5cbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlVGltZU1vZGVsKHRoaXMucGFyc2VEYXRlKGV2ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZVRpbWVNb2RlbChldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRlIHx8ICFkYXRlLnllYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGF0ZXRpbWUpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZXRpbWUueWVhciA9IGRhdGUueWVhcjtcbiAgICB0aGlzLmRhdGV0aW1lLm1vbnRoID0gZGF0ZS5tb250aDtcbiAgICB0aGlzLmRhdGV0aW1lLmRheSA9IGRhdGUuZGF5O1xuXG4gICAgdGhpcy5jdXJyZW50WWVhciA9IGRhdGUueWVhcjtcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IGRhdGUubW9udGg7XG5cbiAgICB0aGlzLnN0YXJ0RGF0ZSA9IHtcbiAgICAgIHllYXI6IGRhdGUueWVhcixcbiAgICAgIG1vbnRoOiBkYXRlLm1vbnRoLFxuICAgIH07XG5cbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICB9XG5cbiAgc2V0RGF0ZVN0cmluZ01vZGVsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGV0aW1lICYmIHR5cGVvZiB0aGlzLmRhdGV0aW1lLnllYXIgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSB0aGlzLmRhdGV0aW1lLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0ZVN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0ZXRpbWUgJiYgdGhpcy5kYXRldGltZS55ZWFyKSB7XG4gICAgICBjb25zdCBkYXRlU3RydWN0OiBXc2xEYXRlU3RydWN0ID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmRhdGV0aW1lLnllYXIsXG4gICAgICAgIG1vbnRoOiB0aGlzLmRhdGV0aW1lLm1vbnRoLFxuICAgICAgICBkYXk6IHRoaXMuZGF0ZXRpbWUuZGF5LFxuICAgICAgfTtcblxuICAgICAgbGV0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlU3RydWN0KTtcblxuICAgICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5pc0RhdGVPbmx5KSB7XG4gICAgICAgIGNvbnN0IGhvdXIgPVxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUuaG91cnMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUuaG91cnMgOiAwO1xuICAgICAgICBjb25zdCBtaW51dGUgPVxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUubWludXRlcyAhPT0gdW5kZWZpbmVkID8gdGhpcy5kYXRldGltZS5taW51dGVzIDogMDtcbiAgICAgICAgY29uc3Qgc2Vjb25kID1cbiAgICAgICAgICB0aGlzLmRhdGV0aW1lLnNlY29uZHMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUuc2Vjb25kcyA6IDA7XG5cbiAgICAgICAgY29uc3QgaG91ckZvcm1hdHRlZCA9IGhvdXIgPCAxMCA/ICcwJyArIGhvdXIgOiBob3VyLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZUZvcm1hdHRlZCA9IG1pbnV0ZSA8IDEwID8gJzAnICsgbWludXRlIDogbWludXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHNlY29uZEZvcm1hdHRlZCA9IHNlY29uZCA8IDEwID8gJzAnICsgc2Vjb25kIDogc2Vjb25kLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgZGlzcGxheVZhbHVlICs9IGAgJHtob3VyRm9ybWF0dGVkfToke21pbnV0ZUZvcm1hdHRlZH1gO1xuXG4gICAgICAgIGlmICh0aGlzLnNlY29uZHMpIHtcbiAgICAgICAgICBkaXNwbGF5VmFsdWUgKz0gYDoke3NlY29uZEZvcm1hdHRlZH1gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaXNwbGF5VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlucHV0Qmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgZ2V0RWZmZWN0aXZlRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgbGV0IGZvcm1hdCA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCB8fCBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZO1xuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5oYXNUaW1lSW5Gb3JtYXQoZm9ybWF0KSkge1xuICAgICAgZm9ybWF0ICs9IHRoaXMuX3NlY29uZHMgPyAnIEhIOm1tOnNzJyA6ICcgSEg6bW0nO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBvblRpbWVDaGFuZ2UoZXZlbnQ6IFdzbFRpbWVTdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcbiAgICAgIC4uLnRoaXMuZGF0ZXRpbWUsXG4gICAgICBob3VyczogZXZlbnQuaG91cnMsXG4gICAgICBtaW51dGVzOiBldmVudC5taW51dGVzLFxuICAgICAgc2Vjb25kczogZXZlbnQuc2Vjb25kcyxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBoYXNWYWxpZERhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5kYXRldGltZSAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUueWVhciA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmRhdGV0aW1lLm1vbnRoID09PSAnbnVtYmVyJyAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUuZGF5ID09PSAnbnVtYmVyJ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVNb250aHNBbmRZZWFycygpOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsaXplIG1vbnRoc1xuICAgIHRoaXMubW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+XG4gICAgICB0aGlzLmdldE1vbnRoTmFtZShpICsgMSlcbiAgICApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB5ZWFycyBiYXNlZCBvbiBtaW4vbWF4IGRhdGVzIG9yIGRlZmF1bHQgcmFuZ2VcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLm1pbkRhdGU/LnllYXIgfHwgY3VycmVudFllYXIgLSA1MDtcbiAgICBjb25zdCBlbmRZZWFyID0gdGhpcy5tYXhEYXRlPy55ZWFyIHx8IGN1cnJlbnRZZWFyICsgNTA7XG5cbiAgICAvLyBDcmVhdGUgYXJyYXkgb2YgeWVhcnMgaW4gZGVzY2VuZGluZyBvcmRlclxuICAgIHRoaXMueWVhcnMgPSBBcnJheS5mcm9tKFxuICAgICAgeyBsZW5ndGg6IGVuZFllYXIgLSBzdGFydFllYXIgKyAxIH0sXG4gICAgICAoXywgaSkgPT4gZW5kWWVhciAtIGlcbiAgICApLnNvcnQoKGEsIGIpID0+IGIgLSBhKTsgLy8gU29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyXG4gIH1cblxuICBvbk1vbnRoU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICBjb25zdCBuZXdNb250aCA9IHBhcnNlSW50KHNlbGVjdC52YWx1ZSwgMTApO1xuICAgIGlmIChuZXdNb250aCAhPT0gdGhpcy5jdXJyZW50TW9udGgpIHtcbiAgICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5jdXJyZW50TW9udGg7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ld01vbnRoO1xuICAgICAgdGhpcy5tb250aENoYW5nZWQuZW1pdChuZXdNb250aCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xuICAgICAgICBjdXJyZW50OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBvbGRNb250aCB9LFxuICAgICAgICBuZXh0OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBuZXdNb250aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25ZZWFyU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICBjb25zdCBuZXdZZWFyID0gcGFyc2VJbnQoc2VsZWN0LnZhbHVlLCAxMCk7XG4gICAgaWYgKG5ld1llYXIgIT09IHRoaXMuY3VycmVudFllYXIpIHtcbiAgICAgIGNvbnN0IG9sZFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyO1xuICAgICAgdGhpcy5jdXJyZW50WWVhciA9IG5ld1llYXI7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xuICAgICAgICBjdXJyZW50OiB7IHllYXI6IG9sZFllYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxuICAgICAgICBuZXh0OiB7IHllYXI6IG5ld1llYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtcGlja2VyLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgPGlucHV0XG4gICAgICAjZGF0ZUlucHV0XG4gICAgICBbbmdDbGFzc109XCJ7J25nLXZhbGlkJzogbmdDb250cm9sPy52YWxpZCA9PT0gdHJ1ZSwgJ25nLWludmFsaWQnOiBuZ0NvbnRyb2w/LmludmFsaWQgPT09IHRydWUsICduZy1kaXNhYmxlZCc6IGRpc2FibGVkfVwiXG4gICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgIChibHVyKT1cImlucHV0Qmx1cigpXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICBbbmdNb2RlbF09XCJnZXREaXNwbGF5VmFsdWUoKVwiXG4gICAgICAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgd3NsVG9vbHRpcFxuICAgICAgW3Rvb2x0aXBJY29uT3ZlcmxhcF09XCIxMlwiXG4gICAgICB0b29sdGlwUGxhY2VtZW50PVwidG9wXCIvPlxuICA8L2Rpdj5cblxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBcbiAgICBjbGFzcz1cImNhbGVuZGFyLWljb25cIiBcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgZGlzYWJsZUNhbGVuZGFyXCJcbiAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkLWJ0bic6IGRpc2FibGVkIHx8IGRpc2FibGVDYWxlbmRhcn1cIlxuICAgIChjbGljayk9XCJ0b2dnbGVDYWxlbmRhcigkZXZlbnQpXCI+XG4gICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBmYS1sZ1wiPjwvaT5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBDdXN0b20gQ2FsZW5kYXIgUG9wb3ZlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXBvcG92ZXJcIiBbY2xhc3Muc2hvd109XCJzaG93Q2FsZW5kYXJcIiBbY2xhc3MuaGlkZGVuXT1cIiFzaG93Q2FsZW5kYXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPlxuICAgICAgPGRpdiAqbmdJZj1cIiFzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxuICAgICAgICA8IS0tIEN1c3RvbSBEYXRlIFBpY2tlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kYXRlcGlja2VyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmF2aWdhdGVNb250aCgtMSlcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnRcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXNlbGVjdHNcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cIm1vbnRoLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiY3VycmVudE1vbnRoXCIgKGNoYW5nZSk9XCJvbk1vbnRoU2VsZWN0KCRldmVudClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIiBbdmFsdWVdPVwiaSArIDFcIj57eyBtb250aCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInllYXItc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJjdXJyZW50WWVhclwiIChjaGFuZ2UpPVwib25ZZWFyU2VsZWN0KCRldmVudClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCIgW3ZhbHVlXT1cInllYXJcIj57eyB5ZWFyIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmF2aWdhdGVNb250aCgxKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHRcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1jYWxlbmRhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlZWtkYXlzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrZGF5XCIgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrZGF5TGFiZWxzXCI+e3sgZGF5IH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheS1jZWxsXCIgXG4gICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBjYWxlbmRhckRheXNcIiBcbiAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3RoZXItbW9udGhdPVwiZGF5Lm90aGVyTW9udGhcIlxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXkuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJkYXkudG9kYXlcIlxuICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIj5cbiAgICAgICAgICAgICAgICB7eyBkYXkuZGF5IH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd1RpbWVDb250cm9scyAmJiAhaXNEYXRlT25seVwiXG4gICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtdGltZS1idG5cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNsb2NrIGZhLWNsb2NrLW8gZmEtbGdcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCJcbiAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1jYWxlbmRhci1idG5cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIGZhLWxnXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1jb250YWluZXJcIiAqbmdJZj1cInNob3dUaW1lQ29udHJvbHMgJiYgIWlzRGF0ZU9ubHlcIj5cbiAgICAgICAgICA8IS0tIEN1c3RvbSBUaW1lIFBpY2tlciAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWVwaWNrZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7IGRhdGVDb25maWc/LnRva2Vucz8uaG91cnMgfHwgJ0hIJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCBob3Vyc1N0ZXAgfHwgMSlcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtaW5wdXRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGF0ZXRpbWU/LmhvdXJzIHx8IDBcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdob3VycycsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIiBtYXg9XCIyM1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0aW1lLWJ0blwiIChjbGljayk9XCJhZGp1c3RUaW1lKCdob3VycycsIC0oaG91cnNTdGVwIHx8IDEpKVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIj46PC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/Lm1pbnV0ZXMgfHwgJ21tJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnbWludXRlcycsIG1pbnV0ZXNTdGVwIHx8IDEpXCIgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGV0aW1lPy5taW51dGVzIHx8IDBcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdtaW51dGVzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiIG1heD1cIjU5XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ21pbnV0ZXMnLCAtKG1pbnV0ZXNTdGVwIHx8IDEpKVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIiAqbmdJZj1cInNlY29uZHNcIj46PC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiICpuZ0lmPVwic2Vjb25kc1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LnNlY29uZHMgfHwgJ3NzJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnc2Vjb25kcycsIHNlY29uZHNTdGVwIHx8IDEpXCIgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGV0aW1lPy5zZWNvbmRzIHx8IDBcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdzZWNvbmRzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiIG1heD1cIjU5XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ3NlY29uZHMnLCAtKHNlY29uZHNTdGVwIHx8IDEpKVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBCYWNrZHJvcCBmb3IgY2xvc2luZyBwb3BvdmVyIC0tPlxuPGRpdiBjbGFzcz1cImNhbGVuZGFyLWJhY2tkcm9wXCIgXG4gICAgIFtjbGFzcy5zaG93XT1cInNob3dDYWxlbmRhclwiIFxuICAgICAoY2xpY2spPVwiY2xvc2VDYWxlbmRhcigpXCI+PC9kaXY+Il19
|