@acorex/components 5.0.42 → 5.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/base/common.module.mjs +5 -4
- package/esm2020/lib/base/index.mjs +2 -1
- package/esm2020/lib/base/infinite-scroll.directive.mjs +63 -0
- package/esm2020/lib/base/mixin/datalist-component.class.mjs +26 -13
- package/esm2020/lib/base/mixin/datalist.class.mjs +3 -0
- package/esm2020/lib/base/mixin/mixin.class.mjs +2 -1
- package/esm2020/lib/base/mixin/selection-component.class.mjs +7 -3
- package/esm2020/lib/base/overlay.service.mjs +2 -2
- package/esm2020/lib/calendar/calendar.component.mjs +1 -2
- package/esm2020/lib/popover/popover.component.mjs +3 -4
- package/esm2020/lib/popup/popup.component.mjs +3 -3
- package/esm2020/lib/selectbox/selectbox.component.mjs +107 -60
- package/esm2020/lib/selectbox/selectbox.module.mjs +44 -5
- package/esm2020/lib/toast/toast.service.mjs +2 -2
- package/esm2020/lib/treeview/tree-view.component.mjs +8 -5
- package/fesm2015/acorex-components.mjs +254 -91
- package/fesm2015/acorex-components.mjs.map +1 -1
- package/fesm2020/acorex-components.mjs +252 -91
- package/fesm2020/acorex-components.mjs.map +1 -1
- package/lib/base/common.module.d.ts +2 -1
- package/lib/base/index.d.ts +1 -0
- package/lib/base/infinite-scroll.directive.d.ts +25 -0
- package/lib/base/mixin/datalist-component.class.d.ts +11 -4
- package/lib/base/mixin/datalist.class.d.ts +11 -0
- package/lib/base/mixin/mixin.class.d.ts +1 -0
- package/lib/base/mixin/selection-component.class.d.ts +1 -0
- package/lib/selectbox/selectbox.component.d.ts +18 -5
- package/lib/selectbox/selectbox.module.d.ts +11 -10
- package/lib/treeview/tree-view.component.d.ts +2 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AXTranslator } from '@acorex/core';
|
|
2
2
|
import { ChangeDetectionStrategy, Component, ContentChild, HostListener, Input, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import _ from 'lodash';
|
|
3
4
|
import { AXBaseSelectionDropdownMixin } from '../base';
|
|
4
5
|
import { DATALIST_INPUTS } from '../base/mixin/datalist-component.class';
|
|
5
6
|
import { DROPDOWN_INPUTS, DROPDOWN_OUTPUT } from '../base/mixin/dropdown-mixin.class';
|
|
@@ -14,10 +15,12 @@ import * as i2 from "../badge/badge.component";
|
|
|
14
15
|
import * as i3 from "../decorators/suffix.component";
|
|
15
16
|
import * as i4 from "../icon/icon.component";
|
|
16
17
|
import * as i5 from "../button/button.component";
|
|
17
|
-
import * as i6 from "../
|
|
18
|
+
import * as i6 from "../decorators/prefix.component";
|
|
18
19
|
import * as i7 from "../loading/loading.component";
|
|
19
|
-
import * as i8 from "
|
|
20
|
-
import * as i9 from "
|
|
20
|
+
import * as i8 from "../popover/popover.component";
|
|
21
|
+
import * as i9 from "../textbox/textbox.component";
|
|
22
|
+
import * as i10 from "@angular/common";
|
|
23
|
+
import * as i11 from "@angular/cdk/a11y";
|
|
21
24
|
export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
22
25
|
constructor(_elementRef, _cdr, _zone, _platform) {
|
|
23
26
|
super(_elementRef, _cdr);
|
|
@@ -26,9 +29,16 @@ export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
|
26
29
|
this._zone = _zone;
|
|
27
30
|
this._platform = _platform;
|
|
28
31
|
this.clearButton = false;
|
|
32
|
+
this._searchSettings = { enabled: false, expr: null };
|
|
29
33
|
this.checkbox = false;
|
|
30
|
-
this._currentfocusedIndex = -1;
|
|
31
34
|
this._isMobile = false;
|
|
35
|
+
this._forceFocus = false;
|
|
36
|
+
}
|
|
37
|
+
get searchSettings() {
|
|
38
|
+
return this._searchSettings;
|
|
39
|
+
}
|
|
40
|
+
set searchSettings(v) {
|
|
41
|
+
this._searchSettings = v || { enabled: false, expr: null };
|
|
32
42
|
}
|
|
33
43
|
get emptyTemplate() {
|
|
34
44
|
return this._contentEmptyTemplate;
|
|
@@ -46,17 +56,6 @@ export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
|
46
56
|
this._target = this._elementRef.nativeElement;
|
|
47
57
|
this._isMobile = this._platform.is('Mobile');
|
|
48
58
|
this._popoverTitle = this.placeholder || AXTranslator.get('selectbox.popover.title');
|
|
49
|
-
this.onOpened.subscribe(() => {
|
|
50
|
-
if (this.displayItems.length == 0) {
|
|
51
|
-
this._fetchData();
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
this._focusSelectedItem();
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
this.onClosed.subscribe(() => {
|
|
58
|
-
this.focus();
|
|
59
|
-
});
|
|
60
59
|
}
|
|
61
60
|
onViewInit() {
|
|
62
61
|
super.onViewInit();
|
|
@@ -90,10 +89,16 @@ export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
|
90
89
|
}
|
|
91
90
|
}
|
|
92
91
|
_onDataLoaded() {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
92
|
+
if (this.popover.isOpen) {
|
|
93
|
+
setTimeout(() => {
|
|
94
|
+
this._checkForLoadData();
|
|
95
|
+
this.popover.updatePosition();
|
|
96
|
+
if (this._forceFocus) {
|
|
97
|
+
this._focusSelectedItem();
|
|
98
|
+
this._forceFocus = false;
|
|
99
|
+
}
|
|
100
|
+
}, 100);
|
|
101
|
+
}
|
|
97
102
|
}
|
|
98
103
|
_onValueChanged(oldValue, newValue) {
|
|
99
104
|
super._onValueChanged(oldValue, newValue);
|
|
@@ -108,7 +113,6 @@ export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
|
108
113
|
this.close();
|
|
109
114
|
}
|
|
110
115
|
_handleKeydown(e) {
|
|
111
|
-
debugger;
|
|
112
116
|
const isLetter = new RegExp(/[a-zA-Z0-9\-]/).test(String.fromCharCode(e.keyCode));
|
|
113
117
|
if (e.code === 'Backspace' && e.type === 'keydown' &&
|
|
114
118
|
((this.allowNull === true && this.selectedItems.length > 0) ||
|
|
@@ -128,7 +132,7 @@ export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
|
128
132
|
this.open();
|
|
129
133
|
}
|
|
130
134
|
else {
|
|
131
|
-
this.
|
|
135
|
+
this._selectedItemByNav((e.key === 'ArrowDown' ? 1 : -1));
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
138
|
e.preventDefault();
|
|
@@ -142,13 +146,9 @@ export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
|
142
146
|
}
|
|
143
147
|
}
|
|
144
148
|
_handlePopoverKeydown(e) {
|
|
145
|
-
debugger;
|
|
146
149
|
if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && this.displayItems.length > 0) {
|
|
147
150
|
this.isUserInput = true;
|
|
148
151
|
this._focusItemByNav((e.key === 'ArrowDown' ? 1 : -1));
|
|
149
|
-
if (!this.multiple) {
|
|
150
|
-
this.selectItems(this.displayItems[this._currentfocusedIndex]);
|
|
151
|
-
}
|
|
152
152
|
e.preventDefault();
|
|
153
153
|
}
|
|
154
154
|
else if (e.code === 'Backspace' &&
|
|
@@ -160,7 +160,9 @@ export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
|
160
160
|
}
|
|
161
161
|
else if ((e.code === 'Space' || e.code === 'Enter')) {
|
|
162
162
|
e.preventDefault();
|
|
163
|
-
|
|
163
|
+
debugger;
|
|
164
|
+
const focusedItemId = this.listContainer.nativeElement.querySelector('.ax-state-focus').dataset.id;
|
|
165
|
+
const focusedItem = _.findLast(this.flatItems, [this.valueField, focusedItemId]);
|
|
164
166
|
if (focusedItem) {
|
|
165
167
|
if (this.isItemDisabled(focusedItem)) {
|
|
166
168
|
return;
|
|
@@ -189,66 +191,111 @@ export class AXSelectBoxComponent extends AXBaseSelectionDropdownMixin {
|
|
|
189
191
|
}
|
|
190
192
|
_handlePopupOnOpened(e) {
|
|
191
193
|
this.popover.focus();
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const lastSelectedItem = this.selectedItems[this.selectedItems.length - 1];
|
|
196
|
-
this._currentfocusedIndex = lastSelectedItem ? this.displayItems.findIndex(c => c[this.valueField] == lastSelectedItem[this.valueField]) : 0;
|
|
194
|
+
if (this.displayItems.length == 0) {
|
|
195
|
+
this._forceFocus = true;
|
|
196
|
+
this._fetchData();
|
|
197
197
|
}
|
|
198
198
|
else {
|
|
199
|
-
|
|
199
|
+
this._focusSelectedItem();
|
|
200
200
|
}
|
|
201
|
-
if (this.
|
|
202
|
-
this.
|
|
201
|
+
if (this._searchBox) {
|
|
202
|
+
this._searchBox.focus();
|
|
203
203
|
}
|
|
204
|
-
if (this._currentfocusedIndex > this.displayItems.length - 1) {
|
|
205
|
-
this._currentfocusedIndex = this.displayItems.length - 1;
|
|
206
|
-
}
|
|
207
|
-
// set scroll
|
|
208
|
-
this._focusItemByIndex(this._currentfocusedIndex);
|
|
209
204
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
205
|
+
_handlePopupOnClosed(e) {
|
|
206
|
+
this.focus();
|
|
207
|
+
}
|
|
208
|
+
_focusItemByNav(sign) {
|
|
209
|
+
const list = this.listContainer.nativeElement;
|
|
210
|
+
const fn = (s) => list.querySelector(s);
|
|
211
|
+
const itemDiv = fn(`.ax-list-item.ax-state-focus`) || fn(`.ax-list-item.ax-state-selected`) || fn(`.ax-list-item`);
|
|
212
|
+
let next = (sign == 1 ? itemDiv.nextElementSibling : itemDiv.previousElementSibling);
|
|
213
|
+
if (next) {
|
|
214
|
+
this._focusItemElement(next);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
const parent = itemDiv.closest('.ax-list-item-group');
|
|
218
|
+
if (parent) {
|
|
219
|
+
const lis = (sign == 1 ? parent.nextElementSibling : parent.previousElementSibling)?.querySelectorAll('li');
|
|
220
|
+
const a = sign == 1 ? _.first(lis) : _.last(lis);
|
|
221
|
+
if (a) {
|
|
222
|
+
this._focusItemElement(a);
|
|
217
223
|
}
|
|
218
|
-
}
|
|
224
|
+
}
|
|
219
225
|
}
|
|
220
226
|
}
|
|
221
227
|
_focusSelectedItem() {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
228
|
+
this._zone.runOutsideAngular(() => {
|
|
229
|
+
const list = this.listContainer.nativeElement;
|
|
230
|
+
const fn = (s) => list.querySelector(s);
|
|
231
|
+
const itemDiv = fn(`.ax-list-item.ax-state-selected`) || fn(`.ax-list-item`);
|
|
232
|
+
if (itemDiv) {
|
|
233
|
+
this._focusItemElement(itemDiv);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
_focusItemElement(el) {
|
|
238
|
+
this._zone.runOutsideAngular(() => {
|
|
239
|
+
const list = this.listContainer.nativeElement;
|
|
240
|
+
list.querySelectorAll('.ax-list-item').forEach(c => {
|
|
241
|
+
if (c == el) {
|
|
242
|
+
c.classList.add('ax-state-focus');
|
|
243
|
+
el.scrollIntoView({ behavior: 'auto' });
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
c.classList.remove('ax-state-focus');
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
this._searchBox ? this._searchBox.focus() : el.focus();
|
|
250
|
+
});
|
|
225
251
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
252
|
+
_selectedItemByNav(sign) {
|
|
253
|
+
const last = _.last(this.selectedItems);
|
|
254
|
+
let i = 0;
|
|
255
|
+
if (last) {
|
|
256
|
+
i = _.findLastIndex(this.flatItems, [this.valueField, last[this.valueField]]);
|
|
229
257
|
}
|
|
230
|
-
|
|
231
|
-
|
|
258
|
+
i += sign;
|
|
259
|
+
let next = _.nth(this.flatItems, i);
|
|
260
|
+
while (next?.children && next?.children.length) {
|
|
261
|
+
i += sign;
|
|
262
|
+
next = _.nth(this.flatItems, i);
|
|
232
263
|
}
|
|
233
|
-
|
|
234
|
-
|
|
264
|
+
if (next) {
|
|
265
|
+
this.selectItems(next);
|
|
266
|
+
}
|
|
267
|
+
else if (next == null && sign == 1) {
|
|
268
|
+
this._fetchData();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
_onSearchExprChanged(e) {
|
|
272
|
+
this.empty();
|
|
273
|
+
this._fetchData();
|
|
274
|
+
}
|
|
275
|
+
_fetchData() {
|
|
276
|
+
super._fetchData({ searchQuery: this._searchBox?.value });
|
|
235
277
|
}
|
|
236
278
|
}
|
|
237
279
|
AXSelectBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: AXSelectBoxComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1.AXPlatform }], target: i0.ɵɵFactoryTarget.Component });
|
|
238
|
-
AXSelectBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: AXSelectBoxComponent, selector: "ax-select-box", inputs: { isOpen: "isOpen", fitParent: "fitParent", dropdownWidth: "dropdownWidth", position: "position", disabled: "disabled", tabIndex: "tabIndex", readonly: "readonly", allowNull: "allowNull", value: "value", debounceTime: "debounceTime", name: "name", checked: "checked", placeholder: "placeholder", maxLength: "maxLength", pageSize: "pageSize", valueField: "valueField", textField: "textField", items: "items", disabledField: "disabledField", disabledCallback: "disabledCallback", multiple: "multiple", selectionMode: "selectionMode", clearButton: "clearButton", checkbox: "checkbox" }, outputs: { onOpened: "onOpened", onClosed: "onClosed", onBlur: "onBlur", onFocus: "onFocus", valueChange: "valueChange", onValueChanged: "onValueChanged", valueChanged: "valueChanged" }, host: { listeners: { "keydown": "_handleKeydown($event)" }, classAttribute: "ax-editor-container ax-drop-down" }, queries: [{ propertyName: "_contentEmptyTemplate", first: true, predicate: ["emptyTemplate"], descendants: true }], viewQueries: [{ propertyName: "popover", first: true, predicate: AXPopoverComponent, descendants: true, static: true }, { propertyName: "listContainer", first: true, predicate: ["listContainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"ax-prefix\">\r\n</ng-content>\r\n<div class=\"ax-dropdown-content\" [class.ax-state-disabled]=\"disabled\" (click)=\"_handleInputClickEvent($event)\">\r\n <div class=\"ax-select-box-selection\" [tabindex]=\"tabIndex\" (focus)=\"_emitOnFocusEvent($event)\"\r\n (blur)=\"_emitOnBlurEvent($event)\">\r\n <ng-container *ngIf=\"selectedItems && selectedItems.length; else showPlaceholder\">\r\n <ng-container *ngIf=\"!multiple; then singleSelectedTemplate; else multipleSelectedTemplate\"></ng-container>\r\n <ng-template #singleSelectedTemplate>\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <span class=\"ax-mx-2\"> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #multipleSelectedTemplate>\r\n <div class=\"ax-flex ax-mx-2\">\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <ax-badge [text]=\"_getItemDisplayTextTemplte(item)\" color=\"light\" class=\"ax-me-2\">\r\n <ax-suffix>\r\n <ax-icon icon=\"ax-ic ax-ic-close ax-cursor-pointer\"\r\n (click)=\"_handleBadgeRemove($event,item)\"></ax-icon>\r\n </ax-suffix>\r\n </ax-badge>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #showPlaceholder>\r\n <div class=\"ax-placeholder\" role=\"textbox\" area-readonly=\"true\"> {{placeholder}}</div>\r\n </ng-template>\r\n </div>\r\n</div>\r\n<ax-button color=\"light\" look=\"blank\" (onClick)=\"clear()\" [tabIndex]=\"-1\"\r\n *ngIf=\"value && clearButton && !(disabled || readonly)\">\r\n <ax-icon icon=\"ax-ic ax-ic-close\"></ax-icon>\r\n</ax-button>\r\n<ax-button [disabled]=\"disabled\" [tabIndex]=\"-1\" color=\"light\" look=\"blank\" (onClick)=\"_handleArrowClickEvent($event)\">\r\n <ax-icon icon=\"ax-ic ax-ic-chevron ax-transform ax--rotate-90\"></ax-icon>\r\n</ax-button>\r\n<ng-content select=\"ax-validation-rule\">\r\n</ng-content>\r\n<ng-content select=\"ax-suffix\">\r\n</ng-content>\r\n<ax-popover [target]=\"_target\" [position]=\"position\" [openTrigger]=\"'manual'\" [closeTrigger]=\"'clickout'\"\r\n (onOpened)=\"_handlePopupOnOpened($event)\">\r\n <div class=\"ax-overlay-pane\" (keydown)=\"_handlePopoverKeydown($event)\" tabindex=\"0\" aria-modal=\"true\" cdkTrapFocus\r\n [class.ax-overlay-center]=\"_isMobile\" [style.min-width.px]=\"_popoverWidth\">\r\n <div class=\"ax-list ax-list-container\" panel>\r\n <div *ngIf=\"_isMobile\" class=\"ax-overlay-pane-header\">\r\n <span>{{_popoverTitle}}</span>\r\n <i class=\"ax-ic {{multiple?'ax-ic-check !ax-text-primary-500':'ax-ic-close'}}\" (click)=\"close()\"\r\n tabindex=\"1\"></i>\r\n </div>\r\n <div class=\"ax-list-items-container ax-vertical ax-default\" [class.ax-full]=\"_isMobile\"\r\n (scroll)=\"_handleListScroll($event)\" #listContainer>\r\n <!--------------- Check loading state --------------->\r\n <ng-container *ngIf=\"!isLoading; else tmpLoading\">\r\n <!--------------- Check empty state ---------------->\r\n <ng-container *ngIf=\"displayItems.length; else tmpEmpty\">\r\n <ul>\r\n <ng-container *ngTemplateOutlet=\"tmpTree; context:{ list: displayItems }\"></ng-container>\r\n\r\n\r\n <ng-template #tmpTree let-list=\"list\">\r\n <ng-container *ngFor=\"let item of list;let i = index;trackBy : _trackByFunction\">\r\n <!-- <li *ngIf=\"item.visible !=false\" (click)=\"onMenuClick($event,item)\">\r\n <a [ngClass]=\"{'active': item.isActive}\">\r\n <span>{{item.text}}</span>\r\n <ax-icon [ngClass]=\"{'active-icon': item.isOpen}\" *ngIf=\"item?.children?.length > 0\" class=\"ax-ic-chevron\">\r\n </ax-icon>\r\n <ax-icon *ngIf=\"item.icon\" class=\"{{item.icon}}\">\r\n </ax-icon>\r\n </a>\r\n <ul *ngIf=\"item?.children?.length > 0 && item.isOpen\">\r\n <ng-container *ngTemplateOutlet=\"tmpTree; context:{ list: displayItems }\"></ng-container>\r\n </ul>\r\n </li> -->\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!--------------- items iteration ---------------->\r\n <ng-container *ngFor=\"let item of displayItems;let i = index;trackBy : _trackByFunction\">\r\n <ng-container *ngIf=\"itemTemplate; else defualtTemplate\">\r\n <li class=\"ax-list-item\" (click)=\"_handleOnItemClick($event,item)\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item,direction:direction}\">\r\n </ng-container>\r\n </li>\r\n </ng-container>\r\n <ng-template #defualtTemplate>\r\n <ng-container *ngIf=\"!multiple; then singleTemplate; else multipleTemplate\">\r\n </ng-container>\r\n <ng-template #singleTemplate>\r\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [attr.tabindex]=\"i\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n (click)=\"_handleOnItemClick($event,item)\">\r\n {{ _getItemDisplayTextTemplte(item) }}\r\n </li>\r\n </ng-template>\r\n <ng-template #multipleTemplate>\r\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [class.ax-check-box]=\"checkbox\" [attr.tabindex]=\"i\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n (click)=\"_handleOnItemClick($event,item)\">\r\n <input type=\"checkbox\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n *ngIf=\"checkbox\" [checked]=\"isItemSelected(item)\"\r\n [disabled]=\"isItemDisabled(item)\">\r\n \r\n {{ _getItemDisplayTextTemplte(item) }}\r\n </li>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ul>\r\n </ng-container>\r\n </ng-container>\r\n <!--------------- empty template --------------->\r\n <ng-template #tmpEmpty>\r\n <!--------------- check for custom template --------------->\r\n <ng-container *ngIf=\"emptyTemplate; else elseEmptyTemplate\">\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseEmptyTemplate>\r\n <div class=\"ax-list-item\">\r\n {{ 'common.no-result-found' | trans }}\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n <!--------------- loading template --------------->\r\n <ng-template #tmpLoading>\r\n <!--------------- check for custom template --------------->\r\n <ng-container *ngIf=\"loadingTemplate; else elseLoadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseLoadingTemplate>\r\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\">\r\n <ax-loading text=\"{{ 'layout.loading.text' | trans }}\"></ax-loading>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <!-- <ng-container *ngFor=\"let item of displayItems;let i = index;trackBy : _trackByFunction\">\r\n <ng-container *ngIf=\"itemTemplate; else defualtTemplate\">\r\n <div class=\"ax-list-item\" (click)=\"_handleOnItemClick($event,item)\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item,direction:direction}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #defualtTemplate>\r\n <ng-container *ngIf=\"!multiple; then singleTemplate; else multipleTemplate\"></ng-container>\r\n <ng-template #singleTemplate>\r\n <div class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [attr.tabindex]=\"i\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n (click)=\"_handleOnItemClick($event,item)\">\r\n {{ _getItemDisplayTextTemplte(item) }}\r\n </div>\r\n </ng-template>\r\n <ng-template #multipleTemplate>\r\n <div class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [class.ax-check-box]=\"checkbox\" [attr.tabindex]=\"i\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n (click)=\"_handleOnItemClick($event,item)\">\r\n <input type=\"checkbox\" [class.ax-state-disabled]=\"isItemDisabled(item)\" *ngIf=\"checkbox\"\r\n [checked]=\"isItemSelected(item)\" [disabled]=\"isItemDisabled(item)\">\r\n \r\n {{ _getItemDisplayTextTemplte(item) }}\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"(displayItems==null || displayItems.length==0) && !isLoading\">\r\n <ng-container *ngIf=\"emptyTemplate; else elseEmptyTemplate\">\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseEmptyTemplate>\r\n <div class=\"ax-list-item\">\r\n {{ 'common.no-result-found' | trans }}\r\n </div>\r\n </ng-template>\r\n </ng-container> -->\r\n <!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-container *ngIf=\"loadingTemplate; else elseLoadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseLoadingTemplate>\r\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\">\r\n <ax-loading text=\"{{ 'layout.loading.text' | trans }}\"></ax-loading>\r\n </div>\r\n </ng-template>\r\n </ng-container> -->\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ax-popover>", components: [{ type: i2.AXBadgeComponent, selector: "ax-badge", inputs: ["text", "color"] }, { type: i3.AXDecoratorSuffixComponent, selector: "ax-suffix" }, { type: i4.AXIconComponent, selector: "ax-icon", inputs: ["icon"] }, { type: i5.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "size", "text", "submitBehavior", "cancelBehavior", "color", "look", "toggleable", "selected"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange"] }, { type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["target", "position", "openTrigger", "closeTrigger", "hasBackdrop", "backdropClass"], outputs: ["onOpened", "onClosed"] }, { type: i7.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "text"], outputs: ["visibleChange"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "trans": i1.AXTranslatorPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
280
|
+
AXSelectBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: AXSelectBoxComponent, selector: "ax-select-box", inputs: { isOpen: "isOpen", fitParent: "fitParent", dropdownWidth: "dropdownWidth", position: "position", disabled: "disabled", tabIndex: "tabIndex", readonly: "readonly", allowNull: "allowNull", value: "value", debounceTime: "debounceTime", name: "name", checked: "checked", placeholder: "placeholder", maxLength: "maxLength", pageSize: "pageSize", valueField: "valueField", textField: "textField", items: "items", disabledField: "disabledField", disabledCallback: "disabledCallback", multiple: "multiple", selectionMode: "selectionMode", clearButton: "clearButton", searchSettings: "searchSettings", checkbox: "checkbox" }, outputs: { onOpened: "onOpened", onClosed: "onClosed", onBlur: "onBlur", onFocus: "onFocus", valueChange: "valueChange", onValueChanged: "onValueChanged", valueChanged: "valueChanged" }, host: { listeners: { "keydown": "_handleKeydown($event)" }, classAttribute: "ax-editor-container ax-drop-down" }, queries: [{ propertyName: "_contentEmptyTemplate", first: true, predicate: ["emptyTemplate"], descendants: true }], viewQueries: [{ propertyName: "popover", first: true, predicate: AXPopoverComponent, descendants: true, static: true }, { propertyName: "listContainer", first: true, predicate: ["listContainer"], descendants: true, static: true }, { propertyName: "_searchBox", first: true, predicate: ["searchBox"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-content select=\"ax-prefix\">\r\n</ng-content>\r\n<div class=\"ax-dropdown-content\" [class.ax-state-disabled]=\"disabled\" (click)=\"_handleInputClickEvent($event)\">\r\n <div class=\"ax-select-box-selection\" [tabindex]=\"tabIndex\" (focus)=\"_emitOnFocusEvent($event)\"\r\n (blur)=\"_emitOnBlurEvent($event)\">\r\n <ng-container *ngIf=\"selectedItems && selectedItems.length; else showPlaceholder\">\r\n <ng-container *ngIf=\"!multiple; then singleSelectedTemplate; else multipleSelectedTemplate\"></ng-container>\r\n <ng-template #singleSelectedTemplate>\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <span class=\"ax-mx-2\"> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #multipleSelectedTemplate>\r\n <div class=\"ax-flex ax-mx-2\">\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <ax-badge [text]=\"_getItemDisplayTextTemplte(item)\" color=\"light\" class=\"ax-me-2\">\r\n <ax-suffix>\r\n <ax-icon icon=\"ax-ic ax-ic-close ax-cursor-pointer\"\r\n (click)=\"_handleBadgeRemove($event,item)\"></ax-icon>\r\n </ax-suffix>\r\n </ax-badge>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #showPlaceholder>\r\n <div class=\"ax-placeholder\" role=\"textbox\" area-readonly=\"true\"> {{placeholder}}</div>\r\n </ng-template>\r\n </div>\r\n</div>\r\n<ax-button color=\"light\" look=\"blank\" (onClick)=\"clear()\" [tabIndex]=\"-1\"\r\n *ngIf=\"value && clearButton && !(disabled || readonly)\">\r\n <ax-icon icon=\"ax-ic ax-ic-close\"></ax-icon>\r\n</ax-button>\r\n<ax-button [disabled]=\"disabled\" [tabIndex]=\"-1\" color=\"light\" look=\"blank\" (onClick)=\"_handleArrowClickEvent($event)\">\r\n <ax-prefix *ngIf=\"(isLoading && !this.popover.isOpen);else icon\">\r\n <ax-loading type=\"spinner\"></ax-loading>\r\n </ax-prefix>\r\n <ng-template #icon>\r\n <ax-icon #icon icon=\"ax-ic ax-ic-chevron ax-transform ax--rotate-90\"></ax-icon>\r\n </ng-template>\r\n</ax-button>\r\n<ng-content select=\"ax-validation-rule\">\r\n</ng-content>\r\n<ng-content select=\"ax-suffix\">\r\n</ng-content>\r\n<ax-popover [target]=\"_target\" [position]=\"position\" [openTrigger]=\"'manual'\" [closeTrigger]=\"'clickout'\"\r\n (onOpened)=\"_handlePopupOnOpened($event)\" (onClosed)=\"_handlePopupOnClosed($event)\">\r\n <div class=\"ax-overlay-pane\" (keydown)=\"_handlePopoverKeydown($event)\" tabindex=\"0\" aria-modal=\"true\" cdkTrapFocus\r\n [class.ax-overlay-center]=\"_isMobile\" [style.min-width.px]=\"_popoverWidth\">\r\n <div class=\"ax-list ax-list-container\" panel>\r\n <div *ngIf=\"_isMobile\" class=\"ax-overlay-pane-header\">\r\n <span>{{_popoverTitle}}</span>\r\n <i class=\"ax-ic {{multiple?'ax-ic-check !ax-text-primary-500':'ax-ic-close'}}\" (click)=\"close()\"\r\n tabindex=\"1\"></i>\r\n </div>\r\n <div *ngIf=\"searchSettings.enabled\" class=\"ax-p-2\" [cdkTrapFocus]=\"true\">\r\n <ax-text-box #searchBox placeholder=\"{{ 'common.search' | trans }}\" [debounceTime]=\"500\"\r\n [(value)]=\"searchSettings.expr\" (onValueChanged)=\"_onSearchExprChanged($event)\">\r\n </ax-text-box>\r\n </div>\r\n <div class=\"ax-list-items-container ax-vertical ax-default\" [class.ax-full]=\"_isMobile\" (scroll)=\"_handleListScroll($event)\" #listContainer>\r\n <!--------------- Check empty state ---------------->\r\n <ng-container *ngIf=\"displayItems.length; else tmpEmpty\">\r\n <!--------------- recursive template ---------------->\r\n <ul>\r\n <ng-container *ngTemplateOutlet=\"tmpTree; context:{ list: displayItems }\">\r\n </ng-container>\r\n <ng-template #tmpTree let-list=\"list\">\r\n <!--------------- items iteration ---------------->\r\n <ng-container *ngFor=\"let item of list;let i = index;trackBy : _trackByFunction\">\r\n <ng-container *ngIf=\"itemTemplate; else defualtTemplate\">\r\n <li class=\"ax-list-item\" (click)=\"_handleOnItemClick($event,item)\" \r\n [attr.data-id]=\"item[this.valueField]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item,direction:direction}\">\r\n </ng-container>\r\n </li>\r\n </ng-container>\r\n <ng-template #defualtTemplate>\r\n <ng-container *ngIf=\"item.children?.length > 0;else tmpItem\">\r\n <li class=\"ax-list-item-group\" [attr.data-id]=\"item[this.valueField]\" >\r\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n <!--------------- children iteration ---------------->\r\n <ul *ngIf=\"item.children?.length > 0\">\r\n <ng-container\r\n *ngTemplateOutlet=\"tmpTree; context:{ list: item.children }\">\r\n </ng-container>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n <ng-template #tmpItem>\r\n <ng-container *ngIf=\"!multiple; else multipleTemplate\">\r\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\" [attr.tabindex]=\"i\"\r\n (click)=\"_handleOnItemClick($event,item)\"\r\n [attr.data-id]=\"item[this.valueField]\"\r\n >\r\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n </li>\r\n </ng-container>\r\n <ng-template #multipleTemplate>\r\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n [class.ax-check-box]=\"checkbox\" [attr.tabindex]=\"i\"\r\n (click)=\"_handleOnItemClick($event,item)\"\r\n [attr.data-id]=\"item[this.valueField]\"\r\n >\r\n <input type=\"checkbox\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n *ngIf=\"checkbox\" [checked]=\"isItemSelected(item)\"\r\n [disabled]=\"isItemDisabled(item)\">\r\n \r\n \r\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n </li>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </ul>\r\n </ng-container>\r\n <!--------------- loading template --------------->\r\n <ng-container *ngIf=\"isLoading\">\r\n <!--------------- check for custom template --------------->\r\n <ng-container *ngIf=\"loadingTemplate; else elseLoadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseLoadingTemplate>\r\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\">\r\n <ax-loading text=\"{{ 'layout.loading.text' | trans }}\"></ax-loading>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <!--------------- empty template --------------->\r\n <ng-template #tmpEmpty>\r\n <ng-container *ngIf=\"!isLoading\">\r\n <!--------------- check for custom template --------------->\r\n <ng-container *ngIf=\"emptyTemplate; else elseEmptyTemplate\">\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseEmptyTemplate>\r\n <div class=\"ax-list-item\">\r\n {{ 'common.no-result-found' | trans }}\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</ax-popover>", components: [{ type: i2.AXBadgeComponent, selector: "ax-badge", inputs: ["text", "color"] }, { type: i3.AXDecoratorSuffixComponent, selector: "ax-suffix" }, { type: i4.AXIconComponent, selector: "ax-icon", inputs: ["icon"] }, { type: i5.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "size", "text", "submitBehavior", "cancelBehavior", "color", "look", "toggleable", "selected"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange"] }, { type: i6.AXDecoratorPrefixComponent, selector: "ax-prefix" }, { type: i7.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "text"], outputs: ["visibleChange"] }, { type: i8.AXPopoverComponent, selector: "ax-popover", inputs: ["target", "position", "openTrigger", "closeTrigger", "hasBackdrop", "backdropClass"], outputs: ["onOpened", "onClosed"] }, { type: i9.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "allowNull", "value", "debounceTime", "name", "checked", "placeholder", "maxLength"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "trans": i1.AXTranslatorPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
239
281
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: AXSelectBoxComponent, decorators: [{
|
|
240
282
|
type: Component,
|
|
241
|
-
args: [{ selector: 'ax-select-box', inputs: [...DROPDOWN_INPUTS, ...INTERACTIVE_INPUTS, ...VALUE_INPUTS, ...TEXTBOX_INPUTS, ...DATALIST_INPUTS, ...SELECTION_INPUTS], outputs: [...DROPDOWN_OUTPUT, ...INTERACTIVE_OUTPUT, ...VALUE_OUTPUT, ...TEXTBOX_OUTPUT, ...SELECTION_OUTPUT], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ax-editor-container ax-drop-down' }, template: "<ng-content select=\"ax-prefix\">\r\n</ng-content>\r\n<div class=\"ax-dropdown-content\" [class.ax-state-disabled]=\"disabled\" (click)=\"_handleInputClickEvent($event)\">\r\n <div class=\"ax-select-box-selection\" [tabindex]=\"tabIndex\" (focus)=\"_emitOnFocusEvent($event)\"\r\n (blur)=\"_emitOnBlurEvent($event)\">\r\n <ng-container *ngIf=\"selectedItems && selectedItems.length; else showPlaceholder\">\r\n <ng-container *ngIf=\"!multiple; then singleSelectedTemplate; else multipleSelectedTemplate\"></ng-container>\r\n <ng-template #singleSelectedTemplate>\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <span class=\"ax-mx-2\"> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #multipleSelectedTemplate>\r\n <div class=\"ax-flex ax-mx-2\">\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <ax-badge [text]=\"_getItemDisplayTextTemplte(item)\" color=\"light\" class=\"ax-me-2\">\r\n <ax-suffix>\r\n <ax-icon icon=\"ax-ic ax-ic-close ax-cursor-pointer\"\r\n (click)=\"_handleBadgeRemove($event,item)\"></ax-icon>\r\n </ax-suffix>\r\n </ax-badge>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #showPlaceholder>\r\n <div class=\"ax-placeholder\" role=\"textbox\" area-readonly=\"true\"> {{placeholder}}</div>\r\n </ng-template>\r\n </div>\r\n</div>\r\n<ax-button color=\"light\" look=\"blank\" (onClick)=\"clear()\" [tabIndex]=\"-1\"\r\n *ngIf=\"value && clearButton && !(disabled || readonly)\">\r\n <ax-icon icon=\"ax-ic ax-ic-close\"></ax-icon>\r\n</ax-button>\r\n<ax-button [disabled]=\"disabled\" [tabIndex]=\"-1\" color=\"light\" look=\"blank\" (onClick)=\"_handleArrowClickEvent($event)\">\r\n <ax-icon icon=\"ax-ic ax-ic-chevron ax-transform ax--rotate-90\"></ax-icon>\r\n</ax-button>\r\n<ng-content select=\"ax-validation-rule\">\r\n</ng-content>\r\n<ng-content select=\"ax-suffix\">\r\n</ng-content>\r\n<ax-popover [target]=\"_target\" [position]=\"position\" [openTrigger]=\"'manual'\" [closeTrigger]=\"'clickout'\"\r\n (onOpened)=\"_handlePopupOnOpened($event)\">\r\n <div class=\"ax-overlay-pane\" (keydown)=\"_handlePopoverKeydown($event)\" tabindex=\"0\" aria-modal=\"true\" cdkTrapFocus\r\n [class.ax-overlay-center]=\"_isMobile\" [style.min-width.px]=\"_popoverWidth\">\r\n <div class=\"ax-list ax-list-container\" panel>\r\n <div *ngIf=\"_isMobile\" class=\"ax-overlay-pane-header\">\r\n <span>{{_popoverTitle}}</span>\r\n <i class=\"ax-ic {{multiple?'ax-ic-check !ax-text-primary-500':'ax-ic-close'}}\" (click)=\"close()\"\r\n tabindex=\"1\"></i>\r\n </div>\r\n <div class=\"ax-list-items-container ax-vertical ax-default\" [class.ax-full]=\"_isMobile\"\r\n (scroll)=\"_handleListScroll($event)\" #listContainer>\r\n <!--------------- Check loading state --------------->\r\n <ng-container *ngIf=\"!isLoading; else tmpLoading\">\r\n <!--------------- Check empty state ---------------->\r\n <ng-container *ngIf=\"displayItems.length; else tmpEmpty\">\r\n <ul>\r\n <ng-container *ngTemplateOutlet=\"tmpTree; context:{ list: displayItems }\"></ng-container>\r\n\r\n\r\n <ng-template #tmpTree let-list=\"list\">\r\n <ng-container *ngFor=\"let item of list;let i = index;trackBy : _trackByFunction\">\r\n <!-- <li *ngIf=\"item.visible !=false\" (click)=\"onMenuClick($event,item)\">\r\n <a [ngClass]=\"{'active': item.isActive}\">\r\n <span>{{item.text}}</span>\r\n <ax-icon [ngClass]=\"{'active-icon': item.isOpen}\" *ngIf=\"item?.children?.length > 0\" class=\"ax-ic-chevron\">\r\n </ax-icon>\r\n <ax-icon *ngIf=\"item.icon\" class=\"{{item.icon}}\">\r\n </ax-icon>\r\n </a>\r\n <ul *ngIf=\"item?.children?.length > 0 && item.isOpen\">\r\n <ng-container *ngTemplateOutlet=\"tmpTree; context:{ list: displayItems }\"></ng-container>\r\n </ul>\r\n </li> -->\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!--------------- items iteration ---------------->\r\n <ng-container *ngFor=\"let item of displayItems;let i = index;trackBy : _trackByFunction\">\r\n <ng-container *ngIf=\"itemTemplate; else defualtTemplate\">\r\n <li class=\"ax-list-item\" (click)=\"_handleOnItemClick($event,item)\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item,direction:direction}\">\r\n </ng-container>\r\n </li>\r\n </ng-container>\r\n <ng-template #defualtTemplate>\r\n <ng-container *ngIf=\"!multiple; then singleTemplate; else multipleTemplate\">\r\n </ng-container>\r\n <ng-template #singleTemplate>\r\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [attr.tabindex]=\"i\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n (click)=\"_handleOnItemClick($event,item)\">\r\n {{ _getItemDisplayTextTemplte(item) }}\r\n </li>\r\n </ng-template>\r\n <ng-template #multipleTemplate>\r\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [class.ax-check-box]=\"checkbox\" [attr.tabindex]=\"i\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n (click)=\"_handleOnItemClick($event,item)\">\r\n <input type=\"checkbox\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n *ngIf=\"checkbox\" [checked]=\"isItemSelected(item)\"\r\n [disabled]=\"isItemDisabled(item)\">\r\n \r\n {{ _getItemDisplayTextTemplte(item) }}\r\n </li>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ul>\r\n </ng-container>\r\n </ng-container>\r\n <!--------------- empty template --------------->\r\n <ng-template #tmpEmpty>\r\n <!--------------- check for custom template --------------->\r\n <ng-container *ngIf=\"emptyTemplate; else elseEmptyTemplate\">\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseEmptyTemplate>\r\n <div class=\"ax-list-item\">\r\n {{ 'common.no-result-found' | trans }}\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n <!--------------- loading template --------------->\r\n <ng-template #tmpLoading>\r\n <!--------------- check for custom template --------------->\r\n <ng-container *ngIf=\"loadingTemplate; else elseLoadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseLoadingTemplate>\r\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\">\r\n <ax-loading text=\"{{ 'layout.loading.text' | trans }}\"></ax-loading>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <!-- <ng-container *ngFor=\"let item of displayItems;let i = index;trackBy : _trackByFunction\">\r\n <ng-container *ngIf=\"itemTemplate; else defualtTemplate\">\r\n <div class=\"ax-list-item\" (click)=\"_handleOnItemClick($event,item)\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item,direction:direction}\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-template #defualtTemplate>\r\n <ng-container *ngIf=\"!multiple; then singleTemplate; else multipleTemplate\"></ng-container>\r\n <ng-template #singleTemplate>\r\n <div class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [attr.tabindex]=\"i\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n (click)=\"_handleOnItemClick($event,item)\">\r\n {{ _getItemDisplayTextTemplte(item) }}\r\n </div>\r\n </ng-template>\r\n <ng-template #multipleTemplate>\r\n <div class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [class.ax-check-box]=\"checkbox\" [attr.tabindex]=\"i\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n (click)=\"_handleOnItemClick($event,item)\">\r\n <input type=\"checkbox\" [class.ax-state-disabled]=\"isItemDisabled(item)\" *ngIf=\"checkbox\"\r\n [checked]=\"isItemSelected(item)\" [disabled]=\"isItemDisabled(item)\">\r\n \r\n {{ _getItemDisplayTextTemplte(item) }}\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"(displayItems==null || displayItems.length==0) && !isLoading\">\r\n <ng-container *ngIf=\"emptyTemplate; else elseEmptyTemplate\">\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseEmptyTemplate>\r\n <div class=\"ax-list-item\">\r\n {{ 'common.no-result-found' | trans }}\r\n </div>\r\n </ng-template>\r\n </ng-container> -->\r\n <!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-container *ngIf=\"loadingTemplate; else elseLoadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseLoadingTemplate>\r\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\">\r\n <ax-loading text=\"{{ 'layout.loading.text' | trans }}\"></ax-loading>\r\n </div>\r\n </ng-template>\r\n </ng-container> -->\r\n </div>\r\n\r\n </div>\r\n </div>\r\n</ax-popover>" }]
|
|
283
|
+
args: [{ selector: 'ax-select-box', inputs: [...DROPDOWN_INPUTS, ...INTERACTIVE_INPUTS, ...VALUE_INPUTS, ...TEXTBOX_INPUTS, ...DATALIST_INPUTS, ...SELECTION_INPUTS], outputs: [...DROPDOWN_OUTPUT, ...INTERACTIVE_OUTPUT, ...VALUE_OUTPUT, ...TEXTBOX_OUTPUT, ...SELECTION_OUTPUT], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ax-editor-container ax-drop-down' }, template: "<ng-content select=\"ax-prefix\">\r\n</ng-content>\r\n<div class=\"ax-dropdown-content\" [class.ax-state-disabled]=\"disabled\" (click)=\"_handleInputClickEvent($event)\">\r\n <div class=\"ax-select-box-selection\" [tabindex]=\"tabIndex\" (focus)=\"_emitOnFocusEvent($event)\"\r\n (blur)=\"_emitOnBlurEvent($event)\">\r\n <ng-container *ngIf=\"selectedItems && selectedItems.length; else showPlaceholder\">\r\n <ng-container *ngIf=\"!multiple; then singleSelectedTemplate; else multipleSelectedTemplate\"></ng-container>\r\n <ng-template #singleSelectedTemplate>\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <span class=\"ax-mx-2\"> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n </ng-container>\r\n </ng-template>\r\n <ng-template #multipleSelectedTemplate>\r\n <div class=\"ax-flex ax-mx-2\">\r\n <ng-container *ngFor=\"let item of selectedItems\">\r\n <ax-badge [text]=\"_getItemDisplayTextTemplte(item)\" color=\"light\" class=\"ax-me-2\">\r\n <ax-suffix>\r\n <ax-icon icon=\"ax-ic ax-ic-close ax-cursor-pointer\"\r\n (click)=\"_handleBadgeRemove($event,item)\"></ax-icon>\r\n </ax-suffix>\r\n </ax-badge>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template #showPlaceholder>\r\n <div class=\"ax-placeholder\" role=\"textbox\" area-readonly=\"true\"> {{placeholder}}</div>\r\n </ng-template>\r\n </div>\r\n</div>\r\n<ax-button color=\"light\" look=\"blank\" (onClick)=\"clear()\" [tabIndex]=\"-1\"\r\n *ngIf=\"value && clearButton && !(disabled || readonly)\">\r\n <ax-icon icon=\"ax-ic ax-ic-close\"></ax-icon>\r\n</ax-button>\r\n<ax-button [disabled]=\"disabled\" [tabIndex]=\"-1\" color=\"light\" look=\"blank\" (onClick)=\"_handleArrowClickEvent($event)\">\r\n <ax-prefix *ngIf=\"(isLoading && !this.popover.isOpen);else icon\">\r\n <ax-loading type=\"spinner\"></ax-loading>\r\n </ax-prefix>\r\n <ng-template #icon>\r\n <ax-icon #icon icon=\"ax-ic ax-ic-chevron ax-transform ax--rotate-90\"></ax-icon>\r\n </ng-template>\r\n</ax-button>\r\n<ng-content select=\"ax-validation-rule\">\r\n</ng-content>\r\n<ng-content select=\"ax-suffix\">\r\n</ng-content>\r\n<ax-popover [target]=\"_target\" [position]=\"position\" [openTrigger]=\"'manual'\" [closeTrigger]=\"'clickout'\"\r\n (onOpened)=\"_handlePopupOnOpened($event)\" (onClosed)=\"_handlePopupOnClosed($event)\">\r\n <div class=\"ax-overlay-pane\" (keydown)=\"_handlePopoverKeydown($event)\" tabindex=\"0\" aria-modal=\"true\" cdkTrapFocus\r\n [class.ax-overlay-center]=\"_isMobile\" [style.min-width.px]=\"_popoverWidth\">\r\n <div class=\"ax-list ax-list-container\" panel>\r\n <div *ngIf=\"_isMobile\" class=\"ax-overlay-pane-header\">\r\n <span>{{_popoverTitle}}</span>\r\n <i class=\"ax-ic {{multiple?'ax-ic-check !ax-text-primary-500':'ax-ic-close'}}\" (click)=\"close()\"\r\n tabindex=\"1\"></i>\r\n </div>\r\n <div *ngIf=\"searchSettings.enabled\" class=\"ax-p-2\" [cdkTrapFocus]=\"true\">\r\n <ax-text-box #searchBox placeholder=\"{{ 'common.search' | trans }}\" [debounceTime]=\"500\"\r\n [(value)]=\"searchSettings.expr\" (onValueChanged)=\"_onSearchExprChanged($event)\">\r\n </ax-text-box>\r\n </div>\r\n <div class=\"ax-list-items-container ax-vertical ax-default\" [class.ax-full]=\"_isMobile\" (scroll)=\"_handleListScroll($event)\" #listContainer>\r\n <!--------------- Check empty state ---------------->\r\n <ng-container *ngIf=\"displayItems.length; else tmpEmpty\">\r\n <!--------------- recursive template ---------------->\r\n <ul>\r\n <ng-container *ngTemplateOutlet=\"tmpTree; context:{ list: displayItems }\">\r\n </ng-container>\r\n <ng-template #tmpTree let-list=\"list\">\r\n <!--------------- items iteration ---------------->\r\n <ng-container *ngFor=\"let item of list;let i = index;trackBy : _trackByFunction\">\r\n <ng-container *ngIf=\"itemTemplate; else defualtTemplate\">\r\n <li class=\"ax-list-item\" (click)=\"_handleOnItemClick($event,item)\" \r\n [attr.data-id]=\"item[this.valueField]\">\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item,direction:direction}\">\r\n </ng-container>\r\n </li>\r\n </ng-container>\r\n <ng-template #defualtTemplate>\r\n <ng-container *ngIf=\"item.children?.length > 0;else tmpItem\">\r\n <li class=\"ax-list-item-group\" [attr.data-id]=\"item[this.valueField]\" >\r\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n <!--------------- children iteration ---------------->\r\n <ul *ngIf=\"item.children?.length > 0\">\r\n <ng-container\r\n *ngTemplateOutlet=\"tmpTree; context:{ list: item.children }\">\r\n </ng-container>\r\n </ul>\r\n </li>\r\n </ng-container>\r\n <ng-template #tmpItem>\r\n <ng-container *ngIf=\"!multiple; else multipleTemplate\">\r\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\" [attr.tabindex]=\"i\"\r\n (click)=\"_handleOnItemClick($event,item)\"\r\n [attr.data-id]=\"item[this.valueField]\"\r\n >\r\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n </li>\r\n </ng-container>\r\n <ng-template #multipleTemplate>\r\n <li class=\"ax-list-item\" [class.ax-state-selected]=\"isItemSelected(item)\"\r\n [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n [class.ax-check-box]=\"checkbox\" [attr.tabindex]=\"i\"\r\n (click)=\"_handleOnItemClick($event,item)\"\r\n [attr.data-id]=\"item[this.valueField]\"\r\n >\r\n <input type=\"checkbox\" [class.ax-state-disabled]=\"isItemDisabled(item)\"\r\n *ngIf=\"checkbox\" [checked]=\"isItemSelected(item)\"\r\n [disabled]=\"isItemDisabled(item)\">\r\n \r\n \r\n <span> {{ _getItemDisplayTextTemplte(item) }}</span>\r\n </li>\r\n </ng-template>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </ul>\r\n </ng-container>\r\n <!--------------- loading template --------------->\r\n <ng-container *ngIf=\"isLoading\">\r\n <!--------------- check for custom template --------------->\r\n <ng-container *ngIf=\"loadingTemplate; else elseLoadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseLoadingTemplate>\r\n <div class=\"ax-flex ax-items-center ax-justify-center ax-p-4\">\r\n <ax-loading text=\"{{ 'layout.loading.text' | trans }}\"></ax-loading>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <!--------------- empty template --------------->\r\n <ng-template #tmpEmpty>\r\n <ng-container *ngIf=\"!isLoading\">\r\n <!--------------- check for custom template --------------->\r\n <ng-container *ngIf=\"emptyTemplate; else elseEmptyTemplate\">\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #elseEmptyTemplate>\r\n <div class=\"ax-list-item\">\r\n {{ 'common.no-result-found' | trans }}\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</ax-popover>" }]
|
|
242
284
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1.AXPlatform }]; }, propDecorators: { popover: [{
|
|
243
285
|
type: ViewChild,
|
|
244
286
|
args: [AXPopoverComponent, { static: true }]
|
|
245
287
|
}], clearButton: [{
|
|
246
288
|
type: Input
|
|
289
|
+
}], searchSettings: [{
|
|
290
|
+
type: Input
|
|
247
291
|
}], checkbox: [{
|
|
248
292
|
type: Input
|
|
249
293
|
}], listContainer: [{
|
|
250
294
|
type: ViewChild,
|
|
251
295
|
args: ['listContainer', { static: true }]
|
|
296
|
+
}], _searchBox: [{
|
|
297
|
+
type: ViewChild,
|
|
298
|
+
args: ['searchBox']
|
|
252
299
|
}], _contentEmptyTemplate: [{
|
|
253
300
|
type: ContentChild,
|
|
254
301
|
args: ['emptyTemplate']
|
|
@@ -256,4 +303,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImpor
|
|
|
256
303
|
type: HostListener,
|
|
257
304
|
args: ['keydown', ['$event']]
|
|
258
305
|
}] } });
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Ym94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9jb21wb25lbnRzL3NyYy9saWIvc2VsZWN0Ym94L3NlbGVjdGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdGJveC9zZWxlY3Rib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBdUIsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hMLE9BQU8sRUFBRSw0QkFBNEIsRUFBZ0IsTUFBTSxTQUFTLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDL0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDN0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7QUFXaEQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLDRCQUE0QjtJQWlDbEUsWUFDWSxXQUF1QyxFQUN2QyxJQUF1QixF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b3JtLCBBWFRyYW5zbGF0b3IgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBOZ1pvbmUsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFYQmFzZVNlbGVjdGlvbkRyb3Bkb3duTWl4aW4sIEFYQ2xpY2tFdmVudCB9IGZyb20gJy4uL2Jhc2UnO1xyXG5pbXBvcnQgeyBEQVRBTElTVF9JTlBVVFMgfSBmcm9tICcuLi9iYXNlL21peGluL2RhdGFsaXN0LWNvbXBvbmVudC5jbGFzcyc7XHJcbmltcG9ydCB7IERST1BET1dOX0lOUFVUUywgRFJPUERPV05fT1VUUFVUIH0gZnJvbSAnLi4vYmFzZS9taXhpbi9kcm9wZG93bi1taXhpbi5jbGFzcyc7XHJcbmltcG9ydCB7IElOVEVSQUNUSVZFX0lOUFVUUywgSU5URVJBQ1RJVkVfT1VUUFVUIH0gZnJvbSAnLi4vYmFzZS9taXhpbi9pbnRlcmFjdGl2ZS1taXhpbi5jbGFzcyc7XHJcbmltcG9ydCB7IFNFTEVDVElPTl9JTlBVVFMsIFNFTEVDVElPTl9PVVRQVVQgfSBmcm9tICcuLi9iYXNlL21peGluL3NlbGVjdGlvbi1jb21wb25lbnQuY2xhc3MnO1xyXG5pbXBvcnQgeyBURVhUQk9YX0lOUFVUUywgVEVYVEJPWF9PVVRQVVQgfSBmcm9tICcuLi9iYXNlL21peGluL3RleHRib3gtbWl4aW4uY2xhc3MnO1xyXG5pbXBvcnQgeyBWQUxVRV9JTlBVVFMsIFZBTFVFX09VVFBVVCB9IGZyb20gJy4uL2Jhc2UvbWl4aW4vdmFsdWUtbWl4aW4uY2xhc3MnO1xyXG5pbXBvcnQgeyBBWFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuLi9wb3BvdmVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdheC1zZWxlY3QtYm94JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnc2VsZWN0Ym94LmNvbXBvbmVudC5odG1sJyxcclxuICAgIGlucHV0czogWy4uLkRST1BET1dOX0lOUFVUUywgLi4uSU5URVJBQ1RJVkVfSU5QVVRTLCAuLi5WQUxVRV9JTlBVVFMsIC4uLlRFWFRCT1hfSU5QVVRTLCAuLi5EQVRBTElTVF9JTlBVVFMsIC4uLlNFTEVDVElPTl9JTlBVVFNdLFxyXG4gICAgb3V0cHV0czogWy4uLkRST1BET1dOX09VVFBVVCwgLi4uSU5URVJBQ1RJVkVfT1VUUFVULCAuLi5WQUxVRV9PVVRQVVQsIC4uLlRFWFRCT1hfT1VUUFVULCAuLi5TRUxFQ1RJT05fT1VUUFVUXSxcclxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIGhvc3Q6IHsgY2xhc3M6ICdheC1lZGl0b3ItY29udGFpbmVyIGF4LWRyb3AtZG93bicgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQVhTZWxlY3RCb3hDb21wb25lbnQgZXh0ZW5kcyBBWEJhc2VTZWxlY3Rpb25Ecm9wZG93bk1peGluIHtcclxuXHJcblxyXG4gICAgQFZpZXdDaGlsZChBWFBvcG92ZXJDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgICBwb3BvdmVyOiBBWFBvcG92ZXJDb21wb25lbnQ7XHJcblxyXG4gICAgX3RhcmdldDogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICBfcG9wb3ZlclRpdGxlOiBzdHJpbmc7XHJcbiAgICBfcG9wb3ZlcldpZHRoOiBudW1iZXI7XHJcblxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBjbGVhckJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBjaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2xpc3RDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHJpdmF0ZSBsaXN0Q29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgICBAQ29udGVudENoaWxkKCdlbXB0eVRlbXBsYXRlJylcclxuICAgIHByaXZhdGUgX2NvbnRlbnRFbXB0eVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICBnZXQgZW1wdHlUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudEVtcHR5VGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBfY3VycmVudGZvY3VzZWRJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgICBfaXNNb2JpbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PixcclxuICAgICAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcclxuICAgICAgICBwcml2YXRlIF9wbGF0Zm9ybTogQVhQbGF0Zm9ybSxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKF9lbGVtZW50UmVmLCBfY2RyKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUFycm93Q2xpY2tFdmVudChlOiBBWENsaWNrRXZlbnQpIHtcclxuICAgICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUlucHV0Q2xpY2tFdmVudChlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBvbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuX2lzTW9iaWxlID0gdGhpcy5fcGxhdGZvcm0uaXMoJ01vYmlsZScpO1xyXG4gICAgICAgIHRoaXMuX3BvcG92ZXJUaXRsZSA9IHRoaXMucGxhY2Vob2xkZXIgfHwgQVhUcmFuc2xhdG9yLmdldCgnc2VsZWN0Ym94LnBvcG92ZXIudGl0bGUnKVxyXG5cclxuICAgICAgICB0aGlzLm9uT3BlbmVkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3BsYXlJdGVtcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmV0Y2hEYXRhKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1NlbGVjdGVkSXRlbSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMub25DbG9zZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVmlld0luaXQoKSB7XHJcbiAgICAgICAgc3VwZXIub25WaWV3SW5pdCgpO1xyXG4gICAgICAgIHRoaXMuX3BvcG92ZXJXaWR0aCA9IHRoaXMuX2lzTW9iaWxlID8gbnVsbCA6IHRoaXMuX3RhcmdldC5vZmZzZXRXaWR0aDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmVmcmVzaCgpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcclxuICAgICAgICBzdXBlci5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZU9uSXRlbUNsaWNrKGU6IE1vdXNlRXZlbnQsIGl0ZW06IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSXRlbURpc2FibGVkKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgdGhpcy50b2dnbGVTZWxlY3QoaXRlbSk7XHJcbiAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlTGlzdFNjcm9sbChlOiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSBlLnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICBpZiAoKGxpc3Quc2Nyb2xsVG9wIDwgbGlzdC5zY3JvbGxIZWlnaHQgLSBsaXN0LmNsaWVudEhlaWdodCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9mZXRjaERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jaGVja0ZvckxvYWREYXRhKCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBoZWFkZXJTaXplID0gbGlzdC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KCcuYXgtb3ZlcmxheS1wYW5lLWhlYWRlcicpPy5vZmZzZXRIZWlnaHQgfHwgMDtcclxuICAgICAgICBpZiAodGhpcy5sb2FkZWRDb3VudCA8IHRoaXMudG90YWxDb3VudCAmJiBsaXN0LnNjcm9sbEhlaWdodCA8ICgobGlzdC5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodCAtIGhlYWRlclNpemUpICogMS41KSkge1xyXG4gICAgICAgICAgICB0aGlzLl9mZXRjaERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX29uRGF0YUxvYWRlZCgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2tGb3JMb2FkRGF0YSgpO1xyXG4gICAgICAgICAgICB0aGlzLnBvcG92ZXIudXBkYXRlUG9zaXRpb24oKTtcclxuICAgICAgICB9LCAxMDApO1xyXG4gICAgfVxyXG5cclxuICAgIF9vblZhbHVlQ2hhbmdlZChvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XHJcbiAgICAgICAgc3VwZXIuX29uVmFsdWVDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZU9uUmVtb3ZlSXRlbUNsaWNrKGU6IE1vdXNlRXZlbnQsIGl0ZW06IGFueSkge1xyXG4gICAgICAgIHRoaXMudW5zZWxlY3RJdGVtcyhpdGVtKVxyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUJhZGdlUmVtb3ZlKGU6IE1vdXNlRXZlbnQsIGl0ZW0pIHtcclxuICAgICAgICB0aGlzLnVuc2VsZWN0SXRlbXMoaXRlbSlcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgX2hhbmRsZUtleWRvd24oZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgY29uc3QgaXNMZXR0ZXIgPSBuZXcgUmVnRXhwKC9bYS16QS1aMC05XFwtXS8pLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShlLmtleUNvZGUpKTtcclxuICAgICAgICBpZiAoZS5jb2RlID09PSAnQmFja3NwYWNlJyAmJiBlLnR5cGUgPT09ICdrZXlkb3duJyAmJlxyXG4gICAgICAgICAgICAoKHRoaXMuYWxsb3dOdWxsID09PSB0cnVlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB8fFxyXG4gICAgICAgICAgICAgICAgKHRoaXMuYWxsb3dOdWxsICE9PSB0cnVlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1VzZXJJbnB1dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RJdGVtcyh0aGlzLnNlbGVjdGVkSXRlbXMucG9wKCkpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKGUuY29kZSA9PT0gJ0Fycm93RG93bicgfHwgZS5jb2RlID09PSAnQXJyb3dVcCcgfHwgZS5jb2RlID09PSAnU3BhY2UnKSAmJiAhdGhpcy5wb3BvdmVyLmlzT3BlbiAmJiBlLnR5cGUgPT09ICdrZXlkb3duJykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5jb2RlID09PSAnU3BhY2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1CeUluZGV4KHRoaXMuX2N1cnJlbnRmb2N1c2VkSW5kZXggKyAoZS5rZXkgPT09ICdBcnJvd0Rvd24nID8gMSA6IC0xKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzTGV0dGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IGUua2V5O1xyXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBfaGFuZGxlUG9wb3ZlcktleWRvd24oZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgaWYgKChlLmtleSA9PT0gJ0Fycm93RG93bicgfHwgZS5rZXkgPT09ICdBcnJvd1VwJykgJiYgdGhpcy5kaXNwbGF5SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fZm9jdXNJdGVtQnlOYXYoKGUua2V5ID09PSAnQXJyb3dEb3duJyA/IDEgOiAtMSkpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXModGhpcy5kaXNwbGF5SXRlbXNbdGhpcy5fY3VycmVudGZvY3VzZWRJbmRleF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZS5jb2RlID09PSAnQmFja3NwYWNlJyAmJlxyXG4gICAgICAgICAgICAoKHRoaXMuYWxsb3dOdWxsID09PSB0cnVlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB8fFxyXG4gICAgICAgICAgICAgICAgKHRoaXMuYWxsb3dOdWxsICE9PSB0cnVlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1VzZXJJbnB1dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RJdGVtcyh0aGlzLnNlbGVjdGVkSXRlbXMucG9wKCkpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKChlLmNvZGUgPT09ICdTcGFjZScgfHwgZS5jb2RlID09PSAnRW50ZXInKSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRJdGVtID0gdGhpcy5kaXNwbGF5SXRlbXNbdGhpcy5fY3VycmVudGZvY3VzZWRJbmRleF07XHJcbiAgICAgICAgICAgIGlmIChmb2N1c2VkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJdGVtRGlzYWJsZWQoZm9jdXNlZEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdChmb2N1c2VkSXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKGZvY3VzZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZS5jb2RlID09PSBcIlRhYlwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVQb3B1cE9uT3BlbmVkKGUpIHtcclxuICAgICAgICB0aGlzLnBvcG92ZXIuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9mb2N1c0l0ZW1CeU5hdihzaWduOiAtMSB8IDEgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChzaWduID09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRmb2N1c2VkSW5kZXggPSBsYXN0U2VsZWN0ZWRJdGVtID8gdGhpcy5kaXNwbGF5SXRlbXMuZmluZEluZGV4KGMgPT4gY1t0aGlzLnZhbHVlRmllbGRdID09IGxhc3RTZWxlY3RlZEl0ZW1bdGhpcy52YWx1ZUZpZWxkXSkgOiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc2lnbiA9PT0gLTEgPyB0aGlzLl9jdXJyZW50Zm9jdXNlZEluZGV4LS0gOiB0aGlzLl9jdXJyZW50Zm9jdXNlZEluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50Zm9jdXNlZEluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50Zm9jdXNlZEluZGV4ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRmb2N1c2VkSW5kZXggPiB0aGlzLmRpc3BsYXlJdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRmb2N1c2VkSW5kZXggPSB0aGlzLmRpc3BsYXlJdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IHNjcm9sbFxyXG4gICAgICAgIHRoaXMuX2ZvY3VzSXRlbUJ5SW5kZXgodGhpcy5fY3VycmVudGZvY3VzZWRJbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZm9jdXNJdGVtQnlJbmRleChpbmVkeDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EaXYgPSB0aGlzLmxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgLmF4LWxpc3QtaXRlbTpudGgtY2hpbGQoJHtpbmVkeCArIDF9KWApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1EaXYpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtRGl2LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbURpdi5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnYXV0bycgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9mb2N1c1NlbGVjdGVkSXRlbSgpIHtcclxuICAgICAgICBjb25zdCBsYXN0U2VsZWN0ZWRJdGVtID0gdGhpcy5zZWxlY3RlZEl0ZW1zW3RoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxXTtcclxuICAgICAgICB0aGlzLl9jdXJyZW50Zm9jdXNlZEluZGV4ID0gbGFzdFNlbGVjdGVkSXRlbSA/IHRoaXMuZGlzcGxheUl0ZW1zLmZpbmRJbmRleChjID0+IGNbdGhpcy52YWx1ZUZpZWxkXSA9PSBsYXN0U2VsZWN0ZWRJdGVtW3RoaXMudmFsdWVGaWVsZF0pIDogMDtcclxuICAgICAgICB0aGlzLl9mb2N1c0l0ZW1CeUluZGV4KHRoaXMuX2N1cnJlbnRmb2N1c2VkSW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NlbGVjdGVkSXRlbUJ5SW5kZXgoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5kZXggPiB0aGlzLmRpc3BsYXlJdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5kaXNwbGF5SXRlbXMubGVuZ3RoIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyh0aGlzLmRpc3BsYXlJdGVtc1tpbmRleF0pO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRmb2N1c2VkSW5kZXggPSBpbmRleDtcclxuICAgIH1cclxufSIsIjxuZy1jb250ZW50IHNlbGVjdD1cImF4LXByZWZpeFwiPlxyXG48L25nLWNvbnRlbnQ+XHJcbjxkaXYgY2xhc3M9XCJheC1kcm9wZG93bi1jb250ZW50XCIgW2NsYXNzLmF4LXN0YXRlLWRpc2FibGVkXT1cImRpc2FibGVkXCIgKGNsaWNrKT1cIl9oYW5kbGVJbnB1dENsaWNrRXZlbnQoJGV2ZW50KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImF4LXNlbGVjdC1ib3gtc2VsZWN0aW9uXCIgW3RhYmluZGV4XT1cInRhYkluZGV4XCIgKGZvY3VzKT1cIl9lbWl0T25Gb2N1c0V2ZW50KCRldmVudClcIlxyXG4gICAgICAgIChibHVyKT1cIl9lbWl0T25CbHVyRXZlbnQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoOyBlbHNlIHNob3dQbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW11bHRpcGxlOyB0aGVuIHNpbmdsZVNlbGVjdGVkVGVtcGxhdGU7IGVsc2UgbXVsdGlwbGVTZWxlY3RlZFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlU2VsZWN0ZWRUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtbXgtMlwiPiB7eyBfZ2V0SXRlbURpc3BsYXlUZXh0VGVtcGx0ZShpdGVtKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI211bHRpcGxlU2VsZWN0ZWRUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1mbGV4IGF4LW14LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkSXRlbXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGF4LWJhZGdlIFt0ZXh0XT1cIl9nZXRJdGVtRGlzcGxheVRleHRUZW1wbHRlKGl0ZW0pXCIgY29sb3I9XCJsaWdodFwiIGNsYXNzPVwiYXgtbWUtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF4LXN1ZmZpeD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWMgYXgtaWMtY2xvc2UgYXgtY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiX2hhbmRsZUJhZGdlUmVtb3ZlKCRldmVudCxpdGVtKVwiPjwvYXgtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXgtc3VmZml4PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2F4LWJhZGdlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93UGxhY2Vob2xkZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1wbGFjZWhvbGRlclwiIHJvbGU9XCJ0ZXh0Ym94XCIgYXJlYS1yZWFkb25seT1cInRydWVcIj4ge3twbGFjZWhvbGRlcn19PC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGF4LWJ1dHRvbiBjb2xvcj1cImxpZ2h0XCIgbG9vaz1cImJsYW5rXCIgKG9uQ2xpY2spPVwiY2xlYXIoKVwiIFt0YWJJbmRleF09XCItMVwiXHJcbiAgICAqbmdJZj1cInZhbHVlICYmIGNsZWFyQnV0dG9uICYmICAhKGRpc2FibGVkIHx8IHJlYWRvbmx5KVwiPlxyXG4gICAgPGF4LWljb24gaWNvbj1cImF4LWljIGF4LWljLWNsb3NlXCI+PC9heC1pY29uPlxyXG48L2F4LWJ1dHRvbj5cclxuPGF4LWJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbdGFiSW5kZXhdPVwiLTFcIiBjb2xvcj1cImxpZ2h0XCIgbG9vaz1cImJsYW5rXCIgKG9uQ2xpY2spPVwiX2hhbmRsZUFycm93Q2xpY2tFdmVudCgkZXZlbnQpXCI+XHJcbiAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWMgYXgtaWMtY2hldnJvbiBheC10cmFuc2Zvcm0gYXgtLXJvdGF0ZS05MFwiPjwvYXgtaWNvbj5cclxuPC9heC1idXR0b24+XHJcbjxuZy1jb250ZW50IHNlbGVjdD1cImF4LXZhbGlkYXRpb24tcnVsZVwiPlxyXG48L25nLWNvbnRlbnQ+XHJcbjxuZy1jb250ZW50IHNlbGVjdD1cImF4LXN1ZmZpeFwiPlxyXG48L25nLWNvbnRlbnQ+XHJcbjxheC1wb3BvdmVyIFt0YXJnZXRdPVwiX3RhcmdldFwiIFtwb3NpdGlvbl09XCJwb3NpdGlvblwiIFtvcGVuVHJpZ2dlcl09XCInbWFudWFsJ1wiIFtjbG9zZVRyaWdnZXJdPVwiJ2NsaWNrb3V0J1wiXHJcbiAgICAob25PcGVuZWQpPVwiX2hhbmRsZVBvcHVwT25PcGVuZWQoJGV2ZW50KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImF4LW92ZXJsYXktcGFuZVwiIChrZXlkb3duKT1cIl9oYW5kbGVQb3BvdmVyS2V5ZG93bigkZXZlbnQpXCIgdGFiaW5kZXg9XCIwXCIgYXJpYS1tb2RhbD1cInRydWVcIiBjZGtUcmFwRm9jdXNcclxuICAgICAgICBbY2xhc3MuYXgtb3ZlcmxheS1jZW50ZXJdPVwiX2lzTW9iaWxlXCIgW3N0eWxlLm1pbi13aWR0aC5weF09XCJfcG9wb3ZlcldpZHRoXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF4LWxpc3QgYXgtbGlzdC1jb250YWluZXJcIiBwYW5lbD5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIl9pc01vYmlsZVwiIGNsYXNzPVwiYXgtb3ZlcmxheS1wYW5lLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3tfcG9wb3ZlclRpdGxlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImF4LWljIHt7bXVsdGlwbGU/J2F4LWljLWNoZWNrICFheC10ZXh0LXByaW1hcnktNTAwJzonYXgtaWMtY2xvc2UnfX1cIiAoY2xpY2spPVwiY2xvc2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIxXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWxpc3QtaXRlbXMtY29udGFpbmVyIGF4LXZlcnRpY2FsIGF4LWRlZmF1bHRcIiBbY2xhc3MuYXgtZnVsbF09XCJfaXNNb2JpbGVcIlxyXG4gICAgICAgICAgICAgICAgKHNjcm9sbCk9XCJfaGFuZGxlTGlzdFNjcm9sbCgkZXZlbnQpXCIgI2xpc3RDb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBDaGVjayBsb2FkaW5nIHN0YXRlICAtLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZzsgZWxzZSB0bXBMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0gQ2hlY2sgZW1wdHkgc3RhdGUgIC0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlJdGVtcy5sZW5ndGg7IGVsc2UgdG1wRW1wdHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRtcFRyZWU7IGNvbnRleHQ6eyBsaXN0OiBkaXNwbGF5SXRlbXMgfVwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RtcFRyZWUgbGV0LWxpc3Q9XCJsaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsaXN0O2xldCBpID0gaW5kZXg7dHJhY2tCeSA6IF90cmFja0J5RnVuY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGxpICpuZ0lmPVwiaXRlbS52aXNpYmxlICE9ZmFsc2VcIiAoY2xpY2spPVwib25NZW51Q2xpY2soJGV2ZW50LGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogaXRlbS5pc0FjdGl2ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2l0ZW0udGV4dH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxheC1pY29uIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWljb24nOiBpdGVtLmlzT3Blbn1cIiAqbmdJZj1cIml0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwXCIgY2xhc3M9XCJheC1pYy1jaGV2cm9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9heC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxheC1pY29uICpuZ0lmPVwiaXRlbS5pY29uXCIgY2xhc3M9XCJ7e2l0ZW0uaWNvbn19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9heC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cIml0ZW0/LmNoaWxkcmVuPy5sZW5ndGggPiAwICYmIGl0ZW0uaXNPcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRtcFRyZWU7IGNvbnRleHQ6eyBsaXN0OiBkaXNwbGF5SXRlbXMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tLS0tIGl0ZW1zIGl0ZXJhdGlvbiAgLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGlzcGxheUl0ZW1zO2xldCBpID0gaW5kZXg7dHJhY2tCeSA6IF90cmFja0J5RnVuY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVRlbXBsYXRlOyBlbHNlIGRlZnVhbHRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJheC1saXN0LWl0ZW1cIiAoY2xpY2spPVwiX2hhbmRsZU9uSXRlbUNsaWNrKCRldmVudCxpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXgtc3RhdGUtZGlzYWJsZWRdPVwiaXNJdGVtRGlzYWJsZWQoaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sZGlyZWN0aW9uOmRpcmVjdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmdWFsdFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW11bHRpcGxlOyB0aGVuIHNpbmdsZVRlbXBsYXRlOyBlbHNlIG11bHRpcGxlVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJheC1saXN0LWl0ZW1cIiBbY2xhc3MuYXgtc3RhdGUtc2VsZWN0ZWRdPVwiaXNJdGVtU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlcIiBbY2xhc3MuYXgtc3RhdGUtZGlzYWJsZWRdPVwiaXNJdGVtRGlzYWJsZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfaGFuZGxlT25JdGVtQ2xpY2soJGV2ZW50LGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX2dldEl0ZW1EaXNwbGF5VGV4dFRlbXBsdGUoaXRlbSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbXVsdGlwbGVUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImF4LWxpc3QtaXRlbVwiIFtjbGFzcy5heC1zdGF0ZS1zZWxlY3RlZF09XCJpc0l0ZW1TZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmF4LWNoZWNrLWJveF09XCJjaGVja2JveFwiIFthdHRyLnRhYmluZGV4XT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9oYW5kbGVPbkl0ZW1DbGljaygkZXZlbnQsaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NsYXNzLmF4LXN0YXRlLWRpc2FibGVkXT1cImlzSXRlbURpc2FibGVkKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSXRlbURpc2FibGVkKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX2dldEl0ZW1EaXNwbGF5VGV4dFRlbXBsdGUoaXRlbSkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBlbXB0eSB0ZW1wbGF0ZSAgLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0bXBFbXB0eT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBjaGVjayBmb3IgY3VzdG9tIHRlbXBsYXRlICAtLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVtcHR5VGVtcGxhdGU7IGVsc2UgZWxzZUVtcHR5VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVtcHR5VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlRW1wdHlUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWxpc3QtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2NvbW1vbi5uby1yZXN1bHQtZm91bmQnIHwgdHJhbnMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBsb2FkaW5nIHRlbXBsYXRlICAtLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RtcExvYWRpbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0gY2hlY2sgZm9yIGN1c3RvbSB0ZW1wbGF0ZSAgLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nVGVtcGxhdGU7IGVsc2UgZWxzZUxvYWRpbmdUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1RlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUxvYWRpbmdUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWZsZXggYXgtaXRlbXMtY2VudGVyIGF4LWp1c3RpZnktY2VudGVyIGF4LXAtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF4LWxvYWRpbmcgdGV4dD1cInt7ICdsYXlvdXQubG9hZGluZy50ZXh0JyB8IHRyYW5zIH19XCI+PC9heC1sb2FkaW5nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGlzcGxheUl0ZW1zO2xldCBpID0gaW5kZXg7dHJhY2tCeSA6IF90cmFja0J5RnVuY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVRlbXBsYXRlOyBlbHNlIGRlZnVhbHRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtbGlzdC1pdGVtXCIgKGNsaWNrKT1cIl9oYW5kbGVPbkl0ZW1DbGljaygkZXZlbnQsaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmF4LXN0YXRlLWRpc2FibGVkXT1cImlzSXRlbURpc2FibGVkKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtLGRpcmVjdGlvbjpkaXJlY3Rpb259XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZ1YWx0VGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbXVsdGlwbGU7IHRoZW4gc2luZ2xlVGVtcGxhdGU7IGVsc2UgbXVsdGlwbGVUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZVRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWxpc3QtaXRlbVwiIFtjbGFzcy5heC1zdGF0ZS1zZWxlY3RlZF09XCJpc0l0ZW1TZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaVwiIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9oYW5kbGVPbkl0ZW1DbGljaygkZXZlbnQsaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBfZ2V0SXRlbURpc3BsYXlUZXh0VGVtcGx0ZShpdGVtKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbXVsdGlwbGVUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1saXN0LWl0ZW1cIiBbY2xhc3MuYXgtc3RhdGUtc2VsZWN0ZWRdPVwiaXNJdGVtU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5heC1jaGVjay1ib3hdPVwiY2hlY2tib3hcIiBbYXR0ci50YWJpbmRleF09XCJpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXgtc3RhdGUtZGlzYWJsZWRdPVwiaXNJdGVtRGlzYWJsZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfaGFuZGxlT25JdGVtQ2xpY2soJGV2ZW50LGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiICpuZ0lmPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChpdGVtKVwiIFtkaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IF9nZXRJdGVtRGlzcGxheVRleHRUZW1wbHRlKGl0ZW0pIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGRpc3BsYXlJdGVtcz09bnVsbCB8fCBkaXNwbGF5SXRlbXMubGVuZ3RoPT0wKSAmJiAhaXNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVtcHR5VGVtcGxhdGU7IGVsc2UgZWxzZUVtcHR5VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVtcHR5VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlRW1wdHlUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWxpc3QtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2NvbW1vbi5uby1yZXN1bHQtZm91bmQnIHwgdHJhbnMgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nVGVtcGxhdGU7IGVsc2UgZWxzZUxvYWRpbmdUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1RlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUxvYWRpbmdUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWZsZXggYXgtaXRlbXMtY2VudGVyIGF4LWp1c3RpZnktY2VudGVyIGF4LXAtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF4LWxvYWRpbmcgdGV4dD1cInt7ICdsYXlvdXQubG9hZGluZy50ZXh0JyB8IHRyYW5zIH19XCI+PC9heC1sb2FkaW5nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9heC1wb3BvdmVyPiJdfQ==
|
|
306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Ym94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9jb21wb25lbnRzL3NyYy9saWIvc2VsZWN0Ym94L3NlbGVjdGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdGJveC9zZWxlY3Rib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBdUIsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hMLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsNEJBQTRCLEVBQXFDLE1BQU0sU0FBUyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdGLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFZaEQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLDRCQUE0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WSxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsaUJBQzlGLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sUUFDekMsRUFBRSxLQUFLLEVBQUUsa0NBQWtDLEVBQUU7K0tBTW5ELE9BQU87c0JBRE4sU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBUy9DLFdBQVc7c0JBRFYsS0FBSztnQkFNSyxjQUFjO3NCQUR4QixLQUFLO2dCQVVOLFFBQVE7c0JBRFAsS0FBSztnQkFJRSxhQUFhO3NCQURwQixTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSXBDLFVBQVU7c0JBRGpCLFNBQVM7dUJBQUMsV0FBVztnQkFJZCxxQkFBcUI7c0JBRDVCLFlBQVk7dUJBQUMsZUFBZTtnQkF3RzdCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWFBsYXRmb3JtLCBBWFRyYW5zbGF0b3IgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBOZ1pvbmUsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IEFYQmFzZVNlbGVjdGlvbkRyb3Bkb3duTWl4aW4sIEFYQ2xpY2tFdmVudCwgQVhWYWx1ZUNoYW5nZWRFdmVudCB9IGZyb20gJy4uL2Jhc2UnO1xyXG5pbXBvcnQgeyBEQVRBTElTVF9JTlBVVFMgfSBmcm9tICcuLi9iYXNlL21peGluL2RhdGFsaXN0LWNvbXBvbmVudC5jbGFzcyc7XHJcbmltcG9ydCB7IERST1BET1dOX0lOUFVUUywgRFJPUERPV05fT1VUUFVUIH0gZnJvbSAnLi4vYmFzZS9taXhpbi9kcm9wZG93bi1taXhpbi5jbGFzcyc7XHJcbmltcG9ydCB7IElOVEVSQUNUSVZFX0lOUFVUUywgSU5URVJBQ1RJVkVfT1VUUFVUIH0gZnJvbSAnLi4vYmFzZS9taXhpbi9pbnRlcmFjdGl2ZS1taXhpbi5jbGFzcyc7XHJcbmltcG9ydCB7IFNFTEVDVElPTl9JTlBVVFMsIFNFTEVDVElPTl9PVVRQVVQgfSBmcm9tICcuLi9iYXNlL21peGluL3NlbGVjdGlvbi1jb21wb25lbnQuY2xhc3MnO1xyXG5pbXBvcnQgeyBURVhUQk9YX0lOUFVUUywgVEVYVEJPWF9PVVRQVVQgfSBmcm9tICcuLi9iYXNlL21peGluL3RleHRib3gtbWl4aW4uY2xhc3MnO1xyXG5pbXBvcnQgeyBWQUxVRV9JTlBVVFMsIFZBTFVFX09VVFBVVCB9IGZyb20gJy4uL2Jhc2UvbWl4aW4vdmFsdWUtbWl4aW4uY2xhc3MnO1xyXG5pbXBvcnQgeyBBWFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuLi9wb3BvdmVyJztcclxuaW1wb3J0IHsgQVhUZXh0Qm94Q29tcG9uZW50IH0gZnJvbSAnLi4vdGV4dGJveCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXgtc2VsZWN0LWJveCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJ3NlbGVjdGJveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBpbnB1dHM6IFsuLi5EUk9QRE9XTl9JTlBVVFMsIC4uLklOVEVSQUNUSVZFX0lOUFVUUywgLi4uVkFMVUVfSU5QVVRTLCAuLi5URVhUQk9YX0lOUFVUUywgLi4uREFUQUxJU1RfSU5QVVRTLCAuLi5TRUxFQ1RJT05fSU5QVVRTXSxcclxuICAgIG91dHB1dHM6IFsuLi5EUk9QRE9XTl9PVVRQVVQsIC4uLklOVEVSQUNUSVZFX09VVFBVVCwgLi4uVkFMVUVfT1VUUFVULCAuLi5URVhUQk9YX09VVFBVVCwgLi4uU0VMRUNUSU9OX09VVFBVVF0sXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBob3N0OiB7IGNsYXNzOiAnYXgtZWRpdG9yLWNvbnRhaW5lciBheC1kcm9wLWRvd24nIH1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFYU2VsZWN0Qm94Q29tcG9uZW50IGV4dGVuZHMgQVhCYXNlU2VsZWN0aW9uRHJvcGRvd25NaXhpbiB7XHJcblxyXG5cclxuICAgIEBWaWV3Q2hpbGQoQVhQb3BvdmVyQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcG9wb3ZlcjogQVhQb3BvdmVyQ29tcG9uZW50O1xyXG5cclxuICAgIF90YXJnZXQ6IEhUTUxEaXZFbGVtZW50O1xyXG4gICAgX3BvcG92ZXJUaXRsZTogc3RyaW5nO1xyXG4gICAgX3BvcG92ZXJXaWR0aDogbnVtYmVyO1xyXG5cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY2xlYXJCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIF9zZWFyY2hTZXR0aW5nczogeyBlbmFibGVkPzogYm9vbGVhbiwgZXhwcj86IHN0cmluZyB9ID0geyBlbmFibGVkOiBmYWxzZSwgZXhwcjogbnVsbCB9O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHNlYXJjaFNldHRpbmdzKCk6IHsgZW5hYmxlZD86IGJvb2xlYW4sIGV4cHI/OiBzdHJpbmcgfSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFNldHRpbmdzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzZWFyY2hTZXR0aW5ncyh2OiB7IGVuYWJsZWQ/OiBib29sZWFuLCBleHByPzogc3RyaW5nIH0pIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hTZXR0aW5ncyA9IHYgfHwgeyBlbmFibGVkOiBmYWxzZSwgZXhwcjogbnVsbCB9O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY2hlY2tib3g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdsaXN0Q29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgbGlzdENvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoQm94JylcclxuICAgIHByaXZhdGUgX3NlYXJjaEJveDogQVhUZXh0Qm94Q29tcG9uZW50O1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoJ2VtcHR5VGVtcGxhdGUnKVxyXG4gICAgcHJpdmF0ZSBfY29udGVudEVtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cclxuICAgIGdldCBlbXB0eVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50RW1wdHlUZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBfaXNNb2JpbGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIF9mb3JjZUZvY3VzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4sXHJcbiAgICAgICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIF96b25lOiBOZ1pvbmUsXHJcbiAgICAgICAgcHJpdmF0ZSBfcGxhdGZvcm06IEFYUGxhdGZvcm0sXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfZWxlbWVudFJlZiwgX2Nkcik7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUFycm93Q2xpY2tFdmVudChlOiBBWENsaWNrRXZlbnQpIHtcclxuICAgICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUlucHV0Q2xpY2tFdmVudChlOiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBvbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuX2lzTW9iaWxlID0gdGhpcy5fcGxhdGZvcm0uaXMoJ01vYmlsZScpO1xyXG4gICAgICAgIHRoaXMuX3BvcG92ZXJUaXRsZSA9IHRoaXMucGxhY2Vob2xkZXIgfHwgQVhUcmFuc2xhdG9yLmdldCgnc2VsZWN0Ym94LnBvcG92ZXIudGl0bGUnKVxyXG4gICAgfVxyXG5cclxuICAgIG9uVmlld0luaXQoKSB7XHJcbiAgICAgICAgc3VwZXIub25WaWV3SW5pdCgpO1xyXG4gICAgICAgIHRoaXMuX3BvcG92ZXJXaWR0aCA9IHRoaXMuX2lzTW9iaWxlID8gbnVsbCA6IHRoaXMuX3RhcmdldC5vZmZzZXRXaWR0aDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmVmcmVzaCgpIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcclxuICAgICAgICBzdXBlci5yZWZyZXNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZU9uSXRlbUNsaWNrKGU6IE1vdXNlRXZlbnQsIGl0ZW06IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSXRlbURpc2FibGVkKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKVxyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgdGhpcy50b2dnbGVTZWxlY3QoaXRlbSk7XHJcbiAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlTGlzdFNjcm9sbChlOiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSBlLnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICBpZiAoKGxpc3Quc2Nyb2xsVG9wIDwgbGlzdC5zY3JvbGxIZWlnaHQgLSBsaXN0LmNsaWVudEhlaWdodCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9mZXRjaERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jaGVja0ZvckxvYWREYXRhKCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBoZWFkZXJTaXplID0gbGlzdC5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KCcuYXgtb3ZlcmxheS1wYW5lLWhlYWRlcicpPy5vZmZzZXRIZWlnaHQgfHwgMDtcclxuICAgICAgICBpZiAodGhpcy5sb2FkZWRDb3VudCA8IHRoaXMudG90YWxDb3VudCAmJiBsaXN0LnNjcm9sbEhlaWdodCA8ICgobGlzdC5wYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodCAtIGhlYWRlclNpemUpICogMS41KSkge1xyXG4gICAgICAgICAgICB0aGlzLl9mZXRjaERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX29uRGF0YUxvYWRlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wb3BvdmVyLmlzT3Blbikge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrRm9yTG9hZERhdGEoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucG9wb3Zlci51cGRhdGVQb3NpdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZvcmNlRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1NlbGVjdGVkSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmNlRm9jdXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX29uVmFsdWVDaGFuZ2VkKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcclxuICAgICAgICBzdXBlci5fb25WYWx1ZUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlT25SZW1vdmVJdGVtQ2xpY2soZTogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICAgICAgdGhpcy51bnNlbGVjdEl0ZW1zKGl0ZW0pXHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQmFkZ2VSZW1vdmUoZTogTW91c2VFdmVudCwgaXRlbSkge1xyXG4gICAgICAgIHRoaXMudW5zZWxlY3RJdGVtcyhpdGVtKVxyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBfaGFuZGxlS2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgaXNMZXR0ZXIgPSBuZXcgUmVnRXhwKC9bYS16QS1aMC05XFwtXS8pLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShlLmtleUNvZGUpKTtcclxuICAgICAgICBpZiAoZS5jb2RlID09PSAnQmFja3NwYWNlJyAmJiBlLnR5cGUgPT09ICdrZXlkb3duJyAmJlxyXG4gICAgICAgICAgICAoKHRoaXMuYWxsb3dOdWxsID09PSB0cnVlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB8fFxyXG4gICAgICAgICAgICAgICAgKHRoaXMuYWxsb3dOdWxsICE9PSB0cnVlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1VzZXJJbnB1dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RJdGVtcyh0aGlzLnNlbGVjdGVkSXRlbXMucG9wKCkpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKGUuY29kZSA9PT0gJ0Fycm93RG93bicgfHwgZS5jb2RlID09PSAnQXJyb3dVcCcgfHwgZS5jb2RlID09PSAnU3BhY2UnKSAmJiAhdGhpcy5wb3BvdmVyLmlzT3BlbiAmJiBlLnR5cGUgPT09ICdrZXlkb3duJykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChlLmN0cmxLZXkgfHwgZS5jb2RlID09PSAnU3BhY2UnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1CeU5hdigoZS5rZXkgPT09ICdBcnJvd0Rvd24nID8gMSA6IC0xKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlzTGV0dGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IGUua2V5O1xyXG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBfaGFuZGxlUG9wb3ZlcktleWRvd24oZTogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICgoZS5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGUua2V5ID09PSAnQXJyb3dVcCcpICYmIHRoaXMuZGlzcGxheUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5pc1VzZXJJbnB1dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzSXRlbUJ5TmF2KChlLmtleSA9PT0gJ0Fycm93RG93bicgPyAxIDogLTEpKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlLmNvZGUgPT09ICdCYWNrc3BhY2UnICYmXHJcbiAgICAgICAgICAgICgodGhpcy5hbGxvd051bGwgPT09IHRydWUgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgICAgICAgICAodGhpcy5hbGxvd051bGwgIT09IHRydWUgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDEpKSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy51bnNlbGVjdEl0ZW1zKHRoaXMuc2VsZWN0ZWRJdGVtcy5wb3AoKSk7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoKGUuY29kZSA9PT0gJ1NwYWNlJyB8fCBlLmNvZGUgPT09ICdFbnRlcicpKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRJdGVtSWQgPSB0aGlzLmxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLmF4LXN0YXRlLWZvY3VzJykuZGF0YXNldC5pZDtcclxuICAgICAgICAgICAgY29uc3QgZm9jdXNlZEl0ZW0gPSBfLmZpbmRMYXN0KHRoaXMuZmxhdEl0ZW1zLCBbdGhpcy52YWx1ZUZpZWxkLCBmb2N1c2VkSXRlbUlkXSk7XHJcbiAgICAgICAgICAgIGlmIChmb2N1c2VkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJdGVtRGlzYWJsZWQoZm9jdXNlZEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVNlbGVjdChmb2N1c2VkSXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW1zKGZvY3VzZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZS5jb2RlID09PSBcIlRhYlwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVQb3B1cE9uT3BlbmVkKGUpIHtcclxuICAgICAgICB0aGlzLnBvcG92ZXIuZm9jdXMoKTtcclxuICAgICAgICBpZiAodGhpcy5kaXNwbGF5SXRlbXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9yY2VGb2N1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZldGNoRGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWxlY3RlZEl0ZW0oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3NlYXJjaEJveCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hCb3guZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZVBvcHVwT25DbG9zZWQoZSkge1xyXG4gICAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfZm9jdXNJdGVtQnlOYXYoc2lnbjogLTEgfCAxKTogdm9pZCB7XHJcbiAgICAgXHJcbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMubGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGZuID0gKHMpID0+IGxpc3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4ocyk7XHJcbiAgICAgICAgY29uc3QgaXRlbURpdiA9IGZuKGAuYXgtbGlzdC1pdGVtLmF4LXN0YXRlLWZvY3VzYCkgfHwgZm4oYC5heC1saXN0LWl0ZW0uYXgtc3RhdGUtc2VsZWN0ZWRgKSB8fCBmbihgLmF4LWxpc3QtaXRlbWApO1xyXG4gICAgICAgIGxldCBuZXh0ID0gKHNpZ24gPT0gMSA/IGl0ZW1EaXYubmV4dEVsZW1lbnRTaWJsaW5nIDogaXRlbURpdi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAobmV4dCkge1xyXG4gICAgICAgICAgICB0aGlzLl9mb2N1c0l0ZW1FbGVtZW50KG5leHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gaXRlbURpdi5jbG9zZXN0KCcuYXgtbGlzdC1pdGVtLWdyb3VwJyk7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpcyA9IChzaWduID09IDEgPyBwYXJlbnQubmV4dEVsZW1lbnRTaWJsaW5nIDogcGFyZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpPy5xdWVyeVNlbGVjdG9yQWxsKCdsaScpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IHNpZ24gPT0gMSA/IF8uZmlyc3QobGlzKSA6IF8ubGFzdChsaXMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c0l0ZW1FbGVtZW50KGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIF9mb2N1c1NlbGVjdGVkSXRlbSgpIHtcclxuICAgICAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMubGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBmbiA9IChzKSA9PiBsaXN0LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHMpO1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtRGl2ID0gZm4oYC5heC1saXN0LWl0ZW0uYXgtc3RhdGUtc2VsZWN0ZWRgKSB8fCBmbihgLmF4LWxpc3QtaXRlbWApO1xyXG4gICAgICAgICAgICBpZiAoaXRlbURpdikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNJdGVtRWxlbWVudChpdGVtRGl2KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2ZvY3VzSXRlbUVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgbGlzdC5xdWVyeVNlbGVjdG9yQWxsKCcuYXgtbGlzdC1pdGVtJykuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjID09IGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYy5jbGFzc0xpc3QuYWRkKCdheC1zdGF0ZS1mb2N1cycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdhdXRvJyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGMuY2xhc3NMaXN0LnJlbW92ZSgnYXgtc3RhdGUtZm9jdXMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaEJveCA/IHRoaXMuX3NlYXJjaEJveC5mb2N1cygpIDogZWwuZm9jdXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRJdGVtQnlOYXYoc2lnbjogLTEgfCAxKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbGFzdCA9IF8ubGFzdCh0aGlzLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICBpZiAobGFzdCkge1xyXG4gICAgICAgICAgICBpID0gXy5maW5kTGFzdEluZGV4KHRoaXMuZmxhdEl0ZW1zLCBbdGhpcy52YWx1ZUZpZWxkLCBsYXN0W3RoaXMudmFsdWVGaWVsZF1dKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaSArPSBzaWduO1xyXG4gICAgICAgIGxldCBuZXh0ID0gXy5udGg8YW55Pih0aGlzLmZsYXRJdGVtcywgaSk7XHJcbiAgICAgICAgd2hpbGUgKG5leHQ/LmNoaWxkcmVuICYmIG5leHQ/LmNoaWxkcmVuLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpICs9IHNpZ247XHJcbiAgICAgICAgICAgIG5leHQgPSBfLm50aDxhbnk+KHRoaXMuZmxhdEl0ZW1zLCBpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5leHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhuZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobmV4dCA9PSBudWxsICYmIHNpZ24gPT0gMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9mZXRjaERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIF9vblNlYXJjaEV4cHJDaGFuZ2VkKGU6IEFYVmFsdWVDaGFuZ2VkRXZlbnQ8c3RyaW5nPikge1xyXG4gICAgICAgIHRoaXMuZW1wdHkoKTtcclxuICAgICAgICB0aGlzLl9mZXRjaERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBfZmV0Y2hEYXRhKClcclxuICAgIHtcclxuICAgICAgICBzdXBlci5fZmV0Y2hEYXRhKHsgc2VhcmNoUXVlcnk6IHRoaXMuX3NlYXJjaEJveD8udmFsdWUgfSk7XHJcbiAgICB9XHJcbn0iLCI8bmctY29udGVudCBzZWxlY3Q9XCJheC1wcmVmaXhcIj5cclxuPC9uZy1jb250ZW50PlxyXG48ZGl2IGNsYXNzPVwiYXgtZHJvcGRvd24tY29udGVudFwiIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiIChjbGljayk9XCJfaGFuZGxlSW5wdXRDbGlja0V2ZW50KCRldmVudClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJheC1zZWxlY3QtYm94LXNlbGVjdGlvblwiIFt0YWJpbmRleF09XCJ0YWJJbmRleFwiIChmb2N1cyk9XCJfZW1pdE9uRm9jdXNFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAoYmx1cik9XCJfZW1pdE9uQmx1ckV2ZW50KCRldmVudClcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aDsgZWxzZSBzaG93UGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtdWx0aXBsZTsgdGhlbiBzaW5nbGVTZWxlY3RlZFRlbXBsYXRlOyBlbHNlIG11bHRpcGxlU2VsZWN0ZWRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZVNlbGVjdGVkVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkSXRlbXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF4LW14LTJcIj4ge3sgX2dldEl0ZW1EaXNwbGF5VGV4dFRlbXBsdGUoaXRlbSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtdWx0aXBsZVNlbGVjdGVkVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtZmxleCBheC1teC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxheC1iYWRnZSBbdGV4dF09XCJfZ2V0SXRlbURpc3BsYXlUZXh0VGVtcGx0ZShpdGVtKVwiIGNvbG9yPVwibGlnaHRcIiBjbGFzcz1cImF4LW1lLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxheC1zdWZmaXg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljIGF4LWljLWNsb3NlIGF4LWN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9oYW5kbGVCYWRnZVJlbW92ZSgkZXZlbnQsaXRlbSlcIj48L2F4LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2F4LXN1ZmZpeD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9heC1iYWRnZT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd1BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtcGxhY2Vob2xkZXJcIiByb2xlPVwidGV4dGJveFwiIGFyZWEtcmVhZG9ubHk9XCJ0cnVlXCI+IHt7cGxhY2Vob2xkZXJ9fTwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxheC1idXR0b24gY29sb3I9XCJsaWdodFwiIGxvb2s9XCJibGFua1wiIChvbkNsaWNrKT1cImNsZWFyKClcIiBbdGFiSW5kZXhdPVwiLTFcIlxyXG4gICAgKm5nSWY9XCJ2YWx1ZSAmJiBjbGVhckJ1dHRvbiAmJiAgIShkaXNhYmxlZCB8fCByZWFkb25seSlcIj5cclxuICAgIDxheC1pY29uIGljb249XCJheC1pYyBheC1pYy1jbG9zZVwiPjwvYXgtaWNvbj5cclxuPC9heC1idXR0b24+XHJcbjxheC1idXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW3RhYkluZGV4XT1cIi0xXCIgY29sb3I9XCJsaWdodFwiIGxvb2s9XCJibGFua1wiIChvbkNsaWNrKT1cIl9oYW5kbGVBcnJvd0NsaWNrRXZlbnQoJGV2ZW50KVwiPlxyXG4gICAgPGF4LXByZWZpeCAqbmdJZj1cIihpc0xvYWRpbmcgJiYgIXRoaXMucG9wb3Zlci5pc09wZW4pO2Vsc2UgaWNvblwiPlxyXG4gICAgICAgIDxheC1sb2FkaW5nIHR5cGU9XCJzcGlubmVyXCI+PC9heC1sb2FkaW5nPlxyXG4gICAgPC9heC1wcmVmaXg+XHJcbiAgICA8bmctdGVtcGxhdGUgI2ljb24+XHJcbiAgICAgICAgPGF4LWljb24gI2ljb24gaWNvbj1cImF4LWljIGF4LWljLWNoZXZyb24gYXgtdHJhbnNmb3JtIGF4LS1yb3RhdGUtOTBcIj48L2F4LWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L2F4LWJ1dHRvbj5cclxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtdmFsaWRhdGlvbi1ydWxlXCI+XHJcbjwvbmctY29udGVudD5cclxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiYXgtc3VmZml4XCI+XHJcbjwvbmctY29udGVudD5cclxuPGF4LXBvcG92ZXIgW3RhcmdldF09XCJfdGFyZ2V0XCIgW3Bvc2l0aW9uXT1cInBvc2l0aW9uXCIgW29wZW5UcmlnZ2VyXT1cIidtYW51YWwnXCIgW2Nsb3NlVHJpZ2dlcl09XCInY2xpY2tvdXQnXCJcclxuICAgIChvbk9wZW5lZCk9XCJfaGFuZGxlUG9wdXBPbk9wZW5lZCgkZXZlbnQpXCIgKG9uQ2xvc2VkKT1cIl9oYW5kbGVQb3B1cE9uQ2xvc2VkKCRldmVudClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJheC1vdmVybGF5LXBhbmVcIiAoa2V5ZG93bik9XCJfaGFuZGxlUG9wb3ZlcktleWRvd24oJGV2ZW50KVwiIHRhYmluZGV4PVwiMFwiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgY2RrVHJhcEZvY3VzXHJcbiAgICAgICAgW2NsYXNzLmF4LW92ZXJsYXktY2VudGVyXT1cIl9pc01vYmlsZVwiIFtzdHlsZS5taW4td2lkdGgucHhdPVwiX3BvcG92ZXJXaWR0aFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJheC1saXN0IGF4LWxpc3QtY29udGFpbmVyXCIgcGFuZWw+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJfaXNNb2JpbGVcIiBjbGFzcz1cImF4LW92ZXJsYXktcGFuZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7X3BvcG92ZXJUaXRsZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJheC1pYyB7e211bHRpcGxlPydheC1pYy1jaGVjayAhYXgtdGV4dC1wcmltYXJ5LTUwMCc6J2F4LWljLWNsb3NlJ319XCIgKGNsaWNrKT1cImNsb3NlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWFyY2hTZXR0aW5ncy5lbmFibGVkXCIgY2xhc3M9XCJheC1wLTJcIiBbY2RrVHJhcEZvY3VzXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDxheC10ZXh0LWJveCAjc2VhcmNoQm94IHBsYWNlaG9sZGVyPVwie3sgJ2NvbW1vbi5zZWFyY2gnIHwgdHJhbnMgfX1cIiBbZGVib3VuY2VUaW1lXT1cIjUwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyh2YWx1ZSldPVwic2VhcmNoU2V0dGluZ3MuZXhwclwiIChvblZhbHVlQ2hhbmdlZCk9XCJfb25TZWFyY2hFeHByQ2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2F4LXRleHQtYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWxpc3QtaXRlbXMtY29udGFpbmVyIGF4LXZlcnRpY2FsIGF4LWRlZmF1bHRcIiBbY2xhc3MuYXgtZnVsbF09XCJfaXNNb2JpbGVcIiAgKHNjcm9sbCk9XCJfaGFuZGxlTGlzdFNjcm9sbCgkZXZlbnQpXCIgI2xpc3RDb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBDaGVjayBlbXB0eSBzdGF0ZSAgLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5SXRlbXMubGVuZ3RoOyBlbHNlIHRtcEVtcHR5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0gcmVjdXJzaXZlIHRlbXBsYXRlICAtLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRtcFRyZWU7IGNvbnRleHQ6eyBsaXN0OiBkaXNwbGF5SXRlbXMgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0bXBUcmVlIGxldC1saXN0PVwibGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0gaXRlbXMgaXRlcmF0aW9uICAtLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsaXN0O2xldCBpID0gaW5kZXg7dHJhY2tCeSA6IF90cmFja0J5RnVuY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVRlbXBsYXRlOyBlbHNlIGRlZnVhbHRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJheC1saXN0LWl0ZW1cIiAoY2xpY2spPVwiX2hhbmRsZU9uSXRlbUNsaWNrKCRldmVudCxpdGVtKVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pZF09XCJpdGVtW3RoaXMudmFsdWVGaWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0sZGlyZWN0aW9uOmRpcmVjdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmdWFsdFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5jaGlsZHJlbj8ubGVuZ3RoID4gMDtlbHNlIHRtcEl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImF4LWxpc3QtaXRlbS1ncm91cFwiIFthdHRyLmRhdGEtaWRdPVwiaXRlbVt0aGlzLnZhbHVlRmllbGRdXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBfZ2V0SXRlbURpc3BsYXlUZXh0VGVtcGx0ZShpdGVtKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBjaGlsZHJlbiBpdGVyYXRpb24gIC0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsICpuZ0lmPVwiaXRlbS5jaGlsZHJlbj8ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRtcFRyZWU7IGNvbnRleHQ6eyBsaXN0OiAgaXRlbS5jaGlsZHJlbiB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0bXBJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtdWx0aXBsZTsgIGVsc2UgbXVsdGlwbGVUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImF4LWxpc3QtaXRlbVwiIFtjbGFzcy5heC1zdGF0ZS1zZWxlY3RlZF09XCJpc0l0ZW1TZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiIFthdHRyLnRhYmluZGV4XT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiX2hhbmRsZU9uSXRlbUNsaWNrKCRldmVudCxpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWRdPVwiaXRlbVt0aGlzLnZhbHVlRmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgX2dldEl0ZW1EaXNwbGF5VGV4dFRlbXBsdGUoaXRlbSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtdWx0aXBsZVRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImF4LWxpc3QtaXRlbVwiIFtjbGFzcy5heC1zdGF0ZS1zZWxlY3RlZF09XCJpc0l0ZW1TZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5heC1jaGVjay1ib3hdPVwiY2hlY2tib3hcIiBbYXR0ci50YWJpbmRleF09XCJpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9oYW5kbGVPbkl0ZW1DbGljaygkZXZlbnQsaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWlkXT1cIml0ZW1bdGhpcy52YWx1ZUZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSXRlbURpc2FibGVkKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7IF9nZXRJdGVtRGlzcGxheVRleHRUZW1wbHRlKGl0ZW0pIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBsb2FkaW5nIHRlbXBsYXRlICAtLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0gY2hlY2sgZm9yIGN1c3RvbSB0ZW1wbGF0ZSAgLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nVGVtcGxhdGU7IGVsc2UgZWxzZUxvYWRpbmdUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1RlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUxvYWRpbmdUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWZsZXggYXgtaXRlbXMtY2VudGVyIGF4LWp1c3RpZnktY2VudGVyIGF4LXAtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF4LWxvYWRpbmcgdGV4dD1cInt7ICdsYXlvdXQubG9hZGluZy50ZXh0JyB8IHRyYW5zIH19XCI+PC9heC1sb2FkaW5nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBlbXB0eSB0ZW1wbGF0ZSAgLS0tLS0tLS0tLS0tLS0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0bXBFbXB0eT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLSBjaGVjayBmb3IgY3VzdG9tIHRlbXBsYXRlICAtLS0tLS0tLS0tLS0tLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbXB0eVRlbXBsYXRlOyBlbHNlIGVsc2VFbXB0eVRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Vsc2VFbXB0eVRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWxpc3QtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdjb21tb24ubm8tcmVzdWx0LWZvdW5kJyB8IHRyYW5zIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvYXgtcG9wb3Zlcj4iXX0=
|