@wlcm/angular 18.2.26 → 18.2.28
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/esm2022/lib/services/scroll-detection.api.mjs +26 -19
- package/core/fesm2022/wlcm-angular-core.mjs +24 -17
- package/core/fesm2022/wlcm-angular-core.mjs.map +1 -1
- package/core/lib/services/scroll-detection.api.d.ts +4 -1
- package/datepicker/esm2022/index.mjs +5 -2
- package/datepicker/esm2022/lib/components/range/date-range-picker-bottom-panel/date-range-picker-bottom-panel.component.mjs +5 -5
- package/datepicker/esm2022/lib/components/range/date-range-picker-input/date-range-picker-input.component.mjs +10 -8
- package/datepicker/esm2022/lib/components/range/double-calendar-range-picker/double-calendar-range-picker.component.mjs +168 -0
- package/datepicker/esm2022/lib/components/range/single-calendar-range-picker/single-calendar-range-picker.component.mjs +95 -0
- package/datepicker/esm2022/lib/constants/range/date-range-picker.constants.mjs +3 -1
- package/datepicker/esm2022/lib/directives/datepicker-trigger.base.mjs +4 -8
- package/datepicker/esm2022/lib/directives/ragne/date-range-picker-input.base.mjs +6 -4
- package/datepicker/esm2022/lib/models/range/data-range-calendar.models.mjs +1 -1
- package/datepicker/esm2022/lib/models/range/date-range-picker.models.mjs +27 -2
- package/datepicker/fesm2022/wlcm-angular-datepicker.mjs +799 -703
- package/datepicker/fesm2022/wlcm-angular-datepicker.mjs.map +1 -1
- package/datepicker/index.d.ts +4 -1
- package/datepicker/lib/components/range/date-range-picker-bottom-panel/date-range-picker-bottom-panel.component.d.ts +3 -3
- package/datepicker/lib/components/range/date-range-picker-input/date-range-picker-input.component.d.ts +5 -5
- package/datepicker/lib/components/range/{date-range-picker/date-range-picker.component.d.ts → double-calendar-range-picker/double-calendar-range-picker.component.d.ts} +12 -16
- package/datepicker/lib/components/range/single-calendar-range-picker/single-calendar-range-picker.component.d.ts +27 -0
- package/datepicker/lib/constants/range/date-range-picker.constants.d.ts +2 -1
- package/datepicker/lib/directives/datepicker-trigger.base.d.ts +1 -2
- package/datepicker/lib/models/range/date-range-picker.models.d.ts +15 -1
- package/forms/esm2022/lib/forms/components/select/select.component.mjs +11 -2
- package/forms/fesm2022/wlcm-angular-forms.mjs +10 -1
- package/forms/fesm2022/wlcm-angular-forms.mjs.map +1 -1
- package/forms/lib/forms/components/select/select.component.d.ts +1 -0
- package/package.json +1 -1
- package/styles/components/datepicker/date-range-picker/_date-range-picker-body.scss +1 -1
- package/styles/components/datepicker/date-range-picker/_date-range-picker-input.scss +1 -0
- package/datepicker/esm2022/lib/components/range/date-range-picker/date-range-picker.component.mjs +0 -174
package/datepicker/esm2022/lib/components/range/date-range-picker/date-range-picker.component.mjs
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { Component, ElementRef, Inject, Optional, ViewChild, computed, effect, signal, } from '@angular/core';
|
|
3
|
-
import { CommonModule } from '@angular/common';
|
|
4
|
-
import { DefaultMatCalendarRangeStrategy, MAT_DATE_RANGE_SELECTION_STRATEGY, MatCalendar, MatDateSelectionModel, MatDatepickerModule, MatMonthView, } from '@angular/material/datepicker';
|
|
5
|
-
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
|
6
|
-
import { WlcmDateRangePickerBottomPanelComponent } from '../date-range-picker-bottom-panel/date-range-picker-bottom-panel.component';
|
|
7
|
-
import { Subject, startWith, takeUntil, tap } from 'rxjs';
|
|
8
|
-
import { DateAdapter } from '@angular/material/core';
|
|
9
|
-
import { WlcmDateRangeCalendarHeaderComponent } from '../date-range-calendar-header/date-range-calendar-header.component';
|
|
10
|
-
import { WLCM_DATE_RANGE_PICKER_CONFIG } from '../../../constants/range/date-range-picker.constants';
|
|
11
|
-
import { WLCM_DATE_RANGE_SELECTION_MODEL_PROVIDER, WLCM_DATE_RANGE_SELECTION_MODEL, } from '../../../constants/range/date-range-selection-model.constants';
|
|
12
|
-
import { WLCM_DATE_RANGE_TRIGGER_SELECTION_MODEL } from '../../../constants/range/date-range-trigger-selection-model.constants';
|
|
13
|
-
import { WlcmLeftCalendarDirective } from '../../../directives/ragne/left-calendar.directive';
|
|
14
|
-
import { WlcmRightCalendarDirective } from '../../../directives/ragne/right-calendar.directive';
|
|
15
|
-
import { WlcmDatepickerTrigger } from '../../../directives/datepicker-trigger.base';
|
|
16
|
-
import { WlcmCalendarDirective } from '../../../directives/calendar.directive';
|
|
17
|
-
import { WLCM_DATEPICKER_CONFIG } from '../../../constants/datepicker.constants';
|
|
18
|
-
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "../../../directives/datepicker-trigger.base";
|
|
20
|
-
import * as i2 from "@angular/material/core";
|
|
21
|
-
import * as i3 from "@angular/material/datepicker";
|
|
22
|
-
let WlcmDateRangePickerComponent = class WlcmDateRangePickerComponent {
|
|
23
|
-
constructor(rangeConfig, rangeSelectionStrategy, localSelectionModel, triggerSelectionModel, trigger, datepickerConfig, dateAdapter) {
|
|
24
|
-
this.rangeConfig = rangeConfig;
|
|
25
|
-
this.rangeSelectionStrategy = rangeSelectionStrategy;
|
|
26
|
-
this.localSelectionModel = localSelectionModel;
|
|
27
|
-
this.triggerSelectionModel = triggerSelectionModel;
|
|
28
|
-
this.trigger = trigger;
|
|
29
|
-
this.datepickerConfig = datepickerConfig;
|
|
30
|
-
this.dateAdapter = dateAdapter;
|
|
31
|
-
this.headerComponent = WlcmDateRangeCalendarHeaderComponent;
|
|
32
|
-
this._isViewInitialized = false;
|
|
33
|
-
this._isComplete = signal(false);
|
|
34
|
-
this.isComplete = computed(() => this._isComplete());
|
|
35
|
-
this.startDate = signal(new Date());
|
|
36
|
-
this.leftCalendarYearViewActivated = signal(false);
|
|
37
|
-
this.rightCalendarYearViewActivated = signal(false);
|
|
38
|
-
this.handleSelectionChanged();
|
|
39
|
-
this.localSelectionModel.updateSelection(this.triggerSelectionModel.selection, this);
|
|
40
|
-
if (this.triggerSelectionModel.selection.start) {
|
|
41
|
-
this.startDate.set(this.triggerSelectionModel.selection.start);
|
|
42
|
-
}
|
|
43
|
-
if (this.rangeConfig.headerComponent) {
|
|
44
|
-
this.headerComponent = this.rangeConfig.headerComponent;
|
|
45
|
-
}
|
|
46
|
-
effect(() => {
|
|
47
|
-
if (!this._isViewInitialized)
|
|
48
|
-
return;
|
|
49
|
-
this.leftCalendar.activeDate = this.startDate();
|
|
50
|
-
this.rightCalendar.activeDate = this.dateAdapter.addCalendarMonths(this.startDate(), 1);
|
|
51
|
-
this.rightCalendar.startAt = this.dateAdapter.addCalendarMonths(this.startDate(), 1);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
ngAfterViewInit() {
|
|
55
|
-
this._isViewInitialized = true;
|
|
56
|
-
this.leftCalendar.viewChanged.pipe(untilDestroyed(this)).subscribe((view) => {
|
|
57
|
-
this.leftCalendarYearViewActivated.set(view !== 'month');
|
|
58
|
-
});
|
|
59
|
-
this.rightCalendar.viewChanged.pipe(untilDestroyed(this)).subscribe((view) => {
|
|
60
|
-
this.rightCalendarYearViewActivated.set(view !== 'month');
|
|
61
|
-
});
|
|
62
|
-
this.handleRightCalendarPreviewChange();
|
|
63
|
-
}
|
|
64
|
-
calendarSelection(event) {
|
|
65
|
-
const newSelection = this.rangeSelectionStrategy.selectionFinished(event.value, this.localSelectionModel.selection, event.event);
|
|
66
|
-
this.localSelectionModel.updateSelection(newSelection, this);
|
|
67
|
-
}
|
|
68
|
-
calendarDragDrop(event) {
|
|
69
|
-
this.localSelectionModel.updateSelection(event.value, this);
|
|
70
|
-
}
|
|
71
|
-
apply() {
|
|
72
|
-
this.triggerSelectionModel.updateSelection(this.localSelectionModel.selection, this);
|
|
73
|
-
this.trigger.close();
|
|
74
|
-
}
|
|
75
|
-
reset() {
|
|
76
|
-
this.trigger.close();
|
|
77
|
-
}
|
|
78
|
-
get selected() {
|
|
79
|
-
return this.localSelectionModel.selection;
|
|
80
|
-
}
|
|
81
|
-
get leftCalendarActiveCell() {
|
|
82
|
-
return this.leftCalendarElement.nativeElement.querySelector('.mat-calendar-body-active');
|
|
83
|
-
}
|
|
84
|
-
handleSelectionChanged() {
|
|
85
|
-
this.localSelectionModel.selectionChanged
|
|
86
|
-
.pipe(untilDestroyed(this))
|
|
87
|
-
.subscribe(() => this._isComplete.set(this.localSelectionModel.isComplete()));
|
|
88
|
-
}
|
|
89
|
-
handleRightCalendarPreviewChange() {
|
|
90
|
-
const viewChanged = new Subject();
|
|
91
|
-
this.rightCalendar.viewChanged
|
|
92
|
-
.pipe(untilDestroyed(this))
|
|
93
|
-
.pipe(tap(() => viewChanged.next()))
|
|
94
|
-
.pipe(startWith(this.rightCalendar.currentView))
|
|
95
|
-
.subscribe((view) => {
|
|
96
|
-
if (view !== 'month')
|
|
97
|
-
return;
|
|
98
|
-
this.rightCalendar.monthView._matCalendarBody.previewChange
|
|
99
|
-
.pipe(takeUntil(viewChanged), untilDestroyed(this))
|
|
100
|
-
.subscribe(() => {
|
|
101
|
-
if (this.leftCalendar.currentView !== 'month' || !this.leftCalendar.monthView._rangeStart)
|
|
102
|
-
return;
|
|
103
|
-
this.leftCalendar.monthView._previewStart = this.rightCalendar.monthView._previewStart;
|
|
104
|
-
this.leftCalendar.monthView._previewEnd = this.rightCalendar.monthView._previewEnd;
|
|
105
|
-
const activeCell = this.leftCalendarActiveCell;
|
|
106
|
-
if (activeCell && activeCell === document.activeElement)
|
|
107
|
-
activeCell.blur();
|
|
108
|
-
this.leftCalendar.monthView._changeDetectorRef.markForCheck();
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: WlcmDateRangePickerComponent, deps: [{ token: WLCM_DATE_RANGE_PICKER_CONFIG, optional: true }, { token: MAT_DATE_RANGE_SELECTION_STRATEGY }, { token: WLCM_DATE_RANGE_SELECTION_MODEL }, { token: WLCM_DATE_RANGE_TRIGGER_SELECTION_MODEL }, { token: i1.WlcmDatepickerTrigger }, { token: WLCM_DATEPICKER_CONFIG }, { token: i2.DateAdapter }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
113
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: WlcmDateRangePickerComponent, isStandalone: true, selector: "wlcm-date-range-picker", providers: [
|
|
114
|
-
{
|
|
115
|
-
provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
|
|
116
|
-
useClass: DefaultMatCalendarRangeStrategy,
|
|
117
|
-
},
|
|
118
|
-
WLCM_DATE_RANGE_SELECTION_MODEL_PROVIDER,
|
|
119
|
-
], viewQueries: [{ propertyName: "leftCalendar", first: true, predicate: WlcmLeftCalendarDirective, descendants: true, read: MatCalendar }, { propertyName: "rightCalendar", first: true, predicate: WlcmRightCalendarDirective, descendants: true, read: MatCalendar }, { propertyName: "leftCalendarElement", first: true, predicate: WlcmLeftCalendarDirective, descendants: true, read: ElementRef }, { propertyName: "monthView", first: true, predicate: MatMonthView, descendants: true }], ngImport: i0, template: "<div class=\"wlcm-date-range-picker-panel\">\n <div class=\"wlcm-date-range-picker-body\">\n <mat-calendar\n wlcmCalendar\n wlcmLeftCalendar\n [selected]=\"selected\"\n [disabled]=\"rightCalendarYearViewActivated()\"\n [headerComponent]=\"headerComponent\"\n (_userSelection)=\"calendarSelection($event)\"\n (_userDragDrop)=\"calendarDragDrop($event)\"\n (dateChange)=\"startDate.set($event)\"\n ></mat-calendar>\n\n <mat-calendar\n wlcmCalendar\n wlcmRightCalendar\n [selected]=\"selected\"\n [disabled]=\"leftCalendarYearViewActivated()\"\n [headerComponent]=\"headerComponent\"\n (_userSelection)=\"calendarSelection($event)\"\n (_userDragDrop)=\"calendarDragDrop($event)\"\n (dateChange)=\"startDate.set($event)\"\n ></mat-calendar>\n </div>\n\n <wlcm-date-range-picker-bottom-panel></wlcm-date-range-picker-bottom-panel>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i3.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "directive", type: WlcmCalendarDirective, selector: "[wlcmCalendar]" }, { kind: "directive", type: WlcmLeftCalendarDirective, selector: "[wlcmLeftCalendar]" }, { kind: "directive", type: WlcmRightCalendarDirective, selector: "[wlcmRightCalendar]" }, { kind: "component", type: WlcmDateRangePickerBottomPanelComponent, selector: "wlcm-date-range-picker-bottom-panel" }] }); }
|
|
120
|
-
};
|
|
121
|
-
WlcmDateRangePickerComponent = __decorate([
|
|
122
|
-
UntilDestroy(),
|
|
123
|
-
__metadata("design:paramtypes", [Object, Object, MatDateSelectionModel,
|
|
124
|
-
MatDateSelectionModel,
|
|
125
|
-
WlcmDatepickerTrigger, Object, DateAdapter])
|
|
126
|
-
], WlcmDateRangePickerComponent);
|
|
127
|
-
export { WlcmDateRangePickerComponent };
|
|
128
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: WlcmDateRangePickerComponent, decorators: [{
|
|
129
|
-
type: Component,
|
|
130
|
-
args: [{ selector: 'wlcm-date-range-picker', standalone: true, imports: [
|
|
131
|
-
CommonModule,
|
|
132
|
-
MatDatepickerModule,
|
|
133
|
-
WlcmCalendarDirective,
|
|
134
|
-
WlcmLeftCalendarDirective,
|
|
135
|
-
WlcmRightCalendarDirective,
|
|
136
|
-
WlcmDateRangePickerBottomPanelComponent,
|
|
137
|
-
], providers: [
|
|
138
|
-
{
|
|
139
|
-
provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
|
|
140
|
-
useClass: DefaultMatCalendarRangeStrategy,
|
|
141
|
-
},
|
|
142
|
-
WLCM_DATE_RANGE_SELECTION_MODEL_PROVIDER,
|
|
143
|
-
], template: "<div class=\"wlcm-date-range-picker-panel\">\n <div class=\"wlcm-date-range-picker-body\">\n <mat-calendar\n wlcmCalendar\n wlcmLeftCalendar\n [selected]=\"selected\"\n [disabled]=\"rightCalendarYearViewActivated()\"\n [headerComponent]=\"headerComponent\"\n (_userSelection)=\"calendarSelection($event)\"\n (_userDragDrop)=\"calendarDragDrop($event)\"\n (dateChange)=\"startDate.set($event)\"\n ></mat-calendar>\n\n <mat-calendar\n wlcmCalendar\n wlcmRightCalendar\n [selected]=\"selected\"\n [disabled]=\"leftCalendarYearViewActivated()\"\n [headerComponent]=\"headerComponent\"\n (_userSelection)=\"calendarSelection($event)\"\n (_userDragDrop)=\"calendarDragDrop($event)\"\n (dateChange)=\"startDate.set($event)\"\n ></mat-calendar>\n </div>\n\n <wlcm-date-range-picker-bottom-panel></wlcm-date-range-picker-bottom-panel>\n</div>\n" }]
|
|
144
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
145
|
-
type: Optional
|
|
146
|
-
}, {
|
|
147
|
-
type: Inject,
|
|
148
|
-
args: [WLCM_DATE_RANGE_PICKER_CONFIG]
|
|
149
|
-
}] }, { type: undefined, decorators: [{
|
|
150
|
-
type: Inject,
|
|
151
|
-
args: [MAT_DATE_RANGE_SELECTION_STRATEGY]
|
|
152
|
-
}] }, { type: i3.MatDateSelectionModel, decorators: [{
|
|
153
|
-
type: Inject,
|
|
154
|
-
args: [WLCM_DATE_RANGE_SELECTION_MODEL]
|
|
155
|
-
}] }, { type: i3.MatDateSelectionModel, decorators: [{
|
|
156
|
-
type: Inject,
|
|
157
|
-
args: [WLCM_DATE_RANGE_TRIGGER_SELECTION_MODEL]
|
|
158
|
-
}] }, { type: i1.WlcmDatepickerTrigger }, { type: undefined, decorators: [{
|
|
159
|
-
type: Inject,
|
|
160
|
-
args: [WLCM_DATEPICKER_CONFIG]
|
|
161
|
-
}] }, { type: i2.DateAdapter }], propDecorators: { leftCalendar: [{
|
|
162
|
-
type: ViewChild,
|
|
163
|
-
args: [WlcmLeftCalendarDirective, { read: MatCalendar }]
|
|
164
|
-
}], rightCalendar: [{
|
|
165
|
-
type: ViewChild,
|
|
166
|
-
args: [WlcmRightCalendarDirective, { read: MatCalendar }]
|
|
167
|
-
}], leftCalendarElement: [{
|
|
168
|
-
type: ViewChild,
|
|
169
|
-
args: [WlcmLeftCalendarDirective, { read: ElementRef }]
|
|
170
|
-
}], monthView: [{
|
|
171
|
-
type: ViewChild,
|
|
172
|
-
args: [MatMonthView]
|
|
173
|
-
}] } });
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9kYXRlcGlja2VyL3NyYy9saWIvY29tcG9uZW50cy9yYW5nZS9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL2RhdGVwaWNrZXIvc3JjL2xpYi9jb21wb25lbnRzL3JhbmdlL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sUUFBUSxFQUdSLFNBQVMsRUFFVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLCtCQUErQixFQUMvQixpQ0FBaUMsRUFDakMsV0FBVyxFQUlYLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsWUFBWSxHQUNiLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSw0RUFBNEUsQ0FBQztBQUNySSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQztBQUMxSCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzREFBc0Qs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O0FBWTlCLDRCQUE0QjtJQXRCeEMsWUFBWSxFQUFFO3FEQW9Db0IscUJBQXFCO1FBRW5CLHFCQUFxQjtRQUNuQyxxQkFBcUIsVUFFakIsV0FBVztHQW5CekIsNEJBQTRCLENBeUl4Qzs7MkZBeklZLDRCQUE0QjtrQkFyQnhDLFNBQVM7K0JBQ0Usd0JBQXdCLGNBQ3RCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIscUJBQXFCO3dCQUNyQix5QkFBeUI7d0JBQ3pCLDBCQUEwQjt3QkFDMUIsdUNBQXVDO3FCQUN4QyxhQUdVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQ0FBaUM7NEJBQzFDLFFBQVEsRUFBRSwrQkFBK0I7eUJBQzFDO3dCQUNELHdDQUF3QztxQkFDekM7OzBCQVlFLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsNkJBQTZCOzswQkFDaEQsTUFBTTsyQkFBQyxpQ0FBaUM7OzBCQUV4QyxNQUFNOzJCQUFDLCtCQUErQjs7MEJBRXRDLE1BQU07MkJBQUMsdUNBQXVDOzswQkFHOUMsTUFBTTsyQkFBQyxzQkFBc0I7bUVBMEI2QixZQUFZO3NCQUF4RSxTQUFTO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFFRyxhQUFhO3NCQUExRSxTQUFTO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFFQSxtQkFBbUI7c0JBQTlFLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUVqQyxTQUFTO3NCQUFqQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNpZ25hbCxcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBXcml0YWJsZVNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBEYXRlUmFuZ2UsXG4gIERlZmF1bHRNYXRDYWxlbmRhclJhbmdlU3RyYXRlZ3ksXG4gIE1BVF9EQVRFX1JBTkdFX1NFTEVDVElPTl9TVFJBVEVHWSxcbiAgTWF0Q2FsZW5kYXIsXG4gIE1hdENhbGVuZGFyVXNlckV2ZW50LFxuICBNYXRDYWxlbmRhclZpZXcsXG4gIE1hdERhdGVSYW5nZVNlbGVjdGlvblN0cmF0ZWd5LFxuICBNYXREYXRlU2VsZWN0aW9uTW9kZWwsXG4gIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gIE1hdE1vbnRoVmlldyxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IFdsY21EYXRlUmFuZ2VQaWNrZXJCb3R0b21QYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtcmFuZ2UtcGlja2VyLWJvdHRvbS1wYW5lbC9kYXRlLXJhbmdlLXBpY2tlci1ib3R0b20tcGFuZWwuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YmplY3QsIHN0YXJ0V2l0aCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBXbGNtRGF0ZVJhbmdlQ2FsZW5kYXJIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLXJhbmdlLWNhbGVuZGFyLWhlYWRlci9kYXRlLXJhbmdlLWNhbGVuZGFyLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgV0xDTV9EQVRFX1JBTkdFX1BJQ0tFUl9DT05GSUcgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvcmFuZ2UvZGF0ZS1yYW5nZS1waWNrZXIuY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIFdMQ01fREFURV9SQU5HRV9TRUxFQ1RJT05fTU9ERUxfUFJPVklERVIsXG4gIFdMQ01fREFURV9SQU5HRV9TRUxFQ1RJT05fTU9ERUwsXG59IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9yYW5nZS9kYXRlLXJhbmdlLXNlbGVjdGlvbi1tb2RlbC5jb25zdGFudHMnO1xuaW1wb3J0IHsgV0xDTV9EQVRFX1JBTkdFX1RSSUdHRVJfU0VMRUNUSU9OX01PREVMIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL3JhbmdlL2RhdGUtcmFuZ2UtdHJpZ2dlci1zZWxlY3Rpb24tbW9kZWwuY29uc3RhbnRzJztcbmltcG9ydCB7IFdsY21MZWZ0Q2FsZW5kYXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL3JhZ25lL2xlZnQtY2FsZW5kYXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFdsY21SaWdodENhbGVuZGFyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9yYWduZS9yaWdodC1jYWxlbmRhci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgV2xjbURhdGVSYW5nZVBpY2tlckNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yYW5nZS9kYXRlLXJhbmdlLXBpY2tlci5tb2RlbHMnO1xuaW1wb3J0IHsgV2xjbURhdGVwaWNrZXJUcmlnZ2VyIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9kYXRlcGlja2VyLXRyaWdnZXIuYmFzZSc7XG5pbXBvcnQgeyBXbGNtQ2FsZW5kYXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzL2NhbGVuZGFyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBXbGNtRGF0ZXBpY2tlckNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kYXRlLXBpY2tlci5tb2RlbHMnO1xuaW1wb3J0IHsgV0xDTV9EQVRFUElDS0VSX0NPTkZJRyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9kYXRlcGlja2VyLmNvbnN0YW50cyc7XG5cbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2xjbS1kYXRlLXJhbmdlLXBpY2tlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgICBXbGNtQ2FsZW5kYXJEaXJlY3RpdmUsXG4gICAgV2xjbUxlZnRDYWxlbmRhckRpcmVjdGl2ZSxcbiAgICBXbGNtUmlnaHRDYWxlbmRhckRpcmVjdGl2ZSxcbiAgICBXbGNtRGF0ZVJhbmdlUGlja2VyQm90dG9tUGFuZWxDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuc2NzcycsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE1BVF9EQVRFX1JBTkdFX1NFTEVDVElPTl9TVFJBVEVHWSxcbiAgICAgIHVzZUNsYXNzOiBEZWZhdWx0TWF0Q2FsZW5kYXJSYW5nZVN0cmF0ZWd5LFxuICAgIH0sXG4gICAgV0xDTV9EQVRFX1JBTkdFX1NFTEVDVElPTl9NT0RFTF9QUk9WSURFUixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgV2xjbURhdGVSYW5nZVBpY2tlckNvbXBvbmVudCB7XG4gIHByb3RlY3RlZCBoZWFkZXJDb21wb25lbnQ6IFR5cGU8dW5rbm93bj4gPSBXbGNtRGF0ZVJhbmdlQ2FsZW5kYXJIZWFkZXJDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSBfaXNWaWV3SW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9pc0NvbXBsZXRlOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgaXNDb21wbGV0ZTogU2lnbmFsPGJvb2xlYW4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5faXNDb21wbGV0ZSgpKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFdMQ01fREFURV9SQU5HRV9QSUNLRVJfQ09ORklHKSBwcml2YXRlIHJhbmdlQ29uZmlnOiBXbGNtRGF0ZVJhbmdlUGlja2VyQ29uZmlnLFxuICAgIEBJbmplY3QoTUFUX0RBVEVfUkFOR0VfU0VMRUNUSU9OX1NUUkFURUdZKVxuICAgIHByaXZhdGUgcmFuZ2VTZWxlY3Rpb25TdHJhdGVneTogTWF0RGF0ZVJhbmdlU2VsZWN0aW9uU3RyYXRlZ3k8RGF0ZT4sXG4gICAgQEluamVjdChXTENNX0RBVEVfUkFOR0VfU0VMRUNUSU9OX01PREVMKVxuICAgIHByb3RlY3RlZCBsb2NhbFNlbGVjdGlvbk1vZGVsOiBNYXREYXRlU2VsZWN0aW9uTW9kZWw8RGF0ZVJhbmdlPERhdGU+PixcbiAgICBASW5qZWN0KFdMQ01fREFURV9SQU5HRV9UUklHR0VSX1NFTEVDVElPTl9NT0RFTClcbiAgICBwcm90ZWN0ZWQgdHJpZ2dlclNlbGVjdGlvbk1vZGVsOiBNYXREYXRlU2VsZWN0aW9uTW9kZWw8RGF0ZVJhbmdlPERhdGU+PixcbiAgICBwcm90ZWN0ZWQgdHJpZ2dlcjogV2xjbURhdGVwaWNrZXJUcmlnZ2VyPFdsY21EYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQ+LFxuICAgIEBJbmplY3QoV0xDTV9EQVRFUElDS0VSX0NPTkZJRykgcHJvdGVjdGVkIGRhdGVwaWNrZXJDb25maWc6IFdsY21EYXRlcGlja2VyQ29uZmlnLFxuICAgIHByb3RlY3RlZCBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT5cbiAgKSB7XG4gICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKCk7XG5cbiAgICB0aGlzLmxvY2FsU2VsZWN0aW9uTW9kZWwudXBkYXRlU2VsZWN0aW9uKHRoaXMudHJpZ2dlclNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvbiwgdGhpcyk7XG5cbiAgICBpZiAodGhpcy50cmlnZ2VyU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uLnN0YXJ0KSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQodGhpcy50cmlnZ2VyU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uLnN0YXJ0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yYW5nZUNvbmZpZy5oZWFkZXJDb21wb25lbnQpIHtcbiAgICAgIHRoaXMuaGVhZGVyQ29tcG9uZW50ID0gdGhpcy5yYW5nZUNvbmZpZy5oZWFkZXJDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5faXNWaWV3SW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIuYWN0aXZlRGF0ZSA9IHRoaXMuc3RhcnREYXRlKCk7XG5cbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5hY3RpdmVEYXRlID0gdGhpcy5kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLnN0YXJ0RGF0ZSgpLCAxKTtcblxuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnN0YXJ0QXQgPSB0aGlzLmRhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuc3RhcnREYXRlKCksIDEpO1xuICAgIH0pO1xuICB9XG5cbiAgQFZpZXdDaGlsZChXbGNtTGVmdENhbGVuZGFyRGlyZWN0aXZlLCB7IHJlYWQ6IE1hdENhbGVuZGFyIH0pIGxlZnRDYWxlbmRhciE6IE1hdENhbGVuZGFyPERhdGU+O1xuXG4gIEBWaWV3Q2hpbGQoV2xjbVJpZ2h0Q2FsZW5kYXJEaXJlY3RpdmUsIHsgcmVhZDogTWF0Q2FsZW5kYXIgfSkgcmlnaHRDYWxlbmRhciE6IE1hdENhbGVuZGFyPERhdGU+O1xuXG4gIEBWaWV3Q2hpbGQoV2xjbUxlZnRDYWxlbmRhckRpcmVjdGl2ZSwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGxlZnRDYWxlbmRhckVsZW1lbnQhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKE1hdE1vbnRoVmlldykgbW9udGhWaWV3ITogTWF0TW9udGhWaWV3PGFueT47XG5cbiAgc3RhcnREYXRlOiBXcml0YWJsZVNpZ25hbDxEYXRlPiA9IHNpZ25hbChuZXcgRGF0ZSgpKTtcblxuICBsZWZ0Q2FsZW5kYXJZZWFyVmlld0FjdGl2YXRlZDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xuXG4gIHJpZ2h0Q2FsZW5kYXJZZWFyVmlld0FjdGl2YXRlZDogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj4gPSBzaWduYWwoZmFsc2UpO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9pc1ZpZXdJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICB0aGlzLmxlZnRDYWxlbmRhci52aWV3Q2hhbmdlZC5waXBlKHVudGlsRGVzdHJveWVkKHRoaXMpKS5zdWJzY3JpYmUoKHZpZXc6IE1hdENhbGVuZGFyVmlldykgPT4ge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXJZZWFyVmlld0FjdGl2YXRlZC5zZXQodmlldyAhPT0gJ21vbnRoJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIudmlld0NoYW5nZWQucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSkuc3Vic2NyaWJlKCh2aWV3OiBNYXRDYWxlbmRhclZpZXcpID0+IHtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhclllYXJWaWV3QWN0aXZhdGVkLnNldCh2aWV3ICE9PSAnbW9udGgnKTtcbiAgICB9KTtcblxuICAgIHRoaXMuaGFuZGxlUmlnaHRDYWxlbmRhclByZXZpZXdDaGFuZ2UoKTtcbiAgfVxuXG4gIGNhbGVuZGFyU2VsZWN0aW9uKGV2ZW50OiBNYXRDYWxlbmRhclVzZXJFdmVudDxEYXRlIHwgbnVsbD4pOiB2b2lkIHtcbiAgICBjb25zdCBuZXdTZWxlY3Rpb246IERhdGVSYW5nZTxEYXRlPiA9IHRoaXMucmFuZ2VTZWxlY3Rpb25TdHJhdGVneS5zZWxlY3Rpb25GaW5pc2hlZChcbiAgICAgIGV2ZW50LnZhbHVlLFxuICAgICAgdGhpcy5sb2NhbFNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvbixcbiAgICAgIGV2ZW50LmV2ZW50XG4gICAgKTtcblxuICAgIHRoaXMubG9jYWxTZWxlY3Rpb25Nb2RlbC51cGRhdGVTZWxlY3Rpb24obmV3U2VsZWN0aW9uLCB0aGlzKTtcbiAgfVxuXG4gIGNhbGVuZGFyRHJhZ0Ryb3AoZXZlbnQ6IE1hdENhbGVuZGFyVXNlckV2ZW50PERhdGVSYW5nZTxEYXRlPj4pOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU2VsZWN0aW9uTW9kZWwudXBkYXRlU2VsZWN0aW9uKGV2ZW50LnZhbHVlLCB0aGlzKTtcbiAgfVxuXG4gIGFwcGx5KCk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlclNlbGVjdGlvbk1vZGVsLnVwZGF0ZVNlbGVjdGlvbih0aGlzLmxvY2FsU2VsZWN0aW9uTW9kZWwuc2VsZWN0aW9uLCB0aGlzKTtcblxuICAgIHRoaXMudHJpZ2dlci5jbG9zZSgpO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyLmNsb3NlKCk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWQoKTogRGF0ZVJhbmdlPERhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGxlZnRDYWxlbmRhckFjdGl2ZUNlbGwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5sZWZ0Q2FsZW5kYXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25DaGFuZ2VkXG4gICAgICAucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5faXNDb21wbGV0ZS5zZXQodGhpcy5sb2NhbFNlbGVjdGlvbk1vZGVsLmlzQ29tcGxldGUoKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSaWdodENhbGVuZGFyUHJldmlld0NoYW5nZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3Q2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIudmlld0NoYW5nZWRcbiAgICAgIC5waXBlKHVudGlsRGVzdHJveWVkKHRoaXMpKVxuICAgICAgLnBpcGUodGFwKCgpID0+IHZpZXdDaGFuZ2VkLm5leHQoKSkpXG4gICAgICAucGlwZShzdGFydFdpdGgodGhpcy5yaWdodENhbGVuZGFyLmN1cnJlbnRWaWV3KSlcbiAgICAgIC5zdWJzY3JpYmUoKHZpZXc6IE1hdENhbGVuZGFyVmlldykgPT4ge1xuICAgICAgICBpZiAodmlldyAhPT0gJ21vbnRoJykgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci5tb250aFZpZXcuX21hdENhbGVuZGFyQm9keS5wcmV2aWV3Q2hhbmdlXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHZpZXdDaGFuZ2VkKSwgdW50aWxEZXN0cm95ZWQodGhpcykpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0Q2FsZW5kYXIuY3VycmVudFZpZXcgIT09ICdtb250aCcgfHwgIXRoaXMubGVmdENhbGVuZGFyLm1vbnRoVmlldy5fcmFuZ2VTdGFydCkgcmV0dXJuO1xuXG4gICAgICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci5tb250aFZpZXcuX3ByZXZpZXdTdGFydCA9IHRoaXMucmlnaHRDYWxlbmRhci5tb250aFZpZXcuX3ByZXZpZXdTdGFydDtcblxuICAgICAgICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIubW9udGhWaWV3Ll9wcmV2aWV3RW5kID0gdGhpcy5yaWdodENhbGVuZGFyLm1vbnRoVmlldy5fcHJldmlld0VuZDtcblxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQ2VsbCA9IHRoaXMubGVmdENhbGVuZGFyQWN0aXZlQ2VsbDtcblxuICAgICAgICAgICAgaWYgKGFjdGl2ZUNlbGwgJiYgYWN0aXZlQ2VsbCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgYWN0aXZlQ2VsbC5ibHVyKCk7XG5cbiAgICAgICAgICAgIHRoaXMubGVmdENhbGVuZGFyLm1vbnRoVmlldy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIndsY20tZGF0ZS1yYW5nZS1waWNrZXItcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIndsY20tZGF0ZS1yYW5nZS1waWNrZXItYm9keVwiPlxuICAgIDxtYXQtY2FsZW5kYXJcbiAgICAgIHdsY21DYWxlbmRhclxuICAgICAgd2xjbUxlZnRDYWxlbmRhclxuICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyaWdodENhbGVuZGFyWWVhclZpZXdBY3RpdmF0ZWQoKVwiXG4gICAgICBbaGVhZGVyQ29tcG9uZW50XT1cImhlYWRlckNvbXBvbmVudFwiXG4gICAgICAoX3VzZXJTZWxlY3Rpb24pPVwiY2FsZW5kYXJTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAoX3VzZXJEcmFnRHJvcCk9XCJjYWxlbmRhckRyYWdEcm9wKCRldmVudClcIlxuICAgICAgKGRhdGVDaGFuZ2UpPVwic3RhcnREYXRlLnNldCgkZXZlbnQpXCJcbiAgICA+PC9tYXQtY2FsZW5kYXI+XG5cbiAgICA8bWF0LWNhbGVuZGFyXG4gICAgICB3bGNtQ2FsZW5kYXJcbiAgICAgIHdsY21SaWdodENhbGVuZGFyXG4gICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIlxuICAgICAgW2Rpc2FibGVkXT1cImxlZnRDYWxlbmRhclllYXJWaWV3QWN0aXZhdGVkKClcIlxuICAgICAgW2hlYWRlckNvbXBvbmVudF09XCJoZWFkZXJDb21wb25lbnRcIlxuICAgICAgKF91c2VyU2VsZWN0aW9uKT1cImNhbGVuZGFyU2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgKF91c2VyRHJhZ0Ryb3ApPVwiY2FsZW5kYXJEcmFnRHJvcCgkZXZlbnQpXCJcbiAgICAgIChkYXRlQ2hhbmdlKT1cInN0YXJ0RGF0ZS5zZXQoJGV2ZW50KVwiXG4gICAgPjwvbWF0LWNhbGVuZGFyPlxuICA8L2Rpdj5cblxuICA8d2xjbS1kYXRlLXJhbmdlLXBpY2tlci1ib3R0b20tcGFuZWw+PC93bGNtLWRhdGUtcmFuZ2UtcGlja2VyLWJvdHRvbS1wYW5lbD5cbjwvZGl2PlxuIl19
|