@libs-ui/components-tabs 0.2.356-25 → 0.2.356-26
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/esm2022/interfaces/tab.interface.mjs +1 -1
- package/esm2022/item/item.component.mjs +25 -3
- package/esm2022/tabs.component.mjs +184 -7
- package/fesm2022/libs-ui-components-tabs.mjs +207 -8
- package/fesm2022/libs-ui-components-tabs.mjs.map +1 -1
- package/interfaces/tab.interface.d.ts +1 -0
- package/item/item.component.d.ts +8 -3
- package/package.json +10 -10
- package/tabs.component.d.ts +33 -3
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, output, signal, untracked, viewChild } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, model, output, signal, untracked, viewChild } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
2
3
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
3
4
|
import { LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective } from '@libs-ui/components-drag-drop';
|
|
4
5
|
import { LibsUiComponentsListComponent } from '@libs-ui/components-list';
|
|
@@ -18,8 +19,24 @@ export class LibsUiComponentsTabsComponent {
|
|
|
18
19
|
changeViewTab = new Subject();
|
|
19
20
|
groupName = signal(uuid());
|
|
20
21
|
stylesDragDropOverrideComputed = computed(() => this.updateStylesDragDropOverride());
|
|
22
|
+
/**
|
|
23
|
+
* V2 — số item đang hiển thị (specificDisplay !== false). Dùng cho mode `space-between`
|
|
24
|
+
* tính width đều cho các item visible (item hidden ở `position: absolute` không chiếm chỗ).
|
|
25
|
+
*/
|
|
26
|
+
displayedCount = computed(() => {
|
|
27
|
+
if (!this.useCalculatorV2())
|
|
28
|
+
return this.itemsDisplay().length || 1;
|
|
29
|
+
const count = this.itemsDisplay().filter((s) => s().specificDisplay !== false).length;
|
|
30
|
+
return count || 1;
|
|
31
|
+
});
|
|
32
|
+
/** V2 — kích thước container do ResizeObserver cập nhật, dùng để compute synchronous. */
|
|
33
|
+
containerWidthV2 = signal(0);
|
|
34
|
+
headerLeftWidthV2 = signal(0);
|
|
35
|
+
headerRightWidthV2 = signal(0);
|
|
36
|
+
resizeObserverV2;
|
|
21
37
|
popoverFunctionControlEvent = signal(undefined);
|
|
22
38
|
onDestroy = new Subject();
|
|
39
|
+
destroyRef = inject(DestroyRef);
|
|
23
40
|
// #region INPUT
|
|
24
41
|
tabs = input.required();
|
|
25
42
|
keySelected = model.required();
|
|
@@ -37,6 +54,14 @@ export class LibsUiComponentsTabsComponent {
|
|
|
37
54
|
popoverShowMoreTabItem = input();
|
|
38
55
|
checkCanChangeTabSelected = input();
|
|
39
56
|
useEffectUpdateItems = input();
|
|
57
|
+
/**
|
|
58
|
+
* V2 mode — khi `true`:
|
|
59
|
+
* - Bỏ container đo song song (không render 2 lần).
|
|
60
|
+
* - Dùng ResizeObserver thay MutationObserver/setTimeout/debounce.
|
|
61
|
+
* - Compute synchronous, không reorder items → không flicker.
|
|
62
|
+
* Mặc định `false` để giữ 100% behavior cũ (backward compatible).
|
|
63
|
+
*/
|
|
64
|
+
useCalculatorV2 = input(false);
|
|
40
65
|
// #region OUTPUT
|
|
41
66
|
outKeySelected = output();
|
|
42
67
|
outFunctionsControl = output();
|
|
@@ -58,6 +83,20 @@ export class LibsUiComponentsTabsComponent {
|
|
|
58
83
|
this.updateItemsDisplay(items);
|
|
59
84
|
});
|
|
60
85
|
});
|
|
86
|
+
// V2 — effect tự động recompute khi container/headerLeft/headerRight đổi kích thước hoặc selected đổi.
|
|
87
|
+
effect(() => {
|
|
88
|
+
if (!this.useCalculatorV2())
|
|
89
|
+
return;
|
|
90
|
+
const containerWidth = this.containerWidthV2();
|
|
91
|
+
// Đọc cả các signal phụ thuộc để effect tự re-run khi chúng đổi.
|
|
92
|
+
this.headerLeftWidthV2();
|
|
93
|
+
this.headerRightWidthV2();
|
|
94
|
+
this.keySelected();
|
|
95
|
+
const items = this.tabs()?.items();
|
|
96
|
+
if (!containerWidth || !items?.length)
|
|
97
|
+
return;
|
|
98
|
+
untracked(() => this.computeDisplayItemsV2(items));
|
|
99
|
+
});
|
|
61
100
|
}
|
|
62
101
|
ngOnInit() {
|
|
63
102
|
this.updateTabsCssConfig();
|
|
@@ -71,10 +110,67 @@ export class LibsUiComponentsTabsComponent {
|
|
|
71
110
|
if (!this.tabs().items().length) {
|
|
72
111
|
return;
|
|
73
112
|
}
|
|
113
|
+
// V2 không cần xử lý resize ở đây — ResizeObserver tự fire.
|
|
114
|
+
if (this.useCalculatorV2()) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
74
117
|
this.displayMoreItem.set(false);
|
|
75
118
|
this.calculatorTabsItemDisplay();
|
|
76
119
|
});
|
|
77
|
-
|
|
120
|
+
// V1 path: preserve old behavior với debounce(20).
|
|
121
|
+
this.changeViewTab.pipe(debounceTime(20), takeUntil(this.onDestroy)).subscribe(() => {
|
|
122
|
+
if (this.useCalculatorV2())
|
|
123
|
+
return;
|
|
124
|
+
this.calculatorTabsItemDisplay();
|
|
125
|
+
});
|
|
126
|
+
// V2 path: chạy sync (không debounce) — ResizeObserver đã batch theo frame.
|
|
127
|
+
this.changeViewTab.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
128
|
+
if (!this.useCalculatorV2())
|
|
129
|
+
return;
|
|
130
|
+
const items = this.tabs()?.items();
|
|
131
|
+
if (items?.length)
|
|
132
|
+
this.computeDisplayItemsV2(items);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
ngAfterViewInit() {
|
|
136
|
+
if (this.useCalculatorV2()) {
|
|
137
|
+
this.setupResizeObserverV2();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
setupResizeObserverV2() {
|
|
141
|
+
if (this.resizeObserverV2 || typeof ResizeObserver === 'undefined') {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const headerEl = this.headerEl()?.nativeElement;
|
|
145
|
+
const headerLeftEl = this.headerLeftEl()?.nativeElement;
|
|
146
|
+
const headerRightEl = this.headerRightEl()?.nativeElement;
|
|
147
|
+
if (!headerEl)
|
|
148
|
+
return;
|
|
149
|
+
this.resizeObserverV2 = new ResizeObserver((entries) => {
|
|
150
|
+
for (const entry of entries) {
|
|
151
|
+
const target = entry.target;
|
|
152
|
+
const width = target.clientWidth || 0;
|
|
153
|
+
switch (target) {
|
|
154
|
+
case headerEl:
|
|
155
|
+
if (this.containerWidthV2() !== width)
|
|
156
|
+
this.containerWidthV2.set(width);
|
|
157
|
+
break;
|
|
158
|
+
case headerLeftEl:
|
|
159
|
+
if (this.headerLeftWidthV2() !== width)
|
|
160
|
+
this.headerLeftWidthV2.set(width);
|
|
161
|
+
break;
|
|
162
|
+
case headerRightEl:
|
|
163
|
+
if (this.headerRightWidthV2() !== width)
|
|
164
|
+
this.headerRightWidthV2.set(width);
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
this.resizeObserverV2.observe(headerEl);
|
|
170
|
+
if (headerLeftEl)
|
|
171
|
+
this.resizeObserverV2.observe(headerLeftEl);
|
|
172
|
+
if (headerRightEl)
|
|
173
|
+
this.resizeObserverV2.observe(headerRightEl);
|
|
78
174
|
}
|
|
79
175
|
updateItemsDisplay(items) {
|
|
80
176
|
if (!items)
|
|
@@ -85,6 +181,16 @@ export class LibsUiComponentsTabsComponent {
|
|
|
85
181
|
this.itemsDisplay.set(items);
|
|
86
182
|
return;
|
|
87
183
|
}
|
|
184
|
+
if (this.useCalculatorV2()) {
|
|
185
|
+
// V2: itemsDisplay chứa toàn bộ items (không filter). ResizeObserver sẽ đo width
|
|
186
|
+
// và compute sẽ set specificDisplay flag — style binding ẩn item overflow.
|
|
187
|
+
items.forEach((item) => item.update((data) => ({ ...data, specificDisplay: true })));
|
|
188
|
+
this.itemsDisplay.set([...items]);
|
|
189
|
+
if (this.containerWidthV2()) {
|
|
190
|
+
this.computeDisplayItemsV2(items);
|
|
191
|
+
}
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
88
194
|
this.calculatorTabsItemDisplay();
|
|
89
195
|
});
|
|
90
196
|
}
|
|
@@ -92,7 +198,7 @@ export class LibsUiComponentsTabsComponent {
|
|
|
92
198
|
get FunctionsControl() {
|
|
93
199
|
return {
|
|
94
200
|
addTabsItem: this.addTabsItem.bind(this),
|
|
95
|
-
calculatorTabsItemsDisplay: this.
|
|
201
|
+
calculatorTabsItemsDisplay: this.calculatorTabsItemDisplayDispatch.bind(this),
|
|
96
202
|
selectedTabsItem: this.handlerSelectedTabsItem.bind(this),
|
|
97
203
|
};
|
|
98
204
|
}
|
|
@@ -216,7 +322,7 @@ export class LibsUiComponentsTabsComponent {
|
|
|
216
322
|
this.keySelected.set(item()[this.fieldKey()]);
|
|
217
323
|
this.outKeySelected.emit(this.keySelected());
|
|
218
324
|
this.popoverFunctionControlEvent()?.removePopoverOverlay();
|
|
219
|
-
this.
|
|
325
|
+
this.calculatorTabsItemDisplayDispatch();
|
|
220
326
|
}
|
|
221
327
|
async handlerAction(event) {
|
|
222
328
|
this.outAction.emit(event);
|
|
@@ -237,6 +343,16 @@ export class LibsUiComponentsTabsComponent {
|
|
|
237
343
|
this.handlerClickItem(item);
|
|
238
344
|
}
|
|
239
345
|
}
|
|
346
|
+
/** Dispatch sang nhánh V1 hoặc V2 dựa theo flag. Public API giữ nguyên signature. */
|
|
347
|
+
async calculatorTabsItemDisplayDispatch() {
|
|
348
|
+
if (this.useCalculatorV2()) {
|
|
349
|
+
const items = this.tabs()?.items();
|
|
350
|
+
if (items?.length)
|
|
351
|
+
this.computeDisplayItemsV2(items);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
await this.calculatorTabsItemDisplay();
|
|
355
|
+
}
|
|
240
356
|
async calculatorTabsItemDisplay() {
|
|
241
357
|
let items = this.tabs().items();
|
|
242
358
|
const indexItemSelected = items.findIndex((item) => item()[this.fieldKey()] === this.keySelected());
|
|
@@ -281,15 +397,76 @@ export class LibsUiComponentsTabsComponent {
|
|
|
281
397
|
.filter((item) => item().specificDisplay);
|
|
282
398
|
this.itemsDisplay.set(newItemsDisplay);
|
|
283
399
|
}
|
|
400
|
+
/**
|
|
401
|
+
* V2 — Tính displayItems synchronous, không reorder, không setTimeout.
|
|
402
|
+
*
|
|
403
|
+
* Why: tránh flicker do reorder DOM + bỏ thuật toán "cảm tính" debounce.
|
|
404
|
+
* How to apply: gọi mỗi khi container width / headerLeft / headerRight / item widths / selected key đổi.
|
|
405
|
+
*/
|
|
406
|
+
computeDisplayItemsV2(items) {
|
|
407
|
+
if (this.mode() !== 'left' || this.ignoreCalculatorTab()) {
|
|
408
|
+
items.forEach((item) => item.update((data) => ({ ...data, specificDisplay: true })));
|
|
409
|
+
this.itemsDisplay.set([...items]);
|
|
410
|
+
this.displayMoreItem.set(false);
|
|
411
|
+
this.outDisplayMoreItem.emit(false);
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
const headerWidth = this.containerWidthV2();
|
|
415
|
+
if (!headerWidth)
|
|
416
|
+
return;
|
|
417
|
+
const indexItemSelected = items.findIndex((item) => item()[this.fieldKey()] === this.keySelected());
|
|
418
|
+
if (indexItemSelected < 0)
|
|
419
|
+
return;
|
|
420
|
+
const itemSelected = items[indexItemSelected];
|
|
421
|
+
const itemSelectedWidth = itemSelected().specificWidth || 0;
|
|
422
|
+
const reservedWidth = this.headerLeftWidthV2() + this.headerRightWidthV2() + 32;
|
|
423
|
+
let totalWidth = reservedWidth;
|
|
424
|
+
let displayMoreItem = false;
|
|
425
|
+
items.forEach((item, index) => {
|
|
426
|
+
const itemWidth = item().specificWidth || 0;
|
|
427
|
+
if (!itemWidth) {
|
|
428
|
+
// Chưa có width — tạm hiển thị để ResizeObserver có element mà đo.
|
|
429
|
+
item.update((data) => ({ ...data, specificDisplay: true }));
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
// Reserve space cho selected nếu item này nằm trước selected.
|
|
433
|
+
const projected = totalWidth + itemWidth + (index < indexItemSelected ? itemSelectedWidth : 0);
|
|
434
|
+
totalWidth += itemWidth;
|
|
435
|
+
if (projected > headerWidth) {
|
|
436
|
+
item.update((data) => ({ ...data, specificDisplay: false }));
|
|
437
|
+
displayMoreItem = true;
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
item.update((data) => ({ ...data, specificDisplay: true }));
|
|
441
|
+
});
|
|
442
|
+
// Selected luôn hiển thị.
|
|
443
|
+
itemSelected.update((data) => ({ ...data, specificDisplay: true }));
|
|
444
|
+
// V2: itemsDisplay chứa TẤT CẢ items — không filter. Item overflow được ẩn qua style binding
|
|
445
|
+
// (visibility: hidden + position: absolute) để giữ DOM stable, tránh mount/unmount gây flicker.
|
|
446
|
+
// ResizeObserver luôn đo được width vì mọi item luôn có DOM.
|
|
447
|
+
const allItems = [...items];
|
|
448
|
+
const currentDisplay = this.itemsDisplay();
|
|
449
|
+
// Chỉ set khi nội dung array thực sự đổi (tránh CD thừa).
|
|
450
|
+
const arrayChanged = allItems.length !== currentDisplay.length || allItems.some((it, i) => it !== currentDisplay[i]);
|
|
451
|
+
if (arrayChanged) {
|
|
452
|
+
this.itemsDisplay.set(allItems);
|
|
453
|
+
}
|
|
454
|
+
if (this.displayMoreItem() !== displayMoreItem) {
|
|
455
|
+
this.displayMoreItem.set(displayMoreItem);
|
|
456
|
+
this.outDisplayMoreItem.emit(displayMoreItem);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
284
459
|
ngOnDestroy() {
|
|
460
|
+
this.resizeObserverV2?.disconnect();
|
|
461
|
+
this.resizeObserverV2 = undefined;
|
|
285
462
|
this.onDestroy.next();
|
|
286
463
|
this.onDestroy.complete();
|
|
287
464
|
}
|
|
288
465
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsTabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
289
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsTabsComponent, isStandalone: true, selector: "libs_ui-components-tabs", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, fieldLabel: { classPropertyName: "fieldLabel", publicName: "fieldLabel", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, disableLabel: { classPropertyName: "disableLabel", publicName: "disableLabel", isSignal: true, isRequired: false, transformFunction: null }, heightTabItem: { classPropertyName: "heightTabItem", publicName: "heightTabItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreCalculatorTab: { classPropertyName: "ignoreCalculatorTab", publicName: "ignoreCalculatorTab", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, allowDragDropPosition: { classPropertyName: "allowDragDropPosition", publicName: "allowDragDropPosition", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configCss: { classPropertyName: "configCss", publicName: "configCss", isSignal: true, isRequired: false, transformFunction: null }, popoverShowMoreTabItem: { classPropertyName: "popoverShowMoreTabItem", publicName: "popoverShowMoreTabItem", isSignal: true, isRequired: false, transformFunction: null }, checkCanChangeTabSelected: { classPropertyName: "checkCanChangeTabSelected", publicName: "checkCanChangeTabSelected", isSignal: true, isRequired: false, transformFunction: null }, useEffectUpdateItems: { classPropertyName: "useEffectUpdateItems", publicName: "useEffectUpdateItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keySelected: "keySelectedChange", configCss: "configCssChange", outKeySelected: "outKeySelected", outFunctionsControl: "outFunctionsControl", outDragTabChange: "outDragTabChange", outDisplayMoreItem: "outDisplayMoreItem", outAction: "outAction" }, viewQueries: [{ propertyName: "headerEl", first: true, predicate: ["headerEl"], descendants: true, isSignal: true }, { propertyName: "headerLeftEl", first: true, predicate: ["headerLeftEl"], descendants: true, isSignal: true }, { propertyName: "headerRightEl", first: true, predicate: ["headerRightEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"libs-ui-tab\">\n <div\n #headerEl\n class=\"libs-ui-tab-header z-[1] {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div\n #headerLeftEl\n class=\"libs-ui-tab-header-left\">\n <ng-content select=\"div.libs-ui-tab-header-left\"></ng-content>\n </div>\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n <div\n class=\"!flex w-full\"\n #elementContainerEl\n LibsUiComponentsDragContainerDirective\n [stylesOverride]=\"stylesDragDropOverrideComputed()\"\n [groupName]=\"groupName()\"\n [(items)]=\"itemsDisplay\"\n [directionDrag]=\"'horizontal'\"\n [disableDragContainer]=\"!allowDragDropPosition()\"\n [acceptDragSameGroup]=\"allowDragDropPosition()\"\n (outDroppedContainer)=\"handlerDropContainer($event)\">\n @for (item of itemsDisplay(); track item) {\n <div\n LibsUiDragItemDirective\n [disable]=\"disable() || !allowDragDropPosition()\"\n [elementContainer]=\"elementContainerEl\"\n [dragBoundary]=\"true\"\n [dragBoundaryAcceptMouseLeaveContainer]=\"true\"\n class=\"relative libs-ui-tab-item-container\"\n [style.width.px]=\"mode() === 'space-between' ? elementContainerEl.clientWidth / (itemsDisplay().length || 1) : undefined\"\n [class.flex]=\"mode() === 'center-has-line'\"\n [class.items-center]=\"mode() === 'center-has-line'\">\n @if (allowDragDropPosition() && !disable()) {\n <span class=\"libs-ui-icon-arrange text-[#9ca2ad] absolute top-[14px] left-[4px]\"></span>\n }\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [class.!pointer-events-none]=\"item().disable || disable()\"\n [disable]=\"item().disable || disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [ignoreCalculatorTab]=\"true\"\n [changeViewTab]=\"changeViewTab\"\n (click)=\"handlerClickItem(item)\"\n (outAction)=\"handlerAction($event)\" />\n @if (mode() === 'center-has-line' && !$last) {\n <div class=\"w-[40px] h-[1px] bg-[#e6e7ea]\"></div>\n }\n </div>\n }\n </div>\n </div>\n <div\n class=\"flex items-center\"\n [class.ml-auto]=\"displayMoreItem() && !tabs().viewMoreIgnoreMarginLeft\">\n @if (displayMoreItem()) {\n <libs_ui-components-popover\n class=\"w-full h-full flex items-center\"\n [mode]=\"'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{\n zIndex: popoverShowMoreTabItem()?.config?.zIndex || 1000,\n maxHeight: popoverShowMoreTabItem()?.config?.maxHeight || 287,\n maxWidth: popoverShowMoreTabItem()?.config?.maxWidth || 2048,\n width: popoverShowMoreTabItem()?.config?.width || 277,\n direction: popoverShowMoreTabItem()?.config?.direction || 'bottom',\n template: popoverShowMoreTabItem()?.config?.template || menuEl,\n whiteTheme: true,\n ignoreArrow: true,\n position: popoverShowMoreTabItem()?.config?.position || { mode: 'end', distance: 0 },\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classInclude]=\"'!p-[8px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical rotate-90 text-[16px] mr-0'\"\n [popover]=\"{ config: { content: popoverShowMoreTabItem()?.config?.content || 'i18n_view_more' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-popover>\n }\n </div>\n <div\n #headerRightEl\n class=\"libs-ui-tab-header-right {{ tabs().classIncludeHeaderRight || '' }}\">\n <ng-content select=\"div.libs-ui-tab-header-right\"></ng-content>\n </div>\n </div>\n <div class=\"absolute top-0 z-0 w-full\">\n <div\n class=\"libs-ui-tab-header {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n @for (item of tabs().items(); track item) {\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [disable]=\"disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [changeViewTab]=\"changeViewTab\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab()\" />\n }\n </div>\n </div>\n </div>\n</div>\n<ng-template #menuEl>\n <libs_ui-components-list\n [config]=\"tabMoreListConfig()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n</ng-template>\n", styles: [".libs-ui-tab{position:relative;display:flex;width:100%}.libs-ui-tab .libs-ui-tab-header{position:relative;background-color:#fff;display:flex;flex-wrap:nowrap;width:100%;overflow:hidden;flex-shrink:0}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-header-center{display:flex;flex-wrap:nowrap}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container .libs-ui-icon-arrange{display:none}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container:hover .libs-ui-icon-arrange{display:block}.libs-ui-tab .libs-ui-tab-content-container{width:100%;height:100%}\n"], dependencies: [{ kind: "directive", type: LibsUiComponentsDragContainerDirective, selector: "[LibsUiComponentsDragContainerDirective]", inputs: ["disableDragContainer", "mode", "directionDrag", "viewEncapsulation", "acceptDragSameGroup", "placeholder", "groupName", "dropToGroupName", "items", "stylesOverride"], outputs: ["itemsChange", "outDragStartContainer", "outDragOverContainer", "outDragLeaveContainer", "outDragEndContainer", "outDroppedContainer", "outDroppedContainerEmpty", "outFunctionControl"] }, { kind: "directive", type: LibsUiDragItemDirective, selector: "[LibsUiDragItemDirective]", inputs: ["fieldId", "item", "itemInContainerVirtualScroll", "throttleTimeHandlerDraggingEvent", "ignoreStopEvent", "onlyMouseDownStopEvent", "dragRootElement", "dragBoundary", "dragBoundaryAcceptMouseLeaveContainer", "elementContainer", "zIndex", "disable", "ignoreUserSelectNone"], outputs: ["outDragStart", "outDragOver", "outDragLeave", "outDragEnd", "outDropped"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsTabsItemComponent, selector: "libs_ui-components-tabs-item", inputs: ["ignoreCalculatorTab", "step", "mode", "tabs", "item", "keySelected", "fieldLabel", "fieldKey", "cssDefault", "size", "disable", "disableLabel", "zIndex", "changeViewTab"], outputs: ["itemChange", "outAction"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "templateRefNotSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outKeySearch", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
466
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsTabsComponent, isStandalone: true, selector: "libs_ui-components-tabs", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, keySelected: { classPropertyName: "keySelected", publicName: "keySelected", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, fieldLabel: { classPropertyName: "fieldLabel", publicName: "fieldLabel", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, disableLabel: { classPropertyName: "disableLabel", publicName: "disableLabel", isSignal: true, isRequired: false, transformFunction: null }, heightTabItem: { classPropertyName: "heightTabItem", publicName: "heightTabItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreCalculatorTab: { classPropertyName: "ignoreCalculatorTab", publicName: "ignoreCalculatorTab", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, allowDragDropPosition: { classPropertyName: "allowDragDropPosition", publicName: "allowDragDropPosition", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, configCss: { classPropertyName: "configCss", publicName: "configCss", isSignal: true, isRequired: false, transformFunction: null }, popoverShowMoreTabItem: { classPropertyName: "popoverShowMoreTabItem", publicName: "popoverShowMoreTabItem", isSignal: true, isRequired: false, transformFunction: null }, checkCanChangeTabSelected: { classPropertyName: "checkCanChangeTabSelected", publicName: "checkCanChangeTabSelected", isSignal: true, isRequired: false, transformFunction: null }, useEffectUpdateItems: { classPropertyName: "useEffectUpdateItems", publicName: "useEffectUpdateItems", isSignal: true, isRequired: false, transformFunction: null }, useCalculatorV2: { classPropertyName: "useCalculatorV2", publicName: "useCalculatorV2", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { keySelected: "keySelectedChange", configCss: "configCssChange", outKeySelected: "outKeySelected", outFunctionsControl: "outFunctionsControl", outDragTabChange: "outDragTabChange", outDisplayMoreItem: "outDisplayMoreItem", outAction: "outAction" }, viewQueries: [{ propertyName: "headerEl", first: true, predicate: ["headerEl"], descendants: true, isSignal: true }, { propertyName: "headerLeftEl", first: true, predicate: ["headerLeftEl"], descendants: true, isSignal: true }, { propertyName: "headerRightEl", first: true, predicate: ["headerRightEl"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"libs-ui-tab\">\n <div\n #headerEl\n class=\"libs-ui-tab-header z-[1] {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div\n #headerLeftEl\n class=\"libs-ui-tab-header-left\">\n <ng-content select=\"div.libs-ui-tab-header-left\"></ng-content>\n </div>\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n <div\n class=\"!flex w-full\"\n #elementContainerEl\n LibsUiComponentsDragContainerDirective\n [stylesOverride]=\"stylesDragDropOverrideComputed()\"\n [groupName]=\"groupName()\"\n [(items)]=\"itemsDisplay\"\n [directionDrag]=\"'horizontal'\"\n [disableDragContainer]=\"!allowDragDropPosition()\"\n [acceptDragSameGroup]=\"allowDragDropPosition()\"\n (outDroppedContainer)=\"handlerDropContainer($event)\">\n @for (item of itemsDisplay(); track item) {\n <div\n LibsUiDragItemDirective\n [disable]=\"disable() || !allowDragDropPosition() || (useCalculatorV2() && item().specificDisplay === false)\"\n [elementContainer]=\"elementContainerEl\"\n [dragBoundary]=\"true\"\n [dragBoundaryAcceptMouseLeaveContainer]=\"true\"\n class=\"relative libs-ui-tab-item-container\"\n [style.width.px]=\"mode() === 'space-between' ? elementContainerEl.clientWidth / displayedCount() : undefined\"\n [class.flex]=\"mode() === 'center-has-line'\"\n [class.items-center]=\"mode() === 'center-has-line'\"\n [style.visibility]=\"useCalculatorV2() && item().specificDisplay === false ? 'hidden' : null\"\n [style.position]=\"useCalculatorV2() && item().specificDisplay === false ? 'absolute' : null\"\n [style.pointer-events]=\"useCalculatorV2() && item().specificDisplay === false ? 'none' : null\"\n [attr.aria-hidden]=\"useCalculatorV2() && item().specificDisplay === false ? 'true' : null\">\n @if (allowDragDropPosition() && !disable()) {\n <span class=\"libs-ui-icon-arrange text-[#9ca2ad] absolute top-[14px] left-[4px]\"></span>\n }\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [class.!pointer-events-none]=\"item().disable || disable()\"\n [disable]=\"item().disable || disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab() || !useCalculatorV2()\"\n [useCalculatorV2]=\"useCalculatorV2()\"\n [changeViewTab]=\"changeViewTab\"\n (click)=\"handlerClickItem(item)\"\n (outAction)=\"handlerAction($event)\" />\n @if (mode() === 'center-has-line' && !$last) {\n <div class=\"w-[40px] h-[1px] bg-[#e6e7ea]\"></div>\n }\n </div>\n }\n </div>\n </div>\n <div\n class=\"flex items-center\"\n [class.ml-auto]=\"displayMoreItem() && !tabs().viewMoreIgnoreMarginLeft\">\n @if (displayMoreItem()) {\n <libs_ui-components-popover\n class=\"w-full h-full flex items-center\"\n [mode]=\"'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{\n zIndex: popoverShowMoreTabItem()?.config?.zIndex || 1000,\n maxHeight: popoverShowMoreTabItem()?.config?.maxHeight || 287,\n maxWidth: popoverShowMoreTabItem()?.config?.maxWidth || 2048,\n width: popoverShowMoreTabItem()?.config?.width || 277,\n direction: popoverShowMoreTabItem()?.config?.direction || 'bottom',\n template: popoverShowMoreTabItem()?.config?.template || menuEl,\n whiteTheme: true,\n ignoreArrow: true,\n position: popoverShowMoreTabItem()?.config?.position || { mode: 'end', distance: 0 },\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classInclude]=\"'!p-[8px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical rotate-90 text-[16px] mr-0'\"\n [popover]=\"{ config: { content: popoverShowMoreTabItem()?.config?.content || 'i18n_view_more' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-popover>\n }\n </div>\n <div\n #headerRightEl\n class=\"libs-ui-tab-header-right {{ tabs().classIncludeHeaderRight || '' }}\">\n <ng-content select=\"div.libs-ui-tab-header-right\"></ng-content>\n </div>\n </div>\n @if (!useCalculatorV2()) {\n <div class=\"absolute top-0 z-0 w-full\">\n <div\n class=\"libs-ui-tab-header {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n @for (item of tabs().items(); track item) {\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [disable]=\"disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [changeViewTab]=\"changeViewTab\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab()\" />\n }\n </div>\n </div>\n </div>\n }\n</div>\n<ng-template #menuEl>\n <libs_ui-components-list\n [config]=\"tabMoreListConfig()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n</ng-template>\n", styles: [".libs-ui-tab{position:relative;display:flex;width:100%}.libs-ui-tab .libs-ui-tab-header{position:relative;background-color:#fff;display:flex;flex-wrap:nowrap;width:100%;overflow:hidden;flex-shrink:0}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-header-center{display:flex;flex-wrap:nowrap}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container .libs-ui-icon-arrange{display:none}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container:hover .libs-ui-icon-arrange{display:block}.libs-ui-tab .libs-ui-tab-content-container{width:100%;height:100%}\n"], dependencies: [{ kind: "directive", type: LibsUiComponentsDragContainerDirective, selector: "[LibsUiComponentsDragContainerDirective]", inputs: ["disableDragContainer", "mode", "directionDrag", "viewEncapsulation", "acceptDragSameGroup", "placeholder", "groupName", "dropToGroupName", "items", "stylesOverride"], outputs: ["itemsChange", "outDragStartContainer", "outDragOverContainer", "outDragLeaveContainer", "outDragEndContainer", "outDroppedContainer", "outDroppedContainerEmpty", "outFunctionControl"] }, { kind: "directive", type: LibsUiDragItemDirective, selector: "[LibsUiDragItemDirective]", inputs: ["fieldId", "item", "itemInContainerVirtualScroll", "throttleTimeHandlerDraggingEvent", "ignoreStopEvent", "onlyMouseDownStopEvent", "dragRootElement", "dragBoundary", "dragBoundaryAcceptMouseLeaveContainer", "elementContainer", "zIndex", "disable", "ignoreUserSelectNone"], outputs: ["outDragStart", "outDragOver", "outDragLeave", "outDragEnd", "outDropped"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsTabsItemComponent, selector: "libs_ui-components-tabs-item", inputs: ["ignoreCalculatorTab", "step", "mode", "tabs", "item", "keySelected", "fieldLabel", "fieldKey", "cssDefault", "size", "disable", "disableLabel", "zIndex", "changeViewTab", "useCalculatorV2"], outputs: ["itemChange", "outAction"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "templateRefNotSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outKeySearch", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
290
467
|
}
|
|
291
468
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsTabsComponent, decorators: [{
|
|
292
469
|
type: Component,
|
|
293
|
-
args: [{ selector: 'libs_ui-components-tabs', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsTabsItemComponent, LibsUiComponentsListComponent], template: "<div class=\"libs-ui-tab\">\n <div\n #headerEl\n class=\"libs-ui-tab-header z-[1] {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div\n #headerLeftEl\n class=\"libs-ui-tab-header-left\">\n <ng-content select=\"div.libs-ui-tab-header-left\"></ng-content>\n </div>\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n <div\n class=\"!flex w-full\"\n #elementContainerEl\n LibsUiComponentsDragContainerDirective\n [stylesOverride]=\"stylesDragDropOverrideComputed()\"\n [groupName]=\"groupName()\"\n [(items)]=\"itemsDisplay\"\n [directionDrag]=\"'horizontal'\"\n [disableDragContainer]=\"!allowDragDropPosition()\"\n [acceptDragSameGroup]=\"allowDragDropPosition()\"\n (outDroppedContainer)=\"handlerDropContainer($event)\">\n @for (item of itemsDisplay(); track item) {\n <div\n LibsUiDragItemDirective\n [disable]=\"disable() || !allowDragDropPosition()\"\n [elementContainer]=\"elementContainerEl\"\n [dragBoundary]=\"true\"\n [dragBoundaryAcceptMouseLeaveContainer]=\"true\"\n class=\"relative libs-ui-tab-item-container\"\n [style.width.px]=\"mode() === 'space-between' ? elementContainerEl.clientWidth / (
|
|
470
|
+
args: [{ selector: 'libs_ui-components-tabs', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDragContainerDirective, LibsUiDragItemDirective, LibsUiComponentsPopoverComponent, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsTabsItemComponent, LibsUiComponentsListComponent], template: "<div class=\"libs-ui-tab\">\n <div\n #headerEl\n class=\"libs-ui-tab-header z-[1] {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div\n #headerLeftEl\n class=\"libs-ui-tab-header-left\">\n <ng-content select=\"div.libs-ui-tab-header-left\"></ng-content>\n </div>\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n <div\n class=\"!flex w-full\"\n #elementContainerEl\n LibsUiComponentsDragContainerDirective\n [stylesOverride]=\"stylesDragDropOverrideComputed()\"\n [groupName]=\"groupName()\"\n [(items)]=\"itemsDisplay\"\n [directionDrag]=\"'horizontal'\"\n [disableDragContainer]=\"!allowDragDropPosition()\"\n [acceptDragSameGroup]=\"allowDragDropPosition()\"\n (outDroppedContainer)=\"handlerDropContainer($event)\">\n @for (item of itemsDisplay(); track item) {\n <div\n LibsUiDragItemDirective\n [disable]=\"disable() || !allowDragDropPosition() || (useCalculatorV2() && item().specificDisplay === false)\"\n [elementContainer]=\"elementContainerEl\"\n [dragBoundary]=\"true\"\n [dragBoundaryAcceptMouseLeaveContainer]=\"true\"\n class=\"relative libs-ui-tab-item-container\"\n [style.width.px]=\"mode() === 'space-between' ? elementContainerEl.clientWidth / displayedCount() : undefined\"\n [class.flex]=\"mode() === 'center-has-line'\"\n [class.items-center]=\"mode() === 'center-has-line'\"\n [style.visibility]=\"useCalculatorV2() && item().specificDisplay === false ? 'hidden' : null\"\n [style.position]=\"useCalculatorV2() && item().specificDisplay === false ? 'absolute' : null\"\n [style.pointer-events]=\"useCalculatorV2() && item().specificDisplay === false ? 'none' : null\"\n [attr.aria-hidden]=\"useCalculatorV2() && item().specificDisplay === false ? 'true' : null\">\n @if (allowDragDropPosition() && !disable()) {\n <span class=\"libs-ui-icon-arrange text-[#9ca2ad] absolute top-[14px] left-[4px]\"></span>\n }\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [class.!pointer-events-none]=\"item().disable || disable()\"\n [disable]=\"item().disable || disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab() || !useCalculatorV2()\"\n [useCalculatorV2]=\"useCalculatorV2()\"\n [changeViewTab]=\"changeViewTab\"\n (click)=\"handlerClickItem(item)\"\n (outAction)=\"handlerAction($event)\" />\n @if (mode() === 'center-has-line' && !$last) {\n <div class=\"w-[40px] h-[1px] bg-[#e6e7ea]\"></div>\n }\n </div>\n }\n </div>\n </div>\n <div\n class=\"flex items-center\"\n [class.ml-auto]=\"displayMoreItem() && !tabs().viewMoreIgnoreMarginLeft\">\n @if (displayMoreItem()) {\n <libs_ui-components-popover\n class=\"w-full h-full flex items-center\"\n [mode]=\"'click-toggle'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{\n zIndex: popoverShowMoreTabItem()?.config?.zIndex || 1000,\n maxHeight: popoverShowMoreTabItem()?.config?.maxHeight || 287,\n maxWidth: popoverShowMoreTabItem()?.config?.maxWidth || 2048,\n width: popoverShowMoreTabItem()?.config?.width || 277,\n direction: popoverShowMoreTabItem()?.config?.direction || 'bottom',\n template: popoverShowMoreTabItem()?.config?.template || menuEl,\n whiteTheme: true,\n ignoreArrow: true,\n position: popoverShowMoreTabItem()?.config?.position || { mode: 'end', distance: 0 },\n }\"\n (outFunctionsControl)=\"handlerPopoverFunctionControlEvent($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [classInclude]=\"'!p-[8px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-more-vertical rotate-90 text-[16px] mr-0'\"\n [popover]=\"{ config: { content: popoverShowMoreTabItem()?.config?.content || 'i18n_view_more' } }\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-popover>\n }\n </div>\n <div\n #headerRightEl\n class=\"libs-ui-tab-header-right {{ tabs().classIncludeHeaderRight || '' }}\">\n <ng-content select=\"div.libs-ui-tab-header-right\"></ng-content>\n </div>\n </div>\n @if (!useCalculatorV2()) {\n <div class=\"absolute top-0 z-0 w-full\">\n <div\n class=\"libs-ui-tab-header {{ configCss()?.header || '' }} {{ tabs().classIncludeHeader || '' }}\"\n [style.minHeight.px]=\"heightTabItem()\">\n <div class=\"libs-ui-tab-header-center {{ configCss()?.headerCenter || '' }} {{ tabs().classIncludeHeaderCenter || '' }}\">\n @for (item of tabs().items(); track item) {\n <libs_ui-components-tabs-item\n class=\"h-full w-full {{ tabs().classIncludeItem || '' }}\"\n [tabs]=\"tabs()\"\n [size]=\"size()\"\n [(item)]=\"item\"\n [step]=\"$index + 1\"\n [disable]=\"disable()\"\n [disableLabel]=\"disableLabel()\"\n [keySelected]=\"keySelected()\"\n [fieldLabel]=\"fieldLabel()\"\n [fieldKey]=\"fieldKey()\"\n [cssDefault]=\"($first ? configCss()?.first : configCss()?.other) || ''\"\n [zIndex]=\"zIndex()\"\n [mode]=\"mode()\"\n [changeViewTab]=\"changeViewTab\"\n [ignoreCalculatorTab]=\"ignoreCalculatorTab()\" />\n }\n </div>\n </div>\n </div>\n }\n</div>\n<ng-template #menuEl>\n <libs_ui-components-list\n [config]=\"tabMoreListConfig()\"\n [maxItemShow]=\"5\"\n [hiddenInputSearch]=\"true\"\n [paddingLeftItem]=\"true\"\n (outSelectKey)=\"handlerSelectedKey($event)\" />\n</ng-template>\n", styles: [".libs-ui-tab{position:relative;display:flex;width:100%}.libs-ui-tab .libs-ui-tab-header{position:relative;background-color:#fff;display:flex;flex-wrap:nowrap;width:100%;overflow:hidden;flex-shrink:0}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-header-center{display:flex;flex-wrap:nowrap}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container .libs-ui-icon-arrange{display:none}.libs-ui-tab .libs-ui-tab-header .libs-ui-tab-item-container:hover .libs-ui-icon-arrange{display:block}.libs-ui-tab .libs-ui-tab-content-container{width:100%;height:100%}\n"] }]
|
|
294
471
|
}], ctorParameters: () => [] });
|
|
295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFicy9zcmMvdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFicy9zcmMvdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQWMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDaE0sT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFTLHNDQUFzQyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkgsT0FBTyxFQUFvQiw2QkFBNkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNGLE9BQU8sRUFBMEMsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQVdqRCxNQUFNLE9BQU8sNkJBQTZCO0lBQ3hDLG1CQUFtQjtJQUNU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NkJBQTZCO2tCQVR6QyxTQUFTOytCQUVFLHlCQUF5QixjQUd2QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxzQ0FBc0MsRUFBRSx1QkFBdUIsRUFBRSxnQ0FBZ0MsRUFBRSxzQ0FBc0MsRUFBRSxpQ0FBaUMsRUFBRSw2QkFBNkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElEcm9wLCBMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZSwgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyYWctZHJvcCc7XG5pbXBvcnQgeyBJTGlzdERhdGFFbWl0S2V5LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBJUG9wb3ZlciwgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgY29udmVydE9iamVjdFRvU2lnbmFsLCBpc05pbCwgdXVpZCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJVGFiQ3NzQ29uZmlnLCBJVGFicywgSVRhYnNGdW5jdGlvbkNvbnRyb2xFdmVudCwgSVRhYnNJdGVtLCBJVGFic0l0ZW1FdmVudCwgVFlQRV9UQUJfTU9ERSB9IGZyb20gJy4vaW50ZXJmYWNlcy90YWIuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNUYWJzSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vaXRlbS9pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB0YWJNb3JlTGlzdENvbmZpZyB9IGZyb20gJy4vdXRpbHMvdGFicyc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy10YWJzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJzLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUsIExpYnNVaURyYWdJdGVtRGlyZWN0aXZlLCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNUYWJzSXRlbUNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0xpc3RDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzVGFic0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLy8gI3JlZ2lvbiBQUk9QRVJUWVxuICBwcm90ZWN0ZWQgaXRlbXNEaXNwbGF5ID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPElUYWJzSXRlbT4+PihbXSk7XG4gIHByb3RlY3RlZCBkaXNwbGF5TW9yZUl0ZW0gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgdGFiTW9yZUxpc3RDb25maWcgPSBjb21wdXRlZCgoKSA9PiB0YWJNb3JlTGlzdENvbmZpZyh0aGlzLnRyYW5zbGF0ZSwgdGhpcy5maWVsZEtleSgpLCB0aGlzLmZpZWxkTGFiZWwoKSwgdGhpcy50YWJzKCksIHRoaXMuZGlzYWJsZSgpKSk7XG4gIHByb3RlY3RlZCBjaGFuZ2VWaWV3VGFiID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJvdGVjdGVkIGdyb3VwTmFtZSA9IHNpZ25hbDxzdHJpbmc+KHV1aWQoKSk7XG4gIHByb3RlY3RlZCBzdHlsZXNEcmFnRHJvcE92ZXJyaWRlQ29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnVwZGF0ZVN0eWxlc0RyYWdEcm9wT3ZlcnJpZGUoKSk7XG5cbiAgcHJpdmF0ZSBwb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgPSBzaWduYWw8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgdGFicyA9IGlucHV0LnJlcXVpcmVkPElUYWJzPigpO1xuICByZWFkb25seSBrZXlTZWxlY3RlZCA9IG1vZGVsLnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbW9kZSA9IGlucHV0PFRZUEVfVEFCX01PREU+KCdsZWZ0Jyk7XG4gIHJlYWRvbmx5IGZpZWxkS2V5ID0gaW5wdXQ8c3RyaW5nPigna2V5Jyk7XG4gIHJlYWRvbmx5IGZpZWxkTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCdsYWJlbCcpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZUxhYmVsID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaGVpZ2h0VGFiSXRlbSA9IGlucHV0PG51bWJlcj4oNDApO1xuICByZWFkb25seSBpZ25vcmVDYWxjdWxhdG9yVGFiID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzaXplID0gaW5wdXQ8J2xhbmdlcicgfCAnbWVkaXVtJz4oJ21lZGl1bScpO1xuICByZWFkb25seSBhbGxvd0RyYWdEcm9wUG9zaXRpb24gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZ0NzcyA9IG1vZGVsPElUYWJDc3NDb25maWc+KCk7XG4gIHJlYWRvbmx5IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0gPSBpbnB1dDxJUG9wb3Zlcj4oKTtcbiAgcmVhZG9ubHkgY2hlY2tDYW5DaGFuZ2VUYWJTZWxlY3RlZCA9IGlucHV0PCgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+PigpO1xuICByZWFkb25seSB1c2VFZmZlY3RVcGRhdGVJdGVtcyA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0S2V5U2VsZWN0ZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJzRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdUYWJDaGFuZ2UgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0RGlzcGxheU1vcmVJdGVtID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEFjdGlvbiA9IG91dHB1dDxJVGFic0l0ZW1FdmVudD4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhZGVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZj4oJ2hlYWRlckVsJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhZGVyTGVmdEVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCdoZWFkZXJMZWZ0RWwnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoZWFkZXJSaWdodEVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCdoZWFkZXJSaWdodEVsJyk7XG5cbiAgLyogSU5KRUNUKi9cbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy50YWJzKCk/Lml0ZW1zKCk7XG4gICAgICBpZiAoIXRoaXMudXNlRWZmZWN0VXBkYXRlSXRlbXMoKSkgcmV0dXJuO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVJdGVtc0Rpc3BsYXkoaXRlbXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZVRhYnNDc3NDb25maWcoKTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICAgIGlmICghdGhpcy51c2VFZmZlY3RVcGRhdGVJdGVtcygpKSB7XG4gICAgICB0aGlzLnVwZGF0ZUl0ZW1zRGlzcGxheSh0aGlzLnRhYnMoKT8uaXRlbXMoKSk7XG4gICAgfVxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDI1MCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYnMoKS5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3BsYXlNb3JlSXRlbS5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0b3JUYWJzSXRlbURpc3BsYXkoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuY2hhbmdlVmlld1RhYi5waXBlKGRlYm91bmNlVGltZSgyMCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNhbGN1bGF0b3JUYWJzSXRlbURpc3BsYXkoKSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUl0ZW1zRGlzcGxheShpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPj4pIHtcbiAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm1vZGUoKSAhPT0gJ2xlZnQnIHx8IHRoaXMuaWdub3JlQ2FsY3VsYXRvclRhYigpKSB7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0udXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0Rpc3BsYXk6IHRydWUgfSkpKTtcbiAgICAgICAgdGhpcy5pdGVtc0Rpc3BsYXkuc2V0KGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxjdWxhdG9yVGFic0l0ZW1EaXNwbGF5KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElUYWJzRnVuY3Rpb25Db250cm9sRXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBhZGRUYWJzSXRlbTogdGhpcy5hZGRUYWJzSXRlbS5iaW5kKHRoaXMpLFxuICAgICAgY2FsY3VsYXRvclRhYnNJdGVtc0Rpc3BsYXk6IHRoaXMuY2FsY3VsYXRvclRhYnNJdGVtRGlzcGxheS5iaW5kKHRoaXMpLFxuICAgICAgc2VsZWN0ZWRUYWJzSXRlbTogdGhpcy5oYW5kbGVyU2VsZWN0ZWRUYWJzSXRlbS5iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYnNDc3NDb25maWcoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnQ3NzKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLm1vZGUoKSkge1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHRoaXMuY29uZmlnQ3NzLnNldCh7XG4gICAgICAgICAgZmlyc3Q6ICdtbC1bMjBweF0gbXItWzE2cHhdJyxcbiAgICAgICAgICBvdGhlcjogJ21sLVsyMHB4XSBtci1bMTZweF0nLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICB0aGlzLmNvbmZpZ0Nzcy5zZXQoe1xuICAgICAgICAgIGZpcnN0OiAncHgtWzEycHhdIG1sLVsxOHB4XSBtci1bMThweF0nLFxuICAgICAgICAgIG90aGVyOiAncHgtWzEycHhdIG14LVsxOHB4XScsXG4gICAgICAgICAgaGVhZGVyOiAnZmxleCBqdXN0aWZ5LWNlbnRlcicsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlci1oYXMtbGluZSc6XG4gICAgICAgIHRoaXMuY29uZmlnQ3NzLnNldCh7XG4gICAgICAgICAgZmlyc3Q6ICdweC1bMTZweF0nLFxuICAgICAgICAgIG90aGVyOiAncHgtWzE2cHhdJyxcbiAgICAgICAgICBoZWFkZXJDZW50ZXI6ICdpdGVtcy1jZW50ZXInLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzcGFjZS1iZXR3ZWVuJzpcbiAgICAgICAgdGhpcy5jb25maWdDc3Muc2V0KHtcbiAgICAgICAgICBmaXJzdDogJ214LWF1dG8nLFxuICAgICAgICAgIG90aGVyOiAnbXgtYXV0bycsXG4gICAgICAgICAgaGVhZGVyQ2VudGVyOiAndy1mdWxsJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3R5bGVzRHJhZ0Ryb3BPdmVycmlkZSgpIHtcbiAgICBpZiAodGhpcy5hbGxvd0RyYWdEcm9wUG9zaXRpb24oKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInLFxuICAgICAgICAgIHN0eWxlczogJycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtJyxcbiAgICAgICAgICBzdHlsZXM6ICdjdXJzb3I6IG1vdmU7JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tZHJhZ2dpbmcnLFxuICAgICAgICAgIHN0eWxlczogJ2N1cnNvcjogbW92ZTsgYmFja2dyb3VuZDogI2RkZGRkZDsnLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbGlicy11aS1kcmFnLWRyb3AtaXRlbScsXG4gICAgICAgIHN0eWxlczogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRpc2FibGUnLFxuICAgICAgICBzdHlsZXM6ICcnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEcm9wQ29udGFpbmVyKGV2ZW50OiBJRHJvcCkge1xuICAgIGNvbnN0IHsgaXRlbURyYWdJbmZvIH0gPSBldmVudDtcbiAgICBpZiAoIWl0ZW1EcmFnSW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFicygpLml0ZW1zO1xuICAgIGNvbnN0IHsgaW5kZXhEcmFnLCBpbmRleERyb3AgfSA9IGl0ZW1EcmFnSW5mbztcbiAgICBpZiAoaXNOaWwoaW5kZXhEcmFnKSB8fCBpc05pbChpbmRleERyb3ApIHx8IGluZGV4RHJvcCA9PT0gaW5kZXhEcmFnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1EcmFnID0gaXRlbXMoKVtpbmRleERyYWcgYXMgbnVtYmVyXTtcbiAgICBpdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcmFnIGFzIG51bWJlciwgMSk7XG4gICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcm9wIGFzIG51bWJlciwgMCwgaXRlbURyYWcpO1xuICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgfSk7XG4gICAgdGhpcy5vdXREcmFnVGFiQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlclNlbGVjdGVkVGFic0l0ZW0oa2V5OiBzdHJpbmcsIHJlc2V0RGlzYWJsZSA9IHRydWUpIHtcbiAgICBjb25zdCBpdGVtU2VsZWN0ZWQgPSB0aGlzLnRhYnMoKVxuICAgICAgLml0ZW1zKClcbiAgICAgIC5maW5kKChpdGVtKSA9PiBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0ga2V5KTtcbiAgICBpZiAoIWl0ZW1TZWxlY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzZXREaXNhYmxlKSB7XG4gICAgICBpdGVtU2VsZWN0ZWQudXBkYXRlKChpdGVtKSA9PiAoeyAuLi5pdGVtLCBkaXNhYmxlOiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlckNsaWNrSXRlbShpdGVtU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZEtleShldmVudDogSUxpc3REYXRhRW1pdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVyQ2xpY2tJdGVtKGNvbnZlcnRPYmplY3RUb1NpZ25hbChldmVudC5pdGVtKSk7XG4gICAgdGhpcy5vdXREcmFnVGFiQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ2xpY2tJdGVtKGl0ZW06IFdyaXRhYmxlU2lnbmFsPElUYWJzSXRlbT4pIHtcbiAgICBpZiAoaXRlbSgpLmRpc2FibGUgfHwgdGhpcy5kaXNhYmxlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tDYW5DaGFuZ2VUYWJTZWxlY3RlZCA9IHRoaXMuY2hlY2tDYW5DaGFuZ2VUYWJTZWxlY3RlZCgpO1xuICAgIGlmIChjaGVja0NhbkNoYW5nZVRhYlNlbGVjdGVkKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IGNoZWNrQ2FuQ2hhbmdlVGFiU2VsZWN0ZWQoKTtcbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICB0aGlzLmNoYW5nZUl0ZW1TZWxlY3RlZChpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VJdGVtU2VsZWN0ZWQoaXRlbSk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZUl0ZW1TZWxlY3RlZChpdGVtOiBXcml0YWJsZVNpZ25hbDxJVGFic0l0ZW0+KSB7XG4gICAgdGhpcy5rZXlTZWxlY3RlZC5zZXQoaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0pO1xuICAgIHRoaXMub3V0S2V5U2VsZWN0ZWQuZW1pdCh0aGlzLmtleVNlbGVjdGVkKCkpO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgdGhpcy5jYWxjdWxhdG9yVGFic0l0ZW1EaXNwbGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckFjdGlvbihldmVudDogSVRhYnNJdGVtRXZlbnQpIHtcbiAgICB0aGlzLm91dEFjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkVGFic0l0ZW0oaXRlbTogV3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPiwgc2VsZWN0ZWQgPSB0cnVlLCBhZGRGaXJzdD86IGJvb2xlYW4sIGluZGV4QWRkPzogbnVtYmVyKSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnRhYnMoKS5pdGVtcztcbiAgICBpdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICBpZiAoYWRkRmlyc3QpIHtcbiAgICAgICAgcmV0dXJuIFtpdGVtLCAuLi5pdGVtc107XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXhBZGQpIHtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4QWRkLCAwLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi5pdGVtcywgaXRlbV07XG4gICAgfSk7XG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmhhbmRsZXJDbGlja0l0ZW0oaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNhbGN1bGF0b3JUYWJzSXRlbURpc3BsYXkoKSB7XG4gICAgbGV0IGl0ZW1zID0gdGhpcy50YWJzKCkuaXRlbXMoKTtcbiAgICBjb25zdCBpbmRleEl0ZW1TZWxlY3RlZCA9IGl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09IHRoaXMua2V5U2VsZWN0ZWQoKSk7XG4gICAgaWYgKGluZGV4SXRlbVNlbGVjdGVkIDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc3BsYXlNb3JlSXRlbS5zZXQoZmFsc2UpO1xuICAgIGxldCBkaXNwbGF5TW9yZUl0ZW0gPSBmYWxzZTtcbiAgICBjb25zdCBoZWFkZXJXaWR0aCA9IHRoaXMuaGVhZGVyRWwoKS5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIHx8IDA7XG4gICAgY29uc3QgaXRlbVNlbGVjdGVkID0gaXRlbXNbaW5kZXhJdGVtU2VsZWN0ZWRdO1xuICAgIGNvbnN0IGl0ZW1TZWxlY3RlZFdpZHRoID0gaXRlbVNlbGVjdGVkKCkuc3BlY2lmaWNXaWR0aDtcbiAgICBsZXQgdG90YWxXaWR0aEl0ZW1zRGlzcGxheSA9ICh0aGlzLmhlYWRlckxlZnRFbCgpLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggfHwgMCkgKyAodGhpcy5oZWFkZXJSaWdodEVsKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCB8fCAwKSArIDMyO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIWl0ZW0oKS5zcGVjaWZpY1dpZHRoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGl0ZW0udXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0Rpc3BsYXk6IGZhbHNlIH0pKTtcbiAgICAgIGNvbnN0IGl0ZW1XaWR0aCA9IGl0ZW0oKS5zcGVjaWZpY1dpZHRoIHx8IDA7XG4gICAgICBjb25zdCB3aWR0aCA9IHRvdGFsV2lkdGhJdGVtc0Rpc3BsYXkgKyBpdGVtV2lkdGggKyAoaW5kZXggPCBpbmRleEl0ZW1TZWxlY3RlZCA/IGl0ZW1TZWxlY3RlZFdpZHRoIDogMCk7XG4gICAgICB0b3RhbFdpZHRoSXRlbXNEaXNwbGF5ICs9IGl0ZW1XaWR0aDtcbiAgICAgIGlmICh3aWR0aCA+IGhlYWRlcldpZHRoKSB7XG4gICAgICAgIGRpc3BsYXlNb3JlSXRlbSA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGl0ZW0udXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0Rpc3BsYXk6IHRydWUgfSkpO1xuICAgIH0pO1xuICAgIGl0ZW1TZWxlY3RlZC51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljRGlzcGxheTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgZGlzcGxheSA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSgpLnNwZWNpZmljRGlzcGxheSA9PT0gdHJ1ZSk7XG4gICAgY29uc3Qgbm90RGlzcGxheSA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbSgpLnNwZWNpZmljRGlzcGxheSA9PT0gZmFsc2UpO1xuICAgIGl0ZW1zID0gZGlzcGxheS5jb25jYXQobm90RGlzcGxheSk7XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IGl0ZW0udXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBvcmRlcjogaW5kZXggfSkpKTtcbiAgICBjb25zdCBzb3J0ZWRJdGVtcyA9IFsuLi5pdGVtc10uc29ydCgocHJldiwgbmV4dCkgPT4gKHByZXYoKS5vcmRlciB8fCAwKSAtIChuZXh0KCkub3JkZXIgfHwgMCkpO1xuICAgIC8vIENoZWNrIGlmIG9yZGVyIGFjdHVhbGx5IGNoYW5nZWQgYmVmb3JlIHNldHRpbmcgdG8gYXZvaWQgdHJpZ2dlcmluZyByZWR1bmRhbnQgY3ljbGVzXG4gICAgY29uc3Qgb3JkZXJDaGFuZ2VkID0gaXRlbXMuc29tZSgoaXRlbSwgaW5kZXgpID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldICE9PSBzb3J0ZWRJdGVtc1tpbmRleF0oKVt0aGlzLmZpZWxkS2V5KCldKTtcblxuICAgIGlmIChvcmRlckNoYW5nZWQpIHtcbiAgICAgIHRoaXMudGFicygpLml0ZW1zLnNldChzb3J0ZWRJdGVtcyk7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwbGF5TW9yZUl0ZW0uc2V0KGRpc3BsYXlNb3JlSXRlbSk7XG4gICAgdGhpcy5vdXREaXNwbGF5TW9yZUl0ZW0uZW1pdCh0aGlzLmRpc3BsYXlNb3JlSXRlbSgpKTtcblxuICAgIGNvbnN0IG5ld0l0ZW1zRGlzcGxheSA9IHRoaXMudGFicygpXG4gICAgICAuaXRlbXMoKVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbSgpLnNwZWNpZmljRGlzcGxheSk7XG4gICAgdGhpcy5pdGVtc0Rpc3BsYXkuc2V0KG5ld0l0ZW1zRGlzcGxheSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxpYnMtdWktdGFiXCI+XG4gIDxkaXZcbiAgICAjaGVhZGVyRWxcbiAgICBjbGFzcz1cImxpYnMtdWktdGFiLWhlYWRlciB6LVsxXSB7eyBjb25maWdDc3MoKT8uaGVhZGVyIHx8ICcnIH19IHt7IHRhYnMoKS5jbGFzc0luY2x1ZGVIZWFkZXIgfHwgJycgfX1cIlxuICAgIFtzdHlsZS5taW5IZWlnaHQucHhdPVwiaGVpZ2h0VGFiSXRlbSgpXCI+XG4gICAgPGRpdlxuICAgICAgI2hlYWRlckxlZnRFbFxuICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXItbGVmdFwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2LmxpYnMtdWktdGFiLWhlYWRlci1sZWZ0XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXItY2VudGVyIHt7IGNvbmZpZ0NzcygpPy5oZWFkZXJDZW50ZXIgfHwgJycgfX0ge3sgdGFicygpLmNsYXNzSW5jbHVkZUhlYWRlckNlbnRlciB8fCAnJyB9fVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIiFmbGV4IHctZnVsbFwiXG4gICAgICAgICNlbGVtZW50Q29udGFpbmVyRWxcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmVcbiAgICAgICAgW3N0eWxlc092ZXJyaWRlXT1cInN0eWxlc0RyYWdEcm9wT3ZlcnJpZGVDb21wdXRlZCgpXCJcbiAgICAgICAgW2dyb3VwTmFtZV09XCJncm91cE5hbWUoKVwiXG4gICAgICAgIFsoaXRlbXMpXT1cIml0ZW1zRGlzcGxheVwiXG4gICAgICAgIFtkaXJlY3Rpb25EcmFnXT1cIidob3Jpem9udGFsJ1wiXG4gICAgICAgIFtkaXNhYmxlRHJhZ0NvbnRhaW5lcl09XCIhYWxsb3dEcmFnRHJvcFBvc2l0aW9uKClcIlxuICAgICAgICBbYWNjZXB0RHJhZ1NhbWVHcm91cF09XCJhbGxvd0RyYWdEcm9wUG9zaXRpb24oKVwiXG4gICAgICAgIChvdXREcm9wcGVkQ29udGFpbmVyKT1cImhhbmRsZXJEcm9wQ29udGFpbmVyKCRldmVudClcIj5cbiAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtc0Rpc3BsYXkoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIExpYnNVaURyYWdJdGVtRGlyZWN0aXZlXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgIWFsbG93RHJhZ0Ryb3BQb3NpdGlvbigpXCJcbiAgICAgICAgICAgIFtlbGVtZW50Q29udGFpbmVyXT1cImVsZW1lbnRDb250YWluZXJFbFwiXG4gICAgICAgICAgICBbZHJhZ0JvdW5kYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgW2RyYWdCb3VuZGFyeUFjY2VwdE1vdXNlTGVhdmVDb250YWluZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGxpYnMtdWktdGFiLWl0ZW0tY29udGFpbmVyXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtb2RlKCkgPT09ICdzcGFjZS1iZXR3ZWVuJyA/IGVsZW1lbnRDb250YWluZXJFbC5jbGllbnRXaWR0aCAvIChpdGVtc0Rpc3BsYXkoKS5sZW5ndGggfHwgMSkgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwibW9kZSgpID09PSAnY2VudGVyLWhhcy1saW5lJ1wiXG4gICAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cIm1vZGUoKSA9PT0gJ2NlbnRlci1oYXMtbGluZSdcIj5cbiAgICAgICAgICAgIEBpZiAoYWxsb3dEcmFnRHJvcFBvc2l0aW9uKCkgJiYgIWRpc2FibGUoKSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktaWNvbi1hcnJhbmdlIHRleHQtWyM5Y2EyYWRdIGFic29sdXRlIHRvcC1bMTRweF0gbGVmdC1bNHB4XVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFicy1pdGVtXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsIHctZnVsbCAge3sgdGFicygpLmNsYXNzSW5jbHVkZUl0ZW0gfHwgJycgfX1cIlxuICAgICAgICAgICAgICBbdGFic109XCJ0YWJzKClcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJzaXplKClcIlxuICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1cIlxuICAgICAgICAgICAgICBbc3RlcF09XCIkaW5kZXggKyAxXCJcbiAgICAgICAgICAgICAgW2NsYXNzLiFwb2ludGVyLWV2ZW50cy1ub25lXT1cIml0ZW0oKS5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cIml0ZW0oKS5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlTGFiZWxdPVwiZGlzYWJsZUxhYmVsKClcIlxuICAgICAgICAgICAgICBba2V5U2VsZWN0ZWRdPVwia2V5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgIFtmaWVsZExhYmVsXT1cImZpZWxkTGFiZWwoKVwiXG4gICAgICAgICAgICAgIFtmaWVsZEtleV09XCJmaWVsZEtleSgpXCJcbiAgICAgICAgICAgICAgW2Nzc0RlZmF1bHRdPVwiKCRmaXJzdCA/IGNvbmZpZ0NzcygpPy5maXJzdCA6IGNvbmZpZ0NzcygpPy5vdGhlcikgfHwgJydcIlxuICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgICAgW21vZGVdPVwibW9kZSgpXCJcbiAgICAgICAgICAgICAgW2lnbm9yZUNhbGN1bGF0b3JUYWJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjaGFuZ2VWaWV3VGFiXT1cImNoYW5nZVZpZXdUYWJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNsaWNrSXRlbShpdGVtKVwiXG4gICAgICAgICAgICAgIChvdXRBY3Rpb24pPVwiaGFuZGxlckFjdGlvbigkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnY2VudGVyLWhhcy1saW5lJyAmJiAhJGxhc3QpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctWzQwcHhdIGgtWzFweF0gYmctWyNlNmU3ZWFdXCI+PC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgW2NsYXNzLm1sLWF1dG9dPVwiZGlzcGxheU1vcmVJdGVtKCkgJiYgIXRhYnMoKS52aWV3TW9yZUlnbm9yZU1hcmdpbkxlZnRcIj5cbiAgICAgIEBpZiAoZGlzcGxheU1vcmVJdGVtKCkpIHtcbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIGZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICBbbW9kZV09XCInY2xpY2stdG9nZ2xlJ1wiXG4gICAgICAgICAgW2lnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJ7XG4gICAgICAgICAgICB6SW5kZXg6IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy56SW5kZXggfHwgMTAwMCxcbiAgICAgICAgICAgIG1heEhlaWdodDogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/Lm1heEhlaWdodCB8fCAyODcsXG4gICAgICAgICAgICBtYXhXaWR0aDogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/Lm1heFdpZHRoIHx8IDIwNDgsXG4gICAgICAgICAgICB3aWR0aDogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/LndpZHRoIHx8IDI3NyxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/LmRpcmVjdGlvbiB8fCAnYm90dG9tJyxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBwb3BvdmVyU2hvd01vcmVUYWJJdGVtKCk/LmNvbmZpZz8udGVtcGxhdGUgfHwgbWVudUVsLFxuICAgICAgICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgICAgICAgIGlnbm9yZUFycm93OiB0cnVlLFxuICAgICAgICAgICAgcG9zaXRpb246IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy5wb3NpdGlvbiB8fCB7IG1vZGU6ICdlbmQnLCBkaXN0YW5jZTogMCB9LFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQoJGV2ZW50KVwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzhweF0nXCJcbiAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLW1vcmUtdmVydGljYWwgcm90YXRlLTkwIHRleHQtWzE2cHhdIG1yLTAnXCJcbiAgICAgICAgICAgIFtwb3BvdmVyXT1cInsgY29uZmlnOiB7IGNvbnRlbnQ6IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy5jb250ZW50IHx8ICdpMThuX3ZpZXdfbW9yZScgfSB9XCJcbiAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAjaGVhZGVyUmlnaHRFbFxuICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXItcmlnaHQge3sgdGFicygpLmNsYXNzSW5jbHVkZUhlYWRlclJpZ2h0IHx8ICcnIH19XCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJkaXYubGlicy11aS10YWItaGVhZGVyLXJpZ2h0XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImFic29sdXRlIHRvcC0wIHotMCB3LWZ1bGxcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImxpYnMtdWktdGFiLWhlYWRlciB7eyBjb25maWdDc3MoKT8uaGVhZGVyIHx8ICcnIH19IHt7IHRhYnMoKS5jbGFzc0luY2x1ZGVIZWFkZXIgfHwgJycgfX1cIlxuICAgICAgW3N0eWxlLm1pbkhlaWdodC5weF09XCJoZWlnaHRUYWJJdGVtKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXItY2VudGVyIHt7IGNvbmZpZ0NzcygpPy5oZWFkZXJDZW50ZXIgfHwgJycgfX0ge3sgdGFicygpLmNsYXNzSW5jbHVkZUhlYWRlckNlbnRlciB8fCAnJyB9fVwiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIHRhYnMoKS5pdGVtcygpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJzLWl0ZW1cbiAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsIHctZnVsbCB7eyB0YWJzKCkuY2xhc3NJbmNsdWRlSXRlbSB8fCAnJyB9fVwiXG4gICAgICAgICAgICBbdGFic109XCJ0YWJzKClcIlxuICAgICAgICAgICAgW3NpemVdPVwic2l6ZSgpXCJcbiAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbVwiXG4gICAgICAgICAgICBbc3RlcF09XCIkaW5kZXggKyAxXCJcbiAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZUxhYmVsXT1cImRpc2FibGVMYWJlbCgpXCJcbiAgICAgICAgICAgIFtrZXlTZWxlY3RlZF09XCJrZXlTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgIFtmaWVsZExhYmVsXT1cImZpZWxkTGFiZWwoKVwiXG4gICAgICAgICAgICBbZmllbGRLZXldPVwiZmllbGRLZXkoKVwiXG4gICAgICAgICAgICBbY3NzRGVmYXVsdF09XCIoJGZpcnN0ID8gY29uZmlnQ3NzKCk/LmZpcnN0IDogY29uZmlnQ3NzKCk/Lm90aGVyKSB8fCAnJ1wiXG4gICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgIFttb2RlXT1cIm1vZGUoKVwiXG4gICAgICAgICAgICBbY2hhbmdlVmlld1RhYl09XCJjaGFuZ2VWaWV3VGFiXCJcbiAgICAgICAgICAgIFtpZ25vcmVDYWxjdWxhdG9yVGFiXT1cImlnbm9yZUNhbGN1bGF0b3JUYWIoKVwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNtZW51RWw+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdFxuICAgIFtjb25maWddPVwidGFiTW9yZUxpc3RDb25maWcoKVwiXG4gICAgW21heEl0ZW1TaG93XT1cIjVcIlxuICAgIFtoaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICBbcGFkZGluZ0xlZnRJdGVtXT1cInRydWVcIlxuICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkS2V5KCRldmVudClcIiAvPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
472
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFicy9zcmMvdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFicy9zcmMvdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUMzTixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQVMsc0NBQXNDLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2SCxPQUFPLEVBQW9CLDZCQUE2QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0YsT0FBTyxFQUEwQyxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3ZILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUs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LEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLGVBQWUsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUM1RSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRixNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixzRkFBc0Y7UUFDdEYsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFL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QUFDLENBQUM7UUFDckgsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0F2ZFUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIscWlHQ3ZCMUMsd29OQTRJQSx1bUJEdkhZLHNDQUFzQywwY0FBRSx1QkFBdUIsdWJBQUUsZ0NBQWdDLG9nQkFBRSxzQ0FBc0Msc2pCQUFFLGlDQUFpQyx3VEFBRSw2QkFBNkI7OzRGQUUxTSw2QkFBNkI7a0JBVHpDLFNBQVM7K0JBRUUseUJBQXlCLGNBR3ZCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLHNDQUFzQyxFQUFFLHVCQUF1QixFQUFFLGdDQUFnQyxFQUFFLHNDQUFzQyxFQUFFLGlDQUFpQyxFQUFFLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSURyb3AsIExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlLCBMaWJzVWlEcmFnSXRlbURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJhZy1kcm9wJztcbmltcG9ydCB7IElMaXN0RGF0YUVtaXRLZXksIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElQb3BvdmVyLCBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBjb252ZXJ0T2JqZWN0VG9TaWduYWwsIGlzTmlsLCB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElUYWJDc3NDb25maWcsIElUYWJzLCBJVGFic0Z1bmN0aW9uQ29udHJvbEV2ZW50LCBJVGFic0l0ZW0sIElUYWJzSXRlbUV2ZW50LCBUWVBFX1RBQl9NT0RFIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3RhYi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1RhYnNJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9pdGVtL2l0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IHRhYk1vcmVMaXN0Q29uZmlnIH0gZnJvbSAnLi91dGlscy90YWJzJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXRhYnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFicy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYnMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZSwgTGlic1VpRHJhZ0l0ZW1EaXJlY3RpdmUsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1RhYnNJdGVtQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByb3RlY3RlZCBpdGVtc0Rpc3BsYXkgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGRpc3BsYXlNb3JlSXRlbSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCB0YWJNb3JlTGlzdENvbmZpZyA9IGNvbXB1dGVkKCgpID0+IHRhYk1vcmVMaXN0Q29uZmlnKHRoaXMudHJhbnNsYXRlLCB0aGlzLmZpZWxkS2V5KCksIHRoaXMuZmllbGRMYWJlbCgpLCB0aGlzLnRhYnMoKSwgdGhpcy5kaXNhYmxlKCkpKTtcbiAgcHJvdGVjdGVkIGNoYW5nZVZpZXdUYWIgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgZ3JvdXBOYW1lID0gc2lnbmFsPHN0cmluZz4odXVpZCgpKTtcbiAgcHJvdGVjdGVkIHN0eWxlc0RyYWdEcm9wT3ZlcnJpZGVDb21wdXRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudXBkYXRlU3R5bGVzRHJhZ0Ryb3BPdmVycmlkZSgpKTtcbiAgLyoqXG4gICAqIFYyIOKAlCBz4buRIGl0ZW0gxJFhbmcgaGnhu4NuIHRo4buLIChzcGVjaWZpY0Rpc3BsYXkgIT09IGZhbHNlKS4gRMO5bmcgY2hvIG1vZGUgYHNwYWNlLWJldHdlZW5gXG4gICAqIHTDrW5oIHdpZHRoIMSR4buBdSBjaG8gY8OhYyBpdGVtIHZpc2libGUgKGl0ZW0gaGlkZGVuIOG7nyBgcG9zaXRpb246IGFic29sdXRlYCBraMO0bmcgY2hp4bq/bSBjaOG7lykuXG4gICAqL1xuICBwcm90ZWN0ZWQgZGlzcGxheWVkQ291bnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnVzZUNhbGN1bGF0b3JWMigpKSByZXR1cm4gdGhpcy5pdGVtc0Rpc3BsYXkoKS5sZW5ndGggfHwgMTtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuaXRlbXNEaXNwbGF5KCkuZmlsdGVyKChzKSA9PiBzKCkuc3BlY2lmaWNEaXNwbGF5ICE9PSBmYWxzZSkubGVuZ3RoO1xuICAgIHJldHVybiBjb3VudCB8fCAxO1xuICB9KTtcblxuICAvKiogVjIg4oCUIGvDrWNoIHRoxrDhu5tjIGNvbnRhaW5lciBkbyBSZXNpemVPYnNlcnZlciBj4bqtcCBuaOG6rXQsIGTDuW5nIMSR4buDIGNvbXB1dGUgc3luY2hyb25vdXMuICovXG4gIHByaXZhdGUgY29udGFpbmVyV2lkdGhWMiA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIGhlYWRlckxlZnRXaWR0aFYyID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByaXZhdGUgaGVhZGVyUmlnaHRXaWR0aFYyID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXJWMjogUmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBwb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgPSBzaWduYWw8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSB0YWJzID0gaW5wdXQucmVxdWlyZWQ8SVRhYnM+KCk7XG4gIHJlYWRvbmx5IGtleVNlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8c3RyaW5nPigpO1xuICByZWFkb25seSBtb2RlID0gaW5wdXQ8VFlQRV9UQUJfTU9ERT4oJ2xlZnQnKTtcbiAgcmVhZG9ubHkgZmllbGRLZXkgPSBpbnB1dDxzdHJpbmc+KCdrZXknKTtcbiAgcmVhZG9ubHkgZmllbGRMYWJlbCA9IGlucHV0PHN0cmluZz4oJ2xhYmVsJyk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXNhYmxlTGFiZWwgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBoZWlnaHRUYWJJdGVtID0gaW5wdXQ8bnVtYmVyPig0MCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNhbGN1bGF0b3JUYWIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNpemUgPSBpbnB1dDwnbGFuZ2VyJyB8ICdtZWRpdW0nPignbWVkaXVtJyk7XG4gIHJlYWRvbmx5IGFsbG93RHJhZ0Ryb3BQb3NpdGlvbiA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnQ3NzID0gbW9kZWw8SVRhYkNzc0NvbmZpZz4oKTtcbiAgcmVhZG9ubHkgcG9wb3ZlclNob3dNb3JlVGFiSXRlbSA9IGlucHV0PElQb3BvdmVyPigpO1xuICByZWFkb25seSBjaGVja0NhbkNoYW5nZVRhYlNlbGVjdGVkID0gaW5wdXQ8KCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4+KCk7XG4gIHJlYWRvbmx5IHVzZUVmZmVjdFVwZGF0ZUl0ZW1zID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgLyoqXG4gICAqIFYyIG1vZGUg4oCUIGtoaSBgdHJ1ZWA6XG4gICAqIC0gQuG7jyBjb250YWluZXIgxJFvIHNvbmcgc29uZyAoa2jDtG5nIHJlbmRlciAyIGzhuqduKS5cbiAgICogLSBEw7luZyBSZXNpemVPYnNlcnZlciB0aGF5IE11dGF0aW9uT2JzZXJ2ZXIvc2V0VGltZW91dC9kZWJvdW5jZS5cbiAgICogLSBDb21wdXRlIHN5bmNocm9ub3VzLCBraMO0bmcgcmVvcmRlciBpdGVtcyDihpIga2jDtG5nIGZsaWNrZXIuXG4gICAqIE3hurdjIMSR4buLbmggYGZhbHNlYCDEkeG7gyBnaeG7ryAxMDAlIGJlaGF2aW9yIGPFqSAoYmFja3dhcmQgY29tcGF0aWJsZSkuXG4gICAqL1xuICByZWFkb25seSB1c2VDYWxjdWxhdG9yVjIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0S2V5U2VsZWN0ZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElUYWJzRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdUYWJDaGFuZ2UgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0RGlzcGxheU1vcmVJdGVtID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEFjdGlvbiA9IG91dHB1dDxJVGFic0l0ZW1FdmVudD4oKTtcblxuICAvKiBWSUVXIENISUxEICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhZGVyRWwgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZj4oJ2hlYWRlckVsJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhZGVyTGVmdEVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCdoZWFkZXJMZWZ0RWwnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoZWFkZXJSaWdodEVsID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY+KCdoZWFkZXJSaWdodEVsJyk7XG5cbiAgLyogSU5KRUNUKi9cbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy50YWJzKCk/Lml0ZW1zKCk7XG4gICAgICBpZiAoIXRoaXMudXNlRWZmZWN0VXBkYXRlSXRlbXMoKSkgcmV0dXJuO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVJdGVtc0Rpc3BsYXkoaXRlbXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBWMiDigJQgZWZmZWN0IHThu7EgxJHhu5luZyByZWNvbXB1dGUga2hpIGNvbnRhaW5lci9oZWFkZXJMZWZ0L2hlYWRlclJpZ2h0IMSR4buVaSBrw61jaCB0aMaw4bubYyBob+G6t2Mgc2VsZWN0ZWQgxJHhu5VpLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMudXNlQ2FsY3VsYXRvclYyKCkpIHJldHVybjtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXJXaWR0aFYyKCk7XG4gICAgICAvLyDEkOG7jWMgY+G6oyBjw6FjIHNpZ25hbCBwaOG7pSB0aHXhu5ljIMSR4buDIGVmZmVjdCB04buxIHJlLXJ1biBraGkgY2jDum5nIMSR4buVaS5cbiAgICAgIHRoaXMuaGVhZGVyTGVmdFdpZHRoVjIoKTtcbiAgICAgIHRoaXMuaGVhZGVyUmlnaHRXaWR0aFYyKCk7XG4gICAgICB0aGlzLmtleVNlbGVjdGVkKCk7XG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFicygpPy5pdGVtcygpO1xuICAgICAgaWYgKCFjb250YWluZXJXaWR0aCB8fCAhaXRlbXM/Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY29tcHV0ZURpc3BsYXlJdGVtc1YyKGl0ZW1zKSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZVRhYnNDc3NDb25maWcoKTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICAgIGlmICghdGhpcy51c2VFZmZlY3RVcGRhdGVJdGVtcygpKSB7XG4gICAgICB0aGlzLnVwZGF0ZUl0ZW1zRGlzcGxheSh0aGlzLnRhYnMoKT8uaXRlbXMoKSk7XG4gICAgfVxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDI1MCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYnMoKS5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBWMiBraMO0bmcgY+G6p24geOG7rSBsw70gcmVzaXplIOG7nyDEkcOieSDigJQgUmVzaXplT2JzZXJ2ZXIgdOG7sSBmaXJlLlxuICAgICAgICBpZiAodGhpcy51c2VDYWxjdWxhdG9yVjIoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3BsYXlNb3JlSXRlbS5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0b3JUYWJzSXRlbURpc3BsYXkoKTtcbiAgICAgIH0pO1xuICAgIC8vIFYxIHBhdGg6IHByZXNlcnZlIG9sZCBiZWhhdmlvciB24bubaSBkZWJvdW5jZSgyMCkuXG4gICAgdGhpcy5jaGFuZ2VWaWV3VGFiLnBpcGUoZGVib3VuY2VUaW1lKDIwKSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnVzZUNhbGN1bGF0b3JWMigpKSByZXR1cm47XG4gICAgICB0aGlzLmNhbGN1bGF0b3JUYWJzSXRlbURpc3BsYXkoKTtcbiAgICB9KTtcbiAgICAvLyBWMiBwYXRoOiBjaOG6oXkgc3luYyAoa2jDtG5nIGRlYm91bmNlKSDigJQgUmVzaXplT2JzZXJ2ZXIgxJHDoyBiYXRjaCB0aGVvIGZyYW1lLlxuICAgIHRoaXMuY2hhbmdlVmlld1RhYi5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnVzZUNhbGN1bGF0b3JWMigpKSByZXR1cm47XG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFicygpPy5pdGVtcygpO1xuICAgICAgaWYgKGl0ZW1zPy5sZW5ndGgpIHRoaXMuY29tcHV0ZURpc3BsYXlJdGVtc1YyKGl0ZW1zKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy51c2VDYWxjdWxhdG9yVjIoKSkge1xuICAgICAgdGhpcy5zZXR1cFJlc2l6ZU9ic2VydmVyVjIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVzaXplT2JzZXJ2ZXJWMigpIHtcbiAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlclYyIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyRWwgPSB0aGlzLmhlYWRlckVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgaGVhZGVyTGVmdEVsID0gdGhpcy5oZWFkZXJMZWZ0RWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBoZWFkZXJSaWdodEVsID0gdGhpcy5oZWFkZXJSaWdodEVsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFoZWFkZXJFbCkgcmV0dXJuO1xuXG4gICAgdGhpcy5yZXNpemVPYnNlcnZlclYyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZW50cnkudGFyZ2V0O1xuICAgICAgICBjb25zdCB3aWR0aCA9ICh0YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsaWVudFdpZHRoIHx8IDA7XG4gICAgICAgIHN3aXRjaCAodGFyZ2V0KSB7XG4gICAgICAgICAgY2FzZSBoZWFkZXJFbDpcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcldpZHRoVjIoKSAhPT0gd2lkdGgpIHRoaXMuY29udGFpbmVyV2lkdGhWMi5zZXQod2lkdGgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBoZWFkZXJMZWZ0RWw6XG4gICAgICAgICAgICBpZiAodGhpcy5oZWFkZXJMZWZ0V2lkdGhWMigpICE9PSB3aWR0aCkgdGhpcy5oZWFkZXJMZWZ0V2lkdGhWMi5zZXQod2lkdGgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBoZWFkZXJSaWdodEVsOlxuICAgICAgICAgICAgaWYgKHRoaXMuaGVhZGVyUmlnaHRXaWR0aFYyKCkgIT09IHdpZHRoKSB0aGlzLmhlYWRlclJpZ2h0V2lkdGhWMi5zZXQod2lkdGgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyVjIub2JzZXJ2ZShoZWFkZXJFbCk7XG4gICAgaWYgKGhlYWRlckxlZnRFbCkgdGhpcy5yZXNpemVPYnNlcnZlclYyLm9ic2VydmUoaGVhZGVyTGVmdEVsKTtcbiAgICBpZiAoaGVhZGVyUmlnaHRFbCkgdGhpcy5yZXNpemVPYnNlcnZlclYyLm9ic2VydmUoaGVhZGVyUmlnaHRFbCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUl0ZW1zRGlzcGxheShpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPj4pIHtcbiAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm1vZGUoKSAhPT0gJ2xlZnQnIHx8IHRoaXMuaWdub3JlQ2FsY3VsYXRvclRhYigpKSB7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0udXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0Rpc3BsYXk6IHRydWUgfSkpKTtcbiAgICAgICAgdGhpcy5pdGVtc0Rpc3BsYXkuc2V0KGl0ZW1zKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudXNlQ2FsY3VsYXRvclYyKCkpIHtcbiAgICAgICAgLy8gVjI6IGl0ZW1zRGlzcGxheSBjaOG7qWEgdG/DoG4gYuG7mSBpdGVtcyAoa2jDtG5nIGZpbHRlcikuIFJlc2l6ZU9ic2VydmVyIHPhur0gxJFvIHdpZHRoXG4gICAgICAgIC8vIHbDoCBjb21wdXRlIHPhur0gc2V0IHNwZWNpZmljRGlzcGxheSBmbGFnIOKAlCBzdHlsZSBiaW5kaW5nIOG6qW4gaXRlbSBvdmVyZmxvdy5cbiAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljRGlzcGxheTogdHJ1ZSB9KSkpO1xuICAgICAgICB0aGlzLml0ZW1zRGlzcGxheS5zZXQoWy4uLml0ZW1zXSk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcldpZHRoVjIoKSkge1xuICAgICAgICAgIHRoaXMuY29tcHV0ZURpc3BsYXlJdGVtc1YyKGl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGN1bGF0b3JUYWJzSXRlbURpc3BsYXkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVRhYnNGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZFRhYnNJdGVtOiB0aGlzLmFkZFRhYnNJdGVtLmJpbmQodGhpcyksXG4gICAgICBjYWxjdWxhdG9yVGFic0l0ZW1zRGlzcGxheTogdGhpcy5jYWxjdWxhdG9yVGFic0l0ZW1EaXNwbGF5RGlzcGF0Y2guYmluZCh0aGlzKSxcbiAgICAgIHNlbGVjdGVkVGFic0l0ZW06IHRoaXMuaGFuZGxlclNlbGVjdGVkVGFic0l0ZW0uYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUYWJzQ3NzQ29uZmlnKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZ0NzcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5tb2RlKCkpIHtcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB0aGlzLmNvbmZpZ0Nzcy5zZXQoe1xuICAgICAgICAgIGZpcnN0OiAnbWwtWzIwcHhdIG1yLVsxNnB4XScsXG4gICAgICAgICAgb3RoZXI6ICdtbC1bMjBweF0gbXItWzE2cHhdJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgdGhpcy5jb25maWdDc3Muc2V0KHtcbiAgICAgICAgICBmaXJzdDogJ3B4LVsxMnB4XSBtbC1bMThweF0gbXItWzE4cHhdJyxcbiAgICAgICAgICBvdGhlcjogJ3B4LVsxMnB4XSBteC1bMThweF0nLFxuICAgICAgICAgIGhlYWRlcjogJ2ZsZXgganVzdGlmeS1jZW50ZXInLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjZW50ZXItaGFzLWxpbmUnOlxuICAgICAgICB0aGlzLmNvbmZpZ0Nzcy5zZXQoe1xuICAgICAgICAgIGZpcnN0OiAncHgtWzE2cHhdJyxcbiAgICAgICAgICBvdGhlcjogJ3B4LVsxNnB4XScsXG4gICAgICAgICAgaGVhZGVyQ2VudGVyOiAnaXRlbXMtY2VudGVyJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3BhY2UtYmV0d2Vlbic6XG4gICAgICAgIHRoaXMuY29uZmlnQ3NzLnNldCh7XG4gICAgICAgICAgZmlyc3Q6ICdteC1hdXRvJyxcbiAgICAgICAgICBvdGhlcjogJ214LWF1dG8nLFxuICAgICAgICAgIGhlYWRlckNlbnRlcjogJ3ctZnVsbCcsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0eWxlc0RyYWdEcm9wT3ZlcnJpZGUoKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dEcmFnRHJvcFBvc2l0aW9uKCkpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJyxcbiAgICAgICAgICBzdHlsZXM6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAnbGlicy11aS1kcmFnLWRyb3AtaXRlbScsXG4gICAgICAgICAgc3R5bGVzOiAnY3Vyc29yOiBtb3ZlOycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyYWdnaW5nJyxcbiAgICAgICAgICBzdHlsZXM6ICdjdXJzb3I6IG1vdmU7IGJhY2tncm91bmQ6ICNkZGRkZGQ7JyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0nLFxuICAgICAgICBzdHlsZXM6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kaXNhYmxlJyxcbiAgICAgICAgc3R5bGVzOiAnJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRHJvcENvbnRhaW5lcihldmVudDogSURyb3ApIHtcbiAgICBjb25zdCB7IGl0ZW1EcmFnSW5mbyB9ID0gZXZlbnQ7XG4gICAgaWYgKCFpdGVtRHJhZ0luZm8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnRhYnMoKS5pdGVtcztcbiAgICBjb25zdCB7IGluZGV4RHJhZywgaW5kZXhEcm9wIH0gPSBpdGVtRHJhZ0luZm87XG4gICAgaWYgKGlzTmlsKGluZGV4RHJhZykgfHwgaXNOaWwoaW5kZXhEcm9wKSB8fCBpbmRleERyb3AgPT09IGluZGV4RHJhZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtRHJhZyA9IGl0ZW1zKClbaW5kZXhEcmFnIGFzIG51bWJlcl07XG4gICAgaXRlbXMudXBkYXRlKChpdGVtcykgPT4ge1xuICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJhZyBhcyBudW1iZXIsIDEpO1xuICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJvcCBhcyBudW1iZXIsIDAsIGl0ZW1EcmFnKTtcbiAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgIH0pO1xuICAgIHRoaXMub3V0RHJhZ1RhYkNoYW5nZS5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudChldmVudDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LnNldChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZXJTZWxlY3RlZFRhYnNJdGVtKGtleTogc3RyaW5nLCByZXNldERpc2FibGUgPSB0cnVlKSB7XG4gICAgY29uc3QgaXRlbVNlbGVjdGVkID0gdGhpcy50YWJzKClcbiAgICAgIC5pdGVtcygpXG4gICAgICAuZmluZCgoaXRlbSkgPT4gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gPT09IGtleSk7XG4gICAgaWYgKCFpdGVtU2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc2V0RGlzYWJsZSkge1xuICAgICAgaXRlbVNlbGVjdGVkLnVwZGF0ZSgoaXRlbSkgPT4gKHsgLi4uaXRlbSwgZGlzYWJsZTogZmFsc2UgfSkpO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJDbGlja0l0ZW0oaXRlbVNlbGVjdGVkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlckNsaWNrSXRlbShjb252ZXJ0T2JqZWN0VG9TaWduYWwoZXZlbnQuaXRlbSkpO1xuICAgIHRoaXMub3V0RHJhZ1RhYkNoYW5nZS5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNsaWNrSXRlbShpdGVtOiBXcml0YWJsZVNpZ25hbDxJVGFic0l0ZW0+KSB7XG4gICAgaWYgKGl0ZW0oKS5kaXNhYmxlIHx8IHRoaXMuZGlzYWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrQ2FuQ2hhbmdlVGFiU2VsZWN0ZWQgPSB0aGlzLmNoZWNrQ2FuQ2hhbmdlVGFiU2VsZWN0ZWQoKTtcbiAgICBpZiAoY2hlY2tDYW5DaGFuZ2VUYWJTZWxlY3RlZCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSBhd2FpdCBjaGVja0NhbkNoYW5nZVRhYlNlbGVjdGVkKCk7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VJdGVtU2VsZWN0ZWQoaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlSXRlbVNlbGVjdGVkKGl0ZW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VJdGVtU2VsZWN0ZWQoaXRlbTogV3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPikge1xuICAgIHRoaXMua2V5U2VsZWN0ZWQuc2V0KGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldKTtcbiAgICB0aGlzLm91dEtleVNlbGVjdGVkLmVtaXQodGhpcy5rZXlTZWxlY3RlZCgpKTtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgIHRoaXMuY2FsY3VsYXRvclRhYnNJdGVtRGlzcGxheURpc3BhdGNoKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckFjdGlvbihldmVudDogSVRhYnNJdGVtRXZlbnQpIHtcbiAgICB0aGlzLm91dEFjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkVGFic0l0ZW0oaXRlbTogV3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPiwgc2VsZWN0ZWQgPSB0cnVlLCBhZGRGaXJzdD86IGJvb2xlYW4sIGluZGV4QWRkPzogbnVtYmVyKSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnRhYnMoKS5pdGVtcztcbiAgICBpdGVtcy51cGRhdGUoKGl0ZW1zKSA9PiB7XG4gICAgICBpZiAoYWRkRmlyc3QpIHtcbiAgICAgICAgcmV0dXJuIFtpdGVtLCAuLi5pdGVtc107XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXhBZGQpIHtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4QWRkLCAwLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi5pdGVtcywgaXRlbV07XG4gICAgfSk7XG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmhhbmRsZXJDbGlja0l0ZW0oaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERpc3BhdGNoIHNhbmcgbmjDoW5oIFYxIGhv4bq3YyBWMiBk4buxYSB0aGVvIGZsYWcuIFB1YmxpYyBBUEkgZ2nhu68gbmd1ecOqbiBzaWduYXR1cmUuICovXG4gIHByaXZhdGUgYXN5bmMgY2FsY3VsYXRvclRhYnNJdGVtRGlzcGxheURpc3BhdGNoKCkge1xuICAgIGlmICh0aGlzLnVzZUNhbGN1bGF0b3JWMigpKSB7XG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMudGFicygpPy5pdGVtcygpO1xuICAgICAgaWYgKGl0ZW1zPy5sZW5ndGgpIHRoaXMuY29tcHV0ZURpc3BsYXlJdGVtc1YyKGl0ZW1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jYWxjdWxhdG9yVGFic0l0ZW1EaXNwbGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2FsY3VsYXRvclRhYnNJdGVtRGlzcGxheSgpIHtcbiAgICBsZXQgaXRlbXMgPSB0aGlzLnRhYnMoKS5pdGVtcygpO1xuICAgIGNvbnN0IGluZGV4SXRlbVNlbGVjdGVkID0gaXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtKClbdGhpcy5maWVsZEtleSgpXSA9PT0gdGhpcy5rZXlTZWxlY3RlZCgpKTtcbiAgICBpZiAoaW5kZXhJdGVtU2VsZWN0ZWQgPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheU1vcmVJdGVtLnNldChmYWxzZSk7XG4gICAgbGV0IGRpc3BsYXlNb3JlSXRlbSA9IGZhbHNlO1xuICAgIGNvbnN0IGhlYWRlcldpZHRoID0gdGhpcy5oZWFkZXJFbCgpLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggfHwgMDtcbiAgICBjb25zdCBpdGVtU2VsZWN0ZWQgPSBpdGVtc1tpbmRleEl0ZW1TZWxlY3RlZF07XG4gICAgY29uc3QgaXRlbVNlbGVjdGVkV2lkdGggPSBpdGVtU2VsZWN0ZWQoKS5zcGVjaWZpY1dpZHRoO1xuICAgIGxldCB0b3RhbFdpZHRoSXRlbXNEaXNwbGF5ID0gKHRoaXMuaGVhZGVyTGVmdEVsKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCB8fCAwKSArICh0aGlzLmhlYWRlclJpZ2h0RWwoKS5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIHx8IDApICsgMzI7XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghaXRlbSgpLnNwZWNpZmljV2lkdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljRGlzcGxheTogZmFsc2UgfSkpO1xuICAgICAgY29uc3QgaXRlbVdpZHRoID0gaXRlbSgpLnNwZWNpZmljV2lkdGggfHwgMDtcbiAgICAgIGNvbnN0IHdpZHRoID0gdG90YWxXaWR0aEl0ZW1zRGlzcGxheSArIGl0ZW1XaWR0aCArIChpbmRleCA8IGluZGV4SXRlbVNlbGVjdGVkID8gaXRlbVNlbGVjdGVkV2lkdGggOiAwKTtcbiAgICAgIHRvdGFsV2lkdGhJdGVtc0Rpc3BsYXkgKz0gaXRlbVdpZHRoO1xuICAgICAgaWYgKHdpZHRoID4gaGVhZGVyV2lkdGgpIHtcbiAgICAgICAgZGlzcGxheU1vcmVJdGVtID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljRGlzcGxheTogdHJ1ZSB9KSk7XG4gICAgfSk7XG4gICAgaXRlbVNlbGVjdGVkLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNEaXNwbGF5OiB0cnVlIH0pKTtcbiAgICBjb25zdCBkaXNwbGF5ID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtKCkuc3BlY2lmaWNEaXNwbGF5ID09PSB0cnVlKTtcbiAgICBjb25zdCBub3REaXNwbGF5ID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtKCkuc3BlY2lmaWNEaXNwbGF5ID09PSBmYWxzZSk7XG4gICAgaXRlbXMgPSBkaXNwbGF5LmNvbmNhdChub3REaXNwbGF5KTtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIG9yZGVyOiBpbmRleCB9KSkpO1xuICAgIGNvbnN0IHNvcnRlZEl0ZW1zID0gWy4uLml0ZW1zXS5zb3J0KChwcmV2LCBuZXh0KSA9PiAocHJldigpLm9yZGVyIHx8IDApIC0gKG5leHQoKS5vcmRlciB8fCAwKSk7XG4gICAgLy8gQ2hlY2sgaWYgb3JkZXIgYWN0dWFsbHkgY2hhbmdlZCBiZWZvcmUgc2V0dGluZyB0byBhdm9pZCB0cmlnZ2VyaW5nIHJlZHVuZGFudCBjeWNsZXNcbiAgICBjb25zdCBvcmRlckNoYW5nZWQgPSBpdGVtcy5zb21lKChpdGVtLCBpbmRleCkgPT4gaXRlbSgpW3RoaXMuZmllbGRLZXkoKV0gIT09IHNvcnRlZEl0ZW1zW2luZGV4XSgpW3RoaXMuZmllbGRLZXkoKV0pO1xuXG4gICAgaWYgKG9yZGVyQ2hhbmdlZCkge1xuICAgICAgdGhpcy50YWJzKCkuaXRlbXMuc2V0KHNvcnRlZEl0ZW1zKTtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BsYXlNb3JlSXRlbS5zZXQoZGlzcGxheU1vcmVJdGVtKTtcbiAgICB0aGlzLm91dERpc3BsYXlNb3JlSXRlbS5lbWl0KHRoaXMuZGlzcGxheU1vcmVJdGVtKCkpO1xuXG4gICAgY29uc3QgbmV3SXRlbXNEaXNwbGF5ID0gdGhpcy50YWJzKClcbiAgICAgIC5pdGVtcygpXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtKCkuc3BlY2lmaWNEaXNwbGF5KTtcbiAgICB0aGlzLml0ZW1zRGlzcGxheS5zZXQobmV3SXRlbXNEaXNwbGF5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWMiDigJQgVMOtbmggZGlzcGxheUl0ZW1zIHN5bmNocm9ub3VzLCBraMO0bmcgcmVvcmRlciwga2jDtG5nIHNldFRpbWVvdXQuXG4gICAqXG4gICAqIFdoeTogdHLDoW5oIGZsaWNrZXIgZG8gcmVvcmRlciBET00gKyBi4buPIHRodeG6rXQgdG/DoW4gXCJj4bqjbSB0w61uaFwiIGRlYm91bmNlLlxuICAgKiBIb3cgdG8gYXBwbHk6IGfhu41pIG3hu5dpIGtoaSBjb250YWluZXIgd2lkdGggLyBoZWFkZXJMZWZ0IC8gaGVhZGVyUmlnaHQgLyBpdGVtIHdpZHRocyAvIHNlbGVjdGVkIGtleSDEkeG7lWkuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVEaXNwbGF5SXRlbXNWMihpdGVtczogQXJyYXk8V3JpdGFibGVTaWduYWw8SVRhYnNJdGVtPj4pIHtcbiAgICBpZiAodGhpcy5tb2RlKCkgIT09ICdsZWZ0JyB8fCB0aGlzLmlnbm9yZUNhbGN1bGF0b3JUYWIoKSkge1xuICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljRGlzcGxheTogdHJ1ZSB9KSkpO1xuICAgICAgdGhpcy5pdGVtc0Rpc3BsYXkuc2V0KFsuLi5pdGVtc10pO1xuICAgICAgdGhpcy5kaXNwbGF5TW9yZUl0ZW0uc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0RGlzcGxheU1vcmVJdGVtLmVtaXQoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcldpZHRoID0gdGhpcy5jb250YWluZXJXaWR0aFYyKCk7XG4gICAgaWYgKCFoZWFkZXJXaWR0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5kZXhJdGVtU2VsZWN0ZWQgPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0oKVt0aGlzLmZpZWxkS2V5KCldID09PSB0aGlzLmtleVNlbGVjdGVkKCkpO1xuICAgIGlmIChpbmRleEl0ZW1TZWxlY3RlZCA8IDApIHJldHVybjtcblxuICAgIGNvbnN0IGl0ZW1TZWxlY3RlZCA9IGl0ZW1zW2luZGV4SXRlbVNlbGVjdGVkXTtcbiAgICBjb25zdCBpdGVtU2VsZWN0ZWRXaWR0aCA9IGl0ZW1TZWxlY3RlZCgpLnNwZWNpZmljV2lkdGggfHwgMDtcbiAgICBjb25zdCByZXNlcnZlZFdpZHRoID0gdGhpcy5oZWFkZXJMZWZ0V2lkdGhWMigpICsgdGhpcy5oZWFkZXJSaWdodFdpZHRoVjIoKSArIDMyO1xuXG4gICAgbGV0IHRvdGFsV2lkdGggPSByZXNlcnZlZFdpZHRoO1xuICAgIGxldCBkaXNwbGF5TW9yZUl0ZW0gPSBmYWxzZTtcblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpdGVtV2lkdGggPSBpdGVtKCkuc3BlY2lmaWNXaWR0aCB8fCAwO1xuICAgICAgaWYgKCFpdGVtV2lkdGgpIHtcbiAgICAgICAgLy8gQ2jGsGEgY8OzIHdpZHRoIOKAlCB04bqhbSBoaeG7g24gdGjhu4sgxJHhu4MgUmVzaXplT2JzZXJ2ZXIgY8OzIGVsZW1lbnQgbcOgIMSRby5cbiAgICAgICAgaXRlbS51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljRGlzcGxheTogdHJ1ZSB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFJlc2VydmUgc3BhY2UgY2hvIHNlbGVjdGVkIG7hur91IGl0ZW0gbsOgeSBu4bqxbSB0csaw4bubYyBzZWxlY3RlZC5cbiAgICAgIGNvbnN0IHByb2plY3RlZCA9IHRvdGFsV2lkdGggKyBpdGVtV2lkdGggKyAoaW5kZXggPCBpbmRleEl0ZW1TZWxlY3RlZCA/IGl0ZW1TZWxlY3RlZFdpZHRoIDogMCk7XG4gICAgICB0b3RhbFdpZHRoICs9IGl0ZW1XaWR0aDtcbiAgICAgIGlmIChwcm9qZWN0ZWQgPiBoZWFkZXJXaWR0aCkge1xuICAgICAgICBpdGVtLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNEaXNwbGF5OiBmYWxzZSB9KSk7XG4gICAgICAgIGRpc3BsYXlNb3JlSXRlbSA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGl0ZW0udXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0Rpc3BsYXk6IHRydWUgfSkpO1xuICAgIH0pO1xuICAgIC8vIFNlbGVjdGVkIGx1w7RuIGhp4buDbiB0aOG7iy5cbiAgICBpdGVtU2VsZWN0ZWQudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0Rpc3BsYXk6IHRydWUgfSkpO1xuXG4gICAgLy8gVjI6IGl0ZW1zRGlzcGxheSBjaOG7qWEgVOG6pFQgQ+G6oiBpdGVtcyDigJQga2jDtG5nIGZpbHRlci4gSXRlbSBvdmVyZmxvdyDEkcaw4bujYyDhuqluIHF1YSBzdHlsZSBiaW5kaW5nXG4gICAgLy8gKHZpc2liaWxpdHk6IGhpZGRlbiArIHBvc2l0aW9uOiBhYnNvbHV0ZSkgxJHhu4MgZ2nhu68gRE9NIHN0YWJsZSwgdHLDoW5oIG1vdW50L3VubW91bnQgZ8OieSBmbGlja2VyLlxuICAgIC8vIFJlc2l6ZU9ic2VydmVyIGx1w7RuIMSRbyDEkcaw4bujYyB3aWR0aCB2w6wgbeG7jWkgaXRlbSBsdcO0biBjw7MgRE9NLlxuICAgIGNvbnN0IGFsbEl0ZW1zID0gWy4uLml0ZW1zXTtcbiAgICBjb25zdCBjdXJyZW50RGlzcGxheSA9IHRoaXMuaXRlbXNEaXNwbGF5KCk7XG4gICAgLy8gQ2jhu4kgc2V0IGtoaSBu4buZaSBkdW5nIGFycmF5IHRo4buxYyBz4buxIMSR4buVaSAodHLDoW5oIENEIHRo4burYSkuXG4gICAgY29uc3QgYXJyYXlDaGFuZ2VkID0gYWxsSXRlbXMubGVuZ3RoICE9PSBjdXJyZW50RGlzcGxheS5sZW5ndGggfHwgYWxsSXRlbXMuc29tZSgoaXQsIGkpID0+IGl0ICE9PSBjdXJyZW50RGlzcGxheVtpXSk7XG4gICAgaWYgKGFycmF5Q2hhbmdlZCkge1xuICAgICAgdGhpcy5pdGVtc0Rpc3BsYXkuc2V0KGFsbEl0ZW1zKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaXNwbGF5TW9yZUl0ZW0oKSAhPT0gZGlzcGxheU1vcmVJdGVtKSB7XG4gICAgICB0aGlzLmRpc3BsYXlNb3JlSXRlbS5zZXQoZGlzcGxheU1vcmVJdGVtKTtcbiAgICAgIHRoaXMub3V0RGlzcGxheU1vcmVJdGVtLmVtaXQoZGlzcGxheU1vcmVJdGVtKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyVjI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyVjIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYlwiPlxuICA8ZGl2XG4gICAgI2hlYWRlckVsXG4gICAgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXIgei1bMV0ge3sgY29uZmlnQ3NzKCk/LmhlYWRlciB8fCAnJyB9fSB7eyB0YWJzKCkuY2xhc3NJbmNsdWRlSGVhZGVyIHx8ICcnIH19XCJcbiAgICBbc3R5bGUubWluSGVpZ2h0LnB4XT1cImhlaWdodFRhYkl0ZW0oKVwiPlxuICAgIDxkaXZcbiAgICAgICNoZWFkZXJMZWZ0RWxcbiAgICAgIGNsYXNzPVwibGlicy11aS10YWItaGVhZGVyLWxlZnRcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImRpdi5saWJzLXVpLXRhYi1oZWFkZXItbGVmdFwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10YWItaGVhZGVyLWNlbnRlciB7eyBjb25maWdDc3MoKT8uaGVhZGVyQ2VudGVyIHx8ICcnIH19IHt7IHRhYnMoKS5jbGFzc0luY2x1ZGVIZWFkZXJDZW50ZXIgfHwgJycgfX1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCIhZmxleCB3LWZ1bGxcIlxuICAgICAgICAjZWxlbWVudENvbnRhaW5lckVsXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlXG4gICAgICAgIFtzdHlsZXNPdmVycmlkZV09XCJzdHlsZXNEcmFnRHJvcE92ZXJyaWRlQ29tcHV0ZWQoKVwiXG4gICAgICAgIFtncm91cE5hbWVdPVwiZ3JvdXBOYW1lKClcIlxuICAgICAgICBbKGl0ZW1zKV09XCJpdGVtc0Rpc3BsYXlcIlxuICAgICAgICBbZGlyZWN0aW9uRHJhZ109XCInaG9yaXpvbnRhbCdcIlxuICAgICAgICBbZGlzYWJsZURyYWdDb250YWluZXJdPVwiIWFsbG93RHJhZ0Ryb3BQb3NpdGlvbigpXCJcbiAgICAgICAgW2FjY2VwdERyYWdTYW1lR3JvdXBdPVwiYWxsb3dEcmFnRHJvcFBvc2l0aW9uKClcIlxuICAgICAgICAob3V0RHJvcHBlZENvbnRhaW5lcik9XCJoYW5kbGVyRHJvcENvbnRhaW5lcigkZXZlbnQpXCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXNEaXNwbGF5KCk7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBMaWJzVWlEcmFnSXRlbURpcmVjdGl2ZVxuICAgICAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8ICFhbGxvd0RyYWdEcm9wUG9zaXRpb24oKSB8fCAodXNlQ2FsY3VsYXRvclYyKCkgJiYgaXRlbSgpLnNwZWNpZmljRGlzcGxheSA9PT0gZmFsc2UpXCJcbiAgICAgICAgICAgIFtlbGVtZW50Q29udGFpbmVyXT1cImVsZW1lbnRDb250YWluZXJFbFwiXG4gICAgICAgICAgICBbZHJhZ0JvdW5kYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgW2RyYWdCb3VuZGFyeUFjY2VwdE1vdXNlTGVhdmVDb250YWluZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGxpYnMtdWktdGFiLWl0ZW0tY29udGFpbmVyXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJtb2RlKCkgPT09ICdzcGFjZS1iZXR3ZWVuJyA/IGVsZW1lbnRDb250YWluZXJFbC5jbGllbnRXaWR0aCAvIGRpc3BsYXllZENvdW50KCkgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwibW9kZSgpID09PSAnY2VudGVyLWhhcy1saW5lJ1wiXG4gICAgICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cIm1vZGUoKSA9PT0gJ2NlbnRlci1oYXMtbGluZSdcIlxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwidXNlQ2FsY3VsYXRvclYyKCkgJiYgaXRlbSgpLnNwZWNpZmljRGlzcGxheSA9PT0gZmFsc2UgPyAnaGlkZGVuJyA6IG51bGxcIlxuICAgICAgICAgICAgW3N0eWxlLnBvc2l0aW9uXT1cInVzZUNhbGN1bGF0b3JWMigpICYmIGl0ZW0oKS5zcGVjaWZpY0Rpc3BsYXkgPT09IGZhbHNlID8gJ2Fic29sdXRlJyA6IG51bGxcIlxuICAgICAgICAgICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cInVzZUNhbGN1bGF0b3JWMigpICYmIGl0ZW0oKS5zcGVjaWZpY0Rpc3BsYXkgPT09IGZhbHNlID8gJ25vbmUnIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCJ1c2VDYWxjdWxhdG9yVjIoKSAmJiBpdGVtKCkuc3BlY2lmaWNEaXNwbGF5ID09PSBmYWxzZSA/ICd0cnVlJyA6IG51bGxcIj5cbiAgICAgICAgICAgIEBpZiAoYWxsb3dEcmFnRHJvcFBvc2l0aW9uKCkgJiYgIWRpc2FibGUoKSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktaWNvbi1hcnJhbmdlIHRleHQtWyM5Y2EyYWRdIGFic29sdXRlIHRvcC1bMTRweF0gbGVmdC1bNHB4XVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFicy1pdGVtXG4gICAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsIHctZnVsbCAge3sgdGFicygpLmNsYXNzSW5jbHVkZUl0ZW0gfHwgJycgfX1cIlxuICAgICAgICAgICAgICBbdGFic109XCJ0YWJzKClcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJzaXplKClcIlxuICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1cIlxuICAgICAgICAgICAgICBbc3RlcF09XCIkaW5kZXggKyAxXCJcbiAgICAgICAgICAgICAgW2NsYXNzLiFwb2ludGVyLWV2ZW50cy1ub25lXT1cIml0ZW0oKS5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cIml0ZW0oKS5kaXNhYmxlIHx8IGRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlTGFiZWxdPVwiZGlzYWJsZUxhYmVsKClcIlxuICAgICAgICAgICAgICBba2V5U2VsZWN0ZWRdPVwia2V5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgIFtmaWVsZExhYmVsXT1cImZpZWxkTGFiZWwoKVwiXG4gICAgICAgICAgICAgIFtmaWVsZEtleV09XCJmaWVsZEtleSgpXCJcbiAgICAgICAgICAgICAgW2Nzc0RlZmF1bHRdPVwiKCRmaXJzdCA/IGNvbmZpZ0NzcygpPy5maXJzdCA6IGNvbmZpZ0NzcygpPy5vdGhlcikgfHwgJydcIlxuICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgICAgW21vZGVdPVwibW9kZSgpXCJcbiAgICAgICAgICAgICAgW2lnbm9yZUNhbGN1bGF0b3JUYWJdPVwiaWdub3JlQ2FsY3VsYXRvclRhYigpIHx8ICF1c2VDYWxjdWxhdG9yVjIoKVwiXG4gICAgICAgICAgICAgIFt1c2VDYWxjdWxhdG9yVjJdPVwidXNlQ2FsY3VsYXRvclYyKClcIlxuICAgICAgICAgICAgICBbY2hhbmdlVmlld1RhYl09XCJjaGFuZ2VWaWV3VGFiXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDbGlja0l0ZW0oaXRlbSlcIlxuICAgICAgICAgICAgICAob3V0QWN0aW9uKT1cImhhbmRsZXJBY3Rpb24oJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2NlbnRlci1oYXMtbGluZScgJiYgISRsYXN0KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LVs0MHB4XSBoLVsxcHhdIGJnLVsjZTZlN2VhXVwiPjwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgIFtjbGFzcy5tbC1hdXRvXT1cImRpc3BsYXlNb3JlSXRlbSgpICYmICF0YWJzKCkudmlld01vcmVJZ25vcmVNYXJnaW5MZWZ0XCI+XG4gICAgICBAaWYgKGRpc3BsYXlNb3JlSXRlbSgpKSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgW21vZGVdPVwiJ2NsaWNrLXRvZ2dsZSdcIlxuICAgICAgICAgIFtpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlXT1cInRydWVcIlxuICAgICAgICAgIFtjb25maWddPVwie1xuICAgICAgICAgICAgekluZGV4OiBwb3BvdmVyU2hvd01vcmVUYWJJdGVtKCk/LmNvbmZpZz8uekluZGV4IHx8IDEwMDAsXG4gICAgICAgICAgICBtYXhIZWlnaHQ6IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy5tYXhIZWlnaHQgfHwgMjg3LFxuICAgICAgICAgICAgbWF4V2lkdGg6IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy5tYXhXaWR0aCB8fCAyMDQ4LFxuICAgICAgICAgICAgd2lkdGg6IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy53aWR0aCB8fCAyNzcsXG4gICAgICAgICAgICBkaXJlY3Rpb246IHBvcG92ZXJTaG93TW9yZVRhYkl0ZW0oKT8uY29uZmlnPy5kaXJlY3Rpb24gfHwgJ2JvdHRvbScsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogcG9wb3ZlclNob3dNb3JlVGFiSXRlbSgpPy5jb25maWc/LnRlbXBsYXRlIHx8IG1lbnVFbCxcbiAgICAgICAgICAgIHdoaXRlVGhlbWU6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBwb3BvdmVyU2hvd01vcmVUYWJJdGVtKCk/LmNvbmZpZz8ucG9zaXRpb24gfHwgeyBtb2RlOiAnZW5kJywgZGlzdGFuY2U6IDAgfSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KCRldmVudClcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLVs4cHhdJ1wiXG4gICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1tb3JlLXZlcnRpY2FsIHJvdGF0ZS05MCB0ZXh0LVsxNnB4XSBtci0wJ1wiXG4gICAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiBwb3BvdmVyU2hvd01vcmVUYWJJdGVtKCk/LmNvbmZpZz8uY29udGVudCB8fCAnaTE4bl92aWV3X21vcmUnIH0gfVwiXG4gICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG4gICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgI2hlYWRlclJpZ2h0RWxcbiAgICAgIGNsYXNzPVwibGlicy11aS10YWItaGVhZGVyLXJpZ2h0IHt7IHRhYnMoKS5jbGFzc0luY2x1ZGVIZWFkZXJSaWdodCB8fCAnJyB9fVwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiZGl2LmxpYnMtdWktdGFiLWhlYWRlci1yaWdodFwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIEBpZiAoIXVzZUNhbGN1bGF0b3JWMigpKSB7XG4gICAgPGRpdiBjbGFzcz1cImFic29sdXRlIHRvcC0wIHotMCB3LWZ1bGxcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJsaWJzLXVpLXRhYi1oZWFkZXIge3sgY29uZmlnQ3NzKCk/LmhlYWRlciB8fCAnJyB9fSB7eyB0YWJzKCkuY2xhc3NJbmNsdWRlSGVhZGVyIHx8ICcnIH19XCJcbiAgICAgICAgW3N0eWxlLm1pbkhlaWdodC5weF09XCJoZWlnaHRUYWJJdGVtKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktdGFiLWhlYWRlci1jZW50ZXIge3sgY29uZmlnQ3NzKCk/LmhlYWRlckNlbnRlciB8fCAnJyB9fSB7eyB0YWJzKCkuY2xhc3NJbmNsdWRlSGVhZGVyQ2VudGVyIHx8ICcnIH19XCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiB0YWJzKCkuaXRlbXMoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJzLWl0ZW1cbiAgICAgICAgICAgICAgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIHt7IHRhYnMoKS5jbGFzc0luY2x1ZGVJdGVtIHx8ICcnIH19XCJcbiAgICAgICAgICAgICAgW3RhYnNdPVwidGFicygpXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwic2l6ZSgpXCJcbiAgICAgICAgICAgICAgWyhpdGVtKV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgW3N0ZXBdPVwiJGluZGV4ICsgMVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlTGFiZWxdPVwiZGlzYWJsZUxhYmVsKClcIlxuICAgICAgICAgICAgICBba2V5U2VsZWN0ZWRdPVwia2V5U2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgIFtmaWVsZExhYmVsXT1cImZpZWxkTGFiZWwoKVwiXG4gICAgICAgICAgICAgIFtmaWVsZEtleV09XCJmaWVsZEtleSgpXCJcbiAgICAgICAgICAgICAgW2Nzc0RlZmF1bHRdPVwiKCRmaXJzdCA/IGNvbmZpZ0NzcygpPy5maXJzdCA6IGNvbmZpZ0NzcygpPy5vdGhlcikgfHwgJydcIlxuICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICAgICAgW21vZGVdPVwibW9kZSgpXCJcbiAgICAgICAgICAgICAgW2NoYW5nZVZpZXdUYWJdPVwiY2hhbmdlVmlld1RhYlwiXG4gICAgICAgICAgICAgIFtpZ25vcmVDYWxjdWxhdG9yVGFiXT1cImlnbm9yZUNhbGN1bGF0b3JUYWIoKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjbWVudUVsPlxuICA8bGlic191aS1jb21wb25lbnRzLWxpc3RcbiAgICBbY29uZmlnXT1cInRhYk1vcmVMaXN0Q29uZmlnKClcIlxuICAgIFttYXhJdGVtU2hvd109XCI1XCJcbiAgICBbaGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgW3BhZGRpbmdMZWZ0SXRlbV09XCJ0cnVlXCJcbiAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZEtleSgkZXZlbnQpXCIgLz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|