@oneluiz/dual-datepicker 3.6.0 → 3.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/core/calendar-grid/calendar-grid.cache.d.ts +39 -0
- package/core/calendar-grid/calendar-grid.factory.d.ts +26 -0
- package/core/calendar-grid/calendar-grid.types.d.ts +57 -0
- package/core/calendar-grid/index.d.ts +50 -0
- package/core/calendar-grid/range-highlighter.cache.d.ts +105 -0
- package/core/calendar-grid/range-highlighter.d.ts +85 -0
- package/core/calendar-grid/range-highlighter.types.d.ts +182 -0
- package/core/calendar-grid/virtual-weeks.logic.d.ts +116 -0
- package/core/calendar-grid/virtual-weeks.types.d.ts +71 -0
- package/core/index.d.ts +11 -0
- package/dual-datepicker.component.d.ts +78 -1
- package/esm2022/core/calendar-grid/calendar-grid.cache.mjs +92 -0
- package/esm2022/core/calendar-grid/calendar-grid.factory.mjs +97 -0
- package/esm2022/core/calendar-grid/calendar-grid.types.mjs +8 -0
- package/esm2022/core/calendar-grid/index.mjs +51 -0
- package/esm2022/core/calendar-grid/range-highlighter.cache.mjs +198 -0
- package/esm2022/core/calendar-grid/range-highlighter.mjs +185 -0
- package/esm2022/core/calendar-grid/range-highlighter.types.mjs +11 -0
- package/esm2022/core/calendar-grid/virtual-weeks.logic.mjs +149 -0
- package/esm2022/core/calendar-grid/virtual-weeks.types.mjs +11 -0
- package/esm2022/core/index.mjs +14 -1
- package/esm2022/dual-datepicker.component.mjs +177 -38
- package/fesm2022/oneluiz-dual-datepicker.mjs +965 -39
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -6,6 +6,7 @@ import { NativeDateAdapter } from './native-date-adapter';
|
|
|
6
6
|
import { DualDateRangeStore } from './core/dual-date-range.store';
|
|
7
7
|
import { PresetRegistry } from './core/preset-registry';
|
|
8
8
|
import { BUILT_IN_PRESETS } from './core/built-in-presets';
|
|
9
|
+
import { CalendarGridCache, RangeHighlighterCache, getVisibleWeeks, navigateWeekWindow, isVirtualWeeksEnabled } from './core/calendar-grid';
|
|
9
10
|
import * as i0 from "@angular/core";
|
|
10
11
|
import * as i1 from "@angular/common";
|
|
11
12
|
export class DualDatepickerComponent {
|
|
@@ -57,12 +58,35 @@ export class DualDatepickerComponent {
|
|
|
57
58
|
minuteStep = 15; // Step for minute selector (1, 5, 15, 30)
|
|
58
59
|
defaultStartTime = '00:00'; // Default start time HH:mm
|
|
59
60
|
defaultEndTime = '23:59'; // Default end time HH:mm
|
|
61
|
+
/**
|
|
62
|
+
* Virtual Weeks Configuration (v3.9.0+)
|
|
63
|
+
*
|
|
64
|
+
* Enables windowed rendering to reduce DOM complexity and improve mobile performance.
|
|
65
|
+
* Only renders a subset of calendar weeks instead of all 6.
|
|
66
|
+
*
|
|
67
|
+
* Example: `{ windowSize: 3 }` renders only 3 weeks (21 cells) instead of 6 weeks (42 cells),
|
|
68
|
+
* reducing DOM nodes by ~50% per calendar.
|
|
69
|
+
*
|
|
70
|
+
* @default undefined (disabled - renders all 6 weeks for backward compatibility)
|
|
71
|
+
*
|
|
72
|
+
* Example:
|
|
73
|
+
* ```html
|
|
74
|
+
* <ngx-dual-datepicker
|
|
75
|
+
* [virtualWeeks]="{ windowSize: 3 }">
|
|
76
|
+
* </ngx-dual-datepicker>
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
virtualWeeks;
|
|
60
80
|
dateRangeChange = new EventEmitter();
|
|
61
81
|
dateRangeSelected = new EventEmitter();
|
|
62
82
|
multiDateRangeChange = new EventEmitter();
|
|
63
83
|
multiDateRangeSelected = new EventEmitter();
|
|
64
84
|
// Date adapter injection
|
|
65
85
|
dateAdapter = inject(DATE_ADAPTER);
|
|
86
|
+
// Calendar grid cache (v3.7.0+) - memoizes month grid generation
|
|
87
|
+
gridCache = inject(CalendarGridCache);
|
|
88
|
+
// Range highlighter cache (v3.8.0+) - memoizes decorations
|
|
89
|
+
highlighterCache = inject(RangeHighlighterCache);
|
|
66
90
|
// Headless store for date range state (v3.5.0+)
|
|
67
91
|
rangeStore = inject(DualDateRangeStore);
|
|
68
92
|
// UI-only signals
|
|
@@ -75,6 +99,51 @@ export class DualDatepickerComponent {
|
|
|
75
99
|
showStartTimePicker = signal(false);
|
|
76
100
|
showEndTimePicker = signal(false);
|
|
77
101
|
hoverDate = signal(null);
|
|
102
|
+
/**
|
|
103
|
+
* Virtual Weeks State (v3.9.0+)
|
|
104
|
+
*
|
|
105
|
+
* Signals to track which week window is currently visible for each calendar.
|
|
106
|
+
* - weekStart = 0: Shows first N weeks (windowSize)
|
|
107
|
+
* - weekStart = 1: Shows weeks 1 to N+1, etc.
|
|
108
|
+
*
|
|
109
|
+
* Reset to 0 when month changes for consistent UX.
|
|
110
|
+
*/
|
|
111
|
+
previousMonthWeekStart = signal(0);
|
|
112
|
+
currentMonthWeekStart = signal(0);
|
|
113
|
+
/**
|
|
114
|
+
* Computed: Visible weeks for windowed rendering (v3.9.0+)
|
|
115
|
+
*
|
|
116
|
+
* If virtualWeeks is enabled, returns only the visible subset of weeks.
|
|
117
|
+
* Otherwise, returns all weeks for backward compatibility.
|
|
118
|
+
*
|
|
119
|
+
* Example: If windowSize=3 and weekStart=0, returns first 3 weeks (rows 0-2).
|
|
120
|
+
*/
|
|
121
|
+
previousMonthVisibleDays = computed(() => {
|
|
122
|
+
const allDays = this.previousMonthDays();
|
|
123
|
+
if (!this.virtualWeeks || !isVirtualWeeksEnabled(this.virtualWeeks.windowSize, 6)) {
|
|
124
|
+
return allDays;
|
|
125
|
+
}
|
|
126
|
+
// Calendar has 6 weeks (42 cells = 7 days × 6 weeks)
|
|
127
|
+
const allWeeks = [];
|
|
128
|
+
for (let i = 0; i < 6; i++) {
|
|
129
|
+
allWeeks.push(allDays.slice(i * 7, (i + 1) * 7));
|
|
130
|
+
}
|
|
131
|
+
const visibleWeeks = getVisibleWeeks(allWeeks, this.previousMonthWeekStart(), this.virtualWeeks.windowSize);
|
|
132
|
+
return visibleWeeks.flat();
|
|
133
|
+
});
|
|
134
|
+
currentMonthVisibleDays = computed(() => {
|
|
135
|
+
const allDays = this.currentMonthDays();
|
|
136
|
+
if (!this.virtualWeeks || !isVirtualWeeksEnabled(this.virtualWeeks.windowSize, 6)) {
|
|
137
|
+
return allDays;
|
|
138
|
+
}
|
|
139
|
+
// Calendar has 6 weeks (42 cells = 7 days × 6 weeks)
|
|
140
|
+
const allWeeks = [];
|
|
141
|
+
for (let i = 0; i < 6; i++) {
|
|
142
|
+
allWeeks.push(allDays.slice(i * 7, (i + 1) * 7));
|
|
143
|
+
}
|
|
144
|
+
const visibleWeeks = getVisibleWeeks(allWeeks, this.currentMonthWeekStart(), this.virtualWeeks.windowSize);
|
|
145
|
+
return visibleWeeks.flat();
|
|
146
|
+
});
|
|
78
147
|
// Computed time properties from store
|
|
79
148
|
get startHour() {
|
|
80
149
|
const time = this.rangeStore.startTime();
|
|
@@ -564,43 +633,63 @@ export class DualDatepickerComponent {
|
|
|
564
633
|
generateCalendars() {
|
|
565
634
|
this.previousMonthDays.set(this.generateMonthCalendar(this.previousMonth()));
|
|
566
635
|
this.currentMonthDays.set(this.generateMonthCalendar(this.currentMonth()));
|
|
636
|
+
// Reset virtual week windows when month changes (v3.9.0+)
|
|
637
|
+
// Always start at first week for consistent UX
|
|
638
|
+
if (this.virtualWeeks) {
|
|
639
|
+
this.previousMonthWeekStart.set(0);
|
|
640
|
+
this.currentMonthWeekStart.set(0);
|
|
641
|
+
}
|
|
567
642
|
}
|
|
643
|
+
/**
|
|
644
|
+
* Generate calendar grid with decorations (v3.8.0+)
|
|
645
|
+
*
|
|
646
|
+
* Uses CalendarGridCache for base grid structure (memoized by month),
|
|
647
|
+
* then uses RangeHighlighterCache for decorations (memoized by range/constraints).
|
|
648
|
+
*
|
|
649
|
+
* Performance:
|
|
650
|
+
* - Grid structure: Cached by month (same month = same grid object)
|
|
651
|
+
* - Decorations: Cached by range+hover+disabled (same state = same decorated grid)
|
|
652
|
+
* - Result: ~95% cache hit rate in typical usage
|
|
653
|
+
*
|
|
654
|
+
* Cache keys:
|
|
655
|
+
* - Grid: `${year}-${month}-${weekStart}`
|
|
656
|
+
* - Decorations: `${monthKey}|${start}|${end}|${hover}|${disabled}`
|
|
657
|
+
*/
|
|
568
658
|
generateMonthCalendar(date) {
|
|
569
|
-
|
|
570
|
-
const
|
|
571
|
-
|
|
572
|
-
const
|
|
573
|
-
const
|
|
574
|
-
const
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
//
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
date: dateStr,
|
|
659
|
+
// Get base grid from cache (weekStart = 0 for Sunday, no locale for now)
|
|
660
|
+
const grid = this.gridCache.get(date, 0);
|
|
661
|
+
// Get dates from store
|
|
662
|
+
const startDate = this.rangeStore.startDate();
|
|
663
|
+
const endDate = this.rangeStore.endDate();
|
|
664
|
+
const hoverISO = this.hoverDate();
|
|
665
|
+
// Get decorated grid from cache (handles all decoration logic)
|
|
666
|
+
const decorated = this.highlighterCache.get(grid, {
|
|
667
|
+
start: startDate,
|
|
668
|
+
end: endDate,
|
|
669
|
+
hoverDate: hoverISO,
|
|
670
|
+
disabledDates: this.disabledDates,
|
|
671
|
+
multiRange: this.multiRange,
|
|
672
|
+
selectingStartDate: this.selectingStartDate()
|
|
673
|
+
// minDate/maxDate omitted for now (not in current API)
|
|
674
|
+
});
|
|
675
|
+
// Map decorated cells to legacy format (for backward compatibility)
|
|
676
|
+
const monthDays = decorated.cells.map((cell) => {
|
|
677
|
+
if (!cell.inCurrentMonth) {
|
|
678
|
+
// Padding cell (previous/next month)
|
|
679
|
+
return { day: null, isCurrentMonth: false };
|
|
680
|
+
}
|
|
681
|
+
// Current month cell - use cached decorations
|
|
682
|
+
return {
|
|
683
|
+
day: cell.day,
|
|
684
|
+
date: cell.iso,
|
|
596
685
|
isCurrentMonth: true,
|
|
597
|
-
isStart:
|
|
598
|
-
isEnd:
|
|
599
|
-
inRange:
|
|
600
|
-
inHoverRange:
|
|
601
|
-
isDisabled:
|
|
602
|
-
}
|
|
603
|
-
}
|
|
686
|
+
isStart: cell.isSelectedStart,
|
|
687
|
+
isEnd: cell.isSelectedEnd,
|
|
688
|
+
inRange: cell.isInRange,
|
|
689
|
+
inHoverRange: cell.isInHoverRange,
|
|
690
|
+
isDisabled: cell.isDisabled
|
|
691
|
+
};
|
|
692
|
+
});
|
|
604
693
|
return monthDays;
|
|
605
694
|
}
|
|
606
695
|
isInRange(dateStr) {
|
|
@@ -616,6 +705,54 @@ export class DualDatepickerComponent {
|
|
|
616
705
|
return dateStr >= this.startDate && dateStr <= this.endDate;
|
|
617
706
|
}
|
|
618
707
|
}
|
|
708
|
+
/**
|
|
709
|
+
* Virtual Weeks Navigation (v3.9.0+)
|
|
710
|
+
*
|
|
711
|
+
* Navigate the visible week window up/down for windowed rendering.
|
|
712
|
+
*
|
|
713
|
+
* @param monthIndex 0 = previous month, 1 = current month
|
|
714
|
+
* @param direction -1 = scroll up (previous weeks), +1 = scroll down (next weeks)
|
|
715
|
+
*
|
|
716
|
+
* Example: If windowSize=3 and weekStart=0, navigateWeeks(0, +1) shows weeks 1-3.
|
|
717
|
+
*/
|
|
718
|
+
navigateWeeks(monthIndex, direction) {
|
|
719
|
+
if (!this.virtualWeeks)
|
|
720
|
+
return;
|
|
721
|
+
const totalWeeks = 6; // Standard calendar grid has 6 weeks
|
|
722
|
+
const currentStart = monthIndex === 0
|
|
723
|
+
? this.previousMonthWeekStart()
|
|
724
|
+
: this.currentMonthWeekStart();
|
|
725
|
+
const newStart = navigateWeekWindow(currentStart, direction, totalWeeks, this.virtualWeeks.windowSize);
|
|
726
|
+
if (monthIndex === 0) {
|
|
727
|
+
this.previousMonthWeekStart.set(newStart);
|
|
728
|
+
}
|
|
729
|
+
else {
|
|
730
|
+
this.currentMonthWeekStart.set(newStart);
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
* Check if week navigation is available (v3.9.0+)
|
|
735
|
+
*
|
|
736
|
+
* @param monthIndex 0 = previous month, 1 = current month
|
|
737
|
+
* @param direction -1 = up (can scroll to previous weeks?), +1 = down (can scroll to next weeks?)
|
|
738
|
+
* @returns true if navigation is available in that direction
|
|
739
|
+
*/
|
|
740
|
+
canNavigateWeeks(monthIndex, direction) {
|
|
741
|
+
if (!this.virtualWeeks)
|
|
742
|
+
return false;
|
|
743
|
+
const totalWeeks = 6;
|
|
744
|
+
const currentStart = monthIndex === 0
|
|
745
|
+
? this.previousMonthWeekStart()
|
|
746
|
+
: this.currentMonthWeekStart();
|
|
747
|
+
if (direction < 0) {
|
|
748
|
+
// Can scroll up if not at start
|
|
749
|
+
return currentStart > 0;
|
|
750
|
+
}
|
|
751
|
+
else {
|
|
752
|
+
// Can scroll down if window doesn't extend past end
|
|
753
|
+
return currentStart + this.virtualWeeks.windowSize < totalWeeks;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
619
756
|
isDateDisabled(date) {
|
|
620
757
|
if (!this.disabledDates)
|
|
621
758
|
return false;
|
|
@@ -1054,7 +1191,7 @@ export class DualDatepickerComponent {
|
|
|
1054
1191
|
this.isDisabled.set(isDisabled);
|
|
1055
1192
|
}
|
|
1056
1193
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDatepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1057
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DualDatepickerComponent, isStandalone: true, selector: "ngx-dual-datepicker", inputs: { placeholder: "placeholder", startDate: "startDate", endDate: "endDate", showPresets: "showPresets", showClearButton: "showClearButton", multiRange: "multiRange", closeOnSelection: "closeOnSelection", closeOnPresetSelection: "closeOnPresetSelection", closeOnClickOutside: "closeOnClickOutside", enableKeyboardNavigation: "enableKeyboardNavigation", presets: "presets", theme: "theme", inputBackgroundColor: "inputBackgroundColor", inputTextColor: "inputTextColor", inputBorderColor: "inputBorderColor", inputBorderColorHover: "inputBorderColorHover", inputBorderColorFocus: "inputBorderColorFocus", inputPadding: "inputPadding", locale: "locale", disabledDates: "disabledDates", displayFormat: "displayFormat", requireApply: "requireApply", enableTimePicker: "enableTimePicker", timeFormat: "timeFormat", minuteStep: "minuteStep", defaultStartTime: "defaultStartTime", defaultEndTime: "defaultEndTime" }, outputs: { dateRangeChange: "dateRangeChange", dateRangeSelected: "dateRangeSelected", multiDateRangeChange: "multiDateRangeChange", multiDateRangeSelected: "multiDateRangeSelected" }, host: { listeners: { "document:click": "onClickOutside($event)", "keydown": "handleKeyboardNavigation($event)" } }, providers: [
|
|
1194
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DualDatepickerComponent, isStandalone: true, selector: "ngx-dual-datepicker", inputs: { placeholder: "placeholder", startDate: "startDate", endDate: "endDate", showPresets: "showPresets", showClearButton: "showClearButton", multiRange: "multiRange", closeOnSelection: "closeOnSelection", closeOnPresetSelection: "closeOnPresetSelection", closeOnClickOutside: "closeOnClickOutside", enableKeyboardNavigation: "enableKeyboardNavigation", presets: "presets", theme: "theme", inputBackgroundColor: "inputBackgroundColor", inputTextColor: "inputTextColor", inputBorderColor: "inputBorderColor", inputBorderColorHover: "inputBorderColorHover", inputBorderColorFocus: "inputBorderColorFocus", inputPadding: "inputPadding", locale: "locale", disabledDates: "disabledDates", displayFormat: "displayFormat", requireApply: "requireApply", enableTimePicker: "enableTimePicker", timeFormat: "timeFormat", minuteStep: "minuteStep", defaultStartTime: "defaultStartTime", defaultEndTime: "defaultEndTime", virtualWeeks: "virtualWeeks" }, outputs: { dateRangeChange: "dateRangeChange", dateRangeSelected: "dateRangeSelected", multiDateRangeChange: "multiDateRangeChange", multiDateRangeSelected: "multiDateRangeSelected" }, host: { listeners: { "document:click": "onClickOutside($event)", "keydown": "handleKeyboardNavigation($event)" } }, providers: [
|
|
1058
1195
|
{
|
|
1059
1196
|
provide: NG_VALUE_ACCESSOR,
|
|
1060
1197
|
useExisting: forwardRef(() => DualDatepickerComponent),
|
|
@@ -1075,7 +1212,7 @@ export class DualDatepickerComponent {
|
|
|
1075
1212
|
},
|
|
1076
1213
|
deps: [PresetRegistry]
|
|
1077
1214
|
}
|
|
1078
|
-
], usesOnChanges: true, ngImport: i0, template: "<div class=\"datepicker-wrapper\" \n [class]=\"'theme-' + theme\"\n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"dateRangeText()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"placeholder\"\n [attr.aria-expanded]=\"showDatePicker()\"\n [attr.aria-haspopup]=\"'dialog'\"\n role=\"combobox\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (showDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"selectPresetRange(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"changeMonth(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ previousMonthName() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of previousMonthDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 0)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 0) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ currentMonthName() }}</span>\n <button type=\"button\" (click)=\"changeMonth(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of currentMonthDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 1)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 1) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Multi-Range List -->\n @if (multiRange && selectedRanges().length > 0) {\n <div class=\"multi-range-list\">\n <div class=\"multi-range-header\">\n <span class=\"multi-range-title\">Selected Ranges ({{ selectedRanges().length }})</span>\n </div>\n <div class=\"multi-range-items\">\n @for (range of selectedRanges(); track $index) {\n <div class=\"multi-range-item\">\n <span class=\"multi-range-text\">{{ range.rangeText }}</span>\n <button \n type=\"button\" \n class=\"btn-remove-range\" \n (click)=\"removeRange($index)\"\n title=\"Remove this range\">\n <svg width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Time Picker -->\n @if (enableTimePicker) {\n <div class=\"time-picker-container\">\n <!-- Start Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">Start Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startHour.toString().padStart(2, '0')\"\n readonly\n title=\"Start hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startMinute.toString().padStart(2, '0')\"\n readonly\n title=\"Start minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ startHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n\n <!-- Separator -->\n <div class=\"time-separator-vertical\"></div>\n\n <!-- End Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">End Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endHour.toString().padStart(2, '0')\"\n readonly\n title=\"End hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endMinute.toString().padStart(2, '0')\"\n readonly\n title=\"End minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ endHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Footer with buttons -->\n @if (showClearButton || multiRange || requireApply) {\n <div class=\"date-picker-footer\">\n @if (requireApply && !multiRange) {\n <div class=\"apply-footer-actions\">\n <button \n type=\"button\" \n class=\"btn-cancel\" \n (click)=\"cancelSelection()\" \n [disabled]=\"!hasPendingChanges()\"\n title=\"Cancel selection\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn-apply\" \n (click)=\"applySelection()\" \n [disabled]=\"!hasPendingChanges() || !pendingStartDate || !pendingEndDate\"\n title=\"Apply selection\">\n Apply\n </button>\n </div>\n }\n @if (multiRange) {\n <div class=\"multi-range-footer-actions\">\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear all ranges\">\n Clear All\n </button>\n <button type=\"button\" class=\"btn-done\" (click)=\"closeDatePicker()\" title=\"Done selecting\">\n Done\n </button>\n </div>\n }\n @if (!multiRange && !requireApply && showClearButton) {\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear selection\">\n Clear\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400;position:relative}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day.in-hover-range{background-color:#e0e7ff;border-radius:0;opacity:.7;position:relative}.date-picker-day.in-hover-range:after{content:\"\";position:absolute;inset:0;border:1px dashed #6366f1;pointer-events:none}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}.date-picker-day.disabled{cursor:not-allowed;opacity:.4;color:#9ca3af;background-color:#f9fafb;text-decoration:line-through}.date-picker-day.disabled:hover{background-color:#f9fafb;color:#9ca3af}.date-picker-day.keyboard-focused{outline:2px solid #3b82f6;outline-offset:2px;z-index:1}.date-picker-day.keyboard-focused:not(.selected){background-color:#eff6ff}.date-picker-day:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;z-index:1}.date-picker-footer{padding:12px;border-top:1px solid #e1e4e8;display:flex;justify-content:center;gap:8px}.date-picker-footer .btn-clear{padding:8px 16px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-clear:hover{background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-clear:active{transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-done{padding:8px 16px;background-color:#222;border:1px solid #222;border-radius:6px;font-size:.875rem;font-weight:500;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-done:hover{background-color:#000;border-color:#000;transform:translateY(-1px);box-shadow:0 2px 4px #00000026}.date-picker-footer .btn-done:active{transform:translateY(0);box-shadow:none}.date-picker-footer .btn-apply{padding:8px 24px;background-color:#2563eb;border:1px solid #2563eb;border-radius:6px;font-size:.875rem;font-weight:600;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-apply:hover:not(:disabled){background-color:#1d4ed8;border-color:#1d4ed8;transform:translateY(-1px);box-shadow:0 2px 8px #2563eb40}.date-picker-footer .btn-apply:active:not(:disabled){transform:translateY(0);box-shadow:none}.date-picker-footer .btn-apply:disabled{opacity:.5;cursor:not-allowed}.date-picker-footer .btn-cancel{padding:8px 24px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-cancel:hover:not(:disabled){background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-cancel:active:not(:disabled){transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-cancel:disabled{opacity:.5;cursor:not-allowed}.date-picker-footer .apply-footer-actions{display:flex;gap:8px;width:100%;justify-content:flex-end}.date-picker-footer .multi-range-footer-actions{display:flex;gap:8px;width:100%;justify-content:space-between}.multi-range-list{border-top:1px solid #e1e4e8;border-bottom:1px solid #e1e4e8;padding:12px;margin-top:12px}.multi-range-list .multi-range-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.multi-range-list .multi-range-header .multi-range-title{font-size:.8125rem;font-weight:600;color:#24292f;text-transform:uppercase;letter-spacing:.025em}.multi-range-list .multi-range-items{display:flex;flex-direction:column;gap:6px;max-height:150px;overflow-y:auto}.multi-range-list .multi-range-items::-webkit-scrollbar{width:6px}.multi-range-list .multi-range-items::-webkit-scrollbar-track{background:#f1f3f4;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb{background:#cbd5e0;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb:hover{background:#a0aec0}.multi-range-list .multi-range-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;transition:all .15s ease}.multi-range-list .multi-range-item:hover{background-color:#f3f4f6;border-color:#8c959f}.multi-range-list .multi-range-item .multi-range-text{font-size:.875rem;color:#24292f;font-weight:500}.multi-range-list .multi-range-item .btn-remove-range{padding:4px;background-color:transparent;border:1px solid transparent;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.multi-range-list .multi-range-item .btn-remove-range:hover{background-color:#fee;border-color:#fcc;color:#dc2626}.multi-range-list .multi-range-item .btn-remove-range:hover svg{transform:scale(1.1)}.multi-range-list .multi-range-item .btn-remove-range:active{transform:scale(.95)}.multi-range-list .multi-range-item .btn-remove-range svg{transition:transform .15s ease}.time-picker-container{display:flex;align-items:center;justify-content:center;gap:16px;padding:16px;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb;margin:12px 0;background-color:#f9fafb}.time-picker-container .time-picker-section{display:flex;flex-direction:column;gap:8px;flex:1;align-items:center}.time-picker-container .time-picker-section .time-picker-label{font-size:.875rem;font-weight:600;color:#374151;text-align:center}.time-picker-container .time-picker-section .time-picker-inputs{display:flex;align-items:center;gap:8px}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group{display:flex;flex-direction:column;gap:4px;align-items:center}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-input{width:48px;padding:8px 6px;text-align:center;font-size:1.25rem;font-weight:600;color:#1f2937;background-color:#fff;border:2px solid #e5e7eb;border-radius:6px;outline:none;transition:all .15s ease;cursor:default;-webkit-user-select:none;user-select:none}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-input:focus{border-color:var(--primary-color, #3b82f6);box-shadow:0 0 0 3px #3b82f61a}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn{padding:4px 8px;background-color:#fff;border:1px solid #d1d5db;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn:hover{background-color:var(--primary-color, #3b82f6);border-color:var(--primary-color, #3b82f6);color:#fff;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn:active{transform:translateY(0);box-shadow:none}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn svg{pointer-events:none}.time-picker-container .time-picker-section .time-picker-inputs .time-separator{font-size:1.5rem;font-weight:700;color:#9ca3af;margin:0 4px}.time-picker-container .time-picker-section .time-picker-inputs .time-period{font-size:.875rem;font-weight:600;color:#6b7280;padding:8px 12px;background-color:#f3f4f6;border-radius:6px;min-width:48px;text-align:center}.time-picker-container .time-separator-vertical{width:1px;height:80px;background-color:#e5e7eb}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }] });
|
|
1215
|
+
], usesOnChanges: true, ngImport: i0, template: "<div class=\"datepicker-wrapper\" \n [class]=\"'theme-' + theme\"\n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"dateRangeText()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"placeholder\"\n [attr.aria-expanded]=\"showDatePicker()\"\n [attr.aria-haspopup]=\"'dialog'\"\n role=\"combobox\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (showDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"selectPresetRange(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"changeMonth(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ previousMonthName() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of previousMonthVisibleDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 0)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 0) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ currentMonthName() }}</span>\n <button type=\"button\" (click)=\"changeMonth(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of currentMonthVisibleDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 1)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 1) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Multi-Range List -->\n @if (multiRange && selectedRanges().length > 0) {\n <div class=\"multi-range-list\">\n <div class=\"multi-range-header\">\n <span class=\"multi-range-title\">Selected Ranges ({{ selectedRanges().length }})</span>\n </div>\n <div class=\"multi-range-items\">\n @for (range of selectedRanges(); track $index) {\n <div class=\"multi-range-item\">\n <span class=\"multi-range-text\">{{ range.rangeText }}</span>\n <button \n type=\"button\" \n class=\"btn-remove-range\" \n (click)=\"removeRange($index)\"\n title=\"Remove this range\">\n <svg width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Time Picker -->\n @if (enableTimePicker) {\n <div class=\"time-picker-container\">\n <!-- Start Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">Start Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startHour.toString().padStart(2, '0')\"\n readonly\n title=\"Start hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startMinute.toString().padStart(2, '0')\"\n readonly\n title=\"Start minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ startHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n\n <!-- Separator -->\n <div class=\"time-separator-vertical\"></div>\n\n <!-- End Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">End Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endHour.toString().padStart(2, '0')\"\n readonly\n title=\"End hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endMinute.toString().padStart(2, '0')\"\n readonly\n title=\"End minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ endHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Footer with buttons -->\n @if (showClearButton || multiRange || requireApply) {\n <div class=\"date-picker-footer\">\n @if (requireApply && !multiRange) {\n <div class=\"apply-footer-actions\">\n <button \n type=\"button\" \n class=\"btn-cancel\" \n (click)=\"cancelSelection()\" \n [disabled]=\"!hasPendingChanges()\"\n title=\"Cancel selection\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn-apply\" \n (click)=\"applySelection()\" \n [disabled]=\"!hasPendingChanges() || !pendingStartDate || !pendingEndDate\"\n title=\"Apply selection\">\n Apply\n </button>\n </div>\n }\n @if (multiRange) {\n <div class=\"multi-range-footer-actions\">\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear all ranges\">\n Clear All\n </button>\n <button type=\"button\" class=\"btn-done\" (click)=\"closeDatePicker()\" title=\"Done selecting\">\n Done\n </button>\n </div>\n }\n @if (!multiRange && !requireApply && showClearButton) {\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear selection\">\n Clear\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1;contain:layout paint}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;contain:layout paint}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400;position:relative}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day.in-hover-range{background-color:#e0e7ff;border-radius:0;opacity:.7;position:relative}.date-picker-day.in-hover-range:after{content:\"\";position:absolute;inset:0;border:1px dashed #6366f1;pointer-events:none}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}.date-picker-day.disabled{cursor:not-allowed;opacity:.4;color:#9ca3af;background-color:#f9fafb;text-decoration:line-through}.date-picker-day.disabled:hover{background-color:#f9fafb;color:#9ca3af}.date-picker-day.keyboard-focused{outline:2px solid #3b82f6;outline-offset:2px;z-index:1}.date-picker-day.keyboard-focused:not(.selected){background-color:#eff6ff}.date-picker-day:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;z-index:1}.date-picker-footer{padding:12px;border-top:1px solid #e1e4e8;display:flex;justify-content:center;gap:8px}.date-picker-footer .btn-clear{padding:8px 16px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-clear:hover{background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-clear:active{transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-done{padding:8px 16px;background-color:#222;border:1px solid #222;border-radius:6px;font-size:.875rem;font-weight:500;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-done:hover{background-color:#000;border-color:#000;transform:translateY(-1px);box-shadow:0 2px 4px #00000026}.date-picker-footer .btn-done:active{transform:translateY(0);box-shadow:none}.date-picker-footer .btn-apply{padding:8px 24px;background-color:#2563eb;border:1px solid #2563eb;border-radius:6px;font-size:.875rem;font-weight:600;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-apply:hover:not(:disabled){background-color:#1d4ed8;border-color:#1d4ed8;transform:translateY(-1px);box-shadow:0 2px 8px #2563eb40}.date-picker-footer .btn-apply:active:not(:disabled){transform:translateY(0);box-shadow:none}.date-picker-footer .btn-apply:disabled{opacity:.5;cursor:not-allowed}.date-picker-footer .btn-cancel{padding:8px 24px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-cancel:hover:not(:disabled){background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-cancel:active:not(:disabled){transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-cancel:disabled{opacity:.5;cursor:not-allowed}.date-picker-footer .apply-footer-actions{display:flex;gap:8px;width:100%;justify-content:flex-end}.date-picker-footer .multi-range-footer-actions{display:flex;gap:8px;width:100%;justify-content:space-between}.multi-range-list{border-top:1px solid #e1e4e8;border-bottom:1px solid #e1e4e8;padding:12px;margin-top:12px}.multi-range-list .multi-range-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.multi-range-list .multi-range-header .multi-range-title{font-size:.8125rem;font-weight:600;color:#24292f;text-transform:uppercase;letter-spacing:.025em}.multi-range-list .multi-range-items{display:flex;flex-direction:column;gap:6px;max-height:150px;overflow-y:auto}.multi-range-list .multi-range-items::-webkit-scrollbar{width:6px}.multi-range-list .multi-range-items::-webkit-scrollbar-track{background:#f1f3f4;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb{background:#cbd5e0;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb:hover{background:#a0aec0}.multi-range-list .multi-range-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;transition:all .15s ease}.multi-range-list .multi-range-item:hover{background-color:#f3f4f6;border-color:#8c959f}.multi-range-list .multi-range-item .multi-range-text{font-size:.875rem;color:#24292f;font-weight:500}.multi-range-list .multi-range-item .btn-remove-range{padding:4px;background-color:transparent;border:1px solid transparent;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.multi-range-list .multi-range-item .btn-remove-range:hover{background-color:#fee;border-color:#fcc;color:#dc2626}.multi-range-list .multi-range-item .btn-remove-range:hover svg{transform:scale(1.1)}.multi-range-list .multi-range-item .btn-remove-range:active{transform:scale(.95)}.multi-range-list .multi-range-item .btn-remove-range svg{transition:transform .15s ease}.time-picker-container{display:flex;align-items:center;justify-content:center;gap:16px;padding:16px;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb;margin:12px 0;background-color:#f9fafb}.time-picker-container .time-picker-section{display:flex;flex-direction:column;gap:8px;flex:1;align-items:center}.time-picker-container .time-picker-section .time-picker-label{font-size:.875rem;font-weight:600;color:#374151;text-align:center}.time-picker-container .time-picker-section .time-picker-inputs{display:flex;align-items:center;gap:8px}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group{display:flex;flex-direction:column;gap:4px;align-items:center}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-input{width:48px;padding:8px 6px;text-align:center;font-size:1.25rem;font-weight:600;color:#1f2937;background-color:#fff;border:2px solid #e5e7eb;border-radius:6px;outline:none;transition:all .15s ease;cursor:default;-webkit-user-select:none;user-select:none}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-input:focus{border-color:var(--primary-color, #3b82f6);box-shadow:0 0 0 3px #3b82f61a}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn{padding:4px 8px;background-color:#fff;border:1px solid #d1d5db;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn:hover{background-color:var(--primary-color, #3b82f6);border-color:var(--primary-color, #3b82f6);color:#fff;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn:active{transform:translateY(0);box-shadow:none}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn svg{pointer-events:none}.time-picker-container .time-picker-section .time-picker-inputs .time-separator{font-size:1.5rem;font-weight:700;color:#9ca3af;margin:0 4px}.time-picker-container .time-picker-section .time-picker-inputs .time-period{font-size:.875rem;font-weight:600;color:#6b7280;padding:8px 12px;background-color:#f3f4f6;border-radius:6px;min-width:48px;text-align:center}.time-picker-container .time-separator-vertical{width:1px;height:80px;background-color:#e5e7eb}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }] });
|
|
1079
1216
|
}
|
|
1080
1217
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDatepickerComponent, decorators: [{
|
|
1081
1218
|
type: Component,
|
|
@@ -1100,7 +1237,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1100
1237
|
},
|
|
1101
1238
|
deps: [PresetRegistry]
|
|
1102
1239
|
}
|
|
1103
|
-
], template: "<div class=\"datepicker-wrapper\" \n [class]=\"'theme-' + theme\"\n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"dateRangeText()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"placeholder\"\n [attr.aria-expanded]=\"showDatePicker()\"\n [attr.aria-haspopup]=\"'dialog'\"\n role=\"combobox\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (showDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"selectPresetRange(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"changeMonth(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ previousMonthName() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of previousMonthDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 0)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 0) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ currentMonthName() }}</span>\n <button type=\"button\" (click)=\"changeMonth(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of currentMonthDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 1)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 1) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Multi-Range List -->\n @if (multiRange && selectedRanges().length > 0) {\n <div class=\"multi-range-list\">\n <div class=\"multi-range-header\">\n <span class=\"multi-range-title\">Selected Ranges ({{ selectedRanges().length }})</span>\n </div>\n <div class=\"multi-range-items\">\n @for (range of selectedRanges(); track $index) {\n <div class=\"multi-range-item\">\n <span class=\"multi-range-text\">{{ range.rangeText }}</span>\n <button \n type=\"button\" \n class=\"btn-remove-range\" \n (click)=\"removeRange($index)\"\n title=\"Remove this range\">\n <svg width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Time Picker -->\n @if (enableTimePicker) {\n <div class=\"time-picker-container\">\n <!-- Start Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">Start Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startHour.toString().padStart(2, '0')\"\n readonly\n title=\"Start hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startMinute.toString().padStart(2, '0')\"\n readonly\n title=\"Start minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ startHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n\n <!-- Separator -->\n <div class=\"time-separator-vertical\"></div>\n\n <!-- End Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">End Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endHour.toString().padStart(2, '0')\"\n readonly\n title=\"End hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endMinute.toString().padStart(2, '0')\"\n readonly\n title=\"End minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ endHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Footer with buttons -->\n @if (showClearButton || multiRange || requireApply) {\n <div class=\"date-picker-footer\">\n @if (requireApply && !multiRange) {\n <div class=\"apply-footer-actions\">\n <button \n type=\"button\" \n class=\"btn-cancel\" \n (click)=\"cancelSelection()\" \n [disabled]=\"!hasPendingChanges()\"\n title=\"Cancel selection\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn-apply\" \n (click)=\"applySelection()\" \n [disabled]=\"!hasPendingChanges() || !pendingStartDate || !pendingEndDate\"\n title=\"Apply selection\">\n Apply\n </button>\n </div>\n }\n @if (multiRange) {\n <div class=\"multi-range-footer-actions\">\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear all ranges\">\n Clear All\n </button>\n <button type=\"button\" class=\"btn-done\" (click)=\"closeDatePicker()\" title=\"Done selecting\">\n Done\n </button>\n </div>\n }\n @if (!multiRange && !requireApply && showClearButton) {\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear selection\">\n Clear\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400;position:relative}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day.in-hover-range{background-color:#e0e7ff;border-radius:0;opacity:.7;position:relative}.date-picker-day.in-hover-range:after{content:\"\";position:absolute;inset:0;border:1px dashed #6366f1;pointer-events:none}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}.date-picker-day.disabled{cursor:not-allowed;opacity:.4;color:#9ca3af;background-color:#f9fafb;text-decoration:line-through}.date-picker-day.disabled:hover{background-color:#f9fafb;color:#9ca3af}.date-picker-day.keyboard-focused{outline:2px solid #3b82f6;outline-offset:2px;z-index:1}.date-picker-day.keyboard-focused:not(.selected){background-color:#eff6ff}.date-picker-day:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;z-index:1}.date-picker-footer{padding:12px;border-top:1px solid #e1e4e8;display:flex;justify-content:center;gap:8px}.date-picker-footer .btn-clear{padding:8px 16px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-clear:hover{background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-clear:active{transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-done{padding:8px 16px;background-color:#222;border:1px solid #222;border-radius:6px;font-size:.875rem;font-weight:500;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-done:hover{background-color:#000;border-color:#000;transform:translateY(-1px);box-shadow:0 2px 4px #00000026}.date-picker-footer .btn-done:active{transform:translateY(0);box-shadow:none}.date-picker-footer .btn-apply{padding:8px 24px;background-color:#2563eb;border:1px solid #2563eb;border-radius:6px;font-size:.875rem;font-weight:600;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-apply:hover:not(:disabled){background-color:#1d4ed8;border-color:#1d4ed8;transform:translateY(-1px);box-shadow:0 2px 8px #2563eb40}.date-picker-footer .btn-apply:active:not(:disabled){transform:translateY(0);box-shadow:none}.date-picker-footer .btn-apply:disabled{opacity:.5;cursor:not-allowed}.date-picker-footer .btn-cancel{padding:8px 24px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-cancel:hover:not(:disabled){background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-cancel:active:not(:disabled){transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-cancel:disabled{opacity:.5;cursor:not-allowed}.date-picker-footer .apply-footer-actions{display:flex;gap:8px;width:100%;justify-content:flex-end}.date-picker-footer .multi-range-footer-actions{display:flex;gap:8px;width:100%;justify-content:space-between}.multi-range-list{border-top:1px solid #e1e4e8;border-bottom:1px solid #e1e4e8;padding:12px;margin-top:12px}.multi-range-list .multi-range-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.multi-range-list .multi-range-header .multi-range-title{font-size:.8125rem;font-weight:600;color:#24292f;text-transform:uppercase;letter-spacing:.025em}.multi-range-list .multi-range-items{display:flex;flex-direction:column;gap:6px;max-height:150px;overflow-y:auto}.multi-range-list .multi-range-items::-webkit-scrollbar{width:6px}.multi-range-list .multi-range-items::-webkit-scrollbar-track{background:#f1f3f4;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb{background:#cbd5e0;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb:hover{background:#a0aec0}.multi-range-list .multi-range-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;transition:all .15s ease}.multi-range-list .multi-range-item:hover{background-color:#f3f4f6;border-color:#8c959f}.multi-range-list .multi-range-item .multi-range-text{font-size:.875rem;color:#24292f;font-weight:500}.multi-range-list .multi-range-item .btn-remove-range{padding:4px;background-color:transparent;border:1px solid transparent;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.multi-range-list .multi-range-item .btn-remove-range:hover{background-color:#fee;border-color:#fcc;color:#dc2626}.multi-range-list .multi-range-item .btn-remove-range:hover svg{transform:scale(1.1)}.multi-range-list .multi-range-item .btn-remove-range:active{transform:scale(.95)}.multi-range-list .multi-range-item .btn-remove-range svg{transition:transform .15s ease}.time-picker-container{display:flex;align-items:center;justify-content:center;gap:16px;padding:16px;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb;margin:12px 0;background-color:#f9fafb}.time-picker-container .time-picker-section{display:flex;flex-direction:column;gap:8px;flex:1;align-items:center}.time-picker-container .time-picker-section .time-picker-label{font-size:.875rem;font-weight:600;color:#374151;text-align:center}.time-picker-container .time-picker-section .time-picker-inputs{display:flex;align-items:center;gap:8px}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group{display:flex;flex-direction:column;gap:4px;align-items:center}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-input{width:48px;padding:8px 6px;text-align:center;font-size:1.25rem;font-weight:600;color:#1f2937;background-color:#fff;border:2px solid #e5e7eb;border-radius:6px;outline:none;transition:all .15s ease;cursor:default;-webkit-user-select:none;user-select:none}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-input:focus{border-color:var(--primary-color, #3b82f6);box-shadow:0 0 0 3px #3b82f61a}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn{padding:4px 8px;background-color:#fff;border:1px solid #d1d5db;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn:hover{background-color:var(--primary-color, #3b82f6);border-color:var(--primary-color, #3b82f6);color:#fff;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn:active{transform:translateY(0);box-shadow:none}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn svg{pointer-events:none}.time-picker-container .time-picker-section .time-picker-inputs .time-separator{font-size:1.5rem;font-weight:700;color:#9ca3af;margin:0 4px}.time-picker-container .time-picker-section .time-picker-inputs .time-period{font-size:.875rem;font-weight:600;color:#6b7280;padding:8px 12px;background-color:#f3f4f6;border-radius:6px;min-width:48px;text-align:center}.time-picker-container .time-separator-vertical{width:1px;height:80px;background-color:#e5e7eb}\n"] }]
|
|
1240
|
+
], template: "<div class=\"datepicker-wrapper\" \n [class]=\"'theme-' + theme\"\n [style.--input-border-hover]=\"inputBorderColorHover\"\n [style.--input-border-focus]=\"inputBorderColorFocus\">\n <input \n type=\"text\" \n class=\"datepicker-input\" \n [value]=\"dateRangeText()\" \n (click)=\"toggleDatePicker()\" \n [placeholder]=\"placeholder\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"placeholder\"\n [attr.aria-expanded]=\"showDatePicker()\"\n [attr.aria-haspopup]=\"'dialog'\"\n role=\"combobox\"\n [ngStyle]=\"{\n 'background-color': inputBackgroundColor,\n 'color': inputTextColor,\n 'border-color': inputBorderColor,\n 'padding': inputPadding\n }\"\n readonly>\n\n @if (showDatePicker()) {\n <div class=\"date-picker-dropdown\">\n @if (showPresets) {\n <div class=\"date-picker-presets\">\n @for (preset of presets; track preset.label) {\n <button type=\"button\" (click)=\"selectPresetRange(preset)\">{{ preset.label }}</button>\n }\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n @if (!showPresets) {\n <div class=\"date-picker-header-only-close\">\n <button type=\"button\" class=\"btn-close-calendar\" (click)=\"closeDatePicker()\" title=\"Close\">\n \u00D7\n </button>\n </div>\n }\n\n <!-- Calendars -->\n <div class=\"date-picker-calendars\">\n <!-- Previous month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" (click)=\"changeMonth(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ previousMonthName() }}</span>\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of previousMonthVisibleDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 0)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 0) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n\n <!-- Current month calendar -->\n <div class=\"date-picker-calendar\">\n <div class=\"date-picker-header\">\n <button type=\"button\" style=\"visibility: hidden;\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z\"/>\n </svg>\n </button>\n <span>{{ currentMonthName() }}</span>\n <button type=\"button\" (click)=\"changeMonth(1)\">\n <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n </svg>\n </button>\n </div>\n <div class=\"date-picker-weekdays\">\n @for (dayName of weekDayNames(); track $index) {\n <span>{{ dayName }}</span>\n }\n </div>\n <div class=\"date-picker-days\">\n @for (dayObj of currentMonthVisibleDays(); track dayObj.date || $index) {\n <button \n type=\"button\"\n class=\"date-picker-day\" \n [class.empty]=\"!dayObj.isCurrentMonth\"\n [class.selected]=\"dayObj.isStart || dayObj.isEnd\"\n [class.in-range]=\"dayObj.inRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.in-hover-range]=\"dayObj.inHoverRange && !dayObj.isStart && !dayObj.isEnd\"\n [class.disabled]=\"dayObj.isDisabled\"\n [class.keyboard-focused]=\"enableKeyboardNavigation && hasKeyboardFocus(dayObj.date, 1)\"\n [attr.tabindex]=\"enableKeyboardNavigation && dayObj.isCurrentMonth && hasKeyboardFocus(dayObj.date, 1) ? 0 : -1\"\n [attr.aria-label]=\"formatDateDisplay(dayObj.date)\"\n [attr.aria-selected]=\"dayObj.isStart || dayObj.isEnd\"\n [attr.aria-current]=\"dayObj.isStart ? 'date' : null\"\n [attr.aria-disabled]=\"dayObj.isDisabled\"\n (click)=\"selectDay(dayObj)\"\n (mouseenter)=\"onDayHover(dayObj)\"\n (mouseleave)=\"clearDayHover()\"\n [disabled]=\"!dayObj.isCurrentMonth || dayObj.isDisabled\">\n {{ dayObj.day }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Multi-Range List -->\n @if (multiRange && selectedRanges().length > 0) {\n <div class=\"multi-range-list\">\n <div class=\"multi-range-header\">\n <span class=\"multi-range-title\">Selected Ranges ({{ selectedRanges().length }})</span>\n </div>\n <div class=\"multi-range-items\">\n @for (range of selectedRanges(); track $index) {\n <div class=\"multi-range-item\">\n <span class=\"multi-range-text\">{{ range.rangeText }}</span>\n <button \n type=\"button\" \n class=\"btn-remove-range\" \n (click)=\"removeRange($index)\"\n title=\"Remove this range\">\n <svg width=\"14\" height=\"14\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Time Picker -->\n @if (enableTimePicker) {\n <div class=\"time-picker-container\">\n <!-- Start Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">Start Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startHour.toString().padStart(2, '0')\"\n readonly\n title=\"Start hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementStartMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"startMinute.toString().padStart(2, '0')\"\n readonly\n title=\"Start minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementStartMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ startHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n\n <!-- Separator -->\n <div class=\"time-separator-vertical\"></div>\n\n <!-- End Time -->\n <div class=\"time-picker-section\">\n <div class=\"time-picker-label\">End Time</div>\n <div class=\"time-picker-inputs\">\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndHour()\"\n title=\"Increment hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endHour.toString().padStart(2, '0')\"\n readonly\n title=\"End hour\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndHour()\"\n title=\"Decrement hour\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-up\" \n (click)=\"incrementEndMinute()\"\n title=\"Increment minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 4.86l-4.796 5.481c-.566.647-.106 1.659.753 1.659h9.592a1 1 0 0 0 .753-1.659l-4.796-5.48a1 1 0 0 0-1.506 0z\"/>\n </svg>\n </button>\n <input\n type=\"text\"\n class=\"time-input\"\n [value]=\"endMinute.toString().padStart(2, '0')\"\n readonly\n title=\"End minute\">\n <button \n type=\"button\" \n class=\"time-btn time-btn-down\" \n (click)=\"decrementEndMinute()\"\n title=\"Decrement minute\">\n <svg width=\"12\" height=\"12\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n <path d=\"M7.247 11.14l-4.796-5.481C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/>\n </svg>\n </button>\n </div>\n @if (timeFormat === '12h') {\n <div class=\"time-period\">\n {{ endHour >= 12 ? 'PM' : 'AM' }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Footer with buttons -->\n @if (showClearButton || multiRange || requireApply) {\n <div class=\"date-picker-footer\">\n @if (requireApply && !multiRange) {\n <div class=\"apply-footer-actions\">\n <button \n type=\"button\" \n class=\"btn-cancel\" \n (click)=\"cancelSelection()\" \n [disabled]=\"!hasPendingChanges()\"\n title=\"Cancel selection\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"btn-apply\" \n (click)=\"applySelection()\" \n [disabled]=\"!hasPendingChanges() || !pendingStartDate || !pendingEndDate\"\n title=\"Apply selection\">\n Apply\n </button>\n </div>\n }\n @if (multiRange) {\n <div class=\"multi-range-footer-actions\">\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear all ranges\">\n Clear All\n </button>\n <button type=\"button\" class=\"btn-done\" (click)=\"closeDatePicker()\" title=\"Done selecting\">\n Done\n </button>\n </div>\n }\n @if (!multiRange && !requireApply && showClearButton) {\n <button type=\"button\" class=\"btn-clear\" (click)=\"clear()\" title=\"Clear selection\">\n Clear\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [".datepicker-wrapper{position:relative;width:100%}.datepicker-wrapper .datepicker-input{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;cursor:pointer}.datepicker-wrapper .datepicker-input:hover{border-color:var(--input-border-hover, #ced4da)}.datepicker-wrapper .datepicker-input:focus{border-color:var(--input-border-focus, #80bdff);box-shadow:0 0 0 .2rem #007bff40;outline:0}.datepicker-wrapper .datepicker-input::placeholder{color:#6c757d;opacity:1}.datepicker-wrapper .datepicker-input:disabled,.datepicker-wrapper .datepicker-input[readonly]{background-color:#e9ecef;opacity:1}.date-picker-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e1e4e8;border-radius:8px;box-shadow:0 4px 12px #00000014,0 0 1px #00000014;padding:16px;z-index:1060;min-width:680px}@media (max-width: 768px){.date-picker-dropdown{min-width:100%;left:0;right:0}}.date-picker-header-only-close{display:flex;justify-content:flex-end;margin-bottom:12px}.date-picker-header-only-close .btn-close-calendar{background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;border-radius:6px;cursor:pointer;transition:all .15s ease;font-size:1.5rem;line-height:1}.date-picker-header-only-close .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-header-only-close .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-presets{display:flex;gap:6px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid #e5e7eb;align-items:center}@media (max-width: 768px){.date-picker-presets{flex-wrap:wrap}}.date-picker-presets button{font-size:.75rem;padding:6px 14px;border:none;background-color:#f9fafb;color:#374151;border-radius:6px;transition:all .15s ease;font-weight:500;cursor:pointer;border:1px solid #e5e7eb}.date-picker-presets button:hover{background-color:#f3f4f6;border-color:#d1d5db;transform:translateY(-1px);box-shadow:0 2px 4px #0000000f}.date-picker-presets button:active{transform:translateY(0);box-shadow:none}.date-picker-presets .btn-close-calendar{margin-left:auto;background-color:transparent;border:1px solid transparent;color:#6b7280;padding:6px 10px;font-size:1.5rem;line-height:1}.date-picker-presets .btn-close-calendar:hover{background-color:#fee;border-color:#fcc;color:#dc2626;transform:translateY(-1px);box-shadow:0 2px 4px #dc26261a}.date-picker-presets .btn-close-calendar:active{transform:translateY(0);box-shadow:none}.date-picker-calendars{display:flex;gap:32px}@media (max-width: 768px){.date-picker-calendars{flex-direction:column;gap:16px}}.date-picker-calendar{flex:1;contain:layout paint}.date-picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 4px}.date-picker-header span{font-size:.813rem;font-weight:600;color:#111827}.date-picker-header button{padding:4px;color:#6b7280;text-decoration:none;border-radius:6px;transition:all .15s ease;border:none;background:transparent;cursor:pointer}.date-picker-header button:hover{background-color:#f3f4f6;color:#111827}.date-picker-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}.date-picker-weekdays span{text-align:center;font-size:.625rem;font-weight:600;color:#6b7280;padding:6px}.date-picker-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;contain:layout paint}.date-picker-day{aspect-ratio:1;border:none;background:transparent;border-radius:50%;font-size:.75rem;cursor:pointer;transition:all .15s ease;color:#374151;font-weight:400;position:relative}.date-picker-day:hover:not(:disabled):not(.selected){background-color:#f3f4f6;color:#111827}.date-picker-day.empty{visibility:hidden}.date-picker-day.selected{background-color:#222;color:#fff;font-weight:600}.date-picker-day.in-range{background-color:#f9fafb;border-radius:0}.date-picker-day.in-hover-range{background-color:#e0e7ff;border-radius:0;opacity:.7;position:relative}.date-picker-day.in-hover-range:after{content:\"\";position:absolute;inset:0;border:1px dashed #6366f1;pointer-events:none}.date-picker-day:disabled{cursor:not-allowed;opacity:.3}.date-picker-day.disabled{cursor:not-allowed;opacity:.4;color:#9ca3af;background-color:#f9fafb;text-decoration:line-through}.date-picker-day.disabled:hover{background-color:#f9fafb;color:#9ca3af}.date-picker-day.keyboard-focused{outline:2px solid #3b82f6;outline-offset:2px;z-index:1}.date-picker-day.keyboard-focused:not(.selected){background-color:#eff6ff}.date-picker-day:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;z-index:1}.date-picker-footer{padding:12px;border-top:1px solid #e1e4e8;display:flex;justify-content:center;gap:8px}.date-picker-footer .btn-clear{padding:8px 16px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-clear:hover{background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-clear:active{transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-done{padding:8px 16px;background-color:#222;border:1px solid #222;border-radius:6px;font-size:.875rem;font-weight:500;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-done:hover{background-color:#000;border-color:#000;transform:translateY(-1px);box-shadow:0 2px 4px #00000026}.date-picker-footer .btn-done:active{transform:translateY(0);box-shadow:none}.date-picker-footer .btn-apply{padding:8px 24px;background-color:#2563eb;border:1px solid #2563eb;border-radius:6px;font-size:.875rem;font-weight:600;color:#fff;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-apply:hover:not(:disabled){background-color:#1d4ed8;border-color:#1d4ed8;transform:translateY(-1px);box-shadow:0 2px 8px #2563eb40}.date-picker-footer .btn-apply:active:not(:disabled){transform:translateY(0);box-shadow:none}.date-picker-footer .btn-apply:disabled{opacity:.5;cursor:not-allowed}.date-picker-footer .btn-cancel{padding:8px 24px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;font-size:.875rem;font-weight:500;color:#24292f;cursor:pointer;transition:all .15s ease}.date-picker-footer .btn-cancel:hover:not(:disabled){background-color:#f3f4f6;border-color:#8c959f;transform:translateY(-1px);box-shadow:0 2px 4px #0000000d}.date-picker-footer .btn-cancel:active:not(:disabled){transform:translateY(0);box-shadow:none;background-color:#e9ecef}.date-picker-footer .btn-cancel:disabled{opacity:.5;cursor:not-allowed}.date-picker-footer .apply-footer-actions{display:flex;gap:8px;width:100%;justify-content:flex-end}.date-picker-footer .multi-range-footer-actions{display:flex;gap:8px;width:100%;justify-content:space-between}.multi-range-list{border-top:1px solid #e1e4e8;border-bottom:1px solid #e1e4e8;padding:12px;margin-top:12px}.multi-range-list .multi-range-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.multi-range-list .multi-range-header .multi-range-title{font-size:.8125rem;font-weight:600;color:#24292f;text-transform:uppercase;letter-spacing:.025em}.multi-range-list .multi-range-items{display:flex;flex-direction:column;gap:6px;max-height:150px;overflow-y:auto}.multi-range-list .multi-range-items::-webkit-scrollbar{width:6px}.multi-range-list .multi-range-items::-webkit-scrollbar-track{background:#f1f3f4;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb{background:#cbd5e0;border-radius:4px}.multi-range-list .multi-range-items::-webkit-scrollbar-thumb:hover{background:#a0aec0}.multi-range-list .multi-range-item{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background-color:#f6f8fa;border:1px solid #d0d7de;border-radius:6px;transition:all .15s ease}.multi-range-list .multi-range-item:hover{background-color:#f3f4f6;border-color:#8c959f}.multi-range-list .multi-range-item .multi-range-text{font-size:.875rem;color:#24292f;font-weight:500}.multi-range-list .multi-range-item .btn-remove-range{padding:4px;background-color:transparent;border:1px solid transparent;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.multi-range-list .multi-range-item .btn-remove-range:hover{background-color:#fee;border-color:#fcc;color:#dc2626}.multi-range-list .multi-range-item .btn-remove-range:hover svg{transform:scale(1.1)}.multi-range-list .multi-range-item .btn-remove-range:active{transform:scale(.95)}.multi-range-list .multi-range-item .btn-remove-range svg{transition:transform .15s ease}.time-picker-container{display:flex;align-items:center;justify-content:center;gap:16px;padding:16px;border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb;margin:12px 0;background-color:#f9fafb}.time-picker-container .time-picker-section{display:flex;flex-direction:column;gap:8px;flex:1;align-items:center}.time-picker-container .time-picker-section .time-picker-label{font-size:.875rem;font-weight:600;color:#374151;text-align:center}.time-picker-container .time-picker-section .time-picker-inputs{display:flex;align-items:center;gap:8px}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group{display:flex;flex-direction:column;gap:4px;align-items:center}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-input{width:48px;padding:8px 6px;text-align:center;font-size:1.25rem;font-weight:600;color:#1f2937;background-color:#fff;border:2px solid #e5e7eb;border-radius:6px;outline:none;transition:all .15s ease;cursor:default;-webkit-user-select:none;user-select:none}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-input:focus{border-color:var(--primary-color, #3b82f6);box-shadow:0 0 0 3px #3b82f61a}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn{padding:4px 8px;background-color:#fff;border:1px solid #d1d5db;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#6b7280;transition:all .15s ease}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn:hover{background-color:var(--primary-color, #3b82f6);border-color:var(--primary-color, #3b82f6);color:#fff;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn:active{transform:translateY(0);box-shadow:none}.time-picker-container .time-picker-section .time-picker-inputs .time-input-group .time-btn svg{pointer-events:none}.time-picker-container .time-picker-section .time-picker-inputs .time-separator{font-size:1.5rem;font-weight:700;color:#9ca3af;margin:0 4px}.time-picker-container .time-picker-section .time-picker-inputs .time-period{font-size:.875rem;font-weight:600;color:#6b7280;padding:8px 12px;background-color:#f3f4f6;border-radius:6px;min-width:48px;text-align:center}.time-picker-container .time-separator-vertical{width:1px;height:80px;background-color:#e5e7eb}\n"] }]
|
|
1104
1241
|
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { placeholder: [{
|
|
1105
1242
|
type: Input
|
|
1106
1243
|
}], startDate: [{
|
|
@@ -1155,6 +1292,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1155
1292
|
type: Input
|
|
1156
1293
|
}], defaultEndTime: [{
|
|
1157
1294
|
type: Input
|
|
1295
|
+
}], virtualWeeks: [{
|
|
1296
|
+
type: Input
|
|
1158
1297
|
}], dateRangeChange: [{
|
|
1159
1298
|
type: Output
|
|
1160
1299
|
}], dateRangeSelected: [{
|
|
@@ -1170,4 +1309,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1170
1309
|
type: HostListener,
|
|
1171
1310
|
args: ['keydown', ['$event']]
|
|
1172
1311
|
}] } });
|
|
1173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vc3JjL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxZQUFZLEVBQWMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbE0sT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7O0FBK0QzRCxNQUFNLE9BQU8sdUJBQXVCO0lBOElkO0lBN0lYLFdBQVcsR0FBVyxtQkFBbUIsQ0FBQztJQUNuRCxJQUFhLFNBQVMsQ0FBQyxLQUFhO1FBQ2xDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLElBQUk7Z0JBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENB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IElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgc2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIEFQUF9JTklUSUFMSVpFUiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciwgREFURV9BREFQVEVSIH0gZnJvbSAnLi9kYXRlLWFkYXB0ZXInO1xuaW1wb3J0IHsgTmF0aXZlRGF0ZUFkYXB0ZXIgfSBmcm9tICcuL25hdGl2ZS1kYXRlLWFkYXB0ZXInO1xuaW1wb3J0IHsgRHVhbERhdGVSYW5nZVN0b3JlIH0gZnJvbSAnLi9jb3JlL2R1YWwtZGF0ZS1yYW5nZS5zdG9yZSc7XG5pbXBvcnQgeyBQcmVzZXRSZWdpc3RyeSB9IGZyb20gJy4vY29yZS9wcmVzZXQtcmVnaXN0cnknO1xuaW1wb3J0IHsgQlVJTFRfSU5fUFJFU0VUUyB9IGZyb20gJy4vY29yZS9idWlsdC1pbi1wcmVzZXRzJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICBzdGFydERhdGU6IHN0cmluZztcbiAgZW5kRGF0ZTogc3RyaW5nO1xuICByYW5nZVRleHQ6IHN0cmluZztcbiAgc3RhcnRUaW1lPzogc3RyaW5nOyAvLyBISDptbSBmb3JtYXQgKG9wdGlvbmFsKVxuICBlbmRUaW1lPzogc3RyaW5nOyAvLyBISDptbSBmb3JtYXQgKG9wdGlvbmFsKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpRGF0ZVJhbmdlIHtcbiAgcmFuZ2VzOiBEYXRlUmFuZ2VbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRSYW5nZSB7XG4gIHN0YXJ0OiBzdHJpbmc7XG4gIGVuZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldENvbmZpZyB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGdldFZhbHVlOiAoKSA9PiBQcmVzZXRSYW5nZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbGVDb25maWcge1xuICBtb250aE5hbWVzPzogc3RyaW5nW107XG4gIG1vbnRoTmFtZXNTaG9ydD86IHN0cmluZ1tdO1xuICBkYXlOYW1lcz86IHN0cmluZ1tdO1xuICBkYXlOYW1lc1Nob3J0Pzogc3RyaW5nW107XG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyOyAvLyAwID0gU3VuZGF5LCAxID0gTW9uZGF5LCBldGMuXG59XG5cbmV4cG9ydCB0eXBlIFRoZW1lVHlwZSA9ICdkZWZhdWx0JyB8ICdib290c3RyYXAnIHwgJ2J1bG1hJyB8ICdmb3VuZGF0aW9uJyB8ICd0YWlsd2luZCcgfCAnY3VzdG9tJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWR1YWwtZGF0ZXBpY2tlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IER1YWxEYXRlcGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQVRFX0FEQVBURVIsXG4gICAgICB1c2VDbGFzczogTmF0aXZlRGF0ZUFkYXB0ZXJcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRmFjdG9yeTogKHJlZ2lzdHJ5OiBQcmVzZXRSZWdpc3RyeSkgPT4ge1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIC8vIEF1dG8tcmVnaXN0ZXIgYnVpbHQtaW4gcHJlc2V0c1xuICAgICAgICAgIEJVSUxUX0lOX1BSRVNFVFMuZm9yRWFjaChwcmVzZXQgPT4gcmVnaXN0cnkucmVnaXN0ZXIocHJlc2V0KSk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZGVwczogW1ByZXNldFJlZ2lzdHJ5XVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEdWFsRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VsZWN0IGRhdGUgcmFuZ2UnO1xuICBASW5wdXQoKSBzZXQgc3RhcnREYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHZhbHVlKTtcbiAgICAgIGlmIChkYXRlKSB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnQoZGF0ZSk7XG4gICAgfVxuICB9XG4gIGdldCBzdGFydERhdGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0RGF0ZSgpO1xuICAgIHJldHVybiBkYXRlID8gdGhpcy5mb3JtYXREYXRlKGRhdGUpIDogJyc7XG4gIH1cbiAgXG4gIEBJbnB1dCgpIHNldCBlbmREYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHZhbHVlKTtcbiAgICAgIGlmIChkYXRlKSB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKGRhdGUpO1xuICAgIH1cbiAgfVxuICBnZXQgZW5kRGF0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnJhbmdlU3RvcmUuZW5kRGF0ZSgpO1xuICAgIHJldHVybiBkYXRlID8gdGhpcy5mb3JtYXREYXRlKGRhdGUpIDogJyc7XG4gIH1cbiAgQElucHV0KCkgc2hvd1ByZXNldHM6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q2xlYXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbXVsdGlSYW5nZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjbG9zZU9uU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xvc2VPblByZXNldFNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNsb3NlT25DbGlja091dHNpZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBlbmFibGVLZXlib2FyZE5hdmlnYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwcmVzZXRzOiBQcmVzZXRDb25maWdbXSA9IFtdO1xuICBASW5wdXQoKSB0aGVtZTogVGhlbWVUeXBlID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBpbnB1dEJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gJyNmZmYnO1xuICBASW5wdXQoKSBpbnB1dFRleHRDb2xvcjogc3RyaW5nID0gJyM0OTUwNTcnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9yOiBzdHJpbmcgPSAnI2NlZDRkYSc7XG4gIEBJbnB1dCgpIGlucHV0Qm9yZGVyQ29sb3JIb3Zlcjogc3RyaW5nID0gJyNjZWQ0ZGEnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9yRm9jdXM6IHN0cmluZyA9ICcjODBiZGZmJztcbiAgQElucHV0KCkgaW5wdXRQYWRkaW5nOiBzdHJpbmcgPSAnMC4zNzVyZW0gMC43NXJlbSc7XG4gIEBJbnB1dCgpIGxvY2FsZTogTG9jYWxlQ29uZmlnID0ge307XG4gIEBJbnB1dCgpIGRpc2FibGVkRGF0ZXM6IERhdGVbXSB8ICgoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGRpc3BsYXlGb3JtYXQ6IHN0cmluZyA9ICdEIE1NTSc7IC8vIEZvcm1hdCBmb3IgZGlzcGxheWluZyBkYXRlcyBpbiBpbnB1dFxuICBASW5wdXQoKSByZXF1aXJlQXBwbHk6IGJvb2xlYW4gPSBmYWxzZTsgLy8gUmVxdWlyZSBBcHBseSBidXR0b24gY29uZmlybWF0aW9uXG4gIEBJbnB1dCgpIGVuYWJsZVRpbWVQaWNrZXI6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRW5hYmxlIHRpbWUgc2VsZWN0aW9uXG4gIEBJbnB1dCgpIHRpbWVGb3JtYXQ6ICcxMmgnIHwgJzI0aCcgPSAnMjRoJzsgLy8gVGltZSBmb3JtYXRcbiAgQElucHV0KCkgbWludXRlU3RlcDogbnVtYmVyID0gMTU7IC8vIFN0ZXAgZm9yIG1pbnV0ZSBzZWxlY3RvciAoMSwgNSwgMTUsIDMwKVxuICBASW5wdXQoKSBkZWZhdWx0U3RhcnRUaW1lOiBzdHJpbmcgPSAnMDA6MDAnOyAvLyBEZWZhdWx0IHN0YXJ0IHRpbWUgSEg6bW1cbiAgQElucHV0KCkgZGVmYXVsdEVuZFRpbWU6IHN0cmluZyA9ICcyMzo1OSc7IC8vIERlZmF1bHQgZW5kIHRpbWUgSEg6bW1cblxuICBAT3V0cHV0KCkgZGF0ZVJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U+KCk7XG4gIEBPdXRwdXQoKSBkYXRlUmFuZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpO1xuICBAT3V0cHV0KCkgbXVsdGlEYXRlUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE11bHRpRGF0ZVJhbmdlPigpO1xuICBAT3V0cHV0KCkgbXVsdGlEYXRlUmFuZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TXVsdGlEYXRlUmFuZ2U+KCk7XG5cbiAgLy8gRGF0ZSBhZGFwdGVyIGluamVjdGlvblxuICBwcml2YXRlIGRhdGVBZGFwdGVyID0gaW5qZWN0PERhdGVBZGFwdGVyPihEQVRFX0FEQVBURVIpO1xuICBcbiAgLy8gSGVhZGxlc3Mgc3RvcmUgZm9yIGRhdGUgcmFuZ2Ugc3RhdGUgKHYzLjUuMCspXG4gIHByb3RlY3RlZCByZWFkb25seSByYW5nZVN0b3JlID0gaW5qZWN0KER1YWxEYXRlUmFuZ2VTdG9yZSk7XG5cbiAgLy8gVUktb25seSBzaWduYWxzXG4gIHNob3dEYXRlUGlja2VyID0gc2lnbmFsKGZhbHNlKTtcbiAgY3VycmVudE1vbnRoID0gc2lnbmFsKHRoaXMuZGF0ZUFkYXB0ZXIudG9kYXkoKSk7XG4gIHByZXZpb3VzTW9udGggPSBzaWduYWwodGhpcy5kYXRlQWRhcHRlci50b2RheSgpKTtcbiAgY3VycmVudE1vbnRoRGF5cyA9IHNpZ25hbDxhbnlbXT4oW10pO1xuICBwcmV2aW91c01vbnRoRGF5cyA9IHNpZ25hbDxhbnlbXT4oW10pO1xuICBpc0Rpc2FibGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgc2hvd1N0YXJ0VGltZVBpY2tlciA9IHNpZ25hbChmYWxzZSk7XG4gIHNob3dFbmRUaW1lUGlja2VyID0gc2lnbmFsKGZhbHNlKTtcbiAgaG92ZXJEYXRlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBcbiAgLy8gQ29tcHV0ZWQgdGltZSBwcm9wZXJ0aWVzIGZyb20gc3RvcmVcbiAgZ2V0IHN0YXJ0SG91cigpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbWUgPSB0aGlzLnJhbmdlU3RvcmUuc3RhcnRUaW1lKCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VUaW1lKHRpbWUpLmhvdXI7XG4gIH1cbiAgXG4gIGdldCBzdGFydE1pbnV0ZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbWUgPSB0aGlzLnJhbmdlU3RvcmUuc3RhcnRUaW1lKCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VUaW1lKHRpbWUpLm1pbnV0ZTtcbiAgfVxuICBcbiAgZ2V0IGVuZEhvdXIoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lID0gdGhpcy5yYW5nZVN0b3JlLmVuZFRpbWUoKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVRpbWUodGltZSkuaG91cjtcbiAgfVxuICBcbiAgZ2V0IGVuZE1pbnV0ZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbWUgPSB0aGlzLnJhbmdlU3RvcmUuZW5kVGltZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVGltZSh0aW1lKS5taW51dGU7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2V0U3RhcnRIb3VyTWludXRlKGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lU3RyID0gdGhpcy5mb3JtYXRUaW1lKGhvdXIsIG1pbnV0ZSk7XG4gICAgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0VGltZSh0aW1lU3RyKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzZXRFbmRIb3VyTWludXRlKGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lU3RyID0gdGhpcy5mb3JtYXRUaW1lKGhvdXIsIG1pbnV0ZSk7XG4gICAgdGhpcy5yYW5nZVN0b3JlLnNldEVuZFRpbWUodGltZVN0cik7XG4gIH1cbiAgXG4gIC8vIE11bHRpLXJhbmdlIHN1cHBvcnQgKFVJLXNwZWNpZmljKVxuICBzZWxlY3RlZFJhbmdlcyA9IHNpZ25hbDxEYXRlUmFuZ2VbXT4oW10pO1xuICBjdXJyZW50UmFuZ2VJbmRleCA9IHNpZ25hbDxudW1iZXI+KC0xKTtcblxuICAvLyBLZXlib2FyZCBuYXZpZ2F0aW9uIChVSS1zcGVjaWZpYylcbiAgZm9jdXNlZERheSA9IHNpZ25hbDx7IGRhdGU6IHN0cmluZzsgbW9udGhJbmRleDogbnVtYmVyIH0gfCBudWxsPihudWxsKTtcbiAgXG4gIC8vIENvbXB1dGVkIHZhbHVlc1xuICBjdXJyZW50TW9udGhOYW1lID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXRNb250aE5hbWUodGhpcy5jdXJyZW50TW9udGgoKSkpO1xuICBwcmV2aW91c01vbnRoTmFtZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZ2V0TW9udGhOYW1lKHRoaXMucHJldmlvdXNNb250aCgpKSk7XG4gIHdlZWtEYXlOYW1lcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZ2V0RGF5TmFtZXMoKSk7XG4gIFxuICAvLyBDb21wdXRlZCBmcm9tIHN0b3JlXG4gIGRhdGVSYW5nZVRleHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJhbmdlU3RvcmUucmFuZ2VUZXh0KCkpO1xuICBzZWxlY3RpbmdTdGFydERhdGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJhbmdlU3RvcmUuc2VsZWN0aW5nU3RhcnQoKSk7XG4gIGhhc1BlbmRpbmdDaGFuZ2VzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yYW5nZVN0b3JlLmhhc1BlbmRpbmdDaGFuZ2VzKCkpO1xuICBcbiAgLy8gQ29tcHV0ZWQgZm9yIHRlbXBsYXRlIGFjY2VzcyB0byBwZW5kaW5nIGRhdGVzIChyZXF1aXJlQXBwbHkgbW9kZSlcbiAgZ2V0IHBlbmRpbmdTdGFydERhdGUoKTogc3RyaW5nIHtcbiAgICAvLyBJbiByZXF1aXJlQXBwbHkgbW9kZSwgc3RvcmUga2VlcHMgcGVuZGluZyB2YWx1ZXNcbiAgICAvLyBGb3Igbm93LCB1c2UgYWN0dWFsIHN0b3JlIHZhbHVlcyBhcyBwZW5kaW5nIChzdG9yZSBoYW5kbGVzIHRoaXMpXG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnJhbmdlU3RvcmUuc3RhcnREYXRlKCk7XG4gICAgcmV0dXJuIGRhdGUgJiYgdGhpcy5oYXNQZW5kaW5nQ2hhbmdlcygpID8gdGhpcy5mb3JtYXREYXRlKGRhdGUpIDogJyc7XG4gIH1cbiAgXG4gIGdldCBwZW5kaW5nRW5kRGF0ZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHJldHVybiAnJztcbiAgICBjb25zdCBkYXRlID0gdGhpcy5yYW5nZVN0b3JlLmVuZERhdGUoKTtcbiAgICByZXR1cm4gZGF0ZSAmJiB0aGlzLmhhc1BlbmRpbmdDaGFuZ2VzKCkgPyB0aGlzLmZvcm1hdERhdGUoZGF0ZSkgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1vbnRoTmFtZXMgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0TW9udGhOYW1lc1Nob3J0ID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHREYXlOYW1lcyA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0RGF5TmFtZXNTaG9ydCA9IFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddO1xuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGNhbGxiYWNrc1xuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IERhdGVSYW5nZSB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICAvLyBFZmZlY3QgdG8gZW1pdCBjaGFuZ2VzIHdoZW4gZGF0ZXMgY2hhbmdlIGluIHN0b3JlXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yYW5nZVN0b3JlLnJhbmdlKCk7XG4gICAgICBpZiAocmFuZ2Uuc3RhcnQgfHwgcmFuZ2UuZW5kKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5nZXREYXRlUmFuZ2VWYWx1ZSgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGlja091dHNpZGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93RGF0ZVBpY2tlcigpICYmIHRoaXMuY2xvc2VPbkNsaWNrT3V0c2lkZSkge1xuICAgICAgY29uc3QgY2xpY2tlZEluc2lkZSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgICBpZiAoIWNsaWNrZWRJbnNpZGUpIHtcbiAgICAgICAgdGhpcy5jbG9zZURhdGVQaWNrZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5Ym9hcmROYXZpZ2F0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG93RGF0ZVBpY2tlcigpKSB7XG4gICAgICAvLyBXaGVuIHBpY2tlciBpcyBjbG9zZWQsIGFsbG93IEVudGVyL1NwYWNlIHRvIG9wZW4gaXRcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZGF0ZXBpY2tlci1pbnB1dCcpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnRvZ2dsZURhdGVQaWNrZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdoZW4gcGlja2VyIGlzIG9wZW5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jbG9zZURhdGVQaWNrZXIoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c1ZlcnRpY2FsKC0xKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUZvY3VzVmVydGljYWwoMSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c0hvcml6b250YWwoLTEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUZvY3VzSG9yaXpvbnRhbCgxKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNlbGVjdEZvY3VzZWREYXkoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1c1RvRmlyc3REYXkoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUZvY3VzVG9MYXN0RGF5KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICB0aGlzLm1vdmVGb2N1c1llYXIoLTEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hhbmdlTW9udGgoLTEpO1xuICAgICAgICAgIHRoaXMuYWRqdXN0Rm9jdXNBZnRlck1vbnRoQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgdGhpcy5tb3ZlRm9jdXNZZWFyKDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hhbmdlTW9udGgoMSk7XG4gICAgICAgICAgdGhpcy5hZGp1c3RGb2N1c0FmdGVyTW9udGhDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBLZXlib2FyZCBuYXZpZ2F0aW9uIG1ldGhvZHNcbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9jdXMoKTogdm9pZCB7XG4gICAgLy8gU2V0IGluaXRpYWwgZm9jdXMgdG8gc3RhcnQgZGF0ZSwgZW5kIGRhdGUsIG9yIGZpcnN0IGF2YWlsYWJsZSBkYXlcbiAgICBpZiAodGhpcy5zdGFydERhdGUpIHtcbiAgICAgIGNvbnN0IGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKHRoaXMuc3RhcnREYXRlLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICBcbiAgICAgIGlmIChpblByZXZNb250aCB8fCBpbkN1cnJNb250aCkge1xuICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogdGhpcy5zdGFydERhdGUsIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IDEgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdGFydERhdGUgaXMgbm90IHZpc2libGUsIGZvY3VzIG9uIHRvZGF5IGlmIHZpc2libGVcbiAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdCh0aGlzLmRhdGVBZGFwdGVyLnRvZGF5KCksICd5eXl5LU1NLWRkJyk7XG4gICAgICAgIGNvbnN0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKHRvZGF5LCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpbkN1cnJNb250aCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiB0b2RheSwgbW9udGhJbmRleDogMSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50TW9udGhEYXlzID0gdGhpcy5jdXJyZW50TW9udGhEYXlzKCk7XG4gICAgICAgICAgY29uc3QgZmlyc3REYXkgPSBjdXJyZW50TW9udGhEYXlzLmZpbmQoZGF5ID0+IGRheS5pc0N1cnJlbnRNb250aCk7XG4gICAgICAgICAgaWYgKGZpcnN0RGF5KSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogZmlyc3REYXkuZGF0ZSwgbW9udGhJbmRleDogMSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgY29uc3QgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodGhpcy5lbmREYXRlLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0aGlzLmVuZERhdGUsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuICAgICAgXG4gICAgICBpZiAoaW5QcmV2TW9udGggfHwgaW5DdXJyTW9udGgpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IHRoaXMuZW5kRGF0ZSwgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogMSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVuZERhdGUgaXMgbm90IHZpc2libGUsIGZvY3VzIG9uIHRvZGF5IGlmIHZpc2libGVcbiAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdCh0aGlzLmRhdGVBZGFwdGVyLnRvZGF5KCksICd5eXl5LU1NLWRkJyk7XG4gICAgICAgIGNvbnN0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKHRvZGF5LCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpbkN1cnJNb250aCkge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiB0b2RheSwgbW9udGhJbmRleDogMSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50TW9udGhEYXlzID0gdGhpcy5jdXJyZW50TW9udGhEYXlzKCk7XG4gICAgICAgICAgY29uc3QgZmlyc3REYXkgPSBjdXJyZW50TW9udGhEYXlzLmZpbmQoZGF5ID0+IGRheS5pc0N1cnJlbnRNb250aCk7XG4gICAgICAgICAgaWYgKGZpcnN0RGF5KSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogZmlyc3REYXkuZGF0ZSwgbW9udGhJbmRleDogMSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9jdXMgb24gdG9kYXkgaWYgdmlzaWJsZSwgb3RoZXJ3aXNlIGZpcnN0IGRheSBvZiBjdXJyZW50IG1vbnRoXG4gICAgICBjb25zdCB0b2RheSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KHRoaXMuZGF0ZUFkYXB0ZXIudG9kYXkoKSwgJ3l5eXktTU0tZGQnKTtcbiAgICAgIGNvbnN0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKHRvZGF5LCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgIFxuICAgICAgaWYgKGluQ3Vyck1vbnRoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiB0b2RheSwgbW9udGhJbmRleDogMSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRvZGF5IGlzIG5vdCBpbiBjdXJyZW50IG1vbnRoLCBmb2N1cyBvbiBmaXJzdCBkYXkgb2YgY3VycmVudCBtb250aFxuICAgICAgICBjb25zdCBjdXJyZW50TW9udGhEYXlzID0gdGhpcy5jdXJyZW50TW9udGhEYXlzKCk7XG4gICAgICAgIGNvbnN0IGZpcnN0RGF5ID0gY3VycmVudE1vbnRoRGF5cy5maW5kKGRheSA9PiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgICAgICBpZiAoZmlyc3REYXkpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogZmlyc3REYXkuZGF0ZSwgbW9udGhJbmRleDogMSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEYXRlSW5Nb250aChkYXRlU3RyOiBzdHJpbmcsIG1vbnRoRGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGRhdGVTdHIpO1xuICAgIGlmICghZGF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSk7XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpO1xuICAgIGNvbnN0IG1vbnRoWWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihtb250aERhdGUpO1xuICAgIGNvbnN0IG1vbnRoTW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKG1vbnRoRGF0ZSk7XG4gICAgcmV0dXJuIHllYXIgPT09IG1vbnRoWWVhciAmJiBtb250aCA9PT0gbW9udGhNb250aDtcbiAgfVxuXG4gIHByaXZhdGUgbW92ZUZvY3VzSG9yaXpvbnRhbChkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXkoKTtcbiAgICBpZiAoIWZvY3VzZWQpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGZvY3VzZWQuZGF0ZSk7XG4gICAgaWYgKCFjdXJyZW50RGF0ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuYWRkRGF5cyhjdXJyZW50RGF0ZSwgZGlyZWN0aW9uKTtcbiAgICBjb25zdCBuZXdEYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKG5ld0RhdGUpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIG1vbnRoIHRoZSBuZXcgZGF0ZSBiZWxvbmdzIHRvXG4gICAgbGV0IGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMucHJldmlvdXNNb250aCgpKTtcbiAgICBsZXQgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG5cbiAgICBpZiAoaW5QcmV2TW9udGggfHwgaW5DdXJyTW9udGgpIHtcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBcbiAgICAgICAgZGF0ZTogbmV3RGF0ZVN0ciwgXG4gICAgICAgIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IDEgXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGF0ZSBpcyBvdXRzaWRlIHZpc2libGUgbW9udGhzLCBuYXZpZ2F0ZSBtb250aFxuICAgICAgaWYgKGRpcmVjdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VNb250aCgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hhbmdlTW9udGgoLTEpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZWNhbGN1bGF0ZSBhZnRlciBtb250aCBjaGFuZ2VcbiAgICAgIGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMucHJldmlvdXNNb250aCgpKTtcbiAgICAgIGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuICAgICAgXG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgXG4gICAgICAgIGRhdGU6IG5ld0RhdGVTdHIsIFxuICAgICAgICBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAoaW5DdXJyTW9udGggPyAxIDogMClcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbW92ZUZvY3VzVmVydGljYWwoZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF5KCk7XG4gICAgaWYgKCFmb2N1c2VkKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShmb2N1c2VkLmRhdGUpO1xuICAgIGlmICghY3VycmVudERhdGUpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmFkZERheXMoY3VycmVudERhdGUsIGRpcmVjdGlvbiAqIDcpOyAvLyBNb3ZlIGJ5IHdlZWtcbiAgICBjb25zdCBuZXdEYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKG5ld0RhdGUpO1xuXG4gICAgbGV0IGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMucHJldmlvdXNNb250aCgpKTtcbiAgICBsZXQgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG5cbiAgICBpZiAoaW5QcmV2TW9udGggfHwgaW5DdXJyTW9udGgpIHtcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBcbiAgICAgICAgZGF0ZTogbmV3RGF0ZVN0ciwgXG4gICAgICAgIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IDEgXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmF2aWdhdGUgdG8gbW9udGggY29udGFpbmluZyB0aGUgbmV3IGRhdGVcbiAgICAgIGlmIChkaXJlY3Rpb24gPiAwKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlTW9udGgoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKC0xKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVjYWxjdWxhdGUgYWZ0ZXIgbW9udGggY2hhbmdlXG4gICAgICBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgICBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgIFxuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IFxuICAgICAgICBkYXRlOiBuZXdEYXRlU3RyLCBcbiAgICAgICAgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogKGluQ3Vyck1vbnRoID8gMSA6IDApXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c1RvRmlyc3REYXkoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldk1vbnRoRGF5cyA9IHRoaXMucHJldmlvdXNNb250aERheXMoKTtcbiAgICBjb25zdCBmaXJzdERheSA9IHByZXZNb250aERheXMuZmluZChkYXkgPT4gZGF5LmlzQ3VycmVudE1vbnRoKTtcbiAgICBpZiAoZmlyc3REYXkpIHtcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiBmaXJzdERheS5kYXRlLCBtb250aEluZGV4OiAwIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbW92ZUZvY3VzVG9MYXN0RGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJNb250aERheXMgPSB0aGlzLmN1cnJlbnRNb250aERheXMoKTtcbiAgICBjb25zdCB2YWxpZERheXMgPSBjdXJyTW9udGhEYXlzLmZpbHRlcihkYXkgPT4gZGF5LmlzQ3VycmVudE1vbnRoKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gdmFsaWREYXlzW3ZhbGlkRGF5cy5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdERheSkge1xuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IGxhc3REYXkuZGF0ZSwgbW9udGhJbmRleDogMSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVGb2N1c1llYXIoZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF5KCk7XG4gICAgaWYgKCFmb2N1c2VkKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShmb2N1c2VkLmRhdGUpO1xuICAgIGlmICghY3VycmVudERhdGUpIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGN1cnJlbnREYXRlKTtcbiAgICBjb25zdCBjdXJyZW50TW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGN1cnJlbnREYXRlKTtcbiAgICBjb25zdCBjdXJyZW50RGF5ID0gdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKGN1cnJlbnREYXRlKTtcbiAgICBcbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGN1cnJlbnRZZWFyICsgZGlyZWN0aW9uLCBjdXJyZW50TW9udGgsIGN1cnJlbnREYXkpO1xuICAgIGNvbnN0IG5ld0RhdGVTdHIgPSB0aGlzLmZvcm1hdERhdGUobmV3RGF0ZSk7XG5cbiAgICAvLyBVcGRhdGUgbW9udGhzIHRvIHNob3cgdGhlIG5ldyB5ZWFyXG4gICAgdGhpcy5jdXJyZW50TW9udGguc2V0KHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShjdXJyZW50WWVhciArIGRpcmVjdGlvbiwgY3VycmVudE1vbnRoLCAxKSk7XG4gICAgdGhpcy5wcmV2aW91c01vbnRoLnNldCh0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoY3VycmVudFllYXIgKyBkaXJlY3Rpb24sIGN1cnJlbnRNb250aCAtIDEsIDEpKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG5cbiAgICBjb25zdCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IFxuICAgICAgZGF0ZTogbmV3RGF0ZVN0ciwgXG4gICAgICBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxIFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RGb2N1c0FmdGVyTW9udGhDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuZm9jdXNlZERheSgpO1xuICAgIGlmICghZm9jdXNlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgoZm9jdXNlZC5kYXRlLCB0aGlzLnByZXZpb3VzTW9udGgoKSk7XG4gICAgY29uc3QgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgoZm9jdXNlZC5kYXRlLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcblxuICAgIGlmICghaW5QcmV2TW9udGggJiYgIWluQ3Vyck1vbnRoKSB7XG4gICAgICAvLyBGb2N1c2VkIGRheSBpcyBubyBsb25nZXIgdmlzaWJsZSwgbW92ZSB0byBlcXVpdmFsZW50IGRheSBpbiB2aXNpYmxlIG1vbnRoc1xuICAgICAgdGhpcy5pbml0aWFsaXplRm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlIG1vbnRoIGluZGV4IGlmIG5lZWRlZFxuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7XG4gICAgICAgIGRhdGU6IGZvY3VzZWQuZGF0ZSxcbiAgICAgICAgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogMVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RGb2N1c2VkRGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXkoKTtcbiAgICBpZiAoIWZvY3VzZWQpIHJldHVybjtcblxuICAgIGNvbnN0IG1vbnRoRGF5cyA9IGZvY3VzZWQubW9udGhJbmRleCA9PT0gMCA/IHRoaXMucHJldmlvdXNNb250aERheXMoKSA6IHRoaXMuY3VycmVudE1vbnRoRGF5cygpO1xuICAgIGNvbnN0IGRheU9iaiA9IG1vbnRoRGF5cy5maW5kKGRheSA9PiBkYXkuZGF0ZSA9PT0gZm9jdXNlZC5kYXRlICYmIGRheS5pc0N1cnJlbnRNb250aCk7XG4gICAgXG4gICAgaWYgKGRheU9iaikge1xuICAgICAgdGhpcy5zZWxlY3REYXkoZGF5T2JqKTtcbiAgICB9XG4gIH1cblxuICBoYXNLZXlib2FyZEZvY3VzKGRhdGU6IHN0cmluZywgbW9udGhJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuZm9jdXNlZERheSgpO1xuICAgIHJldHVybiBmb2N1c2VkICE9PSBudWxsICYmIGZvY3VzZWQuZGF0ZSA9PT0gZGF0ZSAmJiBmb2N1c2VkLm1vbnRoSW5kZXggPT09IG1vbnRoSW5kZXg7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBDb25maWd1cmUgdGhlIGhlYWRsZXNzIHN0b3JlXG4gICAgdGhpcy5yYW5nZVN0b3JlLmNvbmZpZ3VyZSh7XG4gICAgICBlbmFibGVUaW1lUGlja2VyOiB0aGlzLmVuYWJsZVRpbWVQaWNrZXIsXG4gICAgICBkZWZhdWx0U3RhcnRUaW1lOiB0aGlzLmRlZmF1bHRTdGFydFRpbWUsXG4gICAgICBkZWZhdWx0RW5kVGltZTogdGhpcy5kZWZhdWx0RW5kVGltZSxcbiAgICAgIGRpc2FibGVkRGF0ZXM6IHRoaXMuZGlzYWJsZWREYXRlc1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZGF0ZXMgaW4gc3RvcmUgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5zdGFydERhdGUpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHRoaXMuc3RhcnREYXRlKTtcbiAgICAgIGlmIChkYXRlKSB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnQoZGF0ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHRoaXMuZW5kRGF0ZSk7XG4gICAgICBpZiAoZGF0ZSkgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChkYXRlKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc3RhcnREYXRlJ10gfHwgY2hhbmdlc1snZW5kRGF0ZSddKSB7XG4gICAgICAvLyBTeW5jIHdpdGggc3RvcmVcbiAgICAgIGlmIChjaGFuZ2VzWydzdGFydERhdGUnXSAmJiB0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZSh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgIGlmIChkYXRlKSB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnQoZGF0ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlc1snZW5kRGF0ZSddICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZSh0aGlzLmVuZERhdGUpO1xuICAgICAgICBpZiAoZGF0ZSkgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChkYXRlKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSBzdG9yZSBjb25maWd1cmF0aW9uIGlmIHJlbGV2YW50IGlucHV0cyBjaGFuZ2VcbiAgICBpZiAoY2hhbmdlc1snZW5hYmxlVGltZVBpY2tlciddIHx8IGNoYW5nZXNbJ2RlZmF1bHRTdGFydFRpbWUnXSB8fCBcbiAgICAgICAgY2hhbmdlc1snZGVmYXVsdEVuZFRpbWUnXSB8fCBjaGFuZ2VzWydkaXNhYmxlZERhdGVzJ10pIHtcbiAgICAgIHRoaXMucmFuZ2VTdG9yZS5jb25maWd1cmUoe1xuICAgICAgICBlbmFibGVUaW1lUGlja2VyOiB0aGlzLmVuYWJsZVRpbWVQaWNrZXIsXG4gICAgICAgIGRlZmF1bHRTdGFydFRpbWU6IHRoaXMuZGVmYXVsdFN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdEVuZFRpbWU6IHRoaXMuZGVmYXVsdEVuZFRpbWUsXG4gICAgICAgIGRpc2FibGVkRGF0ZXM6IHRoaXMuZGlzYWJsZWREYXRlc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0RGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyh0aGlzLmRhdGVBZGFwdGVyLmdldERhdGUoZGF0ZSkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gIH1cblxuICBmb3JtYXREYXRlRGlzcGxheShkYXRlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuICcnO1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGRhdGVTdHIpO1xuICAgIGlmICghZGF0ZSkgcmV0dXJuICcnO1xuICAgIFxuICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSk7XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpO1xuICAgIGNvbnN0IGRheSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShkYXRlKTtcbiAgICBcbiAgICBjb25zdCBtb250aE5hbWVzID0gdGhpcy5sb2NhbGUubW9udGhOYW1lcyB8fCB0aGlzLmRlZmF1bHRNb250aE5hbWVzO1xuICAgIGNvbnN0IG1vbnRoTmFtZXNTaG9ydCA9IHRoaXMubG9jYWxlLm1vbnRoTmFtZXNTaG9ydCB8fCB0aGlzLmRlZmF1bHRNb250aE5hbWVzU2hvcnQ7XG4gICAgXG4gICAgLy8gUmVwbGFjZSBmb3JtYXQgdG9rZW5zIHdpdGggdmFsdWVzXG4gICAgbGV0IGZvcm1hdHRlZCA9IHRoaXMuZGlzcGxheUZvcm1hdDtcbiAgICBcbiAgICAvLyBZZWFyIHRva2Vuc1xuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9ZWVlZL2csIFN0cmluZyh5ZWFyKSk7XG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1lZL2csIFN0cmluZyh5ZWFyKS5zbGljZSgtMikpO1xuICAgIFxuICAgIC8vIE1vbnRoIHRva2VucyAob3JkZXIgbWF0dGVyczogTU1NTSBiZWZvcmUgTU1NIGJlZm9yZSBNTSBiZWZvcmUgTSlcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWVzW21vbnRoXSk7XG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWVzU2hvcnRbbW9udGhdKTtcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvTU0vZywgU3RyaW5nKG1vbnRoICsgMSkucGFkU3RhcnQoMiwgJzAnKSk7XG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL00vZywgU3RyaW5nKG1vbnRoICsgMSkpO1xuICAgIFxuICAgIC8vIERheSB0b2tlbnMgKG9yZGVyIG1hdHRlcnM6IEREIGJlZm9yZSBEKVxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9ERC9nLCBTdHJpbmcoZGF5KS5wYWRTdGFydCgyLCAnMCcpKTtcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvRC9nLCBTdHJpbmcoZGF5KSk7XG4gICAgXG4gICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgfVxuXG4gIC8vIE5vdGU6IHVwZGF0ZURhdGVSYW5nZVRleHQgaXMgbm93IGhhbmRsZWQgYnkgY29tcHV0ZWQgZGF0ZVJhbmdlVGV4dCBmcm9tIHN0b3JlXG4gIC8vIEtlZXBpbmcgdGhpcyBtZXRob2QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IGl0J3MgYSBuby1vcFxuICB1cGRhdGVEYXRlUmFuZ2VUZXh0KCk6IHZvaWQge1xuICAgIC8vIFRleHQgaXMgbm93IGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQgZnJvbSBzdG9yZS5yYW5nZVRleHQoKVxuICB9XG5cbiAgdG9nZ2xlRGF0ZVBpY2tlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dEYXRlUGlja2VyLnVwZGF0ZSh2YWx1ZSA9PiAhdmFsdWUpO1xuICAgIGlmICh0aGlzLnNob3dEYXRlUGlja2VyKCkpIHtcbiAgICAgIC8vIHNlbGVjdGluZ1N0YXJ0IGlzIG1hbmFnZWQgYnkgc3RvcmUsIG5vIG5lZWQgdG8gc2V0IGhlcmVcbiAgICAgIGNvbnN0IGN1cnJlbnRNb250aFZhbHVlID0gdGhpcy5jdXJyZW50TW9udGgoKTtcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoY3VycmVudE1vbnRoVmFsdWUpO1xuICAgICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGN1cnJlbnRNb250aFZhbHVlKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzTW9udGhEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoIC0gMSwgMSk7XG4gICAgICB0aGlzLnByZXZpb3VzTW9udGguc2V0KHByZXZpb3VzTW9udGhEYXRlKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICAgIC8vIEluaXRpYWxpemUga2V5Ym9hcmQgZm9jdXMgb25seSBpZiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWRcbiAgICAgIGlmICh0aGlzLmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVGb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbGVhciBmb2N1cyB3aGVuIGNsb3NpbmdcbiAgICAgIGlmICh0aGlzLmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgY2xvc2VEYXRlUGlja2VyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgICBpZiAodGhpcy5lbmFibGVLZXlib2FyZE5hdmlnYXRpb24pIHtcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQobnVsbCk7XG4gICAgfVxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBnZW5lcmF0ZUNhbGVuZGFycygpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpb3VzTW9udGhEYXlzLnNldCh0aGlzLmdlbmVyYXRlTW9udGhDYWxlbmRhcih0aGlzLnByZXZpb3VzTW9udGgoKSkpO1xuICAgIHRoaXMuY3VycmVudE1vbnRoRGF5cy5zZXQodGhpcy5nZW5lcmF0ZU1vbnRoQ2FsZW5kYXIodGhpcy5jdXJyZW50TW9udGgoKSkpO1xuICB9XG5cbiAgZ2VuZXJhdGVNb250aENhbGVuZGFyKGRhdGU6IERhdGUpOiBhbnlbXSB7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSk7XG4gICAgY29uc3QgZmlyc3REYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgIGNvbnN0IGxhc3REYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGggKyAxLCAwKTtcbiAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShsYXN0RGF5KTtcbiAgICBjb25zdCBmaXJzdERheU9mV2VlayA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF5KGZpcnN0RGF5KTtcblxuICAgIGNvbnN0IG1vbnRoRGF5cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdERheU9mV2VlazsgaSsrKSB7XG4gICAgICBtb250aERheXMucHVzaCh7IGRheTogbnVsbCwgaXNDdXJyZW50TW9udGg6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGRheSA9IDE7IGRheSA8PSBkYXlzSW5Nb250aDsgZGF5KyspIHtcbiAgICAgIGNvbnN0IGRheURhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgICBjb25zdCBkYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGRheURhdGUpO1xuICAgICAgXG4gICAgICAgLy8gR2V0IHBlbmRpbmcgZGF0ZXMgZnJvbSBzdG9yZSAoZm9yIHJlcXVpcmVBcHBseSBtb2RlKVxuICAgICAgY29uc3QgcGVuZGluZ1N0YXJ0ID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0RGF0ZSgpOyAvLyBJbiBwZW5kaW5nIG1vZGUsIHN0b3JlIGhvbGRzIHBlbmRpbmcgdmFsdWVzXG4gICAgICBjb25zdCBwZW5kaW5nRW5kID0gdGhpcy5yYW5nZVN0b3JlLmVuZERhdGUoKTtcbiAgICAgIGNvbnN0IHBlbmRpbmdTdGFydFN0ciA9IHBlbmRpbmdTdGFydCA/IHRoaXMuZm9ybWF0RGF0ZShwZW5kaW5nU3RhcnQpIDogJyc7XG4gICAgICBjb25zdCBwZW5kaW5nRW5kU3RyID0gcGVuZGluZ0VuZCA/IHRoaXMuZm9ybWF0RGF0ZShwZW5kaW5nRW5kKSA6ICcnO1xuICAgICAgXG4gICAgICBjb25zdCBpc1BlbmRpbmdTdGFydCA9IHRoaXMucmVxdWlyZUFwcGx5ICYmIHBlbmRpbmdTdGFydFN0ciA9PT0gZGF0ZVN0cjtcbiAgICAgIGNvbnN0IGlzUGVuZGluZ0VuZCA9IHRoaXMucmVxdWlyZUFwcGx5ICYmIHBlbmRpbmdFbmRTdHIgPT09IGRhdGVTdHI7XG4gICAgICBjb25zdCBpblBlbmRpbmdSYW5nZSA9IHRoaXMucmVxdWlyZUFwcGx5ICYmIHBlbmRpbmdTdGFydFN0ciAmJiBwZW5kaW5nRW5kU3RyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVTdHIgPj0gcGVuZGluZ1N0YXJ0U3RyICYmIGRhdGVTdHIgPD0gcGVuZGluZ0VuZFN0cjtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZGF0ZSBpcyBpbiBob3ZlciBwcmV2aWV3IHJhbmdlXG4gICAgICBjb25zdCBpbkhvdmVyUmFuZ2UgPSB0aGlzLmlzSW5Ib3ZlclJhbmdlKGRhdGVTdHIpO1xuICAgICAgXG4gICAgICBtb250aERheXMucHVzaCh7XG4gICAgICAgIGRheTogZGF5LFxuICAgICAgICBkYXRlOiBkYXRlU3RyLFxuICAgICAgICBpc0N1cnJlbnRNb250aDogdHJ1ZSxcbiAgICAgICAgaXNTdGFydDogdGhpcy5zdGFydERhdGUgPT09IGRhdGVTdHIgfHwgaXNQZW5kaW5nU3RhcnQsXG4gICAgICAgIGlzRW5kOiB0aGlzLmVuZERhdGUgPT09IGRhdGVTdHIgfHwgaXNQZW5kaW5nRW5kLFxuICAgICAgICBpblJhbmdlOiB0aGlzLmlzSW5SYW5nZShkYXRlU3RyKSB8fCBpblBlbmRpbmdSYW5nZSxcbiAgICAgICAgaW5Ib3ZlclJhbmdlOiBpbkhvdmVyUmFuZ2UsXG4gICAgICAgIGlzRGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF5RGF0ZSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtb250aERheXM7XG4gIH1cblxuICBpc0luUmFuZ2UoZGF0ZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubXVsdGlSYW5nZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgZGF0ZSBpcyBpbiBhbnkgb2YgdGhlIHNlbGVjdGVkIHJhbmdlc1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSYW5nZXMoKS5zb21lKHJhbmdlID0+IHtcbiAgICAgICAgcmV0dXJuIGRhdGVTdHIgPj0gcmFuZ2Uuc3RhcnREYXRlICYmIGRhdGVTdHIgPD0gcmFuZ2UuZW5kRGF0ZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuc3RhcnREYXRlIHx8ICF0aGlzLmVuZERhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBkYXRlU3RyID49IHRoaXMuc3RhcnREYXRlICYmIGRhdGVTdHIgPD0gdGhpcy5lbmREYXRlO1xuICAgIH1cbiAgfVxuXG4gIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWREYXRlcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmRpc2FibGVkRGF0ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIElmIGl0J3MgYSBmdW5jdGlvbiwgY2FsbCBpdCB3aXRoIHRoZSBkYXRlXG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERhdGVzKGRhdGUpO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRpc2FibGVkRGF0ZXMpKSB7XG4gICAgICAvLyBJZiBpdCdzIGFuIGFycmF5LCBjaGVjayBpZiB0aGUgZGF0ZSBtYXRjaGVzIGFueSBkaXNhYmxlZCBkYXRlXG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERhdGVzLnNvbWUoZGlzYWJsZWREYXRlID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKSA9PT0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGRpc2FibGVkRGF0ZSkgJiZcbiAgICAgICAgICAgICAgIHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSkgPT09IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGlzYWJsZWREYXRlKSAmJlxuICAgICAgICAgICAgICAgdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKGRhdGUpID09PSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGUoZGlzYWJsZWREYXRlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc0luSG92ZXJSYW5nZShkYXRlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3ZlciA9IHRoaXMuaG92ZXJEYXRlKCk7XG4gICAgaWYgKCFob3ZlcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gSW4gbXVsdGlSYW5nZSBtb2RlLCBvbmx5IHNob3cgaG92ZXIgcHJldmlldyB3aGVuIHNlbGVjdGluZyBlbmQgZGF0ZVxuICAgIGlmICh0aGlzLm11bHRpUmFuZ2UpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBjdXJyZW50U3RhcnQgPSB0aGlzLnN0YXJ0RGF0ZTtcbiAgICAgIGlmICghY3VycmVudFN0YXJ0KSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBtaW5EYXRlID0gY3VycmVudFN0YXJ0IDwgaG92ZXIgPyBjdXJyZW50U3RhcnQgOiBob3ZlcjtcbiAgICAgIGNvbnN0IG1heERhdGUgPSBjdXJyZW50U3RhcnQgPiBob3ZlciA/IGN1cnJlbnRTdGFydCA6IGhvdmVyO1xuICAgICAgcmV0dXJuIGRhdGVTdHIgPj0gbWluRGF0ZSAmJiBkYXRlU3RyIDw9IG1heERhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHNpbmdsZSByYW5nZSBtb2RlICBcbiAgICAgIGlmICh0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgICAvLyBVc2UgcGVuZGluZyBkYXRlcyBmcm9tIHN0b3JlXG4gICAgICAgIGNvbnN0IHBlbmRpbmdTdGFydCA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydERhdGUoKTtcbiAgICAgICAgaWYgKCFwZW5kaW5nU3RhcnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcGVuZGluZ1N0YXJ0U3RyID0gdGhpcy5mb3JtYXREYXRlKHBlbmRpbmdTdGFydCk7XG4gICAgICAgIGNvbnN0IG1pbkRhdGUgPSBwZW5kaW5nU3RhcnRTdHIgPCBob3ZlciA/IHBlbmRpbmdTdGFydFN0ciA6IGhvdmVyO1xuICAgICAgICBjb25zdCBtYXhEYXRlID0gcGVuZGluZ1N0YXJ0U3RyID4gaG92ZXIgPyBwZW5kaW5nU3RhcnRTdHIgOiBob3ZlcjtcbiAgICAgICAgcmV0dXJuIGRhdGVTdHIgPj0gbWluRGF0ZSAmJiBkYXRlU3RyIDw9IG1heERhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2UgYWN0dWFsIGRhdGVzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGFydCA9IHRoaXMuc3RhcnREYXRlO1xuICAgICAgICBpZiAoIWN1cnJlbnRTdGFydCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBtaW5EYXRlID0gY3VycmVudFN0YXJ0IDwgaG92ZXIgPyBjdXJyZW50U3RhcnQgOiBob3ZlcjtcbiAgICAgICAgY29uc3QgbWF4RGF0ZSA9IGN1cnJlbnRTdGFydCA+IGhvdmVyID8gY3VycmVudFN0YXJ0IDogaG92ZXI7XG4gICAgICAgIHJldHVybiBkYXRlU3RyID49IG1pbkRhdGUgJiYgZGF0ZVN0ciA8PSBtYXhEYXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGF5SG92ZXIoZGF5T2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWRheU9iai5pc0N1cnJlbnRNb250aCB8fCB0aGlzLmlzRGlzYWJsZWQoKSB8fCBkYXlPYmouaXNEaXNhYmxlZCkge1xuICAgICAgdGhpcy5ob3ZlckRhdGUuc2V0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhvdmVyRGF0ZS5zZXQoZGF5T2JqLmRhdGUpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIGNsZWFyRGF5SG92ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5ob3ZlckRhdGUuc2V0KG51bGwpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIHNlbGVjdERheShkYXlPYmo6IGFueSk6IHZvaWQge1xuICAgIGlmICghZGF5T2JqLmlzQ3VycmVudE1vbnRoIHx8IHRoaXMuaXNEaXNhYmxlZCgpIHx8IGRheU9iai5pc0Rpc2FibGVkKSByZXR1cm47XG4gICAgXG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShkYXlPYmouZGF0ZSk7XG4gICAgaWYgKCFzZWxlY3RlZERhdGUpIHJldHVybjtcblxuICAgIGlmICh0aGlzLm11bHRpUmFuZ2UpIHtcbiAgICAgIC8vIE11bHRpLXJhbmdlIG1vZGU6IGFkZCByYW5nZXMgdG8gYXJyYXlcbiAgICAgIGlmICh0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZSgpKSB7XG4gICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRTdGFydChzZWxlY3RlZERhdGUpO1xuICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXJ0ID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0RGF0ZSgpO1xuICAgICAgICBpZiAoY3VycmVudFN0YXJ0ICYmIHNlbGVjdGVkRGF0ZSA8IGN1cnJlbnRTdGFydCkge1xuICAgICAgICAgIC8vIFN3YXA6IHNlbGVjdGVkIGJlY29tZXMgc3RhcnQsIGN1cnJlbnQgc3RhcnQgYmVjb21lcyBlbmRcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKGN1cnJlbnRTdGFydCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChzZWxlY3RlZERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgdGhlIG5ldyByYW5nZSB0byB0aGUgYXJyYXlcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnJhbmdlU3RvcmUucmFuZ2UoKTtcbiAgICAgICAgY29uc3QgbmV3UmFuZ2U6IERhdGVSYW5nZSA9IHtcbiAgICAgICAgICBzdGFydERhdGU6IHJhbmdlLnN0YXJ0LFxuICAgICAgICAgIGVuZERhdGU6IHJhbmdlLmVuZCxcbiAgICAgICAgICByYW5nZVRleHQ6IHRoaXMuZm9ybWF0RGF0ZURpc3BsYXkocmFuZ2Uuc3RhcnQpICsgJyDigJMgJyArIHRoaXMuZm9ybWF0RGF0ZURpc3BsYXkocmFuZ2UuZW5kKSxcbiAgICAgICAgICAuLi4odGhpcy5lbmFibGVUaW1lUGlja2VyICYmIHsgc3RhcnRUaW1lOiByYW5nZS5zdGFydFRpbWUsIGVuZFRpbWU6IHJhbmdlLmVuZFRpbWUgfSlcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSYW5nZXMgPSBbLi4udGhpcy5zZWxlY3RlZFJhbmdlcygpXTtcbiAgICAgICAgY3VycmVudFJhbmdlcy5wdXNoKG5ld1JhbmdlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlcy5zZXQoY3VycmVudFJhbmdlcyk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZXNldCBmb3IgbmV4dCByYW5nZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnJlc2V0KCk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgZGlzcGxheSB0ZXh0XG4gICAgICAgIHRoaXMudXBkYXRlTXVsdGlSYW5nZVRleHQoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIERvbid0IGNsb3NlIGlmIG11bHRpUmFuZ2UsIGFsbG93IGFkZGluZyBtb3JlIHJhbmdlc1xuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0aW9uICYmICF0aGlzLm11bHRpUmFuZ2UpIHtcbiAgICAgICAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuZW1pdE11bHRpQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuZW1pdE11bHRpU2VsZWN0aW9uKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNpbmdsZSByYW5nZSBtb2RlXG4gICAgICBpZiAodGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgICAgLy8gQXBwbHkgbW9kZTogdXNlIHBlbmRpbmcgZGF0ZXMsIGRvbid0IGVtaXQgdW50aWwgQXBwbHkgaXMgY2xpY2tlZFxuICAgICAgICBpZiAodGhpcy5zZWxlY3RpbmdTdGFydERhdGUoKSkge1xuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRQZW5kaW5nU3RhcnQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0UGVuZGluZ0VuZChudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwZW5kaW5nU3RhcnQgPSB0aGlzLnJhbmdlU3RvcmUuc3RhcnREYXRlKCk7XG4gICAgICAgICAgaWYgKHBlbmRpbmdTdGFydCAmJiBzZWxlY3RlZERhdGUgPCBwZW5kaW5nU3RhcnQpIHtcbiAgICAgICAgICAgIC8vIFN3YXBcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRQZW5kaW5nU3RhcnQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRQZW5kaW5nRW5kKHBlbmRpbmdTdGFydCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRQZW5kaW5nRW5kKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEltbWVkaWF0ZSBtb2RlOiBlbWl0IGNoYW5nZXMgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlKCkpIHtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKG51bGwpO1xuICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGFydCA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydERhdGUoKTtcbiAgICAgICAgICBpZiAoY3VycmVudFN0YXJ0ICYmIHNlbGVjdGVkRGF0ZSA8IGN1cnJlbnRTdGFydCkge1xuICAgICAgICAgICAgLy8gU3dhcFxuICAgICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0KHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKGN1cnJlbnRTdGFydCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zaG93RGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXBwbHlTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHJldHVybjtcbiAgICBcbiAgICAvLyBBcHBseSBwZW5kaW5nIGRhdGVzIHRocm91Z2ggc3RvcmVcbiAgICB0aGlzLnJhbmdlU3RvcmUuYXBwbHlQZW5kaW5nKCk7XG4gICAgXG4gICAgLy8gRW1pdCBjaGFuZ2VzXG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gICAgXG4gICAgLy8gQ2xvc2UgcGlja2VyXG4gICAgdGhpcy5zaG93RGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICB9XG5cbiAgY2FuY2VsU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIERpc2NhcmQgcGVuZGluZyBjaGFuZ2VzIHRocm91Z2ggc3RvcmVcbiAgICB0aGlzLnJhbmdlU3RvcmUuY2FuY2VsUGVuZGluZygpO1xuICAgIFxuICAgIC8vIFJlZ2VuZXJhdGUgY2FsZW5kYXJzIHRvIGNsZWFyIHBlbmRpbmcgdmlzdWFsIHN0YXRlXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgY2hhbmdlTW9udGgoZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50TW9udGhWYWx1ZSA9IHRoaXMuY3VycmVudE1vbnRoKCk7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihjdXJyZW50TW9udGhWYWx1ZSk7XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGN1cnJlbnRNb250aFZhbHVlKTtcbiAgICBjb25zdCBuZXdDdXJyZW50TW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGggKyBkaXJlY3Rpb24sIDEpO1xuICAgIHRoaXMuY3VycmVudE1vbnRoLnNldChuZXdDdXJyZW50TW9udGgpO1xuICAgIFxuICAgIGNvbnN0IG5ld1llYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIobmV3Q3VycmVudE1vbnRoKTtcbiAgICBjb25zdCBuZXdNb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgobmV3Q3VycmVudE1vbnRoKTtcbiAgICBjb25zdCBuZXdQcmV2aW91c01vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKG5ld1llYXIsIG5ld01vbnRoIC0gMSwgMSk7XG4gICAgdGhpcy5wcmV2aW91c01vbnRoLnNldChuZXdQcmV2aW91c01vbnRoKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBnZXRNb250aE5hbWUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhOYW1lcyA9IHRoaXMubG9jYWxlLm1vbnRoTmFtZXMgfHwgdGhpcy5kZWZhdWx0TW9udGhOYW1lcztcbiAgICByZXR1cm4gYCR7bW9udGhOYW1lc1t0aGlzLmRhdGVBZGFwdGVyLmdldE1vbnRoKGRhdGUpXX0gJHt0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSl9YDtcbiAgfVxuXG4gIGdldERheU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUuZGF5TmFtZXNTaG9ydCB8fCB0aGlzLmRlZmF1bHREYXlOYW1lc1Nob3J0O1xuICB9XG5cbiAgc2VsZWN0UHJlc2V0UmFuZ2UocHJlc2V0OiBQcmVzZXRDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoIXByZXNldC5nZXRWYWx1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcignUHJlc2V0Q29uZmlnIG11c3QgaGF2ZSBnZXRWYWx1ZSgpIGZ1bmN0aW9uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSBwcmVzZXQuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHJhbmdlLnN0YXJ0KTtcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZShyYW5nZS5lbmQpO1xuICAgIFxuICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xuICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFJhbmdlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICBpZiAodGhpcy5jbG9zZU9uUHJlc2V0U2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5yYW5nZVN0b3JlLnJlc2V0KCk7XG4gICAgdGhpcy5zaG93RGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgIFxuICAgIGlmICh0aGlzLm11bHRpUmFuZ2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZXMuc2V0KFtdKTtcbiAgICAgIHRoaXMuY3VycmVudFJhbmdlSW5kZXguc2V0KC0xKTtcbiAgICAgIHRoaXMuZW1pdE11bHRpQ2hhbmdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBcbiAgcmVtb3ZlUmFuZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aVJhbmdlKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgY3VycmVudFJhbmdlcyA9IFsuLi50aGlzLnNlbGVjdGVkUmFuZ2VzKCldO1xuICAgIGN1cnJlbnRSYW5nZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnNlbGVjdGVkUmFuZ2VzLnNldChjdXJyZW50UmFuZ2VzKTtcbiAgICBcbiAgICB0aGlzLnVwZGF0ZU11bHRpUmFuZ2VUZXh0KCk7XG4gICAgdGhpcy5lbWl0TXVsdGlDaGFuZ2UoKTtcbiAgICB0aGlzLmVtaXRNdWx0aVNlbGVjdGlvbigpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSB1cGRhdGVNdWx0aVJhbmdlVGV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuc2VsZWN0ZWRSYW5nZXMoKS5sZW5ndGg7XG4gICAgLy8gTm90ZTogZGF0ZVJhbmdlVGV4dCBpcyBub3cgY29tcHV0ZWQgZnJvbSBzdG9yZSwgdGhpcyBpcyBmb3IgbXVsdGktcmFuZ2UgVUkgb25seVxuICAgIC8vIFdlIGNvdWxkIHN0b3JlIHRoaXMgaW4gYSBzZXBhcmF0ZSBzaWduYWwgaWYgbmVlZGVkLCBidXQgZm9yIG5vdyBqdXN0IHRyYWNrIHJhbmdlcyBjb3VudFxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JlUmFuZ2UgPSB0aGlzLnJhbmdlU3RvcmUucmFuZ2UoKTtcbiAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0ge1xuICAgICAgc3RhcnREYXRlOiBzdG9yZVJhbmdlLnN0YXJ0LFxuICAgICAgZW5kRGF0ZTogc3RvcmVSYW5nZS5lbmQsXG4gICAgICByYW5nZVRleHQ6IHRoaXMuZGF0ZVJhbmdlVGV4dCgpXG4gICAgfTtcbiAgICBcbiAgICBpZiAodGhpcy5lbmFibGVUaW1lUGlja2VyKSB7XG4gICAgICByYW5nZS5zdGFydFRpbWUgPSBzdG9yZVJhbmdlLnN0YXJ0VGltZTtcbiAgICAgIHJhbmdlLmVuZFRpbWUgPSBzdG9yZVJhbmdlLmVuZFRpbWU7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQocmFuZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JlUmFuZ2UgPSB0aGlzLnJhbmdlU3RvcmUucmFuZ2UoKTtcbiAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0ge1xuICAgICAgc3RhcnREYXRlOiBzdG9yZVJhbmdlLnN0YXJ0LFxuICAgICAgZW5kRGF0ZTogc3RvcmVSYW5nZS5lbmQsXG4gICAgICByYW5nZVRleHQ6IHRoaXMuZGF0ZVJhbmdlVGV4dCgpXG4gICAgfTtcbiAgICBcbiAgICBpZiAodGhpcy5lbmFibGVUaW1lUGlja2VyKSB7XG4gICAgICByYW5nZS5zdGFydFRpbWUgPSBzdG9yZVJhbmdlLnN0YXJ0VGltZTtcbiAgICAgIHJhbmdlLmVuZFRpbWUgPSBzdG9yZVJhbmdlLmVuZFRpbWU7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZGF0ZVJhbmdlU2VsZWN0ZWQuZW1pdChyYW5nZSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgZW1pdE11bHRpQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMubXVsdGlEYXRlUmFuZ2VDaGFuZ2UuZW1pdCh7XG4gICAgICByYW5nZXM6IHRoaXMuc2VsZWN0ZWRSYW5nZXMoKVxuICAgIH0pO1xuICB9XG4gIFxuICBwcml2YXRlIGVtaXRNdWx0aVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLm11bHRpRGF0ZVJhbmdlU2VsZWN0ZWQuZW1pdCh7XG4gICAgICByYW5nZXM6IHRoaXMuc2VsZWN0ZWRSYW5nZXMoKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRlUmFuZ2VWYWx1ZSgpOiBEYXRlUmFuZ2Uge1xuICAgIGNvbnN0IHN0b3JlUmFuZ2UgPSB0aGlzLnJhbmdlU3RvcmUucmFuZ2UoKTtcbiAgICBjb25zdCByYW5nZTogRGF0ZVJhbmdlID0ge1xuICAgICAgc3RhcnREYXRlOiBzdG9yZVJhbmdlLnN0YXJ0LFxuICAgICAgZW5kRGF0ZTogc3RvcmVSYW5nZS5lbmQsXG4gICAgICByYW5nZVRleHQ6IHRoaXMuZGF0ZVJhbmdlVGV4dCgpXG4gICAgfTtcbiAgICBcbiAgICBpZiAodGhpcy5lbmFibGVUaW1lUGlja2VyKSB7XG4gICAgICByYW5nZS5zdGFydFRpbWUgPSBzdG9yZVJhbmdlLnN0YXJ0VGltZTtcbiAgICAgIHJhbmdlLmVuZFRpbWUgPSBzdG9yZVJhbmdlLmVuZFRpbWU7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiByYW5nZTtcbiAgfVxuXG4gIC8vIFRpbWUgUGlja2VyIE1ldGhvZHNcbiAgdG9nZ2xlU3RhcnRUaW1lUGlja2VyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVUaW1lUGlja2VyKSByZXR1cm47XG4gICAgdGhpcy5zaG93U3RhcnRUaW1lUGlja2VyLnNldCghdGhpcy5zaG93U3RhcnRUaW1lUGlja2VyKCkpO1xuICAgIHRoaXMuc2hvd0VuZFRpbWVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHRvZ2dsZUVuZFRpbWVQaWNrZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHJldHVybjtcbiAgICB0aGlzLnNob3dFbmRUaW1lUGlja2VyLnNldCghdGhpcy5zaG93RW5kVGltZVBpY2tlcigpKTtcbiAgICB0aGlzLnNob3dTdGFydFRpbWVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIGluY3JlbWVudFN0YXJ0SG91cigpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdIb3VyID0gKHRoaXMuc3RhcnRIb3VyICsgMSkgJSAyNDtcbiAgICB0aGlzLnNldFN0YXJ0SG91ck1pbnV0ZShuZXdIb3VyLCB0aGlzLnN0YXJ0TWludXRlKTtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBkZWNyZW1lbnRTdGFydEhvdXIoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3SG91ciA9IHRoaXMuc3RhcnRIb3VyID09PSAwID8gMjMgOiB0aGlzLnN0YXJ0SG91ciAtIDE7XG4gICAgdGhpcy5zZXRTdGFydEhvdXJNaW51dGUobmV3SG91ciwgdGhpcy5zdGFydE1pbnV0ZSk7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgaW5jcmVtZW50U3RhcnRNaW51dGUoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3TWludXRlID0gKHRoaXMuc3RhcnRNaW51dGUgKyB0aGlzLm1pbnV0ZVN0ZXApICUgNjA7XG4gICAgdGhpcy5zZXRTdGFydEhvdXJNaW51dGUodGhpcy5zdGFydEhvdXIsIG5ld01pbnV0ZSk7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgZGVjcmVtZW50U3RhcnRNaW51dGUoKTogdm9pZCB7XG4gICAgbGV0IG5ld01pbnV0ZSA9IHRoaXMuc3RhcnRNaW51dGUgLSB0aGlzLm1pbnV0ZVN0ZXA7XG4gICAgaWYgKG5ld01pbnV0ZSA8IDApIHtcbiAgICAgIG5ld01pbnV0ZSA9IDYwIC0gdGhpcy5taW51dGVTdGVwO1xuICAgIH1cbiAgICB0aGlzLnNldFN0YXJ0SG91ck1pbnV0ZSh0aGlzLnN0YXJ0SG91ciwgbmV3TWludXRlKTtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBpbmNyZW1lbnRFbmRIb3VyKCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0hvdXIgPSAodGhpcy5lbmRIb3VyICsgMSkgJSAyNDtcbiAgICB0aGlzLnNldEVuZEhvdXJNaW51dGUobmV3SG91ciwgdGhpcy5lbmRNaW51dGUpO1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlbWVudEVuZEhvdXIoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3SG91ciA9IHRoaXMuZW5kSG91ciA9PT0gMCA/IDIzIDogdGhpcy5lbmRIb3VyIC0gMTtcbiAgICB0aGlzLnNldEVuZEhvdXJNaW51dGUobmV3SG91ciwgdGhpcy5lbmRNaW51dGUpO1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGluY3JlbWVudEVuZE1pbnV0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdNaW51dGUgPSAodGhpcy5lbmRNaW51dGUgKyB0aGlzLm1pbnV0ZVN0ZXApICUgNjA7XG4gICAgdGhpcy5zZXRFbmRIb3VyTWludXRlKHRoaXMuZW5kSG91ciwgbmV3TWludXRlKTtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBkZWNyZW1lbnRFbmRNaW51dGUoKTogdm9pZCB7XG4gICAgbGV0IG5ld01pbnV0ZSA9IHRoaXMuZW5kTWludXRlIC0gdGhpcy5taW51dGVTdGVwO1xuICAgIGlmIChuZXdNaW51dGUgPCAwKSB7XG4gICAgICBuZXdNaW51dGUgPSA2MCAtIHRoaXMubWludXRlU3RlcDtcbiAgICB9XG4gICAgdGhpcy5zZXRFbmRIb3VyTWludXRlKHRoaXMuZW5kSG91ciwgbmV3TWludXRlKTtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGggPSBob3VyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtID0gbWludXRlLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBcbiAgICBpZiAodGhpcy50aW1lRm9ybWF0ID09PSAnMTJoJykge1xuICAgICAgY29uc3QgaXNQTSA9IGhvdXIgPj0gMTI7XG4gICAgICBjb25zdCBob3VyMTIgPSBob3VyID09PSAwID8gMTIgOiBob3VyID4gMTIgPyBob3VyIC0gMTIgOiBob3VyO1xuICAgICAgY29uc3QgcGVyaW9kID0gaXNQTSA/ICdQTScgOiAnQU0nO1xuICAgICAgcmV0dXJuIGAke2hvdXIxMi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bX0gJHtwZXJpb2R9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke2h9OiR7bX1gO1xuICB9XG5cbiAgcGFyc2VUaW1lKHRpbWVTdHJpbmc6IHN0cmluZyk6IHsgaG91cjogbnVtYmVyOyBtaW51dGU6IG51bWJlciB9IHtcbiAgICBpZiAoIXRpbWVTdHJpbmcpIHJldHVybiB7IGhvdXI6IDAsIG1pbnV0ZTogMCB9O1xuICAgIFxuICAgIGNvbnN0IHRpbWUxMmhSZWdleCA9IC9eKFxcZHsxLDJ9KTooXFxkezJ9KVxccz8oQU18UE0pJC9pO1xuICAgIGNvbnN0IHRpbWUyNGhSZWdleCA9IC9eKFxcZHsxLDJ9KTooXFxkezJ9KSQvO1xuICAgIFxuICAgIGxldCBtYXRjaCA9IHRpbWVTdHJpbmcubWF0Y2godGltZTEyaFJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gICAgICBjb25zdCBwZXJpb2QgPSBtYXRjaFszXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgXG4gICAgICBpZiAocGVyaW9kID09PSAnUE0nICYmIGhvdXIgIT09IDEyKSBob3VyICs9IDEyO1xuICAgICAgaWYgKHBlcmlvZCA9PT0gJ0FNJyAmJiBob3VyID09PSAxMikgaG91ciA9IDA7XG4gICAgICBcbiAgICAgIHJldHVybiB7IGhvdXIsIG1pbnV0ZSB9O1xuICAgIH1cbiAgICBcbiAgICBtYXRjaCA9IHRpbWVTdHJpbmcubWF0Y2godGltZTI0aFJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhvdXI6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgICAgIG1pbnV0ZTogcGFyc2VJbnQobWF0Y2hbMl0sIDEwKVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHsgaG91cjogMCwgbWludXRlOiAwIH07XG4gIH1cblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICAvLyBVc2Ugc2V0dGVycyB3aGljaCBkZWxlZ2F0ZSB0byBzdG9yZVxuICAgICAgdGhpcy5zdGFydERhdGUgPSB2YWx1ZS5zdGFydERhdGUgfHwgJyc7XG4gICAgICB0aGlzLmVuZERhdGUgPSB2YWx1ZS5lbmREYXRlIHx8ICcnO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5lbmFibGVUaW1lUGlja2VyKSB7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFydFRpbWUpIHtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnRUaW1lKHZhbHVlLnN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLmVuZFRpbWUpIHtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kVGltZSh2YWx1ZS5lbmRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yYW5nZVN0b3JlLnJlc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBEYXRlUmFuZ2UgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0Rpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItd3JhcHBlclwiIFxuICBbY2xhc3NdPVwiJ3RoZW1lLScgKyB0aGVtZVwiXG4gIFtzdHlsZS4tLWlucHV0LWJvcmRlci1ob3Zlcl09XCJpbnB1dEJvcmRlckNvbG9ySG92ZXJcIlxuICBbc3R5bGUuLS1pbnB1dC1ib3JkZXItZm9jdXNdPVwiaW5wdXRCb3JkZXJDb2xvckZvY3VzXCI+XG4gIDxpbnB1dCBcbiAgICB0eXBlPVwidGV4dFwiIFxuICAgIGNsYXNzPVwiZGF0ZXBpY2tlci1pbnB1dFwiIFxuICAgIFt2YWx1ZV09XCJkYXRlUmFuZ2VUZXh0KClcIiBcbiAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVBpY2tlcigpXCIgXG4gICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3dEYXRlUGlja2VyKClcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2RpYWxvZydcIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBpbnB1dEJhY2tncm91bmRDb2xvcixcbiAgICAgICdjb2xvcic6IGlucHV0VGV4dENvbG9yLFxuICAgICAgJ2JvcmRlci1jb2xvcic6IGlucHV0Qm9yZGVyQ29sb3IsXG4gICAgICAncGFkZGluZyc6IGlucHV0UGFkZGluZ1xuICAgIH1cIlxuICAgIHJlYWRvbmx5PlxuXG4gIEBpZiAoc2hvd0RhdGVQaWNrZXIoKSkge1xuICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItZHJvcGRvd25cIj5cbiAgICBAaWYgKHNob3dQcmVzZXRzKSB7XG4gICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXByZXNldHNcIj5cbiAgICAgIEBmb3IgKHByZXNldCBvZiBwcmVzZXRzOyB0cmFjayBwcmVzZXQubGFiZWwpIHtcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZWxlY3RQcmVzZXRSYW5nZShwcmVzZXQpXCI+e3sgcHJlc2V0LmxhYmVsIH19PC9idXR0b24+XG4gICAgICB9XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZS1jYWxlbmRhclwiIChjbGljayk9XCJjbG9zZURhdGVQaWNrZXIoKVwiIHRpdGxlPVwiQ2xvc2VcIj5cbiAgICAgICAgw5dcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoIXNob3dQcmVzZXRzKSB7XG4gICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWhlYWRlci1vbmx5LWNsb3NlXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZS1jYWxlbmRhclwiIChjbGljayk9XCJjbG9zZURhdGVQaWNrZXIoKVwiIHRpdGxlPVwiQ2xvc2VcIj5cbiAgICAgICAgw5dcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gQ2FsZW5kYXJzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jYWxlbmRhcnNcIj5cbiAgICAgIDwhLS0gUHJldmlvdXMgbW9udGggY2FsZW5kYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWhlYWRlclwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjaGFuZ2VNb250aCgtMSlcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTEuMzU0IDEuNjQ2YS41LjUgMCAwIDEgMCAuNzA4TDUuNzA3IDhsNS42NDcgNS42NDZhLjUuNSAwIDAgMS0uNzA4LjcwOGwtNi02YS41LjUgMCAwIDEgMC0uNzA4bDYtNmEuNS41IDAgMCAxIC43MDggMHpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8c3Bhbj57eyBwcmV2aW91c01vbnRoTmFtZSgpIH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk00LjY0NiAxLjY0NmEuNS41IDAgMCAxIC43MDggMGw2IDZhLjUuNSAwIDAgMSAwIC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDgtLjcwOEwxMC4yOTMgOCA0LjY0NiAyLjM1NGEuNS41IDAgMCAxIDAtLjcwOHpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci13ZWVrZGF5c1wiPlxuICAgICAgICAgIEBmb3IgKGRheU5hbWUgb2Ygd2Vla0RheU5hbWVzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHNwYW4+e3sgZGF5TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItZGF5c1wiPlxuICAgICAgICAgIEBmb3IgKGRheU9iaiBvZiBwcmV2aW91c01vbnRoRGF5cygpOyB0cmFjayBkYXlPYmouZGF0ZSB8fCAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWRheVwiIFxuICAgICAgICAgICAgICBbY2xhc3MuZW1wdHldPVwiIWRheU9iai5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXlPYmouaXNTdGFydCB8fCBkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiZGF5T2JqLmluUmFuZ2UgJiYgIWRheU9iai5pc1N0YXJ0ICYmICFkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4taG92ZXItcmFuZ2VdPVwiZGF5T2JqLmluSG92ZXJSYW5nZSAmJiAhZGF5T2JqLmlzU3RhcnQgJiYgIWRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXlPYmouaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5rZXlib2FyZC1mb2N1c2VkXT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBoYXNLZXlib2FyZEZvY3VzKGRheU9iai5kYXRlLCAwKVwiXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBkYXlPYmouaXNDdXJyZW50TW9udGggJiYgaGFzS2V5Ym9hcmRGb2N1cyhkYXlPYmouZGF0ZSwgMCkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERhdGVEaXNwbGF5KGRheU9iai5kYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZGF5T2JqLmlzU3RhcnQgfHwgZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheU9iai5pc1N0YXJ0ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5T2JqLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJjbGVhckRheUhvdmVyKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRheU9iai5pc0N1cnJlbnRNb250aCB8fCBkYXlPYmouaXNEaXNhYmxlZFwiPlxuICAgICAgICAgICAgICB7eyBkYXlPYmouZGF5IH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ3VycmVudCBtb250aCBjYWxlbmRhciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jYWxlbmRhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTExLjM1NCAxLjY0NmEuNS41IDAgMCAxIDAgLjcwOEw1LjcwNyA4bDUuNjQ3IDUuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhsLTYtNmEuNS41IDAgMCAxIDAtLjcwOGw2LTZhLjUuNSAwIDAgMSAuNzA4IDB6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4+e3sgY3VycmVudE1vbnRoTmFtZSgpIH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjaGFuZ2VNb250aCgxKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk00LjY0NiAxLjY0NmEuNS41IDAgMCAxIC43MDggMGw2IDZhLjUuNSAwIDAgMSAwIC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDgtLjcwOEwxMC4yOTMgOCA0LjY0NiAyLjM1NGEuNS41IDAgMCAxIDAtLjcwOHpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci13ZWVrZGF5c1wiPlxuICAgICAgICAgIEBmb3IgKGRheU5hbWUgb2Ygd2Vla0RheU5hbWVzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHNwYW4+e3sgZGF5TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItZGF5c1wiPlxuICAgICAgICAgIEBmb3IgKGRheU9iaiBvZiBjdXJyZW50TW9udGhEYXlzKCk7IHRyYWNrIGRheU9iai5kYXRlIHx8ICRpbmRleCkge1xuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZS1waWNrZXItZGF5XCIgXG4gICAgICAgICAgICAgIFtjbGFzcy5lbXB0eV09XCIhZGF5T2JqLmlzQ3VycmVudE1vbnRoXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRheU9iai5pc1N0YXJ0IHx8IGRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pbi1yYW5nZV09XCJkYXlPYmouaW5SYW5nZSAmJiAhZGF5T2JqLmlzU3RhcnQgJiYgIWRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pbi1ob3Zlci1yYW5nZV09XCJkYXlPYmouaW5Ib3ZlclJhbmdlICYmICFkYXlPYmouaXNTdGFydCAmJiAhZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRheU9iai5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmtleWJvYXJkLWZvY3VzZWRdPVwiZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uICYmIGhhc0tleWJvYXJkRm9jdXMoZGF5T2JqLmRhdGUsIDEpXCJcbiAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uICYmIGRheU9iai5pc0N1cnJlbnRNb250aCAmJiBoYXNLZXlib2FyZEZvY3VzKGRheU9iai5kYXRlLCAxKSA/IDAgOiAtMVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZm9ybWF0RGF0ZURpc3BsYXkoZGF5T2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJkYXlPYmouaXNTdGFydCB8fCBkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiZGF5T2JqLmlzU3RhcnQgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkYXlPYmouaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXkoZGF5T2JqKVwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRGF5SG92ZXIoZGF5T2JqKVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImNsZWFyRGF5SG92ZXIoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZGF5T2JqLmlzQ3VycmVudE1vbnRoIHx8IGRheU9iai5pc0Rpc2FibGVkXCI+XG4gICAgICAgICAgICAgIHt7IGRheU9iai5kYXkgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTXVsdGktUmFuZ2UgTGlzdCAtLT5cbiAgICBAaWYgKG11bHRpUmFuZ2UgJiYgc2VsZWN0ZWRSYW5nZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgPGRpdiBjbGFzcz1cIm11bHRpLXJhbmdlLWxpc3RcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1yYW5nZS1oZWFkZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtdWx0aS1yYW5nZS10aXRsZVwiPlNlbGVjdGVkIFJhbmdlcyAoe3sgc2VsZWN0ZWRSYW5nZXMoKS5sZW5ndGggfX0pPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaXRlbXNcIj5cbiAgICAgICAgQGZvciAocmFuZ2Ugb2Ygc2VsZWN0ZWRSYW5nZXMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1yYW5nZS1pdGVtXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdWx0aS1yYW5nZS10ZXh0XCI+e3sgcmFuZ2UucmFuZ2VUZXh0IH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1yZW1vdmUtcmFuZ2VcIiBcbiAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVSYW5nZSgkaW5kZXgpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiUmVtb3ZlIHRoaXMgcmFuZ2VcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0yLjE0NiAyLjg1NGEuNS41IDAgMSAxIC43MDgtLjcwOEw4IDcuMjkzbDUuMTQ2LTUuMTQ3YS41LjUgMCAwIDEgLjcwOC43MDhMOC43MDcgOGw1LjE0NyA1LjE0NmEuNS41IDAgMCAxLS43MDguNzA4TDggOC43MDdsLTUuMTQ2IDUuMTQ3YS41LjUgMCAwIDEtLjcwOC0uNzA4TDcuMjkzIDggMi4xNDYgMi44NTRaXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIFRpbWUgUGlja2VyIC0tPlxuICAgIEBpZiAoZW5hYmxlVGltZVBpY2tlcikge1xuICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1jb250YWluZXJcIj5cbiAgICAgIDwhLS0gU3RhcnQgVGltZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1sYWJlbFwiPlN0YXJ0IFRpbWU8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtcGlja2VyLWlucHV0c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tdXBcIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudFN0YXJ0SG91cigpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJJbmNyZW1lbnQgaG91clwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyA0Ljg2bC00Ljc5NiA1LjQ4MWMtLjU2Ni42NDctLjEwNiAxLjY1OS43NTMgMS42NTloOS41OTJhMSAxIDAgMCAwIC43NTMtMS42NTlsLTQuNzk2LTUuNDhhMSAxIDAgMCAwLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInN0YXJ0SG91ci50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICB0aXRsZT1cIlN0YXJ0IGhvdXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi1kb3duXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRTdGFydEhvdXIoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRGVjcmVtZW50IGhvdXJcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiPjo8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi11cFwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50U3RhcnRNaW51dGUoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiSW5jcmVtZW50IG1pbnV0ZVwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyA0Ljg2bC00Ljc5NiA1LjQ4MWMtLjU2Ni42NDctLjEwNiAxLjY1OS43NTMgMS42NTloOS41OTJhMSAxIDAgMCAwIC43NTMtMS42NTlsLTQuNzk2LTUuNDhhMSAxIDAgMCAwLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInN0YXJ0TWludXRlLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgIHRpdGxlPVwiU3RhcnQgbWludXRlXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tZG93blwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U3RhcnRNaW51dGUoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRGVjcmVtZW50IG1pbnV0ZVwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyAxMS4xNGwtNC43OTYtNS40ODFDMS44ODUgNS4wMTMgMi4zNDUgNCAzLjIwNCA0aDkuNTkyYTEgMSAwIDAgMSAuNzUzIDEuNjU5bC00Ljc5NiA1LjQ4YTEgMSAwIDAgMS0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKHRpbWVGb3JtYXQgPT09ICcxMmgnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtcGVyaW9kXCI+XG4gICAgICAgICAgICB7eyBzdGFydEhvdXIgPj0gMTIgPyAnUE0nIDogJ0FNJyB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZXBhcmF0b3IgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1zZXBhcmF0b3ItdmVydGljYWxcIj48L2Rpdj5cblxuICAgICAgPCEtLSBFbmQgVGltZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1sYWJlbFwiPkVuZCBUaW1lPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1pbnB1dHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLXVwXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRFbmRIb3VyKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkluY3JlbWVudCBob3VyXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuMjQ3IDQuODZsLTQuNzk2IDUuNDgxYy0uNTY2LjY0Ny0uMTA2IDEuNjU5Ljc1MyAxLjY1OWg5LjU5MmExIDEgMCAwIDAgLjc1My0xLjY1OWwtNC43OTYtNS40OGExIDEgMCAwIDAtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtaW5wdXRcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZW5kSG91ci50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICB0aXRsZT1cIkVuZCBob3VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tZG93blwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50RW5kSG91cigpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJEZWNyZW1lbnQgaG91clwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyAxMS4xNGwtNC43OTYtNS40ODFDMS44ODUgNS4wMTMgMi4zNDUgNCAzLjIwNCA0aDkuNTkyYTEgMSAwIDAgMSAuNzUzIDEuNjU5bC00Ljc5NiA1LjQ4YTEgMSAwIDAgMS0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCI+Ojwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLXVwXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRFbmRNaW51dGUoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiSW5jcmVtZW50IG1pbnV0ZVwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyA0Ljg2bC00Ljc5NiA1LjQ4MWMtLjU2Ni42NDctLjEwNiAxLjY1OS43NTMgMS42NTloOS41OTJhMSAxIDAgMCAwIC43NTMtMS42NTlsLTQuNzk2LTUuNDhhMSAxIDAgMCAwLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImVuZE1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICB0aXRsZT1cIkVuZCBtaW51dGVcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi1kb3duXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRFbmRNaW51dGUoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRGVjcmVtZW50IG1pbnV0ZVwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyAxMS4xNGwtNC43OTYtNS40ODFDMS44ODUgNS4wMTMgMi4zNDUgNCAzLjIwNCA0aDkuNTkyYTEgMSAwIDAgMSAuNzUzIDEuNjU5bC00Ljc5NiA1LjQ4YTEgMSAwIDAgMS0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKHRpbWVGb3JtYXQgPT09ICcxMmgnKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtcGVyaW9kXCI+XG4gICAgICAgICAgICB7eyBlbmRIb3VyID49IDEyID8gJ1BNJyA6ICdBTScgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBGb290ZXIgd2l0aCBidXR0b25zIC0tPlxuICAgIEBpZiAoc2hvd0NsZWFyQnV0dG9uIHx8IG11bHRpUmFuZ2UgfHwgcmVxdWlyZUFwcGx5KSB7XG4gICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWZvb3RlclwiPlxuICAgICAgQGlmIChyZXF1aXJlQXBwbHkgJiYgIW11bHRpUmFuZ2UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFwcGx5LWZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNhbmNlbFwiIFxuICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbFNlbGVjdGlvbigpXCIgXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1BlbmRpbmdDaGFuZ2VzKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJDYW5jZWwgc2VsZWN0aW9uXCI+XG4gICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgY2xhc3M9XCJidG4tYXBwbHlcIiBcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVNlbGVjdGlvbigpXCIgXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1BlbmRpbmdDaGFuZ2VzKCkgfHwgIXBlbmRpbmdTdGFydERhdGUgfHwgIXBlbmRpbmdFbmREYXRlXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQXBwbHkgc2VsZWN0aW9uXCI+XG4gICAgICAgICAgICBBcHBseVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAobXVsdGlSYW5nZSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtZm9vdGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbGVhclwiIChjbGljayk9XCJjbGVhcigpXCIgdGl0bGU9XCJDbGVhciBhbGwgcmFuZ2VzXCI+XG4gICAgICAgICAgICBDbGVhciBBbGxcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1kb25lXCIgKGNsaWNrKT1cImNsb3NlRGF0ZVBpY2tlcigpXCIgdGl0bGU9XCJEb25lIHNlbGVjdGluZ1wiPlxuICAgICAgICAgICAgRG9uZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoIW11bHRpUmFuZ2UgJiYgIXJlcXVpcmVBcHBseSAmJiBzaG93Q2xlYXJCdXR0b24pIHtcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xlYXJcIiAoY2xpY2spPVwiY2xlYXIoKVwiIHRpdGxlPVwiQ2xlYXIgc2VsZWN0aW9uXCI+XG4gICAgICAgICAgQ2xlYXJcbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
|
|
1312
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vc3JjL2R1YWwtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxZQUFZLEVBQWMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbE0sT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQThCLHFCQUFxQixFQUFxQyxlQUFlLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBK0QzTSxNQUFNLE9BQU8sdUJBQXVCO0lBc09kO0lBck9YLFdBQVcsR0FBVyxtQkFBbUIsQ0FBQztJQUNuRCxJQUFhLFNBQVMsQ0FBQyxLQUFhO1FBQ2xDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxD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QixNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQTBLUCxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVzFDLHdCQUF3QjtzQkFEdkIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgc2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIEFQUF9JTklUSUFMSVpFUiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRlQWRhcHRlciwgREFURV9BREFQVEVSIH0gZnJvbSAnLi9kYXRlLWFkYXB0ZXInO1xuaW1wb3J0IHsgTmF0aXZlRGF0ZUFkYXB0ZXIgfSBmcm9tICcuL25hdGl2ZS1kYXRlLWFkYXB0ZXInO1xuaW1wb3J0IHsgRHVhbERhdGVSYW5nZVN0b3JlIH0gZnJvbSAnLi9jb3JlL2R1YWwtZGF0ZS1yYW5nZS5zdG9yZSc7XG5pbXBvcnQgeyBQcmVzZXRSZWdpc3RyeSB9IGZyb20gJy4vY29yZS9wcmVzZXQtcmVnaXN0cnknO1xuaW1wb3J0IHsgQlVJTFRfSU5fUFJFU0VUUyB9IGZyb20gJy4vY29yZS9idWlsdC1pbi1wcmVzZXRzJztcbmltcG9ydCB7IENhbGVuZGFyR3JpZENhY2hlLCBDYWxlbmRhckdyaWQsIENhbGVuZGFyQ2VsbCwgUmFuZ2VIaWdobGlnaHRlckNhY2hlLCBEZWNvcmF0ZWRDZWxsLCBWaXJ0dWFsV2Vla3NDb25maWcsIGdldFZpc2libGVXZWVrcywgbmF2aWdhdGVXZWVrV2luZG93LCBpc1ZpcnR1YWxXZWVrc0VuYWJsZWQgfSBmcm9tICcuL2NvcmUvY2FsZW5kYXItZ3JpZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlIHtcbiAgc3RhcnREYXRlOiBzdHJpbmc7XG4gIGVuZERhdGU6IHN0cmluZztcbiAgcmFuZ2VUZXh0OiBzdHJpbmc7XG4gIHN0YXJ0VGltZT86IHN0cmluZzsgLy8gSEg6bW0gZm9ybWF0IChvcHRpb25hbClcbiAgZW5kVGltZT86IHN0cmluZzsgLy8gSEg6bW0gZm9ybWF0IChvcHRpb25hbClcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aURhdGVSYW5nZSB7XG4gIHJhbmdlczogRGF0ZVJhbmdlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlc2V0UmFuZ2Uge1xuICBzdGFydDogc3RyaW5nO1xuICBlbmQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRDb25maWcge1xuICBsYWJlbDogc3RyaW5nO1xuICBnZXRWYWx1ZTogKCkgPT4gUHJlc2V0UmFuZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxlQ29uZmlnIHtcbiAgbW9udGhOYW1lcz86IHN0cmluZ1tdO1xuICBtb250aE5hbWVzU2hvcnQ/OiBzdHJpbmdbXTtcbiAgZGF5TmFtZXM/OiBzdHJpbmdbXTtcbiAgZGF5TmFtZXNTaG9ydD86IHN0cmluZ1tdO1xuICBmaXJzdERheU9mV2Vlaz86IG51bWJlcjsgLy8gMCA9IFN1bmRheSwgMSA9IE1vbmRheSwgZXRjLlxufVxuXG5leHBvcnQgdHlwZSBUaGVtZVR5cGUgPSAnZGVmYXVsdCcgfCAnYm9vdHN0cmFwJyB8ICdidWxtYScgfCAnZm91bmRhdGlvbicgfCAndGFpbHdpbmQnIHwgJ2N1c3RvbSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kdWFsLWRhdGVwaWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kdWFsLWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHVhbC1kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEdWFsRGF0ZXBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogREFURV9BREFQVEVSLFxuICAgICAgdXNlQ2xhc3M6IE5hdGl2ZURhdGVBZGFwdGVyXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUZhY3Rvcnk6IChyZWdpc3RyeTogUHJlc2V0UmVnaXN0cnkpID0+IHtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAvLyBBdXRvLXJlZ2lzdGVyIGJ1aWx0LWluIHByZXNldHNcbiAgICAgICAgICBCVUlMVF9JTl9QUkVTRVRTLmZvckVhY2gocHJlc2V0ID0+IHJlZ2lzdHJ5LnJlZ2lzdGVyKHByZXNldCkpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGRlcHM6IFtQcmVzZXRSZWdpc3RyeV1cbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRHVhbERhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBkYXRlIHJhbmdlJztcbiAgQElucHV0KCkgc2V0IHN0YXJ0RGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZSh2YWx1ZSk7XG4gICAgICBpZiAoZGF0ZSkgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0KGRhdGUpO1xuICAgIH1cbiAgfVxuICBnZXQgc3RhcnREYXRlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydERhdGUoKTtcbiAgICByZXR1cm4gZGF0ZSA/IHRoaXMuZm9ybWF0RGF0ZShkYXRlKSA6ICcnO1xuICB9XG4gIFxuICBASW5wdXQoKSBzZXQgZW5kRGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5kYXRlQWRhcHRlci5wYXJzZSh2YWx1ZSk7XG4gICAgICBpZiAoZGF0ZSkgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChkYXRlKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGVuZERhdGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5yYW5nZVN0b3JlLmVuZERhdGUoKTtcbiAgICByZXR1cm4gZGF0ZSA/IHRoaXMuZm9ybWF0RGF0ZShkYXRlKSA6ICcnO1xuICB9XG4gIEBJbnB1dCgpIHNob3dQcmVzZXRzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0NsZWFyQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG11bHRpUmFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2xvc2VPblNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNsb3NlT25QcmVzZXRTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBjbG9zZU9uQ2xpY2tPdXRzaWRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgcHJlc2V0czogUHJlc2V0Q29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgdGhlbWU6IFRoZW1lVHlwZSA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgaW5wdXRCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9ICcjZmZmJztcbiAgQElucHV0KCkgaW5wdXRUZXh0Q29sb3I6IHN0cmluZyA9ICcjNDk1MDU3JztcbiAgQElucHV0KCkgaW5wdXRCb3JkZXJDb2xvcjogc3RyaW5nID0gJyNjZWQ0ZGEnO1xuICBASW5wdXQoKSBpbnB1dEJvcmRlckNvbG9ySG92ZXI6IHN0cmluZyA9ICcjY2VkNGRhJztcbiAgQElucHV0KCkgaW5wdXRCb3JkZXJDb2xvckZvY3VzOiBzdHJpbmcgPSAnIzgwYmRmZic7XG4gIEBJbnB1dCgpIGlucHV0UGFkZGluZzogc3RyaW5nID0gJzAuMzc1cmVtIDAuNzVyZW0nO1xuICBASW5wdXQoKSBsb2NhbGU6IExvY2FsZUNvbmZpZyA9IHt9O1xuICBASW5wdXQoKSBkaXNhYmxlZERhdGVzOiBEYXRlW10gfCAoKGRhdGU6IERhdGUpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBkaXNwbGF5Rm9ybWF0OiBzdHJpbmcgPSAnRCBNTU0nOyAvLyBGb3JtYXQgZm9yIGRpc3BsYXlpbmcgZGF0ZXMgaW4gaW5wdXRcbiAgQElucHV0KCkgcmVxdWlyZUFwcGx5OiBib29sZWFuID0gZmFsc2U7IC8vIFJlcXVpcmUgQXBwbHkgYnV0dG9uIGNvbmZpcm1hdGlvblxuICBASW5wdXQoKSBlbmFibGVUaW1lUGlja2VyOiBib29sZWFuID0gZmFsc2U7IC8vIEVuYWJsZSB0aW1lIHNlbGVjdGlvblxuICBASW5wdXQoKSB0aW1lRm9ybWF0OiAnMTJoJyB8ICcyNGgnID0gJzI0aCc7IC8vIFRpbWUgZm9ybWF0XG4gIEBJbnB1dCgpIG1pbnV0ZVN0ZXA6IG51bWJlciA9IDE1OyAvLyBTdGVwIGZvciBtaW51dGUgc2VsZWN0b3IgKDEsIDUsIDE1LCAzMClcbiAgQElucHV0KCkgZGVmYXVsdFN0YXJ0VGltZTogc3RyaW5nID0gJzAwOjAwJzsgLy8gRGVmYXVsdCBzdGFydCB0aW1lIEhIOm1tXG4gIEBJbnB1dCgpIGRlZmF1bHRFbmRUaW1lOiBzdHJpbmcgPSAnMjM6NTknOyAvLyBEZWZhdWx0IGVuZCB0aW1lIEhIOm1tXG4gIFxuICAvKipcbiAgICogVmlydHVhbCBXZWVrcyBDb25maWd1cmF0aW9uICh2My45LjArKVxuICAgKiBcbiAgICogRW5hYmxlcyB3aW5kb3dlZCByZW5kZXJpbmcgdG8gcmVkdWNlIERPTSBjb21wbGV4aXR5IGFuZCBpbXByb3ZlIG1vYmlsZSBwZXJmb3JtYW5jZS5cbiAgICogT25seSByZW5kZXJzIGEgc3Vic2V0IG9mIGNhbGVuZGFyIHdlZWtzIGluc3RlYWQgb2YgYWxsIDYuXG4gICAqIFxuICAgKiBFeGFtcGxlOiBgeyB3aW5kb3dTaXplOiAzIH1gIHJlbmRlcnMgb25seSAzIHdlZWtzICgyMSBjZWxscykgaW5zdGVhZCBvZiA2IHdlZWtzICg0MiBjZWxscyksXG4gICAqIHJlZHVjaW5nIERPTSBub2RlcyBieSB+NTAlIHBlciBjYWxlbmRhci5cbiAgICogXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAoZGlzYWJsZWQgLSByZW5kZXJzIGFsbCA2IHdlZWtzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgKiBcbiAgICogRXhhbXBsZTpcbiAgICogYGBgaHRtbFxuICAgKiA8bmd4LWR1YWwtZGF0ZXBpY2tlclxuICAgKiAgIFt2aXJ0dWFsV2Vla3NdPVwieyB3aW5kb3dTaXplOiAzIH1cIj5cbiAgICogPC9uZ3gtZHVhbC1kYXRlcGlja2VyPlxuICAgKiBgYGBcbiAgICovXG4gIEBJbnB1dCgpIHZpcnR1YWxXZWVrcz86IFZpcnR1YWxXZWVrc0NvbmZpZztcblxuICBAT3V0cHV0KCkgZGF0ZVJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U+KCk7XG4gIEBPdXRwdXQoKSBkYXRlUmFuZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpO1xuICBAT3V0cHV0KCkgbXVsdGlEYXRlUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE11bHRpRGF0ZVJhbmdlPigpO1xuICBAT3V0cHV0KCkgbXVsdGlEYXRlUmFuZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TXVsdGlEYXRlUmFuZ2U+KCk7XG5cbiAgLy8gRGF0ZSBhZGFwdGVyIGluamVjdGlvblxuICBwcml2YXRlIGRhdGVBZGFwdGVyID0gaW5qZWN0PERhdGVBZGFwdGVyPihEQVRFX0FEQVBURVIpO1xuICBcbiAgLy8gQ2FsZW5kYXIgZ3JpZCBjYWNoZSAodjMuNy4wKykgLSBtZW1vaXplcyBtb250aCBncmlkIGdlbmVyYXRpb25cbiAgcHJpdmF0ZSBncmlkQ2FjaGUgPSBpbmplY3QoQ2FsZW5kYXJHcmlkQ2FjaGUpO1xuICBcbiAgLy8gUmFuZ2UgaGlnaGxpZ2h0ZXIgY2FjaGUgKHYzLjguMCspIC0gbWVtb2l6ZXMgZGVjb3JhdGlvbnNcbiAgcHJpdmF0ZSBoaWdobGlnaHRlckNhY2hlID0gaW5qZWN0KFJhbmdlSGlnaGxpZ2h0ZXJDYWNoZSk7XG4gIFxuICAvLyBIZWFkbGVzcyBzdG9yZSBmb3IgZGF0ZSByYW5nZSBzdGF0ZSAodjMuNS4wKylcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbmdlU3RvcmUgPSBpbmplY3QoRHVhbERhdGVSYW5nZVN0b3JlKTtcblxuICAvLyBVSS1vbmx5IHNpZ25hbHNcbiAgc2hvd0RhdGVQaWNrZXIgPSBzaWduYWwoZmFsc2UpO1xuICBjdXJyZW50TW9udGggPSBzaWduYWwodGhpcy5kYXRlQWRhcHRlci50b2RheSgpKTtcbiAgcHJldmlvdXNNb250aCA9IHNpZ25hbCh0aGlzLmRhdGVBZGFwdGVyLnRvZGF5KCkpO1xuICBjdXJyZW50TW9udGhEYXlzID0gc2lnbmFsPGFueVtdPihbXSk7XG4gIHByZXZpb3VzTW9udGhEYXlzID0gc2lnbmFsPGFueVtdPihbXSk7XG4gIGlzRGlzYWJsZWQgPSBzaWduYWwoZmFsc2UpO1xuICBzaG93U3RhcnRUaW1lUGlja2VyID0gc2lnbmFsKGZhbHNlKTtcbiAgc2hvd0VuZFRpbWVQaWNrZXIgPSBzaWduYWwoZmFsc2UpO1xuICBob3ZlckRhdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIFxuICAvKipcbiAgICogVmlydHVhbCBXZWVrcyBTdGF0ZSAodjMuOS4wKylcbiAgICogXG4gICAqIFNpZ25hbHMgdG8gdHJhY2sgd2hpY2ggd2VlayB3aW5kb3cgaXMgY3VycmVudGx5IHZpc2libGUgZm9yIGVhY2ggY2FsZW5kYXIuXG4gICAqIC0gd2Vla1N0YXJ0ID0gMDogU2hvd3MgZmlyc3QgTiB3ZWVrcyAod2luZG93U2l6ZSlcbiAgICogLSB3ZWVrU3RhcnQgPSAxOiBTaG93cyB3ZWVrcyAxIHRvIE4rMSwgZXRjLlxuICAgKiBcbiAgICogUmVzZXQgdG8gMCB3aGVuIG1vbnRoIGNoYW5nZXMgZm9yIGNvbnNpc3RlbnQgVVguXG4gICAqL1xuICBwcmV2aW91c01vbnRoV2Vla1N0YXJ0ID0gc2lnbmFsKDApO1xuICBjdXJyZW50TW9udGhXZWVrU3RhcnQgPSBzaWduYWwoMCk7XG4gIFxuICAvKipcbiAgICogQ29tcHV0ZWQ6IFZpc2libGUgd2Vla3MgZm9yIHdpbmRvd2VkIHJlbmRlcmluZyAodjMuOS4wKylcbiAgICogXG4gICAqIElmIHZpcnR1YWxXZWVrcyBpcyBlbmFibGVkLCByZXR1cm5zIG9ubHkgdGhlIHZpc2libGUgc3Vic2V0IG9mIHdlZWtzLlxuICAgKiBPdGhlcndpc2UsIHJldHVybnMgYWxsIHdlZWtzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKiBcbiAgICogRXhhbXBsZTogSWYgd2luZG93U2l6ZT0zIGFuZCB3ZWVrU3RhcnQ9MCwgcmV0dXJucyBmaXJzdCAzIHdlZWtzIChyb3dzIDAtMikuXG4gICAqL1xuICBwcmV2aW91c01vbnRoVmlzaWJsZURheXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYWxsRGF5cyA9IHRoaXMucHJldmlvdXNNb250aERheXMoKTtcbiAgICBpZiAoIXRoaXMudmlydHVhbFdlZWtzIHx8ICFpc1ZpcnR1YWxXZWVrc0VuYWJsZWQodGhpcy52aXJ0dWFsV2Vla3Mud2luZG93U2l6ZSwgNikpIHtcbiAgICAgIHJldHVybiBhbGxEYXlzO1xuICAgIH1cbiAgICBcbiAgICAvLyBDYWxlbmRhciBoYXMgNiB3ZWVrcyAoNDIgY2VsbHMgPSA3IGRheXMgw5cgNiB3ZWVrcylcbiAgICBjb25zdCBhbGxXZWVrczogYW55W11bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICBhbGxXZWVrcy5wdXNoKGFsbERheXMuc2xpY2UoaSAqIDcsIChpICsgMSkgKiA3KSk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHZpc2libGVXZWVrcyA9IGdldFZpc2libGVXZWVrcyhcbiAgICAgIGFsbFdlZWtzLFxuICAgICAgdGhpcy5wcmV2aW91c01vbnRoV2Vla1N0YXJ0KCksXG4gICAgICB0aGlzLnZpcnR1YWxXZWVrcy53aW5kb3dTaXplXG4gICAgKTtcbiAgICBcbiAgICByZXR1cm4gdmlzaWJsZVdlZWtzLmZsYXQoKTtcbiAgfSk7XG4gIFxuICBjdXJyZW50TW9udGhWaXNpYmxlRGF5cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBhbGxEYXlzID0gdGhpcy5jdXJyZW50TW9udGhEYXlzKCk7XG4gICAgaWYgKCF0aGlzLnZpcnR1YWxXZWVrcyB8fCAhaXNWaXJ0dWFsV2Vla3NFbmFibGVkKHRoaXMudmlydHVhbFdlZWtzLndpbmRvd1NpemUsIDYpKSB7XG4gICAgICByZXR1cm4gYWxsRGF5cztcbiAgICB9XG4gICAgXG4gICAgLy8gQ2FsZW5kYXIgaGFzIDYgd2Vla3MgKDQyIGNlbGxzID0gNyBkYXlzIMOXIDYgd2Vla3MpXG4gICAgY29uc3QgYWxsV2Vla3M6IGFueVtdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgYWxsV2Vla3MucHVzaChhbGxEYXlzLnNsaWNlKGkgKiA3LCAoaSArIDEpICogNykpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB2aXNpYmxlV2Vla3MgPSBnZXRWaXNpYmxlV2Vla3MoXG4gICAgICBhbGxXZWVrcyxcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoV2Vla1N0YXJ0KCksXG4gICAgICB0aGlzLnZpcnR1YWxXZWVrcy53aW5kb3dTaXplXG4gICAgKTtcbiAgICBcbiAgICByZXR1cm4gdmlzaWJsZVdlZWtzLmZsYXQoKTtcbiAgfSk7XG4gIFxuICAvLyBDb21wdXRlZCB0aW1lIHByb3BlcnRpZXMgZnJvbSBzdG9yZVxuICBnZXQgc3RhcnRIb3VyKCk6IG51bWJlciB7XG4gICAgY29uc3QgdGltZSA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydFRpbWUoKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVRpbWUodGltZSkuaG91cjtcbiAgfVxuICBcbiAgZ2V0IHN0YXJ0TWludXRlKCk6IG51bWJlciB7XG4gICAgY29uc3QgdGltZSA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydFRpbWUoKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVRpbWUodGltZSkubWludXRlO1xuICB9XG4gIFxuICBnZXQgZW5kSG91cigpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbWUgPSB0aGlzLnJhbmdlU3RvcmUuZW5kVGltZSgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVGltZSh0aW1lKS5ob3VyO1xuICB9XG4gIFxuICBnZXQgZW5kTWludXRlKCk6IG51bWJlciB7XG4gICAgY29uc3QgdGltZSA9IHRoaXMucmFuZ2VTdG9yZS5lbmRUaW1lKCk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VUaW1lKHRpbWUpLm1pbnV0ZTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzZXRTdGFydEhvdXJNaW51dGUoaG91cjogbnVtYmVyLCBtaW51dGU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVTdHIgPSB0aGlzLmZvcm1hdFRpbWUoaG91ciwgbWludXRlKTtcbiAgICB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnRUaW1lKHRpbWVTdHIpO1xuICB9XG4gIFxuICBwcml2YXRlIHNldEVuZEhvdXJNaW51dGUoaG91cjogbnVtYmVyLCBtaW51dGU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVTdHIgPSB0aGlzLmZvcm1hdFRpbWUoaG91ciwgbWludXRlKTtcbiAgICB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kVGltZSh0aW1lU3RyKTtcbiAgfVxuICBcbiAgLy8gTXVsdGktcmFuZ2Ugc3VwcG9ydCAoVUktc3BlY2lmaWMpXG4gIHNlbGVjdGVkUmFuZ2VzID0gc2lnbmFsPERhdGVSYW5nZVtdPihbXSk7XG4gIGN1cnJlbnRSYW5nZUluZGV4ID0gc2lnbmFsPG51bWJlcj4oLTEpO1xuXG4gIC8vIEtleWJvYXJkIG5hdmlnYXRpb24gKFVJLXNwZWNpZmljKVxuICBmb2N1c2VkRGF5ID0gc2lnbmFsPHsgZGF0ZTogc3RyaW5nOyBtb250aEluZGV4OiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuICBcbiAgLy8gQ29tcHV0ZWQgdmFsdWVzXG4gIGN1cnJlbnRNb250aE5hbWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmdldE1vbnRoTmFtZSh0aGlzLmN1cnJlbnRNb250aCgpKSk7XG4gIHByZXZpb3VzTW9udGhOYW1lID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXRNb250aE5hbWUodGhpcy5wcmV2aW91c01vbnRoKCkpKTtcbiAgd2Vla0RheU5hbWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXREYXlOYW1lcygpKTtcbiAgXG4gIC8vIENvbXB1dGVkIGZyb20gc3RvcmVcbiAgZGF0ZVJhbmdlVGV4dCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmFuZ2VTdG9yZS5yYW5nZVRleHQoKSk7XG4gIHNlbGVjdGluZ1N0YXJ0RGF0ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmFuZ2VTdG9yZS5zZWxlY3RpbmdTdGFydCgpKTtcbiAgaGFzUGVuZGluZ0NoYW5nZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJhbmdlU3RvcmUuaGFzUGVuZGluZ0NoYW5nZXMoKSk7XG4gIFxuICAvLyBDb21wdXRlZCBmb3IgdGVtcGxhdGUgYWNjZXNzIHRvIHBlbmRpbmcgZGF0ZXMgKHJlcXVpcmVBcHBseSBtb2RlKVxuICBnZXQgcGVuZGluZ1N0YXJ0RGF0ZSgpOiBzdHJpbmcge1xuICAgIC8vIEluIHJlcXVpcmVBcHBseSBtb2RlLCBzdG9yZSBrZWVwcyBwZW5kaW5nIHZhbHVlc1xuICAgIC8vIEZvciBub3csIHVzZSBhY3R1YWwgc3RvcmUgdmFsdWVzIGFzIHBlbmRpbmcgKHN0b3JlIGhhbmRsZXMgdGhpcylcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydERhdGUoKTtcbiAgICByZXR1cm4gZGF0ZSAmJiB0aGlzLmhhc1BlbmRpbmdDaGFuZ2VzKCkgPyB0aGlzLmZvcm1hdERhdGUoZGF0ZSkgOiAnJztcbiAgfVxuICBcbiAgZ2V0IHBlbmRpbmdFbmREYXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLnJhbmdlU3RvcmUuZW5kRGF0ZSgpO1xuICAgIHJldHVybiBkYXRlICYmIHRoaXMuaGFzUGVuZGluZ0NoYW5nZXMoKSA/IHRoaXMuZm9ybWF0RGF0ZShkYXRlKSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0TW9udGhOYW1lcyA9IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRNb250aE5hbWVzU2hvcnQgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdERheU5hbWVzID0gWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHREYXlOYW1lc1Nob3J0ID0gWydTJywgJ00nLCAnVCcsICdXJywgJ1QnLCAnRicsICdTJ107XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgY2FsbGJhY2tzXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogRGF0ZVJhbmdlIHwgbnVsbCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIC8vIEVmZmVjdCB0byBlbWl0IGNoYW5nZXMgd2hlbiBkYXRlcyBjaGFuZ2UgaW4gc3RvcmVcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnJhbmdlU3RvcmUucmFuZ2UoKTtcbiAgICAgIGlmIChyYW5nZS5zdGFydCB8fCByYW5nZS5lbmQpIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdldERhdGVSYW5nZVZhbHVlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrT3V0c2lkZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dEYXRlUGlja2VyKCkgJiYgdGhpcy5jbG9zZU9uQ2xpY2tPdXRzaWRlKSB7XG4gICAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcbiAgICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuICAgICAgICB0aGlzLmNsb3NlRGF0ZVBpY2tlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlib2FyZE5hdmlnYXRpb24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNob3dEYXRlUGlja2VyKCkpIHtcbiAgICAgIC8vIFdoZW4gcGlja2VyIGlzIGNsb3NlZCwgYWxsb3cgRW50ZXIvU3BhY2UgdG8gb3BlbiBpdFxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkYXRlcGlja2VyLWlucHV0JykpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMudG9nZ2xlRGF0ZVBpY2tlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2hlbiBwaWNrZXIgaXMgb3BlblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsb3NlRGF0ZVBpY2tlcigpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUZvY3VzVmVydGljYWwoLTEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNWZXJ0aWNhbCgxKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUZvY3VzSG9yaXpvbnRhbCgtMSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNIb3Jpem9udGFsKDEpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0Rm9jdXNlZERheSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZUZvY3VzVG9GaXJzdERheSgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXNUb0xhc3REYXkoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIHRoaXMubW92ZUZvY3VzWWVhcigtMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VNb250aCgtMSk7XG4gICAgICAgICAgdGhpcy5hZGp1c3RGb2N1c0FmdGVyTW9udGhDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnUGFnZURvd24nOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICB0aGlzLm1vdmVGb2N1c1llYXIoMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VNb250aCgxKTtcbiAgICAgICAgICB0aGlzLmFkanVzdEZvY3VzQWZ0ZXJNb250aENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIEtleWJvYXJkIG5hdmlnYXRpb24gbWV0aG9kc1xuICBwcml2YXRlIGluaXRpYWxpemVGb2N1cygpOiB2b2lkIHtcbiAgICAvLyBTZXQgaW5pdGlhbCBmb2N1cyB0byBzdGFydCBkYXRlLCBlbmQgZGF0ZSwgb3IgZmlyc3QgYXZhaWxhYmxlIGRheVxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgY29uc3QgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodGhpcy5zdGFydERhdGUsIHRoaXMucHJldmlvdXNNb250aCgpKTtcbiAgICAgIGNvbnN0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKHRoaXMuc3RhcnREYXRlLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcbiAgICAgIFxuICAgICAgaWYgKGluUHJldk1vbnRoIHx8IGluQ3Vyck1vbnRoKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSwgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogMSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN0YXJ0RGF0ZSBpcyBub3QgdmlzaWJsZSwgZm9jdXMgb24gdG9kYXkgaWYgdmlzaWJsZVxuICAgICAgICBjb25zdCB0b2RheSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KHRoaXMuZGF0ZUFkYXB0ZXIudG9kYXkoKSwgJ3l5eXktTU0tZGQnKTtcbiAgICAgICAgY29uc3QgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodG9kYXksIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGluQ3Vyck1vbnRoKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IHRvZGF5LCBtb250aEluZGV4OiAxIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb250aERheXMgPSB0aGlzLmN1cnJlbnRNb250aERheXMoKTtcbiAgICAgICAgICBjb25zdCBmaXJzdERheSA9IGN1cnJlbnRNb250aERheXMuZmluZChkYXkgPT4gZGF5LmlzQ3VycmVudE1vbnRoKTtcbiAgICAgICAgICBpZiAoZmlyc3REYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiBmaXJzdERheS5kYXRlLCBtb250aEluZGV4OiAxIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5lbmREYXRlKSB7XG4gICAgICBjb25zdCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aCh0aGlzLmVuZERhdGUsIHRoaXMucHJldmlvdXNNb250aCgpKTtcbiAgICAgIGNvbnN0IGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKHRoaXMuZW5kRGF0ZSwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICBcbiAgICAgIGlmIChpblByZXZNb250aCB8fCBpbkN1cnJNb250aCkge1xuICAgICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogdGhpcy5lbmREYXRlLCBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZW5kRGF0ZSBpcyBub3QgdmlzaWJsZSwgZm9jdXMgb24gdG9kYXkgaWYgdmlzaWJsZVxuICAgICAgICBjb25zdCB0b2RheSA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KHRoaXMuZGF0ZUFkYXB0ZXIudG9kYXkoKSwgJ3l5eXktTU0tZGQnKTtcbiAgICAgICAgY29uc3QgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodG9kYXksIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGluQ3Vyck1vbnRoKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IHRvZGF5LCBtb250aEluZGV4OiAxIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb250aERheXMgPSB0aGlzLmN1cnJlbnRNb250aERheXMoKTtcbiAgICAgICAgICBjb25zdCBmaXJzdERheSA9IGN1cnJlbnRNb250aERheXMuZmluZChkYXkgPT4gZGF5LmlzQ3VycmVudE1vbnRoKTtcbiAgICAgICAgICBpZiAoZmlyc3REYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiBmaXJzdERheS5kYXRlLCBtb250aEluZGV4OiAxIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb2N1cyBvbiB0b2RheSBpZiB2aXNpYmxlLCBvdGhlcndpc2UgZmlyc3QgZGF5IG9mIGN1cnJlbnQgbW9udGhcbiAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5kYXRlQWRhcHRlci5mb3JtYXQodGhpcy5kYXRlQWRhcHRlci50b2RheSgpLCAneXl5eS1NTS1kZCcpO1xuICAgICAgY29uc3QgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgodG9kYXksIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuICAgICAgXG4gICAgICBpZiAoaW5DdXJyTW9udGgpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IHRvZGF5LCBtb250aEluZGV4OiAxIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG9kYXkgaXMgbm90IGluIGN1cnJlbnQgbW9udGgsIGZvY3VzIG9uIGZpcnN0IGRheSBvZiBjdXJyZW50IG1vbnRoXG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aERheXMgPSB0aGlzLmN1cnJlbnRNb250aERheXMoKTtcbiAgICAgICAgY29uc3QgZmlyc3REYXkgPSBjdXJyZW50TW9udGhEYXlzLmZpbmQoZGF5ID0+IGRheS5pc0N1cnJlbnRNb250aCk7XG4gICAgICAgIGlmIChmaXJzdERheSkge1xuICAgICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBkYXRlOiBmaXJzdERheS5kYXRlLCBtb250aEluZGV4OiAxIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVJbk1vbnRoKGRhdGVTdHI6IHN0cmluZywgbW9udGhEYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZGF0ZVN0cik7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSk7XG4gICAgY29uc3QgbW9udGhZZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKG1vbnRoRGF0ZSk7XG4gICAgY29uc3QgbW9udGhNb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgobW9udGhEYXRlKTtcbiAgICByZXR1cm4geWVhciA9PT0gbW9udGhZZWFyICYmIG1vbnRoID09PSBtb250aE1vbnRoO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRm9jdXNIb3Jpem9udGFsKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuZm9jdXNlZERheSgpO1xuICAgIGlmICghZm9jdXNlZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplRm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZm9jdXNlZC5kYXRlKTtcbiAgICBpZiAoIWN1cnJlbnREYXRlKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5hZGREYXlzKGN1cnJlbnREYXRlLCBkaXJlY3Rpb24pO1xuICAgIGNvbnN0IG5ld0RhdGVTdHIgPSB0aGlzLmZvcm1hdERhdGUobmV3RGF0ZSk7XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggbW9udGggdGhlIG5ldyBkYXRlIGJlbG9uZ3MgdG9cbiAgICBsZXQgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgIGxldCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcblxuICAgIGlmIChpblByZXZNb250aCB8fCBpbkN1cnJNb250aCkge1xuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IFxuICAgICAgICBkYXRlOiBuZXdEYXRlU3RyLCBcbiAgICAgICAgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogMSBcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEYXRlIGlzIG91dHNpZGUgdmlzaWJsZSBtb250aHMsIG5hdmlnYXRlIG1vbnRoXG4gICAgICBpZiAoZGlyZWN0aW9uID4gMCkge1xuICAgICAgICB0aGlzLmNoYW5nZU1vbnRoKDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VNb250aCgtMSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlY2FsY3VsYXRlIGFmdGVyIG1vbnRoIGNoYW5nZVxuICAgICAgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgICAgaW5DdXJyTW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5jdXJyZW50TW9udGgoKSk7XG4gICAgICBcbiAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQoeyBcbiAgICAgICAgZGF0ZTogbmV3RGF0ZVN0ciwgXG4gICAgICAgIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IChpbkN1cnJNb250aCA/IDEgOiAwKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRm9jdXNWZXJ0aWNhbChkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXkoKTtcbiAgICBpZiAoIWZvY3VzZWQpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGZvY3VzZWQuZGF0ZSk7XG4gICAgaWYgKCFjdXJyZW50RGF0ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIuYWRkRGF5cyhjdXJyZW50RGF0ZSwgZGlyZWN0aW9uICogNyk7IC8vIE1vdmUgYnkgd2Vla1xuICAgIGNvbnN0IG5ld0RhdGVTdHIgPSB0aGlzLmZvcm1hdERhdGUobmV3RGF0ZSk7XG5cbiAgICBsZXQgaW5QcmV2TW9udGggPSB0aGlzLmlzRGF0ZUluTW9udGgobmV3RGF0ZVN0ciwgdGhpcy5wcmV2aW91c01vbnRoKCkpO1xuICAgIGxldCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChuZXdEYXRlU3RyLCB0aGlzLmN1cnJlbnRNb250aCgpKTtcblxuICAgIGlmIChpblByZXZNb250aCB8fCBpbkN1cnJNb250aCkge1xuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IFxuICAgICAgICBkYXRlOiBuZXdEYXRlU3RyLCBcbiAgICAgICAgbW9udGhJbmRleDogaW5QcmV2TW9udGggPyAwIDogMSBcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOYXZpZ2F0ZSB0byBtb250aCBjb250YWluaW5nIHRoZSBuZXcgZGF0ZVxuICAgICAgaWYgKGRpcmVjdGlvbiA+IDApIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VNb250aCgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hhbmdlTW9udGgoLTEpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZWNhbGN1bGF0ZSBhZnRlciBtb250aCBjaGFuZ2VcbiAgICAgIGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMucHJldmlvdXNNb250aCgpKTtcbiAgICAgIGluQ3Vyck1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuICAgICAgXG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgXG4gICAgICAgIGRhdGU6IG5ld0RhdGVTdHIsIFxuICAgICAgICBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAoaW5DdXJyTW9udGggPyAxIDogMClcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbW92ZUZvY3VzVG9GaXJzdERheSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2TW9udGhEYXlzID0gdGhpcy5wcmV2aW91c01vbnRoRGF5cygpO1xuICAgIGNvbnN0IGZpcnN0RGF5ID0gcHJldk1vbnRoRGF5cy5maW5kKGRheSA9PiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgIGlmIChmaXJzdERheSkge1xuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldCh7IGRhdGU6IGZpcnN0RGF5LmRhdGUsIG1vbnRoSW5kZXg6IDAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRm9jdXNUb0xhc3REYXkoKTogdm9pZCB7XG4gICAgY29uc3QgY3Vyck1vbnRoRGF5cyA9IHRoaXMuY3VycmVudE1vbnRoRGF5cygpO1xuICAgIGNvbnN0IHZhbGlkRGF5cyA9IGN1cnJNb250aERheXMuZmlsdGVyKGRheSA9PiBkYXkuaXNDdXJyZW50TW9udGgpO1xuICAgIGNvbnN0IGxhc3REYXkgPSB2YWxpZERheXNbdmFsaWREYXlzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChsYXN0RGF5KSB7XG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgZGF0ZTogbGFzdERheS5kYXRlLCBtb250aEluZGV4OiAxIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbW92ZUZvY3VzWWVhcihkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZvY3VzZWQgPSB0aGlzLmZvY3VzZWREYXkoKTtcbiAgICBpZiAoIWZvY3VzZWQpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvY3VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGZvY3VzZWQuZGF0ZSk7XG4gICAgaWYgKCFjdXJyZW50RGF0ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoY3VycmVudERhdGUpO1xuICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoY3VycmVudERhdGUpO1xuICAgIGNvbnN0IGN1cnJlbnREYXkgPSB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGUoY3VycmVudERhdGUpO1xuICAgIFxuICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoY3VycmVudFllYXIgKyBkaXJlY3Rpb24sIGN1cnJlbnRNb250aCwgY3VycmVudERheSk7XG4gICAgY29uc3QgbmV3RGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShuZXdEYXRlKTtcblxuICAgIC8vIFVwZGF0ZSBtb250aHMgdG8gc2hvdyB0aGUgbmV3IHllYXJcbiAgICB0aGlzLmN1cnJlbnRNb250aC5zZXQodGhpcy5kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGN1cnJlbnRZZWFyICsgZGlyZWN0aW9uLCBjdXJyZW50TW9udGgsIDEpKTtcbiAgICB0aGlzLnByZXZpb3VzTW9udGguc2V0KHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShjdXJyZW50WWVhciArIGRpcmVjdGlvbiwgY3VycmVudE1vbnRoIC0gMSwgMSkpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcblxuICAgIGNvbnN0IGluUHJldk1vbnRoID0gdGhpcy5pc0RhdGVJbk1vbnRoKG5ld0RhdGVTdHIsIHRoaXMucHJldmlvdXNNb250aCgpKTtcbiAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHsgXG4gICAgICBkYXRlOiBuZXdEYXRlU3RyLCBcbiAgICAgIG1vbnRoSW5kZXg6IGluUHJldk1vbnRoID8gMCA6IDEgXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdEZvY3VzQWZ0ZXJNb250aENoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF5KCk7XG4gICAgaWYgKCFmb2N1c2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBpblByZXZNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChmb2N1c2VkLmRhdGUsIHRoaXMucHJldmlvdXNNb250aCgpKTtcbiAgICBjb25zdCBpbkN1cnJNb250aCA9IHRoaXMuaXNEYXRlSW5Nb250aChmb2N1c2VkLmRhdGUsIHRoaXMuY3VycmVudE1vbnRoKCkpO1xuXG4gICAgaWYgKCFpblByZXZNb250aCAmJiAhaW5DdXJyTW9udGgpIHtcbiAgICAgIC8vIEZvY3VzZWQgZGF5IGlzIG5vIGxvbmdlciB2aXNpYmxlLCBtb3ZlIHRvIGVxdWl2YWxlbnQgZGF5IGluIHZpc2libGUgbW9udGhzXG4gICAgICB0aGlzLmluaXRpYWxpemVGb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGUgbW9udGggaW5kZXggaWYgbmVlZGVkXG4gICAgICB0aGlzLmZvY3VzZWREYXkuc2V0KHtcbiAgICAgICAgZGF0ZTogZm9jdXNlZC5kYXRlLFxuICAgICAgICBtb250aEluZGV4OiBpblByZXZNb250aCA/IDAgOiAxXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdEZvY3VzZWREYXkoKTogdm9pZCB7XG4gICAgY29uc3QgZm9jdXNlZCA9IHRoaXMuZm9jdXNlZERheSgpO1xuICAgIGlmICghZm9jdXNlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9udGhEYXlzID0gZm9jdXNlZC5tb250aEluZGV4ID09PSAwID8gdGhpcy5wcmV2aW91c01vbnRoRGF5cygpIDogdGhpcy5jdXJyZW50TW9udGhEYXlzKCk7XG4gICAgY29uc3QgZGF5T2JqID0gbW9udGhEYXlzLmZpbmQoZGF5ID0+IGRheS5kYXRlID09PSBmb2N1c2VkLmRhdGUgJiYgZGF5LmlzQ3VycmVudE1vbnRoKTtcbiAgICBcbiAgICBpZiAoZGF5T2JqKSB7XG4gICAgICB0aGlzLnNlbGVjdERheShkYXlPYmopO1xuICAgIH1cbiAgfVxuXG4gIGhhc0tleWJvYXJkRm9jdXMoZGF0ZTogc3RyaW5nLCBtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBmb2N1c2VkID0gdGhpcy5mb2N1c2VkRGF5KCk7XG4gICAgcmV0dXJuIGZvY3VzZWQgIT09IG51bGwgJiYgZm9jdXNlZC5kYXRlID09PSBkYXRlICYmIGZvY3VzZWQubW9udGhJbmRleCA9PT0gbW9udGhJbmRleDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIENvbmZpZ3VyZSB0aGUgaGVhZGxlc3Mgc3RvcmVcbiAgICB0aGlzLnJhbmdlU3RvcmUuY29uZmlndXJlKHtcbiAgICAgIGVuYWJsZVRpbWVQaWNrZXI6IHRoaXMuZW5hYmxlVGltZVBpY2tlcixcbiAgICAgIGRlZmF1bHRTdGFydFRpbWU6IHRoaXMuZGVmYXVsdFN0YXJ0VGltZSxcbiAgICAgIGRlZmF1bHRFbmRUaW1lOiB0aGlzLmRlZmF1bHRFbmRUaW1lLFxuICAgICAgZGlzYWJsZWREYXRlczogdGhpcy5kaXNhYmxlZERhdGVzXG4gICAgfSk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBkYXRlcyBpbiBzdG9yZSBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UodGhpcy5zdGFydERhdGUpO1xuICAgICAgaWYgKGRhdGUpIHRoaXMucmFuZ2VTdG9yZS5zZXRTdGFydChkYXRlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UodGhpcy5lbmREYXRlKTtcbiAgICAgIGlmIChkYXRlKSB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKGRhdGUpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzdGFydERhdGUnXSB8fCBjaGFuZ2VzWydlbmREYXRlJ10pIHtcbiAgICAgIC8vIFN5bmMgd2l0aCBzdG9yZVxuICAgICAgaWYgKGNoYW5nZXNbJ3N0YXJ0RGF0ZSddICYmIHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHRoaXMuc3RhcnREYXRlKTtcbiAgICAgICAgaWYgKGRhdGUpIHRoaXMucmFuZ2VTdG9yZS5zZXRTdGFydChkYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2VzWydlbmREYXRlJ10gJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHRoaXMuZW5kRGF0ZSk7XG4gICAgICAgIGlmIChkYXRlKSB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKGRhdGUpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHN0b3JlIGNvbmZpZ3VyYXRpb24gaWYgcmVsZXZhbnQgaW5wdXRzIGNoYW5nZVxuICAgIGlmIChjaGFuZ2VzWydlbmFibGVUaW1lUGlja2VyJ10gfHwgY2hhbmdlc1snZGVmYXVsdFN0YXJ0VGltZSddIHx8IFxuICAgICAgICBjaGFuZ2VzWydkZWZhdWx0RW5kVGltZSddIHx8IGNoYW5nZXNbJ2Rpc2FibGVkRGF0ZXMnXSkge1xuICAgICAgdGhpcy5yYW5nZVN0b3JlLmNvbmZpZ3VyZSh7XG4gICAgICAgIGVuYWJsZVRpbWVQaWNrZXI6IHRoaXMuZW5hYmxlVGltZVBpY2tlcixcbiAgICAgICAgZGVmYXVsdFN0YXJ0VGltZTogdGhpcy5kZWZhdWx0U3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0RW5kVGltZTogdGhpcy5kZWZhdWx0RW5kVGltZSxcbiAgICAgICAgZGlzYWJsZWREYXRlczogdGhpcy5kaXNhYmxlZERhdGVzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGF0ZSk7XG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcodGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShkYXRlKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgfVxuXG4gIGZvcm1hdERhdGVEaXNwbGF5KGRhdGVTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlU3RyKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UoZGF0ZVN0cik7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7XG4gICAgXG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSk7XG4gICAgY29uc3QgZGF5ID0gdGhpcy5kYXRlQWRhcHRlci5nZXREYXRlKGRhdGUpO1xuICAgIFxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSB0aGlzLmxvY2FsZS5tb250aE5hbWVzIHx8IHRoaXMuZGVmYXVsdE1vbnRoTmFtZXM7XG4gICAgY29uc3QgbW9udGhOYW1lc1Nob3J0ID0gdGhpcy5sb2NhbGUubW9udGhOYW1lc1Nob3J0IHx8IHRoaXMuZGVmYXVsdE1vbnRoTmFtZXNTaG9ydDtcbiAgICBcbiAgICAvLyBSZXBsYWNlIGZvcm1hdCB0b2tlbnMgd2l0aCB2YWx1ZXNcbiAgICBsZXQgZm9ybWF0dGVkID0gdGhpcy5kaXNwbGF5Rm9ybWF0O1xuICAgIFxuICAgIC8vIFllYXIgdG9rZW5zXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL1lZWVkvZywgU3RyaW5nKHllYXIpKTtcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvWVkvZywgU3RyaW5nKHllYXIpLnNsaWNlKC0yKSk7XG4gICAgXG4gICAgLy8gTW9udGggdG9rZW5zIChvcmRlciBtYXR0ZXJzOiBNTU1NIGJlZm9yZSBNTU0gYmVmb3JlIE1NIGJlZm9yZSBNKVxuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZXNbbW9udGhdKTtcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvTU1NL2csIG1vbnRoTmFtZXNTaG9ydFttb250aF0pO1xuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9NTS9nLCBTdHJpbmcobW9udGggKyAxKS5wYWRTdGFydCgyLCAnMCcpKTtcbiAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZSgvTS9nLCBTdHJpbmcobW9udGggKyAxKSk7XG4gICAgXG4gICAgLy8gRGF5IHRva2VucyAob3JkZXIgbWF0dGVyczogREQgYmVmb3JlIEQpXG4gICAgZm9ybWF0dGVkID0gZm9ybWF0dGVkLnJlcGxhY2UoL0REL2csIFN0cmluZyhkYXkpLnBhZFN0YXJ0KDIsICcwJykpO1xuICAgIGZvcm1hdHRlZCA9IGZvcm1hdHRlZC5yZXBsYWNlKC9EL2csIFN0cmluZyhkYXkpKTtcbiAgICBcbiAgICByZXR1cm4gZm9ybWF0dGVkO1xuICB9XG5cbiAgLy8gTm90ZTogdXBkYXRlRGF0ZVJhbmdlVGV4dCBpcyBub3cgaGFuZGxlZCBieSBjb21wdXRlZCBkYXRlUmFuZ2VUZXh0IGZyb20gc3RvcmVcbiAgLy8gS2VlcGluZyB0aGlzIG1ldGhvZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgaXQncyBhIG5vLW9wXG4gIHVwZGF0ZURhdGVSYW5nZVRleHQoKTogdm9pZCB7XG4gICAgLy8gVGV4dCBpcyBub3cgYXV0b21hdGljYWxseSBjb21wdXRlZCBmcm9tIHN0b3JlLnJhbmdlVGV4dCgpXG4gIH1cblxuICB0b2dnbGVEYXRlUGlja2VyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIudXBkYXRlKHZhbHVlID0+ICF2YWx1ZSk7XG4gICAgaWYgKHRoaXMuc2hvd0RhdGVQaWNrZXIoKSkge1xuICAgICAgLy8gc2VsZWN0aW5nU3RhcnQgaXMgbWFuYWdlZCBieSBzdG9yZSwgbm8gbmVlZCB0byBzZXQgaGVyZVxuICAgICAgY29uc3QgY3VycmVudE1vbnRoVmFsdWUgPSB0aGlzLmN1cnJlbnRNb250aCgpO1xuICAgICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihjdXJyZW50TW9udGhWYWx1ZSk7XG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoY3VycmVudE1vbnRoVmFsdWUpO1xuICAgICAgY29uc3QgcHJldmlvdXNNb250aERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGggLSAxLCAxKTtcbiAgICAgIHRoaXMucHJldmlvdXNNb250aC5zZXQocHJldmlvdXNNb250aERhdGUpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgICAgLy8gSW5pdGlhbGl6ZSBrZXlib2FyZCBmb2N1cyBvbmx5IGlmIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgZW5hYmxlZFxuICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENsZWFyIGZvY3VzIHdoZW4gY2xvc2luZ1xuICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5Ym9hcmROYXZpZ2F0aW9uKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZERheS5zZXQobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBjbG9zZURhdGVQaWNrZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGF0ZVBpY2tlci5zZXQoZmFsc2UpO1xuICAgIGlmICh0aGlzLmVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbikge1xuICAgICAgdGhpcy5mb2N1c2VkRGF5LnNldChudWxsKTtcbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIGdlbmVyYXRlQ2FsZW5kYXJzKCk6IHZvaWQge1xuICAgIHRoaXMucHJldmlvdXNNb250aERheXMuc2V0KHRoaXMuZ2VuZXJhdGVNb250aENhbGVuZGFyKHRoaXMucHJldmlvdXNNb250aCgpKSk7XG4gICAgdGhpcy5jdXJyZW50TW9udGhEYXlzLnNldCh0aGlzLmdlbmVyYXRlTW9udGhDYWxlbmRhcih0aGlzLmN1cnJlbnRNb250aCgpKSk7XG4gICAgXG4gICAgLy8gUmVzZXQgdmlydHVhbCB3ZWVrIHdpbmRvd3Mgd2hlbiBtb250aCBjaGFuZ2VzICh2My45LjArKVxuICAgIC8vIEFsd2F5cyBzdGFydCBhdCBmaXJzdCB3ZWVrIGZvciBjb25zaXN0ZW50IFVYXG4gICAgaWYgKHRoaXMudmlydHVhbFdlZWtzKSB7XG4gICAgICB0aGlzLnByZXZpb3VzTW9udGhXZWVrU3RhcnQuc2V0KDApO1xuICAgICAgdGhpcy5jdXJyZW50TW9udGhXZWVrU3RhcnQuc2V0KDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBjYWxlbmRhciBncmlkIHdpdGggZGVjb3JhdGlvbnMgKHYzLjguMCspXG4gICAqIFxuICAgKiBVc2VzIENhbGVuZGFyR3JpZENhY2hlIGZvciBiYXNlIGdyaWQgc3RydWN0dXJlIChtZW1vaXplZCBieSBtb250aCksXG4gICAqIHRoZW4gdXNlcyBSYW5nZUhpZ2hsaWdodGVyQ2FjaGUgZm9yIGRlY29yYXRpb25zIChtZW1vaXplZCBieSByYW5nZS9jb25zdHJhaW50cykuXG4gICAqIFxuICAgKiBQZXJmb3JtYW5jZTpcbiAgICogLSBHcmlkIHN0cnVjdHVyZTogQ2FjaGVkIGJ5IG1vbnRoIChzYW1lIG1vbnRoID0gc2FtZSBncmlkIG9iamVjdClcbiAgICogLSBEZWNvcmF0aW9uczogQ2FjaGVkIGJ5IHJhbmdlK2hvdmVyK2Rpc2FibGVkIChzYW1lIHN0YXRlID0gc2FtZSBkZWNvcmF0ZWQgZ3JpZClcbiAgICogLSBSZXN1bHQ6IH45NSUgY2FjaGUgaGl0IHJhdGUgaW4gdHlwaWNhbCB1c2FnZVxuICAgKiBcbiAgICogQ2FjaGUga2V5czpcbiAgICogLSBHcmlkOiBgJHt5ZWFyfS0ke21vbnRofS0ke3dlZWtTdGFydH1gXG4gICAqIC0gRGVjb3JhdGlvbnM6IGAke21vbnRoS2V5fXwke3N0YXJ0fXwke2VuZH18JHtob3Zlcn18JHtkaXNhYmxlZH1gXG4gICAqL1xuICBnZW5lcmF0ZU1vbnRoQ2FsZW5kYXIoZGF0ZTogRGF0ZSk6IGFueVtdIHtcbiAgICAvLyBHZXQgYmFzZSBncmlkIGZyb20gY2FjaGUgKHdlZWtTdGFydCA9IDAgZm9yIFN1bmRheSwgbm8gbG9jYWxlIGZvciBub3cpXG4gICAgY29uc3QgZ3JpZDogQ2FsZW5kYXJHcmlkID0gdGhpcy5ncmlkQ2FjaGUuZ2V0KGRhdGUsIDApO1xuICAgIFxuICAgIC8vIEdldCBkYXRlcyBmcm9tIHN0b3JlXG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLnJhbmdlU3RvcmUuZW5kRGF0ZSgpO1xuICAgIGNvbnN0IGhvdmVySVNPID0gdGhpcy5ob3ZlckRhdGUoKTtcbiAgICBcbiAgICAvLyBHZXQgZGVjb3JhdGVkIGdyaWQgZnJvbSBjYWNoZSAoaGFuZGxlcyBhbGwgZGVjb3JhdGlvbiBsb2dpYylcbiAgICBjb25zdCBkZWNvcmF0ZWQgPSB0aGlzLmhpZ2hsaWdodGVyQ2FjaGUuZ2V0KGdyaWQsIHtcbiAgICAgIHN0YXJ0OiBzdGFydERhdGUsXG4gICAgICBlbmQ6IGVuZERhdGUsXG4gICAgICBob3ZlckRhdGU6IGhvdmVySVNPLFxuICAgICAgZGlzYWJsZWREYXRlczogdGhpcy5kaXNhYmxlZERhdGVzLFxuICAgICAgbXVsdGlSYW5nZTogdGhpcy5tdWx0aVJhbmdlLFxuICAgICAgc2VsZWN0aW5nU3RhcnREYXRlOiB0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZSgpXG4gICAgICAvLyBtaW5EYXRlL21heERhdGUgb21pdHRlZCBmb3Igbm93IChub3QgaW4gY3VycmVudCBBUEkpXG4gICAgfSk7XG4gICAgXG4gICAgLy8gTWFwIGRlY29yYXRlZCBjZWxscyB0byBsZWdhY3kgZm9ybWF0IChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICBjb25zdCBtb250aERheXMgPSBkZWNvcmF0ZWQuY2VsbHMubWFwKChjZWxsOiBEZWNvcmF0ZWRDZWxsKSA9PiB7XG4gICAgICBpZiAoIWNlbGwuaW5DdXJyZW50TW9udGgpIHtcbiAgICAgICAgLy8gUGFkZGluZyBjZWxsIChwcmV2aW91cy9uZXh0IG1vbnRoKVxuICAgICAgICByZXR1cm4geyBkYXk6IG51bGwsIGlzQ3VycmVudE1vbnRoOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDdXJyZW50IG1vbnRoIGNlbGwgLSB1c2UgY2FjaGVkIGRlY29yYXRpb25zXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXk6IGNlbGwuZGF5LFxuICAgICAgICBkYXRlOiBjZWxsLmlzbyxcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXG4gICAgICAgIGlzU3RhcnQ6IGNlbGwuaXNTZWxlY3RlZFN0YXJ0LFxuICAgICAgICBpc0VuZDogY2VsbC5pc1NlbGVjdGVkRW5kLFxuICAgICAgICBpblJhbmdlOiBjZWxsLmlzSW5SYW5nZSxcbiAgICAgICAgaW5Ib3ZlclJhbmdlOiBjZWxsLmlzSW5Ib3ZlclJhbmdlLFxuICAgICAgICBpc0Rpc2FibGVkOiBjZWxsLmlzRGlzYWJsZWRcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW9udGhEYXlzO1xuICB9XG5cbiAgaXNJblJhbmdlKGRhdGVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm11bHRpUmFuZ2UpIHtcbiAgICAgIC8vIENoZWNrIGlmIGRhdGUgaXMgaW4gYW55IG9mIHRoZSBzZWxlY3RlZCByYW5nZXNcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUmFuZ2VzKCkuc29tZShyYW5nZSA9PiB7XG4gICAgICAgIHJldHVybiBkYXRlU3RyID49IHJhbmdlLnN0YXJ0RGF0ZSAmJiBkYXRlU3RyIDw9IHJhbmdlLmVuZERhdGU7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSB8fCAhdGhpcy5lbmREYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gZGF0ZVN0ciA+PSB0aGlzLnN0YXJ0RGF0ZSAmJiBkYXRlU3RyIDw9IHRoaXMuZW5kRGF0ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlydHVhbCBXZWVrcyBOYXZpZ2F0aW9uICh2My45LjArKVxuICAgKiBcbiAgICogTmF2aWdhdGUgdGhlIHZpc2libGUgd2VlayB3aW5kb3cgdXAvZG93biBmb3Igd2luZG93ZWQgcmVuZGVyaW5nLlxuICAgKiBcbiAgICogQHBhcmFtIG1vbnRoSW5kZXggMCA9IHByZXZpb3VzIG1vbnRoLCAxID0gY3VycmVudCBtb250aFxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIC0xID0gc2Nyb2xsIHVwIChwcmV2aW91cyB3ZWVrcyksICsxID0gc2Nyb2xsIGRvd24gKG5leHQgd2Vla3MpXG4gICAqIFxuICAgKiBFeGFtcGxlOiBJZiB3aW5kb3dTaXplPTMgYW5kIHdlZWtTdGFydD0wLCBuYXZpZ2F0ZVdlZWtzKDAsICsxKSBzaG93cyB3ZWVrcyAxLTMuXG4gICAqL1xuICBuYXZpZ2F0ZVdlZWtzKG1vbnRoSW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlydHVhbFdlZWtzKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdG90YWxXZWVrcyA9IDY7IC8vIFN0YW5kYXJkIGNhbGVuZGFyIGdyaWQgaGFzIDYgd2Vla3NcbiAgICBjb25zdCBjdXJyZW50U3RhcnQgPSBtb250aEluZGV4ID09PSAwIFxuICAgICAgPyB0aGlzLnByZXZpb3VzTW9udGhXZWVrU3RhcnQoKSBcbiAgICAgIDogdGhpcy5jdXJyZW50TW9udGhXZWVrU3RhcnQoKTtcbiAgICBcbiAgICBjb25zdCBuZXdTdGFydCA9IG5hdmlnYXRlV2Vla1dpbmRvdyhcbiAgICAgIGN1cnJlbnRTdGFydCxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIHRvdGFsV2Vla3MsXG4gICAgICB0aGlzLnZpcnR1YWxXZWVrcy53aW5kb3dTaXplXG4gICAgKTtcbiAgICBcbiAgICBpZiAobW9udGhJbmRleCA9PT0gMCkge1xuICAgICAgdGhpcy5wcmV2aW91c01vbnRoV2Vla1N0YXJ0LnNldChuZXdTdGFydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoV2Vla1N0YXJ0LnNldChuZXdTdGFydCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHdlZWsgbmF2aWdhdGlvbiBpcyBhdmFpbGFibGUgKHYzLjkuMCspXG4gICAqIFxuICAgKiBAcGFyYW0gbW9udGhJbmRleCAwID0gcHJldmlvdXMgbW9udGgsIDEgPSBjdXJyZW50IG1vbnRoXG4gICAqIEBwYXJhbSBkaXJlY3Rpb24gLTEgPSB1cCAoY2FuIHNjcm9sbCB0byBwcmV2aW91cyB3ZWVrcz8pLCArMSA9IGRvd24gKGNhbiBzY3JvbGwgdG8gbmV4dCB3ZWVrcz8pXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbmF2aWdhdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhhdCBkaXJlY3Rpb25cbiAgICovXG4gIGNhbk5hdmlnYXRlV2Vla3MobW9udGhJbmRleDogbnVtYmVyLCBkaXJlY3Rpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXJ0dWFsV2Vla3MpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBjb25zdCB0b3RhbFdlZWtzID0gNjtcbiAgICBjb25zdCBjdXJyZW50U3RhcnQgPSBtb250aEluZGV4ID09PSAwIFxuICAgICAgPyB0aGlzLnByZXZpb3VzTW9udGhXZWVrU3RhcnQoKSBcbiAgICAgIDogdGhpcy5jdXJyZW50TW9udGhXZWVrU3RhcnQoKTtcbiAgICBcbiAgICBpZiAoZGlyZWN0aW9uIDwgMCkge1xuICAgICAgLy8gQ2FuIHNjcm9sbCB1cCBpZiBub3QgYXQgc3RhcnRcbiAgICAgIHJldHVybiBjdXJyZW50U3RhcnQgPiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYW4gc2Nyb2xsIGRvd24gaWYgd2luZG93IGRvZXNuJ3QgZXh0ZW5kIHBhc3QgZW5kXG4gICAgICByZXR1cm4gY3VycmVudFN0YXJ0ICsgdGhpcy52aXJ0dWFsV2Vla3Mud2luZG93U2l6ZSA8IHRvdGFsV2Vla3M7XG4gICAgfVxuICB9XG5cbiAgaXNEYXRlRGlzYWJsZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZERhdGVzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuZGlzYWJsZWREYXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gSWYgaXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0IHdpdGggdGhlIGRhdGVcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMoZGF0ZSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGlzYWJsZWREYXRlcykpIHtcbiAgICAgIC8vIElmIGl0J3MgYW4gYXJyYXksIGNoZWNrIGlmIHRoZSBkYXRlIG1hdGNoZXMgYW55IGRpc2FibGVkIGRhdGVcbiAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMuc29tZShkaXNhYmxlZERhdGUgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGRhdGUpID09PSB0aGlzLmRhdGVBZGFwdGVyLmdldFllYXIoZGlzYWJsZWREYXRlKSAmJlxuICAgICAgICAgICAgICAgdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkYXRlKSA9PT0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChkaXNhYmxlZERhdGUpICYmXG4gICAgICAgICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLmdldERhdGUoZGF0ZSkgPT09IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShkaXNhYmxlZERhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzSW5Ib3ZlclJhbmdlKGRhdGVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvdmVyID0gdGhpcy5ob3ZlckRhdGUoKTtcbiAgICBpZiAoIWhvdmVyKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJbiBtdWx0aVJhbmdlIG1vZGUsIG9ubHkgc2hvdyBob3ZlciBwcmV2aWV3IHdoZW4gc2VsZWN0aW5nIGVuZCBkYXRlXG4gICAgaWYgKHRoaXMubXVsdGlSYW5nZSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlKCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGFydCA9IHRoaXMuc3RhcnREYXRlO1xuICAgICAgaWYgKCFjdXJyZW50U3RhcnQpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG1pbkRhdGUgPSBjdXJyZW50U3RhcnQgPCBob3ZlciA/IGN1cnJlbnRTdGFydCA6IGhvdmVyO1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IGN1cnJlbnRTdGFydCA+IGhvdmVyID8gY3VycmVudFN0YXJ0IDogaG92ZXI7XG4gICAgICByZXR1cm4gZGF0ZVN0ciA+PSBtaW5EYXRlICYmIGRhdGVTdHIgPD0gbWF4RGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gc2luZ2xlIHJhbmdlIG1vZGUgIFxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlKCkpIHJldHVybiBmYWxzZTtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICAgIC8vIFVzZSBwZW5kaW5nIGRhdGVzIGZyb20gc3RvcmVcbiAgICAgICAgY29uc3QgcGVuZGluZ1N0YXJ0ID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0RGF0ZSgpO1xuICAgICAgICBpZiAoIXBlbmRpbmdTdGFydCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBwZW5kaW5nU3RhcnRTdHIgPSB0aGlzLmZvcm1hdERhdGUocGVuZGluZ1N0YXJ0KTtcbiAgICAgICAgY29uc3QgbWluRGF0ZSA9IHBlbmRpbmdTdGFydFN0ciA8IGhvdmVyID8gcGVuZGluZ1N0YXJ0U3RyIDogaG92ZXI7XG4gICAgICAgIGNvbnN0IG1heERhdGUgPSBwZW5kaW5nU3RhcnRTdHIgPiBob3ZlciA/IHBlbmRpbmdTdGFydFN0ciA6IGhvdmVyO1xuICAgICAgICByZXR1cm4gZGF0ZVN0ciA+PSBtaW5EYXRlICYmIGRhdGVTdHIgPD0gbWF4RGF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZSBhY3R1YWwgZGF0ZXNcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXJ0ID0gdGhpcy5zdGFydERhdGU7XG4gICAgICAgIGlmICghY3VycmVudFN0YXJ0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1pbkRhdGUgPSBjdXJyZW50U3RhcnQgPCBob3ZlciA/IGN1cnJlbnRTdGFydCA6IGhvdmVyO1xuICAgICAgICBjb25zdCBtYXhEYXRlID0gY3VycmVudFN0YXJ0ID4gaG92ZXIgPyBjdXJyZW50U3RhcnQgOiBob3ZlcjtcbiAgICAgICAgcmV0dXJuIGRhdGVTdHIgPj0gbWluRGF0ZSAmJiBkYXRlU3RyIDw9IG1heERhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25EYXlIb3ZlcihkYXlPYmo6IGFueSk6IHZvaWQge1xuICAgIGlmICghZGF5T2JqLmlzQ3VycmVudE1vbnRoIHx8IHRoaXMuaXNEaXNhYmxlZCgpIHx8IGRheU9iai5pc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLmhvdmVyRGF0ZS5zZXQobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaG92ZXJEYXRlLnNldChkYXlPYmouZGF0ZSk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgY2xlYXJEYXlIb3ZlcigpOiB2b2lkIHtcbiAgICB0aGlzLmhvdmVyRGF0ZS5zZXQobnVsbCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgc2VsZWN0RGF5KGRheU9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKCFkYXlPYmouaXNDdXJyZW50TW9udGggfHwgdGhpcy5pc0Rpc2FibGVkKCkgfHwgZGF5T2JqLmlzRGlzYWJsZWQpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKGRheU9iai5kYXRlKTtcbiAgICBpZiAoIXNlbGVjdGVkRGF0ZSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMubXVsdGlSYW5nZSkge1xuICAgICAgLy8gTXVsdGktcmFuZ2UgbW9kZTogYWRkIHJhbmdlcyB0byBhcnJheVxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW5nU3RhcnREYXRlKCkpIHtcbiAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFN0YXJ0KHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmQobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhcnQgPSB0aGlzLnJhbmdlU3RvcmUuc3RhcnREYXRlKCk7XG4gICAgICAgIGlmIChjdXJyZW50U3RhcnQgJiYgc2VsZWN0ZWREYXRlIDwgY3VycmVudFN0YXJ0KSB7XG4gICAgICAgICAgLy8gU3dhcDogc2VsZWN0ZWQgYmVjb21lcyBzdGFydCwgY3VycmVudCBzdGFydCBiZWNvbWVzIGVuZFxuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRTdGFydChzZWxlY3RlZERhdGUpO1xuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmQoY3VycmVudFN0YXJ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0RW5kKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHJhbmdlIHRvIHRoZSBhcnJheVxuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMucmFuZ2VTdG9yZS5yYW5nZSgpO1xuICAgICAgICBjb25zdCBuZXdSYW5nZTogRGF0ZVJhbmdlID0ge1xuICAgICAgICAgIHN0YXJ0RGF0ZTogcmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgZW5kRGF0ZTogcmFuZ2UuZW5kLFxuICAgICAgICAgIHJhbmdlVGV4dDogdGhpcy5mb3JtYXREYXRlRGlzcGxheShyYW5nZS5zdGFydCkgKyAnIOKAkyAnICsgdGhpcy5mb3JtYXREYXRlRGlzcGxheShyYW5nZS5lbmQpLFxuICAgICAgICAgIC4uLih0aGlzLmVuYWJsZVRpbWVQaWNrZXIgJiYgeyBzdGFydFRpbWU6IHJhbmdlLnN0YXJ0VGltZSwgZW5kVGltZTogcmFuZ2UuZW5kVGltZSB9KVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgY29uc3QgY3VycmVudFJhbmdlcyA9IFsuLi50aGlzLnNlbGVjdGVkUmFuZ2VzKCldO1xuICAgICAgICBjdXJyZW50UmFuZ2VzLnB1c2gobmV3UmFuZ2UpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VzLnNldChjdXJyZW50UmFuZ2VzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IGZvciBuZXh0IHJhbmdlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnJhbmdlU3RvcmUucmVzZXQoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHRleHRcbiAgICAgICAgdGhpcy51cGRhdGVNdWx0aVJhbmdlVGV4dCgpO1xuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgY2xvc2UgaWYgbXVsdGlSYW5nZSwgYWxsb3cgYWRkaW5nIG1vcmUgcmFuZ2VzXG4gICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3Rpb24gJiYgIXRoaXMubXVsdGlSYW5nZSkge1xuICAgICAgICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5lbWl0TXVsdGlDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5lbWl0TXVsdGlTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2luZ2xlIHJhbmdlIG1vZGVcbiAgICAgIGlmICh0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgICAvLyBBcHBseSBtb2RlOiB1c2UgcGVuZGluZyBkYXRlcywgZG9uJ3QgZW1pdCB1bnRpbCBBcHBseSBpcyBjbGlja2VkXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGluZ1N0YXJ0RGF0ZSgpKSB7XG4gICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFBlbmRpbmdTdGFydChzZWxlY3RlZERhdGUpO1xuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRQZW5kaW5nRW5kKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGFydCA9IHRoaXMucmFuZ2VTdG9yZS5zdGFydERhdGUoKTtcbiAgICAgICAgICBpZiAocGVuZGluZ1N0YXJ0ICYmIHNlbGVjdGVkRGF0ZSA8IHBlbmRpbmdTdGFydCkge1xuICAgICAgICAgICAgLy8gU3dhcFxuICAgICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFBlbmRpbmdTdGFydChzZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFBlbmRpbmdFbmQocGVuZGluZ1N0YXJ0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldFBlbmRpbmdFbmQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW1tZWRpYXRlIG1vZGU6IGVtaXQgY2hhbmdlcyBpbW1lZGlhdGVseVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RpbmdTdGFydERhdGUoKSkge1xuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRTdGFydChzZWxlY3RlZERhdGUpO1xuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmQobnVsbCk7XG4gICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFN0YXJ0ID0gdGhpcy5yYW5nZVN0b3JlLnN0YXJ0RGF0ZSgpO1xuICAgICAgICAgIGlmIChjdXJyZW50U3RhcnQgJiYgc2VsZWN0ZWREYXRlIDwgY3VycmVudFN0YXJ0KSB7XG4gICAgICAgICAgICAvLyBTd2FwXG4gICAgICAgICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0U3RhcnQoc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmQoY3VycmVudFN0YXJ0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVN0b3JlLnNldEVuZChzZWxlY3RlZERhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhcHBseVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzUGVuZGluZ0NoYW5nZXMoKSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIEFwcGx5IHBlbmRpbmcgZGF0ZXMgdGhyb3VnaCBzdG9yZVxuICAgIHRoaXMucmFuZ2VTdG9yZS5hcHBseVBlbmRpbmcoKTtcbiAgICBcbiAgICAvLyBFbWl0IGNoYW5nZXNcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgICBcbiAgICAvLyBDbG9zZSBwaWNrZXJcbiAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gIH1cblxuICBjYW5jZWxTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gRGlzY2FyZCBwZW5kaW5nIGNoYW5nZXMgdGhyb3VnaCBzdG9yZVxuICAgIHRoaXMucmFuZ2VTdG9yZS5jYW5jZWxQZW5kaW5nKCk7XG4gICAgXG4gICAgLy8gUmVnZW5lcmF0ZSBjYWxlbmRhcnMgdG8gY2xlYXIgcGVuZGluZyB2aXN1YWwgc3RhdGVcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBjaGFuZ2VNb250aChkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRNb250aFZhbHVlID0gdGhpcy5jdXJyZW50TW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5kYXRlQWRhcHRlci5nZXRZZWFyKGN1cnJlbnRNb250aFZhbHVlKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoY3VycmVudE1vbnRoVmFsdWUpO1xuICAgIGNvbnN0IG5ld0N1cnJlbnRNb250aCA9IHRoaXMuZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCArIGRpcmVjdGlvbiwgMSk7XG4gICAgdGhpcy5jdXJyZW50TW9udGguc2V0KG5ld0N1cnJlbnRNb250aCk7XG4gICAgXG4gICAgY29uc3QgbmV3WWVhciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihuZXdDdXJyZW50TW9udGgpO1xuICAgIGNvbnN0IG5ld01vbnRoID0gdGhpcy5kYXRlQWRhcHRlci5nZXRNb250aChuZXdDdXJyZW50TW9udGgpO1xuICAgIGNvbnN0IG5ld1ByZXZpb3VzTW9udGggPSB0aGlzLmRhdGVBZGFwdGVyLmNyZWF0ZURhdGUobmV3WWVhciwgbmV3TW9udGggLSAxLCAxKTtcbiAgICB0aGlzLnByZXZpb3VzTW9udGguc2V0KG5ld1ByZXZpb3VzTW9udGgpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIGdldE1vbnRoTmFtZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb250aE5hbWVzID0gdGhpcy5sb2NhbGUubW9udGhOYW1lcyB8fCB0aGlzLmRlZmF1bHRNb250aE5hbWVzO1xuICAgIHJldHVybiBgJHttb250aE5hbWVzW3RoaXMuZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZGF0ZSldfSAke3RoaXMuZGF0ZUFkYXB0ZXIuZ2V0WWVhcihkYXRlKX1gO1xuICB9XG5cbiAgZ2V0RGF5TmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZS5kYXlOYW1lc1Nob3J0IHx8IHRoaXMuZGVmYXVsdERheU5hbWVzU2hvcnQ7XG4gIH1cblxuICBzZWxlY3RQcmVzZXRSYW5nZShwcmVzZXQ6IFByZXNldENvbmZpZyk6IHZvaWQge1xuICAgIGlmICghcHJlc2V0LmdldFZhbHVlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdQcmVzZXRDb25maWcgbXVzdCBoYXZlIGdldFZhbHVlKCkgZnVuY3Rpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByYW5nZSA9IHByZXNldC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UocmFuZ2Uuc3RhcnQpO1xuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHJhbmdlLmVuZCk7XG4gICAgXG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XG4gICAgICB0aGlzLnJhbmdlU3RvcmUuc2V0UmFuZ2Uoc3RhcnREYXRlLCBlbmREYXRlKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgIGlmICh0aGlzLmNsb3NlT25QcmVzZXRTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIuc2V0KGZhbHNlKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnJhbmdlU3RvcmUucmVzZXQoKTtcbiAgICB0aGlzLnNob3dEYXRlUGlja2VyLnNldChmYWxzZSk7XG4gICAgXG4gICAgaWYgKHRoaXMubXVsdGlSYW5nZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlcy5zZXQoW10pO1xuICAgICAgdGhpcy5jdXJyZW50UmFuZ2VJbmRleC5zZXQoLTEpO1xuICAgICAgdGhpcy5lbWl0TXVsdGlDaGFuZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICB9XG4gIFxuICByZW1vdmVSYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpUmFuZ2UpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBjdXJyZW50UmFuZ2VzID0gWy4uLnRoaXMuc2VsZWN0ZWRSYW5nZXMoKV07XG4gICAgY3VycmVudFJhbmdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuc2VsZWN0ZWRSYW5nZXMuc2V0KGN1cnJlbnRSYW5nZXMpO1xuICAgIFxuICAgIHRoaXMudXBkYXRlTXVsdGlSYW5nZVRleHQoKTtcbiAgICB0aGlzLmVtaXRNdWx0aUNoYW5nZSgpO1xuICAgIHRoaXMuZW1pdE11bHRpU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICB9XG4gIFxuICBwcml2YXRlIHVwZGF0ZU11bHRpUmFuZ2VUZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZFJhbmdlcygpLmxlbmd0aDtcbiAgICAvLyBOb3RlOiBkYXRlUmFuZ2VUZXh0IGlzIG5vdyBjb21wdXRlZCBmcm9tIHN0b3JlLCB0aGlzIGlzIGZvciBtdWx0aS1yYW5nZSBVSSBvbmx5XG4gICAgLy8gV2UgY291bGQgc3RvcmUgdGhpcyBpbiBhIHNlcGFyYXRlIHNpZ25hbCBpZiBuZWVkZWQsIGJ1dCBmb3Igbm93IGp1c3QgdHJhY2sgcmFuZ2VzIGNvdW50XG4gIH1cblxuICBwcml2YXRlIGVtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RvcmVSYW5nZSA9IHRoaXMucmFuZ2VTdG9yZS5yYW5nZSgpO1xuICAgIGNvbnN0IHJhbmdlOiBEYXRlUmFuZ2UgPSB7XG4gICAgICBzdGFydERhdGU6IHN0b3JlUmFuZ2Uuc3RhcnQsXG4gICAgICBlbmREYXRlOiBzdG9yZVJhbmdlLmVuZCxcbiAgICAgIHJhbmdlVGV4dDogdGhpcy5kYXRlUmFuZ2VUZXh0KClcbiAgICB9O1xuICAgIFxuICAgIGlmICh0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICAgIHJhbmdlLnN0YXJ0VGltZSA9IHN0b3JlUmFuZ2Uuc3RhcnRUaW1lO1xuICAgICAgcmFuZ2UuZW5kVGltZSA9IHN0b3JlUmFuZ2UuZW5kVGltZTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdChyYW5nZSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc3RvcmVSYW5nZSA9IHRoaXMucmFuZ2VTdG9yZS5yYW5nZSgpO1xuICAgIGNvbnN0IHJhbmdlOiBEYXRlUmFuZ2UgPSB7XG4gICAgICBzdGFydERhdGU6IHN0b3JlUmFuZ2Uuc3RhcnQsXG4gICAgICBlbmREYXRlOiBzdG9yZVJhbmdlLmVuZCxcbiAgICAgIHJhbmdlVGV4dDogdGhpcy5kYXRlUmFuZ2VUZXh0KClcbiAgICB9O1xuICAgIFxuICAgIGlmICh0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICAgIHJhbmdlLnN0YXJ0VGltZSA9IHN0b3JlUmFuZ2Uuc3RhcnRUaW1lO1xuICAgICAgcmFuZ2UuZW5kVGltZSA9IHN0b3JlUmFuZ2UuZW5kVGltZTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5kYXRlUmFuZ2VTZWxlY3RlZC5lbWl0KHJhbmdlKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBlbWl0TXVsdGlDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5tdWx0aURhdGVSYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgIHJhbmdlczogdGhpcy5zZWxlY3RlZFJhbmdlcygpXG4gICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgZW1pdE11bHRpU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMubXVsdGlEYXRlUmFuZ2VTZWxlY3RlZC5lbWl0KHtcbiAgICAgIHJhbmdlczogdGhpcy5zZWxlY3RlZFJhbmdlcygpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldERhdGVSYW5nZVZhbHVlKCk6IERhdGVSYW5nZSB7XG4gICAgY29uc3Qgc3RvcmVSYW5nZSA9IHRoaXMucmFuZ2VTdG9yZS5yYW5nZSgpO1xuICAgIGNvbnN0IHJhbmdlOiBEYXRlUmFuZ2UgPSB7XG4gICAgICBzdGFydERhdGU6IHN0b3JlUmFuZ2Uuc3RhcnQsXG4gICAgICBlbmREYXRlOiBzdG9yZVJhbmdlLmVuZCxcbiAgICAgIHJhbmdlVGV4dDogdGhpcy5kYXRlUmFuZ2VUZXh0KClcbiAgICB9O1xuICAgIFxuICAgIGlmICh0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICAgIHJhbmdlLnN0YXJ0VGltZSA9IHN0b3JlUmFuZ2Uuc3RhcnRUaW1lO1xuICAgICAgcmFuZ2UuZW5kVGltZSA9IHN0b3JlUmFuZ2UuZW5kVGltZTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG5cbiAgLy8gVGltZSBQaWNrZXIgTWV0aG9kc1xuICB0b2dnbGVTdGFydFRpbWVQaWNrZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHJldHVybjtcbiAgICB0aGlzLnNob3dTdGFydFRpbWVQaWNrZXIuc2V0KCF0aGlzLnNob3dTdGFydFRpbWVQaWNrZXIoKSk7XG4gICAgdGhpcy5zaG93RW5kVGltZVBpY2tlci5zZXQoZmFsc2UpO1xuICB9XG5cbiAgdG9nZ2xlRW5kVGltZVBpY2tlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlVGltZVBpY2tlcikgcmV0dXJuO1xuICAgIHRoaXMuc2hvd0VuZFRpbWVQaWNrZXIuc2V0KCF0aGlzLnNob3dFbmRUaW1lUGlja2VyKCkpO1xuICAgIHRoaXMuc2hvd1N0YXJ0VGltZVBpY2tlci5zZXQoZmFsc2UpO1xuICB9XG5cbiAgaW5jcmVtZW50U3RhcnRIb3VyKCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0hvdXIgPSAodGhpcy5zdGFydEhvdXIgKyAxKSAlIDI0O1xuICAgIHRoaXMuc2V0U3RhcnRIb3VyTWludXRlKG5ld0hvdXIsIHRoaXMuc3RhcnRNaW51dGUpO1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlbWVudFN0YXJ0SG91cigpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdIb3VyID0gdGhpcy5zdGFydEhvdXIgPT09IDAgPyAyMyA6IHRoaXMuc3RhcnRIb3VyIC0gMTtcbiAgICB0aGlzLnNldFN0YXJ0SG91ck1pbnV0ZShuZXdIb3VyLCB0aGlzLnN0YXJ0TWludXRlKTtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBpbmNyZW1lbnRTdGFydE1pbnV0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdNaW51dGUgPSAodGhpcy5zdGFydE1pbnV0ZSArIHRoaXMubWludXRlU3RlcCkgJSA2MDtcbiAgICB0aGlzLnNldFN0YXJ0SG91ck1pbnV0ZSh0aGlzLnN0YXJ0SG91ciwgbmV3TWludXRlKTtcbiAgICBpZiAoIXRoaXMucmVxdWlyZUFwcGx5KSB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBkZWNyZW1lbnRTdGFydE1pbnV0ZSgpOiB2b2lkIHtcbiAgICBsZXQgbmV3TWludXRlID0gdGhpcy5zdGFydE1pbnV0ZSAtIHRoaXMubWludXRlU3RlcDtcbiAgICBpZiAobmV3TWludXRlIDwgMCkge1xuICAgICAgbmV3TWludXRlID0gNjAgLSB0aGlzLm1pbnV0ZVN0ZXA7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhcnRIb3VyTWludXRlKHRoaXMuc3RhcnRIb3VyLCBuZXdNaW51dGUpO1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGluY3JlbWVudEVuZEhvdXIoKTogdm9pZCB7XG4gICAgY29uc3QgbmV3SG91ciA9ICh0aGlzLmVuZEhvdXIgKyAxKSAlIDI0O1xuICAgIHRoaXMuc2V0RW5kSG91ck1pbnV0ZShuZXdIb3VyLCB0aGlzLmVuZE1pbnV0ZSk7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgZGVjcmVtZW50RW5kSG91cigpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdIb3VyID0gdGhpcy5lbmRIb3VyID09PSAwID8gMjMgOiB0aGlzLmVuZEhvdXIgLSAxO1xuICAgIHRoaXMuc2V0RW5kSG91ck1pbnV0ZShuZXdIb3VyLCB0aGlzLmVuZE1pbnV0ZSk7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVBcHBseSkge1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgaW5jcmVtZW50RW5kTWludXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IG5ld01pbnV0ZSA9ICh0aGlzLmVuZE1pbnV0ZSArIHRoaXMubWludXRlU3RlcCkgJSA2MDtcbiAgICB0aGlzLnNldEVuZEhvdXJNaW51dGUodGhpcy5lbmRIb3VyLCBuZXdNaW51dGUpO1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlbWVudEVuZE1pbnV0ZSgpOiB2b2lkIHtcbiAgICBsZXQgbmV3TWludXRlID0gdGhpcy5lbmRNaW51dGUgLSB0aGlzLm1pbnV0ZVN0ZXA7XG4gICAgaWYgKG5ld01pbnV0ZSA8IDApIHtcbiAgICAgIG5ld01pbnV0ZSA9IDYwIC0gdGhpcy5taW51dGVTdGVwO1xuICAgIH1cbiAgICB0aGlzLnNldEVuZEhvdXJNaW51dGUodGhpcy5lbmRIb3VyLCBuZXdNaW51dGUpO1xuICAgIGlmICghdGhpcy5yZXF1aXJlQXBwbHkpIHtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdFRpbWUoaG91cjogbnVtYmVyLCBtaW51dGU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaCA9IGhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG0gPSBtaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIFxuICAgIGlmICh0aGlzLnRpbWVGb3JtYXQgPT09ICcxMmgnKSB7XG4gICAgICBjb25zdCBpc1BNID0gaG91ciA+PSAxMjtcbiAgICAgIGNvbnN0IGhvdXIxMiA9IGhvdXIgPT09IDAgPyAxMiA6IGhvdXIgPiAxMiA/IGhvdXIgLSAxMiA6IGhvdXI7XG4gICAgICBjb25zdCBwZXJpb2QgPSBpc1BNID8gJ1BNJyA6ICdBTSc7XG4gICAgICByZXR1cm4gYCR7aG91cjEyLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX06JHttfSAke3BlcmlvZH1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYCR7aH06JHttfWA7XG4gIH1cblxuICBwYXJzZVRpbWUodGltZVN0cmluZzogc3RyaW5nKTogeyBob3VyOiBudW1iZXI7IG1pbnV0ZTogbnVtYmVyIH0ge1xuICAgIGlmICghdGltZVN0cmluZykgcmV0dXJuIHsgaG91cjogMCwgbWludXRlOiAwIH07XG4gICAgXG4gICAgY29uc3QgdGltZTEyaFJlZ2V4ID0gL14oXFxkezEsMn0pOihcXGR7Mn0pXFxzPyhBTXxQTSkkL2k7XG4gICAgY29uc3QgdGltZTI0aFJlZ2V4ID0gL14oXFxkezEsMn0pOihcXGR7Mn0pJC87XG4gICAgXG4gICAgbGV0IG1hdGNoID0gdGltZVN0cmluZy5tYXRjaCh0aW1lMTJoUmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgICAgY29uc3QgbWludXRlID0gcGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcbiAgICAgIGNvbnN0IHBlcmlvZCA9IG1hdGNoWzNdLnRvVXBwZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIGlmIChwZXJpb2QgPT09ICdQTScgJiYgaG91ciAhPT0gMTIpIGhvdXIgKz0gMTI7XG4gICAgICBpZiAocGVyaW9kID09PSAnQU0nICYmIGhvdXIgPT09IDEyKSBob3VyID0gMDtcbiAgICAgIFxuICAgICAgcmV0dXJuIHsgaG91ciwgbWludXRlIH07XG4gICAgfVxuICAgIFxuICAgIG1hdGNoID0gdGltZVN0cmluZy5tYXRjaCh0aW1lMjRoUmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaG91cjogcGFyc2VJbnQobWF0Y2hbMV0sIDEwKSxcbiAgICAgICAgbWludXRlOiBwYXJzZUludChtYXRjaFsyXSwgMTApXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4geyBob3VyOiAwLCBtaW51dGU6IDAgfTtcbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4gIHdyaXRlVmFsdWUodmFsdWU6IERhdGVSYW5nZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIC8vIFVzZSBzZXR0ZXJzIHdoaWNoIGRlbGVnYXRlIHRvIHN0b3JlXG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHZhbHVlLnN0YXJ0RGF0ZSB8fCAnJztcbiAgICAgIHRoaXMuZW5kRGF0ZSA9IHZhbHVlLmVuZERhdGUgfHwgJyc7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0VGltZSkge1xuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRTdGFydFRpbWUodmFsdWUuc3RhcnRUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUuZW5kVGltZSkge1xuICAgICAgICAgIHRoaXMucmFuZ2VTdG9yZS5zZXRFbmRUaW1lKHZhbHVlLmVuZFRpbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSAmJiB0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFycygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJhbmdlU3RvcmUucmVzZXQoKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IERhdGVSYW5nZSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci13cmFwcGVyXCIgXG4gIFtjbGFzc109XCIndGhlbWUtJyArIHRoZW1lXCJcbiAgW3N0eWxlLi0taW5wdXQtYm9yZGVyLWhvdmVyXT1cImlucHV0Qm9yZGVyQ29sb3JIb3ZlclwiXG4gIFtzdHlsZS4tLWlucHV0LWJvcmRlci1mb2N1c109XCJpbnB1dEJvcmRlckNvbG9yRm9jdXNcIj5cbiAgPGlucHV0IFxuICAgIHR5cGU9XCJ0ZXh0XCIgXG4gICAgY2xhc3M9XCJkYXRlcGlja2VyLWlucHV0XCIgXG4gICAgW3ZhbHVlXT1cImRhdGVSYW5nZVRleHQoKVwiIFxuICAgIChjbGljayk9XCJ0b2dnbGVEYXRlUGlja2VyKClcIiBcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicGxhY2Vob2xkZXJcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd0RhdGVQaWNrZXIoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInZGlhbG9nJ1wiXG4gICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGlucHV0QmFja2dyb3VuZENvbG9yLFxuICAgICAgJ2NvbG9yJzogaW5wdXRUZXh0Q29sb3IsXG4gICAgICAnYm9yZGVyLWNvbG9yJzogaW5wdXRCb3JkZXJDb2xvcixcbiAgICAgICdwYWRkaW5nJzogaW5wdXRQYWRkaW5nXG4gICAgfVwiXG4gICAgcmVhZG9ubHk+XG5cbiAgQGlmIChzaG93RGF0ZVBpY2tlcigpKSB7XG4gIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1kcm9wZG93blwiPlxuICAgIEBpZiAoc2hvd1ByZXNldHMpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItcHJlc2V0c1wiPlxuICAgICAgQGZvciAocHJlc2V0IG9mIHByZXNldHM7IHRyYWNrIHByZXNldC5sYWJlbCkge1xuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbGVjdFByZXNldFJhbmdlKHByZXNldClcIj57eyBwcmVzZXQubGFiZWwgfX08L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlLWNhbGVuZGFyXCIgKGNsaWNrKT1cImNsb3NlRGF0ZVBpY2tlcigpXCIgdGl0bGU9XCJDbG9zZVwiPlxuICAgICAgICDDl1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmICghc2hvd1ByZXNldHMpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItaGVhZGVyLW9ubHktY2xvc2VcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlLWNhbGVuZGFyXCIgKGNsaWNrKT1cImNsb3NlRGF0ZVBpY2tlcigpXCIgdGl0bGU9XCJDbG9zZVwiPlxuICAgICAgICDDl1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBDYWxlbmRhcnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWNhbGVuZGFyc1wiPlxuICAgICAgPCEtLSBQcmV2aW91cyBtb250aCBjYWxlbmRhciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jYWxlbmRhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNoYW5nZU1vbnRoKC0xKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMS4zNTQgMS42NDZhLjUuNSAwIDAgMSAwIC43MDhMNS43MDcgOGw1LjY0NyA1LjY0NmEuNS41IDAgMCAxLS43MDguNzA4bC02LTZhLjUuNSAwIDAgMSAwLS43MDhsNi02YS41LjUgMCAwIDEgLjcwOCAwelwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuPnt7IHByZXZpb3VzTW9udGhOYW1lKCkgfX08L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNjQ2IDEuNjQ2YS41LjUgMCAwIDEgLjcwOCAwbDYgNmEuNS41IDAgMCAxIDAgLjcwOGwtNiA2YS41LjUgMCAwIDEtLjcwOC0uNzA4TDEwLjI5MyA4IDQuNjQ2IDIuMzU0YS41LjUgMCAwIDEgMC0uNzA4elwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLXdlZWtkYXlzXCI+XG4gICAgICAgICAgQGZvciAoZGF5TmFtZSBvZiB3ZWVrRGF5TmFtZXMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8c3Bhbj57eyBkYXlOYW1lIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1kYXlzXCI+XG4gICAgICAgICAgQGZvciAoZGF5T2JqIG9mIHByZXZpb3VzTW9udGhWaXNpYmxlRGF5cygpOyB0cmFjayBkYXlPYmouZGF0ZSB8fCAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWRheVwiIFxuICAgICAgICAgICAgICBbY2xhc3MuZW1wdHldPVwiIWRheU9iai5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXlPYmouaXNTdGFydCB8fCBkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiZGF5T2JqLmluUmFuZ2UgJiYgIWRheU9iai5pc1N0YXJ0ICYmICFkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4taG92ZXItcmFuZ2VdPVwiZGF5T2JqLmluSG92ZXJSYW5nZSAmJiAhZGF5T2JqLmlzU3RhcnQgJiYgIWRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXlPYmouaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5rZXlib2FyZC1mb2N1c2VkXT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBoYXNLZXlib2FyZEZvY3VzKGRheU9iai5kYXRlLCAwKVwiXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBkYXlPYmouaXNDdXJyZW50TW9udGggJiYgaGFzS2V5Ym9hcmRGb2N1cyhkYXlPYmouZGF0ZSwgMCkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERhdGVEaXNwbGF5KGRheU9iai5kYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZGF5T2JqLmlzU3RhcnQgfHwgZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheU9iai5pc1N0YXJ0ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5T2JqLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJjbGVhckRheUhvdmVyKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRheU9iai5pc0N1cnJlbnRNb250aCB8fCBkYXlPYmouaXNEaXNhYmxlZFwiPlxuICAgICAgICAgICAgICB7eyBkYXlPYmouZGF5IH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ3VycmVudCBtb250aCBjYWxlbmRhciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jYWxlbmRhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTExLjM1NCAxLjY0NmEuNS41IDAgMCAxIDAgLjcwOEw1LjcwNyA4bDUuNjQ3IDUuNjQ2YS41LjUgMCAwIDEtLjcwOC43MDhsLTYtNmEuNS41IDAgMCAxIDAtLjcwOGw2LTZhLjUuNSAwIDAgMSAuNzA4IDB6XCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4+e3sgY3VycmVudE1vbnRoTmFtZSgpIH19PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjaGFuZ2VNb250aCgxKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk00LjY0NiAxLjY0NmEuNS41IDAgMCAxIC43MDggMGw2IDZhLjUuNSAwIDAgMSAwIC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDgtLjcwOEwxMC4yOTMgOCA0LjY0NiAyLjM1NGEuNS41IDAgMCAxIDAtLjcwOHpcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci13ZWVrZGF5c1wiPlxuICAgICAgICAgIEBmb3IgKGRheU5hbWUgb2Ygd2Vla0RheU5hbWVzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHNwYW4+e3sgZGF5TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItZGF5c1wiPlxuICAgICAgICAgIEBmb3IgKGRheU9iaiBvZiBjdXJyZW50TW9udGhWaXNpYmxlRGF5cygpOyB0cmFjayBkYXlPYmouZGF0ZSB8fCAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLWRheVwiIFxuICAgICAgICAgICAgICBbY2xhc3MuZW1wdHldPVwiIWRheU9iai5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXlPYmouaXNTdGFydCB8fCBkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiZGF5T2JqLmluUmFuZ2UgJiYgIWRheU9iai5pc1N0YXJ0ICYmICFkYXlPYmouaXNFbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW4taG92ZXItcmFuZ2VdPVwiZGF5T2JqLmluSG92ZXJSYW5nZSAmJiAhZGF5T2JqLmlzU3RhcnQgJiYgIWRheU9iai5pc0VuZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXlPYmouaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5rZXlib2FyZC1mb2N1c2VkXT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBoYXNLZXlib2FyZEZvY3VzKGRheU9iai5kYXRlLCAxKVwiXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImVuYWJsZUtleWJvYXJkTmF2aWdhdGlvbiAmJiBkYXlPYmouaXNDdXJyZW50TW9udGggJiYgaGFzS2V5Ym9hcmRGb2N1cyhkYXlPYmouZGF0ZSwgMSkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERhdGVEaXNwbGF5KGRheU9iai5kYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiZGF5T2JqLmlzU3RhcnQgfHwgZGF5T2JqLmlzRW5kXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheU9iai5pc1N0YXJ0ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5T2JqLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkRheUhvdmVyKGRheU9iailcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJjbGVhckRheUhvdmVyKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRheU9iai5pc0N1cnJlbnRNb250aCB8fCBkYXlPYmouaXNEaXNhYmxlZFwiPlxuICAgICAgICAgICAgICB7eyBkYXlPYmouZGF5IH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE11bHRpLVJhbmdlIExpc3QgLS0+XG4gICAgQGlmIChtdWx0aVJhbmdlICYmIHNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoID4gMCkge1xuICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1yYW5nZS1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaGVhZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGktcmFuZ2UtdGl0bGVcIj5TZWxlY3RlZCBSYW5nZXMgKHt7IHNlbGVjdGVkUmFuZ2VzKCkubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXJhbmdlLWl0ZW1zXCI+XG4gICAgICAgIEBmb3IgKHJhbmdlIG9mIHNlbGVjdGVkUmFuZ2VzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktcmFuZ2UtaXRlbVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGktcmFuZ2UtdGV4dFwiPnt7IHJhbmdlLnJhbmdlVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgY2xhc3M9XCJidG4tcmVtb3ZlLXJhbmdlXCIgXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUmFuZ2UoJGluZGV4KVwiXG4gICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSB0aGlzIHJhbmdlXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMi4xNDYgMi44NTRhLjUuNSAwIDEgMSAuNzA4LS43MDhMOCA3LjI5M2w1LjE0Ni01LjE0N2EuNS41IDAgMCAxIC43MDguNzA4TDguNzA3IDhsNS4xNDcgNS4xNDZhLjUuNSAwIDAgMS0uNzA4LjcwOEw4IDguNzA3bC01LjE0NiA1LjE0N2EuNS41IDAgMCAxLS43MDgtLjcwOEw3LjI5MyA4IDIuMTQ2IDIuODU0WlwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBUaW1lIFBpY2tlciAtLT5cbiAgICBAaWYgKGVuYWJsZVRpbWVQaWNrZXIpIHtcbiAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItY29udGFpbmVyXCI+XG4gICAgICA8IS0tIFN0YXJ0IFRpbWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItbGFiZWxcIj5TdGFydCBUaW1lPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1pbnB1dHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLXVwXCIgXG4gICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRTdGFydEhvdXIoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiSW5jcmVtZW50IGhvdXJcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzdGFydEhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJTdGFydCBob3VyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tZG93blwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U3RhcnRIb3VyKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBob3VyXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTcuMjQ3IDExLjE0bC00Ljc5Ni01LjQ4MUMxLjg4NSA1LjAxMyAyLjM0NSA0IDMuMjA0IDRoOS41OTJhMSAxIDAgMCAxIC43NTMgMS42NTlsLTQuNzk2IDUuNDhhMSAxIDAgMCAxLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIj46PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tdXBcIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudFN0YXJ0TWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkluY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzdGFydE1pbnV0ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcIlxuICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICB0aXRsZT1cIlN0YXJ0IG1pbnV0ZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLWRvd25cIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudFN0YXJ0TWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICh0aW1lRm9ybWF0ID09PSAnMTJoJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBlcmlvZFwiPlxuICAgICAgICAgICAge3sgc3RhcnRIb3VyID49IDEyID8gJ1BNJyA6ICdBTScgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VwYXJhdG9yIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yLXZlcnRpY2FsXCI+PC9kaXY+XG5cbiAgICAgIDwhLS0gRW5kIFRpbWUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItbGFiZWxcIj5FbmQgVGltZTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItaW5wdXRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi11cFwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50RW5kSG91cigpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJJbmNyZW1lbnQgaG91clwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjI0NyA0Ljg2bC00Ljc5NiA1LjQ4MWMtLjU2Ni42NDctLjEwNiAxLjY1OS43NTMgMS42NTloOS41OTJhMSAxIDAgMCAwIC43NTMtMS42NTlsLTQuNzk2LTUuNDhhMSAxIDAgMCAwLTEuNTA2IDB6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImVuZEhvdXIudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJFbmQgaG91clwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuIHRpbWUtYnRuLWRvd25cIiBcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudEVuZEhvdXIoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRGVjcmVtZW50IGhvdXJcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiPjo8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0biB0aW1lLWJ0bi11cFwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50RW5kTWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkluY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgNC44NmwtNC43OTYgNS40ODFjLS41NjYuNjQ3LS4xMDYgMS42NTkuNzUzIDEuNjU5aDkuNTkyYTEgMSAwIDAgMCAuNzUzLTEuNjU5bC00Ljc5Ni01LjQ4YTEgMSAwIDAgMC0xLjUwNiAwelwiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJlbmRNaW51dGUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgdGl0bGU9XCJFbmQgbWludXRlXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG4gdGltZS1idG4tZG93blwiIFxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50RW5kTWludXRlKClcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkRlY3JlbWVudCBtaW51dGVcIj5cbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNy4yNDcgMTEuMTRsLTQuNzk2LTUuNDgxQzEuODg1IDUuMDEzIDIuMzQ1IDQgMy4yMDQgNGg5LjU5MmExIDEgMCAwIDEgLjc1MyAxLjY1OWwtNC43OTYgNS40OGExIDEgMCAwIDEtMS41MDYgMHpcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmICh0aW1lRm9ybWF0ID09PSAnMTJoJykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBlcmlvZFwiPlxuICAgICAgICAgICAge3sgZW5kSG91ciA+PSAxMiA/ICdQTScgOiAnQU0nIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gRm9vdGVyIHdpdGggYnV0dG9ucyAtLT5cbiAgICBAaWYgKHNob3dDbGVhckJ1dHRvbiB8fCBtdWx0aVJhbmdlIHx8IHJlcXVpcmVBcHBseSkge1xuICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1mb290ZXJcIj5cbiAgICAgIEBpZiAocmVxdWlyZUFwcGx5ICYmICFtdWx0aVJhbmdlKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHBseS1mb290ZXItYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1jYW5jZWxcIiBcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxTZWxlY3Rpb24oKVwiIFxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNQZW5kaW5nQ2hhbmdlcygpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiQ2FuY2VsIHNlbGVjdGlvblwiPlxuICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFwcGx5XCIgXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlTZWxlY3Rpb24oKVwiIFxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNQZW5kaW5nQ2hhbmdlcygpIHx8ICFwZW5kaW5nU3RhcnREYXRlIHx8ICFwZW5kaW5nRW5kRGF0ZVwiXG4gICAgICAgICAgICB0aXRsZT1cIkFwcGx5IHNlbGVjdGlvblwiPlxuICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKG11bHRpUmFuZ2UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXJhbmdlLWZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xlYXJcIiAoY2xpY2spPVwiY2xlYXIoKVwiIHRpdGxlPVwiQ2xlYXIgYWxsIHJhbmdlc1wiPlxuICAgICAgICAgICAgQ2xlYXIgQWxsXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tZG9uZVwiIChjbGljayk9XCJjbG9zZURhdGVQaWNrZXIoKVwiIHRpdGxlPVwiRG9uZSBzZWxlY3RpbmdcIj5cbiAgICAgICAgICAgIERvbmVcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKCFtdWx0aVJhbmdlICYmICFyZXF1aXJlQXBwbHkgJiYgc2hvd0NsZWFyQnV0dG9uKSB7XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsZWFyXCIgKGNsaWNrKT1cImNsZWFyKClcIiB0aXRsZT1cIkNsZWFyIHNlbGVjdGlvblwiPlxuICAgICAgICAgIENsZWFyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19
|