@datarailsshared/datarailsshared 1.6.265 → 1.6.269

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.
@@ -1,43 +1,74 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, inject } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, inject, signal } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
2
3
  import { CommonModule } from '@angular/common';
3
4
  import { MatCalendar } from '@angular/material/datepicker';
4
- import { startWith, Subject, takeUntil } from 'rxjs';
5
+ import { delay, startWith } from 'rxjs';
5
6
  import { DrDatePickerService } from '../services/dr-date-picker.service';
6
7
  import moment from 'moment';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/common";
9
- function WeekSelectorComponent_div_4_Template(rf, ctx) { if (rf & 1) {
10
- const _r3 = i0.ɵɵgetCurrentView();
11
- i0.ɵɵelementStart(0, "div", 5);
12
- i0.ɵɵlistener("click", function WeekSelectorComponent_div_4_Template_div_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r3); const week_r1 = restoredCtx.$implicit; const ctx_r2 = i0.ɵɵnextContext(); ctx_r2.service.datePickerInstance.close(); return i0.ɵɵresetView(ctx_r2.service.weekSelectionChange$.next(week_r1)); });
13
- i0.ɵɵtext(1);
14
- i0.ɵɵelementEnd();
10
+ function WeekSelectorComponent_li_4_Template(rf, ctx) { if (rf & 1) {
11
+ const _r4 = i0.ɵɵgetCurrentView();
12
+ i0.ɵɵelementStart(0, "li")(1, "button", 5);
13
+ i0.ɵɵlistener("focus", function WeekSelectorComponent_li_4_Template_button_focus_1_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r4); const i_r2 = restoredCtx.index; const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.toggleWeekPreview($event, i_r2, true)); })("blur", function WeekSelectorComponent_li_4_Template_button_blur_1_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r4); const i_r2 = restoredCtx.index; const ctx_r5 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r5.toggleWeekPreview($event, i_r2, false)); })("mouseover", function WeekSelectorComponent_li_4_Template_button_mouseover_1_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r4); const i_r2 = restoredCtx.index; const ctx_r6 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r6.toggleWeekPreview($event, i_r2, true)); })("mouseleave", function WeekSelectorComponent_li_4_Template_button_mouseleave_1_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r4); const i_r2 = restoredCtx.index; const ctx_r7 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r7.toggleWeekPreview($event, i_r2, false)); })("click", function WeekSelectorComponent_li_4_Template_button_click_1_listener() { const restoredCtx = i0.ɵɵrestoreView(_r4); const week_r1 = restoredCtx.$implicit; const ctx_r8 = i0.ɵɵnextContext(); ctx_r8.service.datePickerInstance.close(); return i0.ɵɵresetView(ctx_r8.service.weekSelectionChange$.next(week_r1)); });
14
+ i0.ɵɵtext(2);
15
+ i0.ɵɵelementEnd()();
15
16
  } if (rf & 2) {
16
17
  const week_r1 = ctx.$implicit;
17
- i0.ɵɵclassProp("selected", week_r1.selected);
18
+ const i_r2 = ctx.index;
19
+ const ctx_r0 = i0.ɵɵnextContext();
20
+ i0.ɵɵadvance(1);
21
+ i0.ɵɵclassProp("previewed", i_r2 === ctx_r0.previewedWeek())("selected", week_r1.selected);
22
+ i0.ɵɵattribute("aria-current", week_r1.selected)("aria-label", "Week " + week_r1.yearWeekNumber);
18
23
  i0.ɵɵadvance(1);
19
24
  i0.ɵɵtextInterpolate1(" W", week_r1.yearWeekNumber, " ");
20
25
  } }
26
+ /**
27
+ * Provides week-based interaction for Angular Material `MatCalendar`.
28
+ * The component renders a list of weeks for the currently active month
29
+ * and keeps it synchronized with the calendar hover (preview) and selection state.
30
+ *
31
+ * Key responsibilities:
32
+ * - Derive logical weeks from the calendar's active month.
33
+ * - Detect which calendar week is currently previewed/selected and reflect it in the UI.
34
+ *
35
+ * ⚠ Stability note:
36
+ * - `_matCalendarBody` and `previewChange` are **private Angular Material APIs**.
37
+ * - This component may require adjustments after Angular Material upgrades.
38
+ * - Related upgrade considerations are documented in `UPGRADE_CHECKLIST.md`.
39
+ *
40
+ * If private API is going to change, and we don't have access to with properties,
41
+ * check the following commit with class and mutation observable implementation:
42
+ * https://github.com/Datarails/datarailsshared/pull/126/commits/590152cff0448c5f48bff32f9cb165bbf464112b
43
+ */
21
44
  export class WeekSelectorComponent {
22
45
  constructor() {
23
46
  this.service = inject(DrDatePickerService);
24
47
  this.calendar = inject(MatCalendar);
25
- this.cdr = inject(ChangeDetectorRef);
26
- this.destroy$ = new Subject();
27
- this.currentMonthWeeks = [];
28
- inject(DestroyRef, { skipSelf: true }).onDestroy(() => {
29
- this.destroy$.next();
30
- this.destroy$.complete();
48
+ this.destroyRef = inject(DestroyRef);
49
+ this.calendarBody = null;
50
+ this.previewedWeek = signal(-1);
51
+ this.currentMonthWeeks = signal([]);
52
+ this.calendar.stateChanges.pipe(startWith(null), delay(0), takeUntilDestroyed()).subscribe(() => {
53
+ const activeDate = moment(this.calendar.activeDate);
54
+ const selectedRange = this.calendar.selected;
55
+ this.currentMonthWeeks.set(this.getWeeksInMonth(activeDate, selectedRange));
31
56
  });
32
- this.calendar.stateChanges.pipe(startWith(null), takeUntil(this.destroy$)).subscribe(() => {
33
- setTimeout(() => {
34
- const activeDate = moment(this.calendar.activeDate);
35
- const selectedRange = this.calendar.selected;
36
- this.currentMonthWeeks = this.getWeeksInMonth(activeDate, selectedRange);
37
- this.cdr.detectChanges();
38
- });
57
+ }
58
+ ngAfterViewInit() {
59
+ // monthView and _matCalendarBody are ViewChild and can be accessed only in AfterViewInit
60
+ this.calendarBody = this.calendar.monthView._matCalendarBody;
61
+ this.calendarBody.previewChange.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {
62
+ const value = event.value ? event.value.rawValue : null;
63
+ this.previewedWeek.set(this.currentMonthWeeks().findIndex((week) => this.isInRange(week.start, value)));
39
64
  });
40
65
  }
66
+ toggleWeekPreview(event, weekIndex, value) {
67
+ if (!this.calendarBody)
68
+ return;
69
+ const weekFestDayCell = this.calendarBody.rows[weekIndex][0];
70
+ this.calendarBody.previewChange.emit({ value: weekFestDayCell?.enabled && value ? weekFestDayCell : null, event });
71
+ }
41
72
  getWeeksInMonth(date, selectedRange) {
42
73
  const weeks = [];
43
74
  const firstDay = moment(date).startOf('month');
@@ -48,12 +79,9 @@ export class WeekSelectorComponent {
48
79
  let weekNumber = 1;
49
80
  while (currentWeekStart.isSameOrBefore(lastWeekEnd)) {
50
81
  const weekEnd = moment(currentWeekStart).endOf('isoWeek');
51
- const days = [];
52
- for (let i = 0; i < 7; i++) {
53
- days.push(moment(currentWeekStart).add(i, 'days'));
54
- }
82
+ const days = this.getWeekDays(currentWeekStart);
55
83
  const isPartial = days.some((day) => !day.isSame(date, 'month'));
56
- const selected = days.some((day) => day.isSame(selectedRange.start, 'day'));
84
+ const selected = this.isInRange(currentWeekStart, selectedRange.start, days);
57
85
  // isoWeek() returns the ISO week number (1-53)
58
86
  const yearWeekNumber = moment(currentWeekStart).isoWeek();
59
87
  weeks.push({
@@ -70,22 +98,28 @@ export class WeekSelectorComponent {
70
98
  }
71
99
  return weeks;
72
100
  }
101
+ isInRange(weekStart, value, days = this.getWeekDays(weekStart)) {
102
+ return days.some((day) => day.isSame(value, 'day'));
103
+ }
104
+ getWeekDays(weekStart) {
105
+ return Array.from(Array(7).keys()).map((i) => moment(weekStart).add(i, 'days'));
106
+ }
73
107
  /** @nocollapse */ static { this.ɵfac = function WeekSelectorComponent_Factory(t) { return new (t || WeekSelectorComponent)(); }; }
74
- /** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: WeekSelectorComponent, selectors: [["dr-week-selector"]], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 6, vars: 1, consts: [[1, "weeks"], [1, "header"], [1, "weeks__container"], ["class", "btn", 3, "selected", "click", 4, "ngFor", "ngForOf"], [1, "weeks-border"], [1, "btn", 3, "click"]], template: function WeekSelectorComponent_Template(rf, ctx) { if (rf & 1) {
108
+ /** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: WeekSelectorComponent, selectors: [["dr-week-selector"]], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 6, vars: 1, consts: [[1, "weeks"], [1, "header"], ["role", "list", "aria-label", "Weeks of the month", 1, "weeks__container"], [4, "ngFor", "ngForOf"], [1, "weeks-border"], [1, "btn", 3, "focus", "blur", "mouseover", "mouseleave", "click"]], template: function WeekSelectorComponent_Template(rf, ctx) { if (rf & 1) {
75
109
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
76
110
  i0.ɵɵtext(2, "Week");
77
111
  i0.ɵɵelementEnd();
78
- i0.ɵɵelementStart(3, "div", 2);
79
- i0.ɵɵtemplate(4, WeekSelectorComponent_div_4_Template, 2, 3, "div", 3);
112
+ i0.ɵɵelementStart(3, "ul", 2);
113
+ i0.ɵɵtemplate(4, WeekSelectorComponent_li_4_Template, 3, 7, "li", 3);
80
114
  i0.ɵɵelementEnd()();
81
115
  i0.ɵɵelement(5, "div", 4);
82
116
  } if (rf & 2) {
83
117
  i0.ɵɵadvance(4);
84
- i0.ɵɵproperty("ngForOf", ctx.currentMonthWeeks);
85
- } }, dependencies: [CommonModule, i1.NgForOf], styles: ["[_nghost-%COMP%]{font-size:14px;line-height:24px;font-weight:400;text-align:center;color:#333;display:flex}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%]{height:100%;flex-direction:column;display:flex}[_nghost-%COMP%] .weeks-border[_ngcontent-%COMP%]{height:100%;width:1px;background-color:#dfe0e3;margin:0 4px}[_nghost-%COMP%] .weeks__container[_ngcontent-%COMP%]{display:flex;flex-direction:column;justify-content:space-between;height:100%}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .header[_ngcontent-%COMP%]{font-weight:600;color:#19181a;padding-bottom:8px;line-height:16px}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{padding:9px 16px;border-radius:40px;cursor:pointer}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]:hover{font-weight:600;background-color:#f2f2fb;color:#4646ce}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .btn.selected[_ngcontent-%COMP%]{font-weight:600;background-color:#4646ce;color:#fff}"], changeDetection: 0 }); }
118
+ i0.ɵɵproperty("ngForOf", ctx.currentMonthWeeks());
119
+ } }, dependencies: [CommonModule, i1.NgForOf], styles: ["[_nghost-%COMP%]{font-size:14px;line-height:24px;font-weight:400;text-align:center;color:#333;display:flex}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%]{height:100%;flex-direction:column;display:flex}[_nghost-%COMP%] .weeks-border[_ngcontent-%COMP%]{height:100%;width:1px;background-color:#dfe0e3;margin:0 4px}[_nghost-%COMP%] .weeks__container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:5px;height:100%;margin:0;padding:0;list-style:none}[_nghost-%COMP%] .weeks__container[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{flex:1}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .header[_ngcontent-%COMP%]{font-weight:600;color:#19181a;padding-bottom:8px;line-height:16px}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]{padding:9px 16px;border-radius:40px;cursor:pointer;background-color:transparent;border:none;height:100%}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .btn.previewed[_ngcontent-%COMP%], [_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%]:hover{background-color:#f5f5f5;color:#19181a}[_nghost-%COMP%] .weeks[_ngcontent-%COMP%] .btn.selected[_ngcontent-%COMP%]{font-weight:600;background-color:#4646ce;color:#fff}"], changeDetection: 0 }); }
86
120
  }
87
121
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WeekSelectorComponent, [{
88
122
  type: Component,
89
- args: [{ selector: 'dr-week-selector', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"weeks\">\n <div class=\"header\">Week</div>\n\n <div class=\"weeks__container\">\n <div\n (click)=\"service.datePickerInstance.close(); service.weekSelectionChange$.next(week)\"\n class=\"btn\"\n [class.selected]=\"week.selected\"\n *ngFor=\"let week of currentMonthWeeks\">\n W{{ week.yearWeekNumber }}\n </div>\n </div>\n</div>\n<div class=\"weeks-border\"></div>\n", styles: [":host{font-size:14px;line-height:24px;font-weight:400;text-align:center;color:#333;display:flex}:host .weeks{height:100%;flex-direction:column;display:flex}:host .weeks-border{height:100%;width:1px;background-color:#dfe0e3;margin:0 4px}:host .weeks__container{display:flex;flex-direction:column;justify-content:space-between;height:100%}:host .weeks .header{font-weight:600;color:#19181a;padding-bottom:8px;line-height:16px}:host .weeks .btn{padding:9px 16px;border-radius:40px;cursor:pointer}:host .weeks .btn:hover{font-weight:600;background-color:#f2f2fb;color:#4646ce}:host .weeks .btn.selected{font-weight:600;background-color:#4646ce;color:#fff}\n"] }]
123
+ args: [{ selector: 'dr-week-selector', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"weeks\">\n <div class=\"header\">Week</div>\n\n <ul role=\"list\" class=\"weeks__container\" aria-label=\"Weeks of the month\">\n <li *ngFor=\"let week of currentMonthWeeks(); let i = index\">\n <button\n class=\"btn\"\n [class.previewed]=\"i === previewedWeek()\"\n [class.selected]=\"week.selected\"\n [attr.aria-current]=\"week.selected\"\n [attr.aria-label]=\"'Week ' + week.yearWeekNumber\"\n (focus)=\"toggleWeekPreview($event, i, true)\"\n (blur)=\"toggleWeekPreview($event, i, false)\"\n (mouseover)=\"toggleWeekPreview($event, i, true)\"\n (mouseleave)=\"toggleWeekPreview($event, i, false)\"\n (click)=\"service.datePickerInstance.close(); service.weekSelectionChange$.next(week)\">\n W{{ week.yearWeekNumber }}\n </button>\n </li>\n </ul>\n</div>\n<div class=\"weeks-border\"></div>\n", styles: [":host{font-size:14px;line-height:24px;font-weight:400;text-align:center;color:#333;display:flex}:host .weeks{height:100%;flex-direction:column;display:flex}:host .weeks-border{height:100%;width:1px;background-color:#dfe0e3;margin:0 4px}:host .weeks__container{display:flex;flex-direction:column;gap:5px;height:100%;margin:0;padding:0;list-style:none}:host .weeks__container li{flex:1}:host .weeks .header{font-weight:600;color:#19181a;padding-bottom:8px;line-height:16px}:host .weeks .btn{padding:9px 16px;border-radius:40px;cursor:pointer;background-color:transparent;border:none;height:100%}:host .weeks .btn.previewed,:host .weeks .btn:hover{background-color:#f5f5f5;color:#19181a}:host .weeks .btn.selected{font-weight:600;background-color:#4646ce;color:#fff}\n"] }]
90
124
  }], function () { return []; }, null); })();
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vlay1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1pbnB1dHMvZGF0ZS1waWNrZXJzL3dlZWstc2VsZWN0b3Ivd2Vlay1zZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1pbnB1dHMvZGF0ZS1waWNrZXJzL3dlZWstc2VsZWN0b3Ivd2Vlay1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBYSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxNQUFrQixNQUFNLFFBQVEsQ0FBQzs7Ozs7SUNEaEMsOEJBSTJDO0lBSHZDLG1OQUFTLHlDQUFrQyxTQUFFLGVBQUEsaURBQXVDLENBQUEsSUFBQztJQUlyRixZQUNKO0lBQUEsaUJBQU07OztJQUhGLDRDQUFnQztJQUVoQyxlQUNKO0lBREksd0RBQ0o7O0FEZVIsTUFBTSxPQUFPLHFCQUFxQjtJQVE5QjtRQVBTLFlBQU8sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM5QixhQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9CLFFBQUcsR0FBRyxN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QyxJQUFJLENBQUM7Z0JBQ1AsVUFBVTtnQkFDVixjQUFjO2dCQUNkLEtBQUssRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLEdBQUcsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNwQixJQUFJO2dCQUNKLFNBQVM7Z0JBQ1QsUUFBUTthQUNYLENBQUMsQ0FBQztZQUVILGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDaEMsVUFBVSxFQUFFLENBQUM7U0FDaEI7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO3lHQWhFUSxxQkFBcUI7bUdBQXJCLHFCQUFxQjtZQ3pCbEMsOEJBQW1CLGFBQUE7WUFDSyxvQkFBSTtZQUFBLGlCQUFNO1lBRTlCLDhCQUE4QjtZQUMxQixzRUFNTTtZQUNWLGlCQUFNLEVBQUE7WUFFVix5QkFBZ0M7O1lBTEgsZUFBb0I7WUFBcEIsK0NBQW9COzRCRFluQyxZQUFZOzt1RkFLYixxQkFBcUI7Y0FSakMsU0FBUzsyQkFDSSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUdOLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRGVzdHJveVJlZiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGF0ZVJhbmdlLCBNYXRDYWxlbmRhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgc3RhcnRXaXRoLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERyRGF0ZVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kci1kYXRlLXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCBtb21lbnQsIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBXZWVrSW5mbyB7XG4gICAgd2Vla051bWJlcjogbnVtYmVyO1xuICAgIHllYXJXZWVrTnVtYmVyOiBudW1iZXI7XG4gICAgc3RhcnQ6IE1vbWVudDtcbiAgICBlbmQ6IE1vbWVudDtcbiAgICBkYXlzOiBNb21lbnRbXTtcbiAgICBpc1BhcnRpYWw6IGJvb2xlYW47XG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZHItd2Vlay1zZWxlY3RvcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vd2Vlay1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vd2Vlay1zZWxlY3Rvci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBXZWVrU2VsZWN0b3JDb21wb25lbnQge1xuICAgIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoRHJEYXRlUGlja2VyU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhciA9IGluamVjdChNYXRDYWxlbmRhcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY3VycmVudE1vbnRoV2Vla3M6IFdlZWtJbmZvW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBpbmplY3QoRGVzdHJveVJlZiwgeyBza2lwU2VsZjogdHJ1ZSB9KS5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXIuc3RhdGVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVEYXRlID0gbW9tZW50KHRoaXMuY2FsZW5kYXIuYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRSYW5nZTogRGF0ZVJhbmdlPE1vbWVudD4gPSB0aGlzLmNhbGVuZGFyLnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoV2Vla3MgPSB0aGlzLmdldFdlZWtzSW5Nb250aChhY3RpdmVEYXRlLCBzZWxlY3RlZFJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXZWVrc0luTW9udGgoZGF0ZTogTW9tZW50LCBzZWxlY3RlZFJhbmdlOiBEYXRlUmFuZ2U8TW9tZW50Pik6IFdlZWtJbmZvW10ge1xuICAgICAgICBjb25zdCB3ZWVrczogV2Vla0luZm9bXSA9IFtdO1xuICAgICAgICBjb25zdCBmaXJzdERheSA9IG1vbWVudChkYXRlKS5zdGFydE9mKCdtb250aCcpO1xuICAgICAgICBjb25zdCBsYXN0RGF5ID0gbW9tZW50KGRhdGUpLmVuZE9mKCdtb250aCcpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0V2Vla1N0YXJ0ID0gbW9tZW50KGZpcnN0RGF5KS5zdGFydE9mKCdpc29XZWVrJyk7XG4gICAgICAgIGNvbnN0IGxhc3RXZWVrRW5kID0gbW9tZW50KGxhc3REYXkpLmVuZE9mKCdpc29XZWVrJyk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRXZWVrU3RhcnQgPSBtb21lbnQoZmlyc3RXZWVrU3RhcnQpO1xuICAgICAgICBsZXQgd2Vla051bWJlciA9IDE7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRXZWVrU3RhcnQuaXNTYW1lT3JCZWZvcmUobGFzdFdlZWtFbmQpKSB7XG4gICAgICAgICAgICBjb25zdCB3ZWVrRW5kID0gbW9tZW50KGN1cnJlbnRXZWVrU3RhcnQpLmVuZE9mKCdpc29XZWVrJyk7XG4gICAgICAgICAgICBjb25zdCBkYXlzOiBNb21lbnRbXSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgICAgIGRheXMucHVzaChtb21lbnQoY3VycmVudFdlZWtTdGFydCkuYWRkKGksICdkYXlzJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpc1BhcnRpYWwgPSBkYXlzLnNvbWUoKGRheSkgPT4gIWRheS5pc1NhbWUoZGF0ZSwgJ21vbnRoJykpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBkYXlzLnNvbWUoKGRheSkgPT4gZGF5LmlzU2FtZShzZWxlY3RlZFJhbmdlLnN0YXJ0LCAnZGF5JykpO1xuXG4gICAgICAgICAgICAvLyBpc29XZWVrKCkgcmV0dXJucyB0aGUgSVNPIHdlZWsgbnVtYmVyICgxLTUzKVxuICAgICAgICAgICAgY29uc3QgeWVhcldlZWtOdW1iZXIgPSBtb21lbnQoY3VycmVudFdlZWtTdGFydCkuaXNvV2VlaygpO1xuXG4gICAgICAgICAgICB3ZWVrcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB3ZWVrTnVtYmVyLFxuICAgICAgICAgICAgICAgIHllYXJXZWVrTnVtYmVyLFxuICAgICAgICAgICAgICAgIHN0YXJ0OiBtb21lbnQoY3VycmVudFdlZWtTdGFydCksXG4gICAgICAgICAgICAgICAgZW5kOiBtb21lbnQod2Vla0VuZCksXG4gICAgICAgICAgICAgICAgZGF5cyxcbiAgICAgICAgICAgICAgICBpc1BhcnRpYWwsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY3VycmVudFdlZWtTdGFydC5hZGQoMSwgJ3dlZWsnKTtcbiAgICAgICAgICAgIHdlZWtOdW1iZXIrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3ZWVrcztcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwid2Vla3NcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+V2VlazwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIndlZWtzX19jb250YWluZXJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlcnZpY2UuZGF0ZVBpY2tlckluc3RhbmNlLmNsb3NlKCk7IHNlcnZpY2Uud2Vla1NlbGVjdGlvbkNoYW5nZSQubmV4dCh3ZWVrKVwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0blwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwid2Vlay5zZWxlY3RlZFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgd2VlayBvZiBjdXJyZW50TW9udGhXZWVrc1wiPlxuICAgICAgICAgICAgV3t7IHdlZWsueWVhcldlZWtOdW1iZXIgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3ZWVrcy1ib3JkZXJcIj48L2Rpdj5cbiJdfQ==
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vlay1zZWxlY3Rvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1pbnB1dHMvZGF0ZS1waWNrZXJzL3dlZWstc2VsZWN0b3Ivd2Vlay1zZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1pbnB1dHMvZGF0ZS1waWNrZXJzL3dlZWstc2VsZWN0b3Ivd2Vlay1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFhLFdBQVcsRUFBbUIsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RixPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RSxPQUFPLE1BQWtCLE1BQU0sUUFBUSxDQUFDOzs7OztJQ0ZoQywwQkFBNEQsZ0JBQUE7SUFPcEQsMk5BQVMsZUFBQSx1Q0FBNkIsSUFBSSxDQUFDLENBQUEsSUFBQyw0TUFDcEMsZUFBQSx1Q0FBNkIsS0FBSyxDQUFDLENBQUEsSUFEQyxzTkFFL0IsZUFBQSx1Q0FBNkIsSUFBSSxDQUFDLENBQUEsSUFGSCx3TkFHOUIsZUFBQSx1Q0FBNkIsS0FBSyxDQUFDLENBQUEsSUFITCx3TUFJbkMseUNBQWtDLFNBQUUsZUFBQSxpREFBdUMs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Q0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDaEMsVUFBVSxFQUFFLENBQUM7U0FDaEI7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sU0FBUyxDQUFDLFNBQWlCLEVBQUUsS0FBYSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUNsRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLFdBQVcsQ0FBQyxTQUFpQjtRQUNqQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7eUdBbkZRLHFCQUFxQjttR0FBckIscUJBQXFCO1lDNUNsQyw4QkFBbUIsYUFBQTtZQUNLLG9CQUFJO1lBQUEsaUJBQU07WUFFOUIsNkJBQXlFO1lBQ3JFLG9FQWNLO1lBQ1QsaUJBQUssRUFBQTtZQUVULHlCQUFnQzs7WUFqQkgsZUFBd0I7WUFBeEIsaURBQXdCOzRCRG1DdkMsWUFBWTs7dUZBS2IscUJBQXFCO2NBUmpDLFNBQVM7MkJBQ0ksa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFHTix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRlUmFuZ2UsIE1hdENhbGVuZGFyLCBNYXRDYWxlbmRhckJvZHkgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IGRlbGF5LCBzdGFydFdpdGggfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERyRGF0ZVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kci1kYXRlLXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCBtb21lbnQsIHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBXZWVrSW5mbyB7XG4gICAgd2Vla051bWJlcjogbnVtYmVyO1xuICAgIHllYXJXZWVrTnVtYmVyOiBudW1iZXI7XG4gICAgc3RhcnQ6IE1vbWVudDtcbiAgICBlbmQ6IE1vbWVudDtcbiAgICBkYXlzOiBNb21lbnRbXTtcbiAgICBpc1BhcnRpYWw6IGJvb2xlYW47XG4gICAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvdmlkZXMgd2Vlay1iYXNlZCBpbnRlcmFjdGlvbiBmb3IgQW5ndWxhciBNYXRlcmlhbCBgTWF0Q2FsZW5kYXJgLlxuICogVGhlIGNvbXBvbmVudCByZW5kZXJzIGEgbGlzdCBvZiB3ZWVrcyBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgbW9udGhcbiAqIGFuZCBrZWVwcyBpdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY2FsZW5kYXIgaG92ZXIgKHByZXZpZXcpIGFuZCBzZWxlY3Rpb24gc3RhdGUuXG4gKlxuICogS2V5IHJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIERlcml2ZSBsb2dpY2FsIHdlZWtzIGZyb20gdGhlIGNhbGVuZGFyJ3MgYWN0aXZlIG1vbnRoLlxuICogLSBEZXRlY3Qgd2hpY2ggY2FsZW5kYXIgd2VlayBpcyBjdXJyZW50bHkgcHJldmlld2VkL3NlbGVjdGVkIGFuZCByZWZsZWN0IGl0IGluIHRoZSBVSS5cbiAqXG4gKiDimqAgU3RhYmlsaXR5IG5vdGU6XG4gKiAtIGBfbWF0Q2FsZW5kYXJCb2R5YCBhbmQgYHByZXZpZXdDaGFuZ2VgIGFyZSAqKnByaXZhdGUgQW5ndWxhciBNYXRlcmlhbCBBUElzKiouXG4gKiAtIFRoaXMgY29tcG9uZW50IG1heSByZXF1aXJlIGFkanVzdG1lbnRzIGFmdGVyIEFuZ3VsYXIgTWF0ZXJpYWwgdXBncmFkZXMuXG4gKiAtIFJlbGF0ZWQgdXBncmFkZSBjb25zaWRlcmF0aW9ucyBhcmUgZG9jdW1lbnRlZCBpbiBgVVBHUkFERV9DSEVDS0xJU1QubWRgLlxuICpcbiAqIElmIHByaXZhdGUgQVBJIGlzIGdvaW5nIHRvIGNoYW5nZSwgYW5kIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHdpdGggcHJvcGVydGllcyxcbiAqIGNoZWNrIHRoZSBmb2xsb3dpbmcgY29tbWl0IHdpdGggY2xhc3MgYW5kIG11dGF0aW9uIG9ic2VydmFibGUgaW1wbGVtZW50YXRpb246XG4gKiBodHRwczovL2dpdGh1Yi5jb20vRGF0YXJhaWxzL2RhdGFyYWlsc3NoYXJlZC9wdWxsLzEyNi9jb21taXRzLzU5MDE1MmNmZjA0NDhjNWY0OGJmZjMyZjljYjE2NWJiZjQ2NDExMmJcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdkci13ZWVrLXNlbGVjdG9yJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi93ZWVrLXNlbGVjdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi93ZWVrLXNlbGVjdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFdlZWtTZWxlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAgIHJlYWRvbmx5IHNlcnZpY2UgPSBpbmplY3QoRHJEYXRlUGlja2VyU2VydmljZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGVuZGFyID0gaW5qZWN0KE1hdENhbGVuZGFyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBwcml2YXRlIGNhbGVuZGFyQm9keTogTWF0Q2FsZW5kYXJCb2R5PE1vbWVudD4gfCBudWxsID0gbnVsbDtcblxuICAgIHJlYWRvbmx5IHByZXZpZXdlZFdlZWsgPSBzaWduYWwoLTEpO1xuICAgIHJlYWRvbmx5IGN1cnJlbnRNb250aFdlZWtzID0gc2lnbmFsPFdlZWtJbmZvW10+KFtdKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyLnN0YXRlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aChudWxsKSwgZGVsYXkoMCksIHRha2VVbnRpbERlc3Ryb3llZCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlRGF0ZSA9IG1vbWVudCh0aGlzLmNhbGVuZGFyLmFjdGl2ZURhdGUpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRSYW5nZTogRGF0ZVJhbmdlPE1vbWVudD4gPSB0aGlzLmNhbGVuZGFyLnNlbGVjdGVkO1xuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNb250aFdlZWtzLnNldCh0aGlzLmdldFdlZWtzSW5Nb250aChhY3RpdmVEYXRlLCBzZWxlY3RlZFJhbmdlKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIG1vbnRoVmlldyBhbmQgX21hdENhbGVuZGFyQm9keSBhcmUgVmlld0NoaWxkIGFuZCBjYW4gYmUgYWNjZXNzZWQgb25seSBpbiBBZnRlclZpZXdJbml0XG4gICAgICAgIHRoaXMuY2FsZW5kYXJCb2R5ID0gdGhpcy5jYWxlbmRhci5tb250aFZpZXcuX21hdENhbGVuZGFyQm9keTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyQm9keS5wcmV2aWV3Q2hhbmdlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWUgPyBldmVudC52YWx1ZS5yYXdWYWx1ZSEgOiBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLnByZXZpZXdlZFdlZWsuc2V0KHRoaXMuY3VycmVudE1vbnRoV2Vla3MoKS5maW5kSW5kZXgoKHdlZWspID0+IHRoaXMuaXNJblJhbmdlKHdlZWsuc3RhcnQsIHZhbHVlKSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlV2Vla1ByZXZpZXcoZXZlbnQ6IEV2ZW50LCB3ZWVrSW5kZXg6IG51bWJlciwgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbGVuZGFyQm9keSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHdlZWtGZXN0RGF5Q2VsbCA9IHRoaXMuY2FsZW5kYXJCb2R5LnJvd3Nbd2Vla0luZGV4XVswXTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyQm9keS5wcmV2aWV3Q2hhbmdlLmVtaXQoeyB2YWx1ZTogd2Vla0Zlc3REYXlDZWxsPy5lbmFibGVkICYmIHZhbHVlID8gd2Vla0Zlc3REYXlDZWxsIDogbnVsbCwgZXZlbnQgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRXZWVrc0luTW9udGgoZGF0ZTogTW9tZW50LCBzZWxlY3RlZFJhbmdlOiBEYXRlUmFuZ2U8TW9tZW50Pik6IFdlZWtJbmZvW10ge1xuICAgICAgICBjb25zdCB3ZWVrczogV2Vla0luZm9bXSA9IFtdO1xuICAgICAgICBjb25zdCBmaXJzdERheSA9IG1vbWVudChkYXRlKS5zdGFydE9mKCdtb250aCcpO1xuICAgICAgICBjb25zdCBsYXN0RGF5ID0gbW9tZW50KGRhdGUpLmVuZE9mKCdtb250aCcpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0V2Vla1N0YXJ0ID0gbW9tZW50KGZpcnN0RGF5KS5zdGFydE9mKCdpc29XZWVrJyk7XG4gICAgICAgIGNvbnN0IGxhc3RXZWVrRW5kID0gbW9tZW50KGxhc3REYXkpLmVuZE9mKCdpc29XZWVrJyk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRXZWVrU3RhcnQgPSBtb21lbnQoZmlyc3RXZWVrU3RhcnQpO1xuICAgICAgICBsZXQgd2Vla051bWJlciA9IDE7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRXZWVrU3RhcnQuaXNTYW1lT3JCZWZvcmUobGFzdFdlZWtFbmQpKSB7XG4gICAgICAgICAgICBjb25zdCB3ZWVrRW5kID0gbW9tZW50KGN1cnJlbnRXZWVrU3RhcnQpLmVuZE9mKCdpc29XZWVrJyk7XG4gICAgICAgICAgICBjb25zdCBkYXlzID0gdGhpcy5nZXRXZWVrRGF5cyhjdXJyZW50V2Vla1N0YXJ0KTtcblxuICAgICAgICAgICAgY29uc3QgaXNQYXJ0aWFsID0gZGF5cy5zb21lKChkYXkpID0+ICFkYXkuaXNTYW1lKGRhdGUsICdtb250aCcpKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pc0luUmFuZ2UoY3VycmVudFdlZWtTdGFydCwgc2VsZWN0ZWRSYW5nZS5zdGFydCwgZGF5cyk7XG5cbiAgICAgICAgICAgIC8vIGlzb1dlZWsoKSByZXR1cm5zIHRoZSBJU08gd2VlayBudW1iZXIgKDEtNTMpXG4gICAgICAgICAgICBjb25zdCB5ZWFyV2Vla051bWJlciA9IG1vbWVudChjdXJyZW50V2Vla1N0YXJ0KS5pc29XZWVrKCk7XG5cbiAgICAgICAgICAgIHdlZWtzLnB1c2goe1xuICAgICAgICAgICAgICAgIHdlZWtOdW1iZXIsXG4gICAgICAgICAgICAgICAgeWVhcldlZWtOdW1iZXIsXG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudChjdXJyZW50V2Vla1N0YXJ0KSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCh3ZWVrRW5kKSxcbiAgICAgICAgICAgICAgICBkYXlzLFxuICAgICAgICAgICAgICAgIGlzUGFydGlhbCxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjdXJyZW50V2Vla1N0YXJ0LmFkZCgxLCAnd2VlaycpO1xuICAgICAgICAgICAgd2Vla051bWJlcisrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdlZWtzO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJblJhbmdlKHdlZWtTdGFydDogTW9tZW50LCB2YWx1ZTogTW9tZW50LCBkYXlzID0gdGhpcy5nZXRXZWVrRGF5cyh3ZWVrU3RhcnQpKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkYXlzLnNvbWUoKGRheSkgPT4gZGF5LmlzU2FtZSh2YWx1ZSwgJ2RheScpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdlZWtEYXlzKHdlZWtTdGFydDogTW9tZW50KTogTW9tZW50W10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShBcnJheSg3KS5rZXlzKCkpLm1hcCgoaSkgPT4gbW9tZW50KHdlZWtTdGFydCkuYWRkKGksICdkYXlzJykpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3ZWVrc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5XZWVrPC9kaXY+XG5cbiAgICA8dWwgcm9sZT1cImxpc3RcIiBjbGFzcz1cIndlZWtzX19jb250YWluZXJcIiBhcmlhLWxhYmVsPVwiV2Vla3Mgb2YgdGhlIG1vbnRoXCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgd2VlayBvZiBjdXJyZW50TW9udGhXZWVrcygpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5wcmV2aWV3ZWRdPVwiaSA9PT0gcHJldmlld2VkV2VlaygpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwid2Vlay5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cIndlZWsuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1dlZWsgJyArIHdlZWsueWVhcldlZWtOdW1iZXJcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJ0b2dnbGVXZWVrUHJldmlldygkZXZlbnQsIGksIHRydWUpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJ0b2dnbGVXZWVrUHJldmlldygkZXZlbnQsIGksIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlb3Zlcik9XCJ0b2dnbGVXZWVrUHJldmlldygkZXZlbnQsIGksIHRydWUpXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJ0b2dnbGVXZWVrUHJldmlldygkZXZlbnQsIGksIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlcnZpY2UuZGF0ZVBpY2tlckluc3RhbmNlLmNsb3NlKCk7IHNlcnZpY2Uud2Vla1NlbGVjdGlvbkNoYW5nZSQubmV4dCh3ZWVrKVwiPlxuICAgICAgICAgICAgICAgIFd7eyB3ZWVrLnllYXJXZWVrTnVtYmVyIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9saT5cbiAgICA8L3VsPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwid2Vla3MtYm9yZGVyXCI+PC9kaXY+XG4iXX0=