@seniorsistemas/data-seniorx-core 3.3.0 → 3.4.0-main-e91c7773
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/constants/nested-table.const.d.ts +3 -0
- package/core/constants/table.const.d.ts +2 -0
- package/core/types/nested-table.type.d.ts +18 -0
- package/esm2022/core/constants/nested-table.const.mjs +4 -0
- package/esm2022/core/constants/table.const.mjs +15 -1
- package/esm2022/core/types/nested-table.type.mjs +2 -0
- package/esm2022/features/datepicker/datepicker.component.mjs +179 -9
- package/esm2022/features/nested-table/nested-table.component.mjs +132 -0
- package/esm2022/features/panel/panel.component.mjs +3 -3
- package/esm2022/features/table/components/table-actions-menu.component.mjs +47 -6
- package/esm2022/features/table/components/table-cell-content.component.mjs +3 -3
- package/esm2022/features/table/table.component.mjs +17 -67
- package/esm2022/features/table/utils/table-data.util.mjs +40 -1
- package/esm2022/locales/en.json +5 -0
- package/esm2022/locales/es-CO.json +5 -0
- package/esm2022/locales/pt.json +5 -0
- package/esm2022/providers/features.provider.mjs +3 -1
- package/esm2022/public-api.mjs +2 -1
- package/features/datepicker/datepicker.component.d.ts +14 -1
- package/features/nested-table/nested-table.component.d.ts +47 -0
- package/features/table/components/table-actions-menu.component.d.ts +16 -1
- package/features/table/table.component.d.ts +0 -1
- package/features/table/utils/table-data.util.d.ts +7 -1
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +435 -83
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/src/locales/en.json +5 -0
- package/src/locales/es-CO.json +5 -0
- package/src/locales/pt.json +5 -0
- package/styles/accessibility.scss +92 -0
- package/styles.css +89 -1
|
@@ -3,7 +3,7 @@ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListe
|
|
|
3
3
|
import { TranslateModule } from '@ngx-translate/core';
|
|
4
4
|
import { getViewportWidth, isMobileViewport } from '../../core/utils/layout.util';
|
|
5
5
|
import { getFocusableElements } from '../../core/utils/focus.util';
|
|
6
|
-
import { DEFAULT_TABLE_OPTIONS, TABLE_COLUMN_TYPE_CHECKBOX_SELECTION as COLUMN_TYPE_CHECKBOX_SELECTION, TABLE_DEFAULT_LOADING_VERTICAL_PADDING_PX as DEFAULT_LOADING_VERTICAL_PADDING_PX, TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX as DEFAULT_MIN_LOADING_HEIGHT_PX, TABLE_DEFAULT_ROW_HEIGHT_PX as DEFAULT_ROW_HEIGHT_PX, TABLE_DEFAULT_ROWS_PER_PAGE as DEFAULT_ROWS_PER_PAGE, TABLE_INDEX_ZERO as INDEX_ZERO, TABLE_MENU_GAP_PX as MENU_GAP_PX, TABLE_MOBILE_CARD_ESTIMATED_HEIGHT_PX } from '../../core/constants/table.const';
|
|
6
|
+
import { DEFAULT_TABLE_OPTIONS, TABLE_COLUMN_TYPE_CHECKBOX_SELECTION as COLUMN_TYPE_CHECKBOX_SELECTION, TABLE_DEFAULT_LOADING_VERTICAL_PADDING_PX as DEFAULT_LOADING_VERTICAL_PADDING_PX, TABLE_DEFAULT_MIN_LOADING_HEIGHT_PX as DEFAULT_MIN_LOADING_HEIGHT_PX, TABLE_DEFAULT_ROW_HEIGHT_PX as DEFAULT_ROW_HEIGHT_PX, TABLE_DEFAULT_ROWS_PER_PAGE as DEFAULT_ROWS_PER_PAGE, TABLE_INDEX_ZERO as INDEX_ZERO, TABLE_MENU_GAP_PX as MENU_GAP_PX, TABLE_EMPTY_STATE_MOBILE_HEIGHT_PX, TABLE_MOBILE_CARD_ESTIMATED_HEIGHT_PX } from '../../core/constants/table.const';
|
|
7
7
|
import { DEFAULT_LOADING_STATE_INDICATOR } from '../../core/constants/loading-state.const';
|
|
8
8
|
import { TableMenuFocusTarget } from '../../core/types/table.type';
|
|
9
9
|
import { ButtonComponent } from '../button/button.component';
|
|
@@ -16,7 +16,7 @@ import { TableActionsMenuComponent } from './components/table-actions-menu.compo
|
|
|
16
16
|
import { TableCellContentComponent } from './components/table-cell-content.component';
|
|
17
17
|
import { TableSortIndicatorComponent } from './components/table-sort-indicator.component';
|
|
18
18
|
import { buildTableCellConfigMap, mergeTableOptions } from './utils/table-config.util';
|
|
19
|
-
import { buildRowCheckboxId, filterTableRows, getNestedValue, resolveRowIdentityLabel, resolveRowSelectionKey } from './utils/table-data.util';
|
|
19
|
+
import { buildRowCheckboxId, cycleSortState, filterTableRows, getNestedValue, resolveRowIdentityLabel, resolveRowSelectionKey, sortTableRows } from './utils/table-data.util';
|
|
20
20
|
import { getTableColumnMinWidthPx, getTableMinWidthPx, resolveTableColumnAlignment } from './utils/table-layout.util';
|
|
21
21
|
import * as i0 from "@angular/core";
|
|
22
22
|
import * as i1 from "@angular/common";
|
|
@@ -159,29 +159,7 @@ export class TableComponent {
|
|
|
159
159
|
if (this.isApiMode()) {
|
|
160
160
|
return this.filteredData();
|
|
161
161
|
}
|
|
162
|
-
|
|
163
|
-
const order = this.sortOrder();
|
|
164
|
-
const rows = [...this.filteredData()];
|
|
165
|
-
if (!field || order === 0) {
|
|
166
|
-
return rows;
|
|
167
|
-
}
|
|
168
|
-
return rows.sort((leftRow, rightRow) => {
|
|
169
|
-
const leftValue = this.resolveValue(leftRow, field);
|
|
170
|
-
const rightValue = this.resolveValue(rightRow, field);
|
|
171
|
-
if (leftValue == null && rightValue == null) {
|
|
172
|
-
return 0;
|
|
173
|
-
}
|
|
174
|
-
if (leftValue == null) {
|
|
175
|
-
return -order;
|
|
176
|
-
}
|
|
177
|
-
if (rightValue == null) {
|
|
178
|
-
return order;
|
|
179
|
-
}
|
|
180
|
-
if (typeof leftValue === 'number' && typeof rightValue === 'number') {
|
|
181
|
-
return (leftValue - rightValue) * order;
|
|
182
|
-
}
|
|
183
|
-
return this.toComparableText(leftValue).localeCompare(this.toComparableText(rightValue)) * order;
|
|
184
|
-
});
|
|
162
|
+
return sortTableRows(this.filteredData(), this.sortField(), this.sortOrder(), this.resolveValue);
|
|
185
163
|
});
|
|
186
164
|
totalRecords = computed(() => {
|
|
187
165
|
if (!this.isApiMode()) {
|
|
@@ -218,7 +196,14 @@ export class TableComponent {
|
|
|
218
196
|
const estimatedHeight = safeRows * rowHeight + DEFAULT_LOADING_VERTICAL_PADDING_PX;
|
|
219
197
|
return Math.max(DEFAULT_MIN_LOADING_HEIGHT_PX, estimatedHeight);
|
|
220
198
|
});
|
|
221
|
-
|
|
199
|
+
// O corpo reserva "linhas por pagina x altura da linha" pra nao dar salto de layout
|
|
200
|
+
// quando os dados chegam. No estado VAZIO nao chega nada, e empilhado a conta
|
|
201
|
+
// explode: cada linha e um cartao de 120px, entao 10 linhas pedem 1224px de nada -
|
|
202
|
+
// medido num Galaxy S9+, a lista vazia virava 3,4 telas de rolagem.
|
|
203
|
+
//
|
|
204
|
+
// So no empilhado: em tela larga a reserva da uns 460px e segura o rodape no lugar,
|
|
205
|
+
// que e o comportamento que ja existia.
|
|
206
|
+
emptyBodyHeightPx = computed(() => this.isMobile() ? TABLE_EMPTY_STATE_MOBILE_HEIGHT_PX : this.bodyViewportHeightPx());
|
|
222
207
|
tableMinWidthPx = computed(() => getTableMinWidthPx(this.colsSignal()));
|
|
223
208
|
resolveValue = (obj, path) => getNestedValue(obj, path, this.pathPartsCache);
|
|
224
209
|
onDocumentClick() {
|
|
@@ -264,24 +249,9 @@ export class TableComponent {
|
|
|
264
249
|
if (!enabled || !field) {
|
|
265
250
|
return;
|
|
266
251
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
const currentOrder = this.sortOrder();
|
|
273
|
-
if (currentOrder === 1) {
|
|
274
|
-
this.sortOrder.set(-1);
|
|
275
|
-
}
|
|
276
|
-
else if (currentOrder === -1) {
|
|
277
|
-
this.sortOrder.set(0);
|
|
278
|
-
this.sortField.set(null);
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
this.sortOrder.set(1);
|
|
282
|
-
this.sortField.set(field);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
252
|
+
const next = cycleSortState(this.sortField(), this.sortOrder(), field);
|
|
253
|
+
this.sortField.set(next.field);
|
|
254
|
+
this.sortOrder.set(next.order);
|
|
285
255
|
this.first.set(INDEX_ZERO);
|
|
286
256
|
if (this.isApiMode()) {
|
|
287
257
|
this.emitLazyLoad('sort');
|
|
@@ -631,26 +601,6 @@ export class TableComponent {
|
|
|
631
601
|
return currentSelection.length === nextSelection.length
|
|
632
602
|
&& currentSelection.every((row, index) => row === nextSelection[index]);
|
|
633
603
|
}
|
|
634
|
-
toComparableText(value) {
|
|
635
|
-
if (value == null) {
|
|
636
|
-
return '';
|
|
637
|
-
}
|
|
638
|
-
if (typeof value === 'string') {
|
|
639
|
-
return value;
|
|
640
|
-
}
|
|
641
|
-
if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
|
|
642
|
-
return String(value);
|
|
643
|
-
}
|
|
644
|
-
if (typeof value === 'object') {
|
|
645
|
-
try {
|
|
646
|
-
return JSON.stringify(value);
|
|
647
|
-
}
|
|
648
|
-
catch {
|
|
649
|
-
return '';
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
return '';
|
|
653
|
-
}
|
|
654
604
|
nextActionsMenuId() {
|
|
655
605
|
this.actionsMenuIdSequence += 1;
|
|
656
606
|
return `sdc-table-actions-menu-${this.actionsMenuIdSequence}`;
|
|
@@ -675,7 +625,7 @@ export class TableComponent {
|
|
|
675
625
|
nextElement?.focus();
|
|
676
626
|
}
|
|
677
627
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
678
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", selection: "selection", loading: "loading", loadingIndicator: "loadingIndicator", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", rowClick: "rowClick", lazyLoad: "lazyLoad", selectionChange: "selectionChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"loadingIndicator\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\" [class.sdc-table-caption__search--full-width]=\"searchFullWidth()\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility_search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility_select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility_select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-table-th-tooltip\"\n [pTooltip]=\"col.headerTooltip\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-circle-info sdc-table-th-tooltip__icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr\n role=\"row\"\n [attr.aria-rowindex]=\"r + 1\"\n (click)=\"onRowClicked(row)\"\n (keydown.enter)=\"onRowClicked(row)\"\n >\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility_collapse_row' | translate)\n : ('platform.datacore.accessibility_expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [showRowsPerPageSelector]=\"showRowsPerPageSelector()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-caption__search--full-width{width:100%}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0;overflow:hidden}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-th-tooltip{flex-shrink:0;display:inline-flex;align-items:center}.sdc-table-th-tooltip__icon{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0;position:sticky;bottom:0;z-index:1;background:var(--sdc-table-bg-card)}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:2px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid rgba(0,0,0,.05)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:1px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid rgba(0,0,0,.06);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelectionDisabled", "forceLeftAlign", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["ariaLabel", "items", "left", "menuId", "top", "width"], outputs: ["close", "select"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
628
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableComponent, isStandalone: true, selector: "sdc-table", inputs: { cols: "cols", data: "data", selection: "selection", loading: "loading", loadingIndicator: "loadingIndicator", config: "config", ariaLabel: "ariaLabel" }, outputs: { action: "action", rowClick: "rowClick", lazyLoad: "lazyLoad", selectionChange: "selectionChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscapeKey()", "window:scroll": "onWindowScroll()" } }, ngImport: i0, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"loadingIndicator\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\" [class.sdc-table-caption__search--full-width]=\"searchFullWidth()\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility_search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility_select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility_select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-table-th-tooltip\"\n [pTooltip]=\"col.headerTooltip\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-circle-info sdc-table-th-tooltip__icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr\n role=\"row\"\n [attr.aria-rowindex]=\"r + 1\"\n (click)=\"onRowClicked(row)\"\n (keydown.enter)=\"onRowClicked(row)\"\n >\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility_collapse_row' | translate)\n : ('platform.datacore.accessibility_expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [showRowsPerPageSelector]=\"showRowsPerPageSelector()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-caption__search--full-width{width:100%}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0;overflow:hidden}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-th-tooltip{flex-shrink:0;display:inline-flex;align-items:center}.sdc-table-th-tooltip__icon{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0;position:sticky;bottom:0;z-index:1;background:var(--sdc-table-bg-card)}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-table-border-gray);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-table-bg-card);border-top:2px solid var(--sdc-table-border-gray)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-table-border-gray);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-table-bg-card);border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid var(--sdc-table-border-gray);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: LoadingStateComponent, selector: "sdc-loading-state", inputs: ["indicator", "id", "blockWindow", "blockDelayMs", "unblockDelayMs", "loading"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: TableSortIndicatorComponent, selector: "sdc-table-sort-indicator", inputs: ["columnField", "columnType", "sortField", "sortOrder", "sortable"] }, { kind: "component", type: TableCellContentComponent, selector: "sdc-table-cell-content", inputs: ["cellConfigs", "col", "resolveValue", "row", "actionsMenuOpen", "actionsMenuId", "defaultTextOverflow", "rowCheckboxId", "rowLabel", "rowSelectionDisabled", "forceLeftAlign", "rowSelected"], outputs: ["toggleActionsMenu", "toggleRow", "triggerButtonAction"] }, { kind: "component", type: TableActionsMenuComponent, selector: "sdc-table-actions-menu", inputs: ["ariaLabel", "items", "left", "menuId", "top", "width"], outputs: ["close", "select"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
679
629
|
}
|
|
680
630
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableComponent, decorators: [{
|
|
681
631
|
type: Component,
|
|
@@ -691,7 +641,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
691
641
|
TableCellContentComponent,
|
|
692
642
|
TableActionsMenuComponent,
|
|
693
643
|
TooltipComponent
|
|
694
|
-
], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"loadingIndicator\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\" [class.sdc-table-caption__search--full-width]=\"searchFullWidth()\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility_search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility_select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility_select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-table-th-tooltip\"\n [pTooltip]=\"col.headerTooltip\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-circle-info sdc-table-th-tooltip__icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr\n role=\"row\"\n [attr.aria-rowindex]=\"r + 1\"\n (click)=\"onRowClicked(row)\"\n (keydown.enter)=\"onRowClicked(row)\"\n >\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility_collapse_row' | translate)\n : ('platform.datacore.accessibility_expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [showRowsPerPageSelector]=\"showRowsPerPageSelector()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-caption__search--full-width{width:100%}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0;overflow:hidden}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-th-tooltip{flex-shrink:0;display:inline-flex;align-items:center}.sdc-table-th-tooltip__icon{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0;position:sticky;bottom:0;z-index:1;background:var(--sdc-table-bg-card)}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:2px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid rgba(0,0,0,.05)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-border-strong, #d1d5db);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-formfield-default-bg, #ffffff);border-top:1px solid var(--sdc-border-strong, #d1d5db)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid rgba(0,0,0,.06);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"] }]
|
|
644
|
+
], encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, template: "<section\n class=\"sdc-table\"\n [class.sdc-table-stack]=\"isMobile()\"\n [class.sdc-table-filtered]=\"!!globalFilter().trim()\"\n [class.sdc-table--loading]=\"isLoading\"\n [class.sdc-table--initial-loading]=\"showInitialLoading()\"\n>\n <sdc-loading-state\n class=\"sdc-table-loading-wrap\"\n [loading]=\"isLoading\"\n [blockWindow]=\"false\"\n [blockDelayMs]=\"0\"\n [indicator]=\"loadingIndicator\"\n >\n <div class=\"sdc-table-shell\" [style.--sdc-table-body-height.px]=\"bodyViewportHeightPx()\">\n @if (showSearch()) {\n <div class=\"sdc-table-caption\">\n <div class=\"sdc-table-caption__search\" [class.sdc-table-caption__search--full-width]=\"searchFullWidth()\">\n <sdc-searchbox\n [disabled]=\"isLoading\"\n [placeholder]=\"searchPlaceholder()\"\n [triggerMode]=\"triggerMode()\"\n (onSearch)=\"onSearchTerm($event)\"\n (onClear)=\"onClearSearch()\"\n [attr.aria-label]=\"'platform.datacore.accessibility_search_field' | translate\"\n />\n </div>\n </div>\n }\n\n @if (!isMobile()) {\n <div\n class=\"sdc-table-scroll\"\n [style.--sdc-table-min-width]=\"isFitLayout() ? '100%' : tableMinWidthPx() + 'px'\"\n >\n <table\n class=\"sdc-table-grid\"\n [class.sdc-table-grid--fit]=\"isFitLayout()\"\n role=\"table\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-rowcount]=\"totalRecords()\"\n [attr.aria-busy]=\"isLoading\"\n >\n <colgroup>\n @for (col of cols; track $index) {\n <col [style.width]=\"colWidthStyle(col)\" />\n }\n </colgroup>\n\n <thead>\n <tr role=\"row\">\n @for (col of cols; track $index) {\n <th\n scope=\"col\"\n role=\"columnheader\"\n [class.sdc-table-th-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-th-currency]=\"col.type === 'currency'\"\n [class.sdc-table-th-button]=\"col.type === 'button'\"\n [class.sdc-table-th-actions]=\"col.type === 'actions'\"\n [class.sdc-table-sortable]=\"canSortColumn(col)\"\n [class.sdc-table-sortable-disabled]=\"isSortableColumn(col) && !canSortColumn(col)\"\n [class.sdc-table-header-disabled]=\"!hasDataRows()\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col, 'header')\"\n [attr.aria-sort]=\"getSortAriaAttribute(col)\"\n [attr.tabindex]=\"hasDataRows() && canSortColumn(col) ? 0 : null\"\n [attr.aria-disabled]=\"!hasDataRows() || (isSortableColumn(col) && !canSortColumn(col)) ? 'true' : null\"\n [attr.aria-label]=\"\n isSortableColumn(col)\n ? (\n (col.header | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n )\n : (col.header | translate)\n \"\n (click)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.enter)=\"hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n (keydown.space)=\"$event.preventDefault();\n hasDataRows() && col.field ? toggleSort(col.field, canSortColumn(col)) : null\"\n >\n @if (col.type === 'checkbox-selection' && (cellsCfg().checkbox.selectAll ?? true)) {\n <div class=\"sdc-table-th-inner sdc-table-th-inner--checkbox\">\n <span class=\"sdc-table-th-label sr-only\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n <span class=\"sdc-table-th-center\">\n <input\n type=\"checkbox\"\n [id]=\"getSelectAllCheckboxId($index)\"\n [checked]=\"isPageFullySelected()\"\n [indeterminate]=\"isPagePartiallySelected()\"\n [disabled]=\"!hasSelectablePageRows()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelectPage(getCheckedValue($event))\"\n (keydown.space)=\"$event.preventDefault(); toggleSelectPage(!isPageFullySelected())\"\n [attr.aria-label]=\"'platform.datacore.accessibility_select_all_rows' | translate\"\n [attr.aria-checked]=\"getPageSelectionAriaChecked()\"\n />\n <label [for]=\"getSelectAllCheckboxId($index)\" class=\"sr-only\">\n {{ 'platform.datacore.accessibility_select_all_rows' | translate }}\n </label>\n </span>\n </div>\n } @else {\n <div class=\"sdc-table-th-inner\" [class.sdc-table-th-inner--sortable]=\"isSortableColumn(col)\">\n <span class=\"sdc-table-th-label\" aria-hidden=\"true\">{{ col.header | translate }}</span>\n\n @if (col.headerTooltip) {\n <sdc-tooltip\n class=\"sdc-table-th-tooltip\"\n [pTooltip]=\"col.headerTooltip\"\n [tooltipPosition]=\"col.headerTooltipPosition ?? 'top'\"\n [tooltipEvent]=\"col.headerTooltipEvent ?? 'hover'\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-circle-info sdc-table-th-tooltip__icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n\n <span class=\"sdc-table-sort-overlay\" aria-hidden=\"true\">\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </span>\n </div>\n }\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <tr class=\"sdc-table-initial-loading-row\" role=\"row\" [attr.aria-rowindex]=\"r + 1\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc sdc-table-td--initial-loading\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n role=\"cell\"\n >\n <div class=\"sdc-table-td-val sdc-table-td-val--initial-loading\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <tr\n role=\"row\"\n [attr.aria-rowindex]=\"r + 1\"\n (click)=\"onRowClicked(row)\"\n (keydown.enter)=\"onRowClicked(row)\"\n >\n @for (col of cols; track $index) {\n <td\n class=\"sdc-table-td sdc-table-tdc\"\n [class.sdc-table-td-checkbox]=\"col.type === 'checkbox-selection'\"\n [class.sdc-table-td-currency]=\"col.type === 'currency'\"\n [class.sdc-table-td-button]=\"col.type === 'button'\"\n [class.sdc-table-td-actions]=\"col.type === 'actions'\"\n [class.sdc-table-is-selected]=\"sortField() === col.field\"\n [ngClass]=\"columnAlignClass(col)\"\n [attr.data-title]=\"col.header | translate\"\n [attr.id]=\"col.colId || null\"\n role=\"cell\"\n >\n @if (col.cellTag === 'span') {\n <span class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </span>\n } @else if (col.cellTag === 'i') {\n <i class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </i>\n } @else if (col.cellTag === 'p') {\n <p class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </p>\n } @else {\n <div class=\"sdc-table-td-val\" [ngStyle]=\"col.cellStyle\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n </div>\n } @else if (mobileMode() === 'stacked') {\n <div\n class=\"sdc-table-mobile-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex; let r = $index) {\n <div class=\"sdc-table-mobile-card sdc-table-mobile-card--loading\" aria-hidden=\"true\">\n @for (col of cols; track $index) {\n <div class=\"sdc-table-mobile-field sdc-table-mobile-field--loading\">\n <div class=\"sdc-table-mobile-label sdc-table-mobile-label--loading\"></div>\n <div class=\"sdc-table-mobile-skeleton\"></div>\n </div>\n }\n </div>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <div class=\"sdc-table-mobile-card\">\n @for (col of cols; track $index) {\n <div\n class=\"sdc-table-mobile-field\"\n [class.sdc-table-mobile-field--full-width]=\"\n col.type === 'button' || col.type === 'actions' || col.type === 'checkbox-selection'\n \"\n [class.sdc-table-mobile-field--selected]=\"sortField() === col.field\"\n [class.sdc-table-mobile-field--sortable]=\"col.field && isSortableColumn(col)\"\n (click)=\"col.field && toggleSort(col.field, isSortableColumn(col))\"\n >\n @if (mobileFieldLabel(col)) {\n <div class=\"sdc-table-mobile-label-wrap\">\n @if (col.field && isSortableColumn(col)) {\n <button\n type=\"button\"\n class=\"sdc-table-mobile-label sdc-table-mobile-label--sortable\"\n [attr.aria-label]=\"\n (mobileFieldLabel(col) | translate)\n + ' - '\n + ('platform.datacore.accessibility_sortable_column' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleSort(col.field, isSortableColumn(col))\"\n (keydown.enter)=\"toggleSort(col.field, isSortableColumn(col))\"\n (keydown.space)=\"$event.preventDefault(); toggleSort(col.field, isSortableColumn(col))\"\n >\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n <sdc-table-sort-indicator\n [columnField]=\"col.field || null\"\n [columnType]=\"col.type\"\n [sortable]=\"isSortableColumn(col)\"\n [sortField]=\"sortField()\"\n [sortOrder]=\"sortOrder()\"\n ></sdc-table-sort-indicator>\n </button>\n } @else {\n <div class=\"sdc-table-mobile-label\">\n <span>{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-table-mobile-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n }\n }\n </div>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n } @else {\n <ul\n class=\"sdc-table-expandable-list\"\n [attr.aria-label]=\"tableAriaLabelKey() | translate\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (showInitialLoading()) {\n @for (rowIndex of initialLoadingRows(); track rowIndex) {\n <li class=\"sdc-table-expandable-item sdc-table-expandable-item--loading\" aria-hidden=\"true\">\n <div class=\"sdc-table-expandable-summary sdc-table-expandable-summary--loading\">\n <div class=\"sdc-table-expandable-summary-fields\">\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-primary\"></div>\n <div class=\"sdc-table-mobile-skeleton sdc-table-expandable-skeleton-secondary\"></div>\n </div>\n <span class=\"sdc-table-expandable-chevron\" aria-hidden=\"true\">\n <i class=\"fas fa-chevron-down\"></i>\n </span>\n </div>\n </li>\n }\n } @else {\n @for (row of pageData(); track $index; let r = $index) {\n <li\n class=\"sdc-table-expandable-item\"\n [class.sdc-table-expandable-item--expanded]=\"isRowExpanded(r)\"\n >\n <div\n class=\"sdc-table-expandable-summary\"\n (click)=\"toggleExpandRow(r)\"\n (keydown.enter)=\"toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); toggleExpandRow(r)\"\n >\n @if (checkboxCol(); as cbCol) {\n <div\n class=\"sdc-table-expandable-checkbox\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n >\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"cbCol\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, cbCol)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, cbCol, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n }\n <div class=\"sdc-table-expandable-summary-fields\">\n @for (col of summaryCols(); track $index) {\n <div class=\"sdc-table-expandable-summary-field\">\n <span class=\"sdc-table-expandable-summary-label\">{{ mobileFieldLabel(col) | translate }}</span>\n <div class=\"sdc-table-expandable-summary-value\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"false\"\n [actionsMenuId]=\"null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n </div>\n <button\n type=\"button\"\n class=\"sdc-table-expandable-toggle\"\n [attr.aria-expanded]=\"isRowExpanded(r)\"\n [attr.aria-label]=\"\n isRowExpanded(r)\n ? ('platform.datacore.accessibility_collapse_row' | translate)\n : ('platform.datacore.accessibility_expand_row' | translate)\n \"\n (click)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.enter)=\"$event.stopPropagation(); toggleExpandRow(r)\"\n (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); toggleExpandRow(r)\"\n >\n <span\n class=\"sdc-table-expandable-chevron\"\n [class.sdc-table-expandable-chevron--open]=\"isRowExpanded(r)\"\n aria-hidden=\"true\"\n ><i class=\"fas fa-chevron-down\"></i></span>\n </button>\n </div>\n @if (isRowExpanded(r)) {\n <div class=\"sdc-table-expandable-details\">\n @for (col of cols; track $index) {\n @if (col.type !== 'checkbox-selection') {\n <div\n class=\"sdc-table-expandable-field\"\n [class.sdc-table-expandable-field--full-width]=\"\n col.type === 'button' || col.type === 'actions'\n \"\n >\n @if (col.type !== 'button' && col.type !== 'actions') {\n <div class=\"sdc-table-expandable-label-wrap\">\n <span class=\"sdc-table-expandable-label\">{{ mobileFieldLabel(col) | translate }}</span>\n </div>\n }\n <div class=\"sdc-table-expandable-value\" [attr.id]=\"resolveCellId(col, row)\">\n <sdc-table-cell-content\n [forceLeftAlign]=\"true\"\n [row]=\"row\"\n [col]=\"col\"\n [cellConfigs]=\"cellsCfg()\"\n [resolveValue]=\"resolveValue\"\n [rowCheckboxId]=\"getRowCheckboxId(row)\"\n [rowLabel]=\"getRowCheckboxLabel(row)\"\n [rowSelectionDisabled]=\"isRowSelectionDisabled(row)\"\n [rowSelected]=\"isRowSelected(row)\"\n [actionsMenuOpen]=\"isActionsMenuOpen(row, col)\"\n [actionsMenuId]=\"isActionsMenuOpen(row, col) ? openMenuState()?.menuId ?? null : null\"\n (toggleRow)=\"onToggleRow(row, $event)\"\n (triggerButtonAction)=\"onButtonClick(row, col)\"\n [defaultTextOverflow]=\"defaultTextOverflow()\"\n (toggleActionsMenu)=\"toggleActionsMenu($event.event, row, col, $event.trigger)\"\n ></sdc-table-cell-content>\n </div>\n </div>\n }\n }\n </div>\n }\n </li>\n }\n }\n </ul>\n\n @if (!isLoading && options().empty?.show !== false && totalRecords() === 0) {\n <sdc-empty-state\n id=\"my-empty-state\"\n iconClass=\"fa fa-inbox\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyText()\"\n class=\"sdc-table-empty-state\"\n [style.min-height.px]=\"emptyBodyHeightPx()\"\n ></sdc-empty-state>\n }\n }\n\n @if (showPaginator()) {\n <div class=\"sdc-table-paginator\">\n <sdc-paginator\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"isMobile() ? [] : rowsPerPageOptions()\"\n [showRowsPerPageSelector]=\"showRowsPerPageSelector()\"\n [isMobile]=\"isMobile()\"\n [totalRecordsLabel]=\"totalRecordsLabel()\"\n (pageChange)=\"onPageChange($event)\"\n ></sdc-paginator>\n </div>\n }\n </div>\n </sdc-loading-state>\n</section>\n\n@if (openMenuState(); as menu) {\n <sdc-table-actions-menu\n [items]=\"menu.items\"\n [menuId]=\"menu.menuId\"\n [top]=\"menu.top\"\n [left]=\"menu.left\"\n [width]=\"menu.width\"\n (close)=\"onMenuClose($event)\"\n (select)=\"onPortalActionClick($event)\"\n ></sdc-table-actions-menu>\n}\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sdc-table{width:100%;box-sizing:border-box;overflow:visible;background:var(--sdc-table-bg-card)}.sdc-table-shell{display:block;--sdc-table-body-height: 220px;overflow:visible}.sdc-table-loading-wrap{display:block;width:100%;overflow:visible}.sdc-table-caption{width:100%;justify-content:flex-end;display:flex;padding:.75rem 0}.sdc-table-caption__search{width:min(100%,22rem)}.sdc-table-caption__search--full-width{width:100%}.sdc-table-scroll{width:100%;overflow-x:auto;overflow-y:visible}.sdc-table-grid{min-width:var(--sdc-table-min-width, 100%);width:100%;border-collapse:collapse;table-layout:auto}.sdc-table-grid--fit{table-layout:fixed}thead th{padding:var(--sdc-table-padding-cell);background:var(--sdc-table-bg-card);border-bottom:1px solid var(--sdc-formfield-default-border);-webkit-user-select:none;user-select:none;transition:background var(--sdc-table-transition-fast),border var(--sdc-table-transition-fast);min-height:44px;position:relative;overflow:hidden;text-align:left}thead th.sdc-table-sortable{cursor:pointer}thead th.sdc-table-sortable:hover{background:var(--sdc-table-th-hover-bg)}thead th.sdc-table-sortable-disabled,thead th.sdc-table-header-disabled{cursor:default}thead th.sdc-table-sortable-disabled:focus,thead th.sdc-table-sortable-disabled:focus-visible{outline:none;box-shadow:none}thead th.sdc-table-sortable:focus,thead th.sdc-table-sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #007bff);outline-offset:-2px;box-shadow:inset 0 0 0 3px #007bff33;position:relative;z-index:1}thead th.sdc-table-is-selected{background:var(--sdc-table-th-selected-bg)!important}thead th.sdc-table-is-selected .sdc-table-sort-overlay{right:.5rem}.sdc-table-th-inner{display:flex;align-items:center;gap:var(--sdc-table-gap-th-inner);width:100%;min-width:0;overflow:hidden;text-align:inherit}.sdc-table-sort-overlay{position:absolute;right:0;top:50%;transform:translateY(-50%)}tbody td{padding:.5rem var(--sdc-table-padding-cell);border-bottom:1px solid var(--sdc-table-border-gray);vertical-align:middle;overflow:visible}.sdc-table-td-val{display:flex;align-items:center;width:100%;min-width:0;overflow:hidden}.sdc-table-td-val--initial-loading{min-height:1.5rem}.sdc-table-initial-loading-row{background:var(--sdc-table-bg-card)}.sdc-table-td--initial-loading{height:3.625rem}.sdc-table-th-label{color:#333!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;display:block;flex:1 1 auto;width:100%;text-align:inherit}.sdc-table-th-inner--sortable{padding-right:1.5rem}.sdc-table-th-tooltip{flex-shrink:0;display:inline-flex;align-items:center}.sdc-table-th-tooltip__icon{font-size:.75rem;color:var(--sdc-table-th-tooltip-icon, #767676);cursor:help}.sdc-table-empty-state{display:flex;align-items:center;justify-content:center;min-height:var(--sdc-table-body-height);padding:0}.sdc-table--loading .sdc-table-shell{pointer-events:none;-webkit-user-select:none;user-select:none}.sdc-table--initial-loading .sdc-table-scroll{overflow-x:hidden}thead th.sdc-table-th-checkbox .sdc-table-th-inner--checkbox{justify-content:center}thead th.sdc-table-th-checkbox .sdc-table-th-center{display:flex;align-items:center;justify-content:center;width:100%}thead th.sdc-table-th-checkbox .sdc-table-th-center input{cursor:pointer;margin:0}thead th.sdc-table-th-checkbox .sdc-table-th-center input:disabled{cursor:not-allowed}.sdc-table-paginator{padding:.5rem 0;position:sticky;bottom:0;z-index:1;background:var(--sdc-table-bg-card)}.sdc-table-td-align-left{text-align:left}.sdc-table-td-align-center{text-align:center}.sdc-table-td-align-right{text-align:right}.sdc-table-th-align-left{text-align:left}.sdc-table-th-align-center{text-align:center}.sdc-table-th-align-right{text-align:right}.sdc-table-cell-content--nowrap .sdc-table-text,.sdc-table-cell-content--nowrap .sdc-table-strong-label,.sdc-table-cell-content--nowrap .sdc-table-code-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}@keyframes sdc-mobile-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.sdc-table-mobile-list{display:flex;flex-direction:column;width:100%;border:1px solid var(--sdc-table-border-gray);border-radius:.5rem;overflow:hidden}.sdc-table-mobile-card{display:flex;flex-direction:column;background:var(--sdc-table-bg-card);border-top:2px solid var(--sdc-table-border-gray)}.sdc-table-mobile-card:first-child{border-top:0}.sdc-table-mobile-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.5rem 1rem;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field:first-child{border-top:0;padding-top:.75rem}.sdc-table-mobile-field:last-child{padding-bottom:.75rem}.sdc-table-mobile-field--selected{background:#11182706}.sdc-table-mobile-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-mobile-label-wrap,.sdc-table-mobile-value{min-width:0}.sdc-table-mobile-field--full-width>.sdc-table-mobile-label-wrap{display:none}.sdc-table-mobile-label,.sdc-table-mobile-label--sortable{display:flex;align-items:center;justify-content:flex-start;gap:.25rem;width:100%;margin:0;padding:0;border:0;background:transparent;color:var(--sdc-text-muted, #6b7280);font:inherit;font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;text-align:left}.sdc-table-mobile-label--sortable{cursor:pointer}.sdc-table-mobile-label--sortable:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:3px;border-radius:.375rem}.sdc-table-mobile-label--loading{width:5.5rem;height:.625rem;border-radius:999px;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b824,#94a3b842,#94a3b824);background-size:200% 100%}.sdc-table-mobile-skeleton{min-height:1.25rem;border-radius:.25rem;animation:sdc-mobile-shimmer 1.8s ease infinite;background:linear-gradient(90deg,#94a3b81a,#94a3b82e,#94a3b81a);background-size:200% 100%}.sdc-table-mobile-value{display:flex;align-items:flex-start;width:100%}@media (max-width: 768px){.sdc-table-caption__search{width:100%}.sdc-table-paginator{justify-content:center!important;border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-mobile-field--sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-mobile-field--sortable:hover{background:#11182705}}@media (max-width: 540px){.sdc-table-mobile-list{border-radius:.375rem}.sdc-table-mobile-field{grid-template-columns:1fr;gap:.125rem;padding:.4375rem .875rem}.sdc-table-mobile-field:first-child{padding-top:.625rem}.sdc-table-mobile-field:last-child{padding-bottom:.625rem}}.sdc-table-expandable-list{display:flex;flex-direction:column;width:100%;list-style:none;margin:0;padding:0;border:1px solid var(--sdc-table-border-gray);border-radius:.5rem;overflow:hidden}.sdc-table-expandable-item{display:flex;flex-direction:column;background:var(--sdc-table-bg-card);border-top:1px solid var(--sdc-table-border-gray)}.sdc-table-expandable-item:first-child{border-top:0}.sdc-table-expandable-summary{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;cursor:pointer;-webkit-user-select:none;user-select:none}.sdc-table-expandable-summary--loading{pointer-events:none}.sdc-table-expandable-summary:hover{background:#11182705}.sdc-table-expandable-checkbox{flex:0 0 auto}.sdc-table-expandable-summary-fields{display:flex;flex:1 1 0;flex-wrap:wrap;gap:.125rem 1.5rem;min-width:0}.sdc-table-expandable-summary-field{display:flex;flex-direction:column;min-width:0}.sdc-table-expandable-summary-label{color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-table-expandable-summary-value{display:flex;align-items:center;min-width:0}.sdc-table-expandable-toggle{display:flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.75rem;height:1.75rem;padding:0;border:0;border-radius:50%;background:transparent;color:var(--sdc-text-muted, #6b7280);cursor:pointer;transition:color var(--sdc-table-transition-fast, .15s ease),background var(--sdc-table-transition-fast, .15s ease)}.sdc-table-expandable-toggle:focus-visible{outline:2px solid var(--sdc-tab-primary, #428bca);outline-offset:2px}.sdc-table-expandable-toggle:hover{color:var(--sdc-text-default, #111827);background:#1118270f}.sdc-table-expandable-chevron{display:flex;align-items:center;justify-content:center;font-size:.75rem;transition:transform .2s ease}.sdc-table-expandable-label-wrap,.sdc-table-expandable-value{min-width:0}.sdc-table-expandable-details{padding:.375rem 0;border-top:1px solid var(--sdc-table-border-gray);background:#11182704}.sdc-table-expandable-field{display:grid;grid-template-columns:minmax(0,7.5rem) minmax(0,1fr);gap:.25rem .75rem;align-items:start;padding:.375rem 1rem;border-top:1px solid rgba(0,0,0,.04)}.sdc-table-expandable-field--full-width{grid-template-columns:1fr;gap:.25rem}.sdc-table-expandable-field:first-child{border-top:0}.sdc-table-expandable-field--full-width>.sdc-table-expandable-label-wrap{display:none}.sdc-table-expandable-label{display:flex;align-items:center;color:var(--sdc-text-muted, #6b7280);font-size:.6875rem;font-weight:500;line-height:1.6;letter-spacing:.015em}.sdc-table-expandable-value{display:flex;align-items:flex-start;width:100%}.sdc-table-expandable-skeleton-primary{width:55%;max-width:10rem}.sdc-table-expandable-skeleton-secondary{width:35%;max-width:7rem}.sdc-table-expandable-chevron--open{transform:rotate(180deg)}.sdc-table-expandable-item--expanded .sdc-table-expandable-summary{background:#11182706}\n"] }]
|
|
695
645
|
}], propDecorators: { cols: [{
|
|
696
646
|
type: Input,
|
|
697
647
|
args: [{ required: true }]
|
|
@@ -728,4 +678,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
728
678
|
type: HostListener,
|
|
729
679
|
args: ['window:scroll']
|
|
730
680
|
}] } });
|
|
731
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixvQ0FBb0MsSUFBSSw4QkFBOEIsRUFDdEUseUNBQXlDLElBQUksbUNBQW1DLEVBQ2hGLG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELGdCQUFnQixJQUFJLFVBQVUsRUFDOUIsaUJBQWlCLElBQUksV0FBVyxFQUNoQyxxQ0FBcUMsRUFDdEMsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUkzRixPQUFPLEVBWUwsb0JBQW9CLEVBQ3JCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRC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S0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBY25CLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFJRixNQUFNO3NCQURULEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO2dCQTBCdEIsU0FBUztzQkFEWixLQUFLO2dCQVNJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFrSkcsZUFBZTtzQkFEeEIsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBTXBCLFdBQVc7c0JBRHBCLFlBQVk7dUJBQUMseUJBQXlCO2dCQXFCN0IsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHsgZ2V0Vmlld3BvcnRXaWR0aCwgaXNNb2JpbGVWaWV3cG9ydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvbGF5b3V0LnV0aWwnO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlRWxlbWVudHMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2ZvY3VzLnV0aWwnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUJMRV9PUFRJT05TLFxuICBUQUJMRV9DT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04gYXMgQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OLFxuICBUQUJMRV9ERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCBhcyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCxcbiAgVEFCTEVfREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFggYXMgREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XX0hFSUdIVF9QWCBhcyBERUZBVUxUX1JPV19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XU19QRVJfUEFHRSBhcyBERUZBVUxUX1JPV1NfUEVSX1BBR0UsXG4gIFRBQkxFX0lOREVYX1pFUk8gYXMgSU5ERVhfWkVSTyxcbiAgVEFCTEVfTUVOVV9HQVBfUFggYXMgTUVOVV9HQVBfUFgsXG4gIFRBQkxFX01PQklMRV9DQVJEX0VTVElNQVRFRF9IRUlHSFRfUFhcbn0gZnJvbSAnLi4vLi4vY29yZS9jb25zdGFudHMvdGFibGUuY29uc3QnO1xuaW1wb3J0IHsgREVGQVVMVF9MT0FESU5HX1NUQVRFX0lORElDQVRPUiB9IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2xvYWRpbmctc3RhdGUuY29uc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWdpbmF0b3JTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvcGFnaW5hdG9yLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBMb2FkaW5nU3RhdGVJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2xvYWRpbmctc3RhdGUudHlwZSc7XG5pbXBvcnQgeyB0eXBlIFNlYXJjaFRyaWdnZXJNb2RlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZWFyY2hib3gudHlwZSc7XG5pbXBvcnQge1xuICB0eXBlIEFjdGlvbk1lbnVJdGVtLFxuICB0eXBlIFJvd0Jhc2UsXG4gIHR5cGUgU29ydE9yZGVyLFxuICB0eXBlIFRhYmxlQWN0aW9uTWVudUl0ZW0gYXMgTmF0aXZlQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWcsXG4gIHR5cGUgVGFibGVDZWxsQ29uZmlnS2V5LFxuICB0eXBlIFRhYmxlQ29sdW1uLFxuICB0eXBlIFRhYmxlT3Blbk1lbnVTdGF0ZSBhcyBPcGVuTWVudVN0YXRlLFxuICB0eXBlIFRhYmxlT3B0aW9ucyxcbiAgdHlwZSBUYWJsZVNlYXJjaEV2ZW50LFxuICBUYWJsZU1lbnVGb2N1c1RhcmdldFxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3RhYmxlLnR5cGUnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaGJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2xvYWRpbmctc3RhdGUvbG9hZGluZy1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb25zTWVudUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hY3Rpb25zLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQ2VsbENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtY2VsbC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtc29ydC1pbmRpY2F0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IGJ1aWxkVGFibGVDZWxsQ29uZmlnTWFwLCBtZXJnZVRhYmxlT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvdGFibGUtY29uZmlnLnV0aWwnO1xuaW1wb3J0IHtcbiAgYnVpbGRSb3dDaGVja2JveElkLFxuICBmaWx0ZXJUYWJsZVJvd3MsXG4gIGdldE5lc3RlZFZhbHVlLFxuICByZXNvbHZlUm93SWRlbnRpdHlMYWJlbCxcbiAgcmVzb2x2ZVJvd1NlbGVjdGlvbktleVxufSBmcm9tICcuL3V0aWxzL3RhYmxlLWRhdGEudXRpbCc7XG5pbXBvcnQge1xuICBnZXRUYWJsZUNvbHVtbk1pbldpZHRoUHgsXG4gIGdldFRhYmxlTWluV2lkdGhQeCxcbiAgcmVzb2x2ZVRhYmxlQ29sdW1uQWxpZ25tZW50XG59IGZyb20gJy4vdXRpbHMvdGFibGUtbGF5b3V0LnV0aWwnO1xuXG5sZXQgdGFibGVJbnN0YW5jZVNlcXVlbmNlID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2RjLXRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBTZWFyY2hib3hDb21wb25lbnQsXG4gICAgUGFnaW5hdG9yQ29tcG9uZW50LFxuICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICBMb2FkaW5nU3RhdGVDb21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbXBvbmVudCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgVGFibGVTb3J0SW5kaWNhdG9yQ29tcG9uZW50LFxuICAgIFRhYmxlQ2VsbENvbnRlbnRDb21wb25lbnQsXG4gICAgVGFibGVBY3Rpb25zTWVudUNvbXBvbmVudCxcbiAgICBUb29sdGlwQ29tcG9uZW50XG4gIF0sXG4gIHN0eWxlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuc2NzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgUm93QmFzZSA9IFJvd0Jhc2U+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdGF0aWMgYWxsb2NhdGVUYWJsZUluc3RhbmNlSWQoKTogbnVtYmVyIHtcbiAgICBjb25zdCBuZXh0SWQgPSB0YWJsZUluc3RhbmNlU2VxdWVuY2U7XG4gICAgdGFibGVJbnN0YW5jZVNlcXVlbmNlICs9IDE7XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBfdGFibGVJbnN0YW5jZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhY3Rpb25zTWVudUlkU2VxdWVuY2UgPSAwO1xuXG4gIHByaXZhdGUgZ2V0IHRhYmxlSW5zdGFuY2VJZCgpOiBudW1iZXIge1xuICAgIHRoaXMuX3RhYmxlSW5zdGFuY2VJZCA/Pz0gVGFibGVDb21wb25lbnQuYWxsb2NhdGVUYWJsZUluc3RhbmNlSWQoKTtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbnN0YW5jZUlkO1xuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sc1NpZ25hbCA9IHNpZ25hbDxUYWJsZUNvbHVtbjxUPltdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNpZ25hbCA9IHNpZ25hbDxUW10+KFtdKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkaW5nU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cG9ydFdpZHRoU2lnbmFsID0gc2lnbmFsPG51bWJlcj4oZ2V0Vmlld3BvcnRXaWR0aCgpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NpZ25hbCA9IHNpZ25hbDxUYWJsZU9wdGlvbnM8VD4+KG1lcmdlVGFibGVPcHRpb25zKERFRkFVTFRfVEFCTEVfT1BUSU9OUyBhcyBUYWJsZU9wdGlvbnM8VD4pKTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBUYWJsZU9wdGlvbnM8VD4gPSBERUZBVUxUX1RBQkxFX09QVElPTlM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXRoUGFydHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByb3dDaGVja2JveElkQ2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3Blbk1lbnVTdGF0ZSA9IHNpZ25hbDxPcGVuTWVudVN0YXRlPFQ+IHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhcmlhTGFiZWxTaWduYWwgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBnbG9iYWxGaWx0ZXIgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0RmllbGQgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0T3JkZXIgPSBzaWduYWw8U29ydE9yZGVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3Rpb25TaWduYWwgPSBzaWduYWw8VFtdPihbXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBmaXJzdCA9IHNpZ25hbDxudW1iZXI+KElOREVYX1pFUk8pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm93cyA9IHNpZ25hbDxudW1iZXI+KERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc2V0IGNvbHModmFsdWU6IFRhYmxlQ29sdW1uPFQ+W10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5jb2xzU2lnbmFsLnNldCh2YWx1ZSA/PyBbXSk7XG4gIH1cblxuICBnZXQgY29scygpOiBUYWJsZUNvbHVtbjxUPltdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xzU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzZXQgZGF0YSh2YWx1ZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuZGF0YVNpZ25hbC5zZXQodmFsdWUgPz8gW10pO1xuICAgIHRoaXMucmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTtcbiAgICB0aGlzLmNsYW1wUGFnZSgpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgZ2V0IGRhdGEoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc2VsZWN0aW9uKHZhbHVlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25TaWduYWwuc2V0KHRoaXMubm9ybWFsaXplU2VsZWN0aW9uKHZhbHVlID8/IFtdKSk7XG4gIH1cblxuICBnZXQgc2VsZWN0aW9uKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoeyByZXF1aXJlZDogZmFsc2UgfSlcbiAgc2V0IGxvYWRpbmcodmFsdWU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5sb2FkaW5nU2lnbmFsLnNldCh2YWx1ZSA9PT0gdHJ1ZSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTaWduYWwoKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsb2FkaW5nSW5kaWNhdG9yOiBMb2FkaW5nU3RhdGVJbmRpY2F0b3IgPSBERUZBVUxUX0xPQURJTkdfU1RBVEVfSU5ESUNBVE9SO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiBmYWxzZSB9KVxuICBzZXQgY29uZmlnKHZhbHVlOiBUYWJsZU9wdGlvbnM8VD4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/IERFRkFVTFRfVEFCTEVfT1BUSU9OUztcblxuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG5leHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWcgPSBuZXh0O1xuICAgIHRoaXMuY29uZmlnU2lnbmFsLnNldChtZXJnZVRhYmxlT3B0aW9ucyhuZXh0KSk7XG5cbiAgICBjb25zdCBuZXh0Um93cyA9IHRoaXMuY29uZmlnU2lnbmFsKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuXG4gICAgdGhpcy5wYXRoUGFydHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucm93Q2hlY2tib3hJZENhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBzdHJpbmc+KCk7XG4gICAgdGhpcy5yZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpOiBUYWJsZU9wdGlvbnM8VD4ge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYXJpYUxhYmVsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFyaWFMYWJlbFNpZ25hbC5zZXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGFyaWFMYWJlbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpO1xuICB9XG5cbiAgQE91dHB1dCgpIGFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2x1bW46IFRhYmxlQ29sdW1uPFQ+OyByb3c6IFQ7IHZhbHVlOiB1bmtub3duIH0+KCk7XG4gIEBPdXRwdXQoKSByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIGxhenlMb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgZmlyc3Q6IG51bWJlcjtcbiAgICByb3dzOiBudW1iZXI7XG4gICAgc29ydEZpZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICBzb3J0T3JkZXI/OiBTb3J0T3JkZXI7XG4gICAgdHJpZ2dlcj86ICdwYWdlJyB8ICdzb3J0JyB8ICdzZWFyY2gnO1xuICAgIHNlYXJjaFRlcm0/OiBzdHJpbmc7XG4gIH0+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcblxuICBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTaWduYWwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zID0gY29tcHV0ZWQ8VGFibGVPcHRpb25zPFQ+PigoKSA9PiB0aGlzLmNvbmZpZ1NpZ25hbCgpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTW9iaWxlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNpdmUgPSB0aGlzLm9wdGlvbnMoKS50YWJsZT8ucmVzcG9uc2l2ZTtcbiAgICBpZiAocmVzcG9uc2l2ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGlzTW9iaWxlVmlld3BvcnQodGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsKCkpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1NlYXJjaCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8uc2hvdyA/PyBmYWxzZSk7XG4gIC8vIE9wdC1pbiBwb3IgdGFiZWxhIChkZWZhdWx0IGZhbHNlIC0gcHJlc2VydmEgYSBsYXJndXJhIGF0dWFsLCBtaW4oMTAwJSwgMjJyZW0pLCBwcmFcbiAgLy8gbsOjbyBhZmV0YXIgY29uc3VtaWRvcmVzIGV4aXN0ZW50ZXMpIC0gdmVyIHRhYmxlLmNvbXBvbmVudC5zY3NzLlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VhcmNoRnVsbFdpZHRoID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy5mdWxsV2lkdGggPz8gZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1BhZ2luYXRvciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnNob3cgPz8gZmFsc2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0luaXRpYWxMb2FkaW5nID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5sb2FkaW5nU2lnbmFsKCkgJiYgdGhpcy5kYXRhU2lnbmFsKCkubGVuZ3RoID09PSAwKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm93c1BlclBhZ2VPcHRpb25zID0gY29tcHV0ZWQ8bnVtYmVyW10+KCgpID0+IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlT3B0aW9ucyA/PyBbXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93Um93c1BlclBhZ2VTZWxlY3RvciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnNob3dSb3dzUGVyUGFnZVNlbGVjdG9yID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaFBsYWNlaG9sZGVyID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnBsYWNlaG9sZGVyID8/ICcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyaWdnZXJNb2RlID0gY29tcHV0ZWQ8U2VhcmNoVHJpZ2dlck1vZGU+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8udHlwZSA/PyAnYXV0bycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxSZWNvcmRzTGFiZWwgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy50b3RhbFJlY29yZHNMYWJlbCA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0VGV4dE92ZXJmbG93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LnRleHRPdmVyZmxvdyk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZU1vZGUgPSBjb21wdXRlZDwnbG9jYWwnIHwgJ2FwaSc+KCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy5tb2RlID8/ICdsb2NhbCcpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNBcGlNb2RlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy50YWJsZU1vZGUoKSA9PT0gJ2FwaScpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGaXRMYXlvdXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8ubGF5b3V0ID09PSAnZml0Jyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2JpbGVNb2RlID0gY29tcHV0ZWQ8J2V4cGFuZGFibGUnIHwgJ3N0YWNrZWQnPigoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8ubW9iaWxlTW9kZSA/PyAnZXhwYW5kYWJsZScpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhwYW5kZWRSb3dJbmRleCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1bW1hcnlDb2xzID0gY29tcHV0ZWQ8VGFibGVDb2x1bW48VD5bXT4oKCkgPT4ge1xuICAgIGNvbnN0IFNVTU1BUllfQ09MX0NPVU5UID0gMjtcbiAgICByZXR1cm4gdGhpcy5jb2xzU2lnbmFsKClcbiAgICAgIC5maWx0ZXIoY29sID0+IGNvbC50eXBlICE9PSBDT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04gJiYgY29sLnR5cGUgIT09ICdhY3Rpb25zJyAmJiBjb2wudHlwZSAhPT0gJ2J1dHRvbicpXG4gICAgICAuc2xpY2UoMCwgU1VNTUFSWV9DT0xfQ09VTlQpO1xuICB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoZWNrYm94Q29sID0gY29tcHV0ZWQ8VGFibGVDb2x1bW48VD4gfCBudWxsPigoKSA9PlxuICAgIHRoaXMuY29sc1NpZ25hbCgpLmZpbmQoY29sID0+IGNvbC50eXBlID09PSBDT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04pID8/IG51bGxcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5VGl0bGUgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLmVtcHR5Py50aXRsZSA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRleHQgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHRoaXMub3B0aW9ucygpLmVtcHR5Py50ZXh0ID8/ICcnKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2VsbHNDZmcgPSBjb21wdXRlZCgoKSA9PiBidWlsZFRhYmxlQ2VsbENvbmZpZ01hcCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJlZERhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcbiAgICBpZiAodGhpcy5pc0FwaU1vZGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVNpZ25hbCgpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJUYWJsZVJvd3ModGhpcy5kYXRhU2lnbmFsKCksIHRoaXMuY29sc1NpZ25hbCgpLCB0aGlzLmdsb2JhbEZpbHRlcigpLCB0aGlzLnJlc29sdmVWYWx1ZSk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzb3J0ZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkRGF0YSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5zb3J0RmllbGQoKTtcbiAgICBjb25zdCBvcmRlciA9IHRoaXMuc29ydE9yZGVyKCk7XG4gICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLmZpbHRlcmVkRGF0YSgpXTtcblxuICAgIGlmICghZmllbGQgfHwgb3JkZXIgPT09IDApIHtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzLnNvcnQoKGxlZnRSb3csIHJpZ2h0Um93KSA9PiB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSB0aGlzLnJlc29sdmVWYWx1ZShsZWZ0Um93LCBmaWVsZCk7XG4gICAgICBjb25zdCByaWdodFZhbHVlID0gdGhpcy5yZXNvbHZlVmFsdWUocmlnaHRSb3csIGZpZWxkKTtcblxuICAgICAgaWYgKGxlZnRWYWx1ZSA9PSBudWxsICYmIHJpZ2h0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGxlZnRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAtb3JkZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChyaWdodFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9yZGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGxlZnRWYWx1ZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHJpZ2h0VmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiAobGVmdFZhbHVlIC0gcmlnaHRWYWx1ZSkgKiBvcmRlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMudG9Db21wYXJhYmxlVGV4dChsZWZ0VmFsdWUpLmxvY2FsZUNvbXBhcmUodGhpcy50b0NvbXBhcmFibGVUZXh0KHJpZ2h0VmFsdWUpKSAqIG9yZGVyO1xuICAgIH0pO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxSZWNvcmRzID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaVRvdGFsID0gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8udG90YWxSZWNvcmRzO1xuXG4gICAgaWYgKHR5cGVvZiBhcGlUb3RhbCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGFwaVRvdGFsKSAmJiBhcGlUb3RhbCA+PSAwKSB7XG4gICAgICByZXR1cm4gTWF0aC50cnVuYyhhcGlUb3RhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc29ydGVkRGF0YSgpLmxlbmd0aDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZ2VEYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnNob3dQYWdpbmF0b3IoKSB8fCB0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0KCk7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnJvd3MoKTtcbiAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpbml0aWFsTG9hZGluZ1Jvd3MgPSBjb21wdXRlZDxudW1iZXJbXT4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3NGcm9tU3RhdGUgPSB0aGlzLnJvd3MoKTtcbiAgICBjb25zdCByb3dzRnJvbUNvbmZpZyA9IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICBjb25zdCBub3JtYWxpemVkUm93cyA9IE51bWJlcihyb3dzRnJvbVN0YXRlIHx8IHJvd3NGcm9tQ29uZmlnIHx8IERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG4gICAgY29uc3Qgc2FmZVJvd3MgPSBOdW1iZXIuaXNGaW5pdGUobm9ybWFsaXplZFJvd3MpICYmIG5vcm1hbGl6ZWRSb3dzID4gMCA/IG5vcm1hbGl6ZWRSb3dzIDogREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHNhZmVSb3dzIH0sIChfLCBpbmRleCkgPT4gaW5kZXgpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0aW9uU2V0ID0gY29tcHV0ZWQ8U2V0PFQ+PigoKSA9PiBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYm9keVZpZXdwb3J0SGVpZ2h0UHggPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICBjb25zdCByb3dzRnJvbVN0YXRlID0gdGhpcy5yb3dzKCk7XG4gICAgY29uc3Qgcm93c0Zyb21Db25maWcgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJvd3MgPSBOdW1iZXIocm93c0Zyb21TdGF0ZSB8fCByb3dzRnJvbUNvbmZpZyB8fCBERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuICAgIGNvbnN0IHNhZmVSb3dzID0gTnVtYmVyLmlzRmluaXRlKG5vcm1hbGl6ZWRSb3dzKSAmJiBub3JtYWxpemVkUm93cyA+IDAgPyBub3JtYWxpemVkUm93cyA6IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcblxuICAgIGNvbnN0IHJvd0hlaWdodCA9IHRoaXMuaXNNb2JpbGUoKSA/IFRBQkxFX01PQklMRV9DQVJEX0VTVElNQVRFRF9IRUlHSFRfUFggOiBERUZBVUxUX1JPV19IRUlHSFRfUFg7XG4gICAgY29uc3QgZXN0aW1hdGVkSGVpZ2h0ID0gc2FmZVJvd3MgKiByb3dIZWlnaHQgKyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWDtcblxuICAgIHJldHVybiBNYXRoLm1heChERUZBVUxUX01JTl9MT0FESU5HX0hFSUdIVF9QWCwgZXN0aW1hdGVkSGVpZ2h0KTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5Qm9keUhlaWdodFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB0aGlzLmJvZHlWaWV3cG9ydEhlaWdodFB4KCkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFibGVNaW5XaWR0aFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiBnZXRUYWJsZU1pbldpZHRoUHgodGhpcy5jb2xzU2lnbmFsKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZVZhbHVlID0gKG9iajogVCwgcGF0aD86IHN0cmluZyk6IHVua25vd24gPT5cbiAgICBnZXROZXN0ZWRWYWx1ZShvYmosIHBhdGgsIHRoaXMucGF0aFBhcnRzQ2FjaGUpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgcHJvdGVjdGVkIG9uRG9jdW1lbnRDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgcHJvdGVjdGVkIG9uRXNjYXBlS2V5KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudShUYWJsZU1lbnVGb2N1c1RhcmdldC5UcmlnZ2VyKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLmZsb29yKGVudHJpZXNbMF0/LmNvbnRlbnRSZWN0LndpZHRoID8/IDApO1xuICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICB0aGlzLnZpZXdwb3J0V2lkdGhTaWduYWwuc2V0KHdpZHRoKTtcbiAgICAgICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBwcm90ZWN0ZWQgb25XaW5kb3dTY3JvbGwoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZWFyY2hUZXJtKGV2ZW50T3JWYWx1ZTogVGFibGVTZWFyY2hFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRlcm0gPSB0eXBlb2YgZXZlbnRPclZhbHVlID09PSAnc3RyaW5nJyA/IGV2ZW50T3JWYWx1ZSA6IGV2ZW50T3JWYWx1ZT8uZGV0YWlsID8/ICcnO1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVyLnNldChTdHJpbmcodGVybSkpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuXG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHRoaXMuZW1pdExhenlMb2FkKCdzZWFyY2gnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoJycpO1xuICAgIHRoaXMuZmlyc3Quc2V0KElOREVYX1pFUk8pO1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuXG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHRoaXMuZW1pdExhenlMb2FkKCdzZWFyY2gnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlU29ydChmaWVsZDogc3RyaW5nLCBlbmFibGVkID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghZW5hYmxlZCB8fCAhZmllbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gZmllbGQpIHtcbiAgICAgIHRoaXMuc29ydEZpZWxkLnNldChmaWVsZCk7XG4gICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRPcmRlciA9IHRoaXMuc29ydE9yZGVyKCk7XG5cbiAgICAgIGlmIChjdXJyZW50T3JkZXIgPT09IDEpIHtcbiAgICAgICAgdGhpcy5zb3J0T3JkZXIuc2V0KC0xKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudE9yZGVyID09PSAtMSkge1xuICAgICAgICB0aGlzLnNvcnRPcmRlci5zZXQoMCk7XG4gICAgICAgIHRoaXMuc29ydEZpZWxkLnNldChudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydE9yZGVyLnNldCgxKTtcbiAgICAgICAgdGhpcy5zb3J0RmllbGQuc2V0KGZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICBpZiAodGhpcy5pc0FwaU1vZGUoKSkge1xuICAgICAgdGhpcy5lbWl0TGF6eUxvYWQoJ3NvcnQnKTtcbiAgICB9XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U29ydEFyaWFBdHRyaWJ1dGUoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbC5zb3J0YWJsZSA9PT0gZmFsc2UgfHwgIWNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb3J0RmllbGQoKSAhPT0gY29sLmZpZWxkKSB7XG4gICAgICByZXR1cm4gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zb3J0T3JkZXIoKTtcblxuICAgIGlmIChvcmRlciA9PT0gMSkge1xuICAgICAgcmV0dXJuICdhc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIGlmIChvcmRlciA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAnZGVzY2VuZGluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdub25lJztcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5BbGlnbkNsYXNzKGNvbDogVGFibGVDb2x1bW48VD4sIHRhcmdldDogJ2NlbGwnIHwgJ2hlYWRlcicgPSAnY2VsbCcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsaWduID0gcmVzb2x2ZVRhYmxlQ29sdW1uQWxpZ25tZW50KGNvbCwgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0ID09PSAnaGVhZGVyJ1xuICAgICAgPyBgc2RjLXRhYmxlLXRoLWFsaWduLSR7YWxpZ259YFxuICAgICAgOiBgc2RjLXRhYmxlLXRkLWFsaWduLSR7YWxpZ259YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1NvcnRhYmxlQ29sdW1uKGNvbDogVGFibGVDb2x1bW48VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sLnR5cGUgIT09IENPTFVNTl9UWVBFX0NIRUNLQk9YX1NFTEVDVElPTiAmJiBjb2wuc29ydGFibGUgIT09IGZhbHNlICYmICEhY29sLmZpZWxkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhc0RhdGFSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTaWduYWwoKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhblNvcnRDb2x1bW4oY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RhdGFSb3dzKCkgJiYgdGhpcy5pc1NvcnRhYmxlQ29sdW1uKGNvbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29sdW1uTWluV2lkdGhQeChjb2w6IFRhYmxlQ29sdW1uPFQ+KTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4KGNvbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29sV2lkdGhTdHlsZShjb2w6IFRhYmxlQ29sdW1uPFQ+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5pc0ZpdExheW91dCgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBjb2wud2lkdGggIT0gbnVsbCA/IGAke2NvbC53aWR0aH0lYCA6IGAke2dldFRhYmxlQ29sdW1uTWluV2lkdGhQeChjb2wpfXB4YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBtb2JpbGVGaWVsZExhYmVsKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcge1xuICAgIGlmIChjb2wuaGVhZGVyKSB7XG4gICAgICByZXR1cm4gY29sLmhlYWRlcjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbC50eXBlKSB7XG4gICAgICBjYXNlICdhY3Rpb25zJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNDZmcoKS5hY3Rpb25zLmJ1dHRvbkxhYmVsIHx8ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X2FjdGlvbnNfbWVudSc7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gdGhpcy5jZWxsc0NmZygpLmJ1dHRvbi5sYWJlbFxuICAgICAgICAgIHx8IHRoaXMuY2VsbHNDZmcoKS5idXR0b24udG9vbHRpcFxuICAgICAgICAgIHx8ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X2FjdGlvbl9idXR0b24nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVFeHBhbmRSb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRSb3dJbmRleC5zZXQodGhpcy5leHBhbmRlZFJvd0luZGV4KCkgPT09IGluZGV4ID8gbnVsbCA6IGluZGV4KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jvd0V4cGFuZGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZFJvd0luZGV4KCkgPT09IGluZGV4O1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUGFnZUNoYW5nZShldmVudDogUGFnaW5hdG9yU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0Rmlyc3QgPSBldmVudC5maXJzdCA/PyBJTkRFWF9aRVJPO1xuICAgIGNvbnN0IG5leHRSb3dzID0gZXZlbnQucm93cyA/PyB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZSA/PyBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICB0aGlzLmZpcnN0LnNldChuZXh0Rmlyc3QpO1xuICAgIHRoaXMucm93cy5zZXQobmV4dFJvd3MpO1xuICAgIHRoaXMuZXhwYW5kZWRSb3dJbmRleC5zZXQobnVsbCk7XG4gICAgdGhpcy5lbWl0TGF6eUxvYWQoJ3BhZ2UnKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIC8vIFNlbXByZSBlbWl0ZSBgcm93Q2xpY2tgIChjb21wb3J0YW1lbnRvIHByw6ktZXhpc3RlbnRlKTsgYWzDqW0gZGlzc28sIGFsdGVybmEgYSBzZWxlw6fDo29cbiAgLy8gZGEgbGluaGEgcXVhbmRvIGBjZWxscy5jaGVja2JveC5zZWxlY3RPblJvd0NsaWNrYCBlc3TDoSBoYWJpbGl0YWRvIGUgYSBsaW5oYSB0ZW0gdW1hXG4gIC8vIGNvbHVuYSBkZSBzZWxlw6fDo28gKGNoZWNrYm94Q29sKS4gTyBwcsOzcHJpbyBpbnB1dCBkbyBjaGVja2JveCBmYXogc3RvcFByb3BhZ2F0aW9uIG5vXG4gIC8vIGNsaWNrICh2ZXIgdGFibGUtY2VsbC1jb250ZW50LmNvbXBvbmVudC5odG1sKSwgZW50w6NvIGVzc2UgaGFuZGxlciBzw7MgZGlzcGFyYSBwYXJhXG4gIC8vIGNsaXF1ZXMgZm9yYSBkbyBjaGVja2JveCAtIHNlbSB0b2dnbGUgZHVwbGljYWRvLlxuICBwcm90ZWN0ZWQgb25Sb3dDbGlja2VkKHJvdzogVCk6IHZvaWQge1xuICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuXG4gICAgaWYgKCF0aGlzLmNoZWNrYm94Q29sKCkgfHwgIXRoaXMuY2VsbHNDZmcoKS5jaGVja2JveC5zZWxlY3RPblJvd0NsaWNrIHx8IHRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vblRvZ2dsZVJvdyhyb3csICF0aGlzLmlzUm93U2VsZWN0ZWQocm93KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Ub2dnbGVSb3cocm93OiBULCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFNlbGVjdGlvbiA9IG5ldyBTZXQodGhpcy5zZWxlY3Rpb25TZXQoKSk7XG5cbiAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgbmV4dFNlbGVjdGlvbi5hZGQocm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFNlbGVjdGlvbi5kZWxldGUocm93KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jvd1NlbGVjdGVkKHJvdzogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNldCgpLmhhcyhyb3cpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93OiBUKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGlzYWJsZWQgPSB0aGlzLmNlbGxzQ2ZnKCkuY2hlY2tib3guZGlzYWJsZWQ7XG5cbiAgICBpZiAodHlwZW9mIGRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZGlzYWJsZWQocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzYWJsZWQgPT09IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlU2VsZWN0UGFnZShjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dFNlbGVjdGlvbiA9IG5ldyBTZXQodGhpcy5zZWxlY3Rpb25TZXQoKSk7XG5cbiAgICB0aGlzLnNlbGVjdGFibGVQYWdlUm93cygpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgbmV4dFNlbGVjdGlvbi5hZGQocm93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRTZWxlY3Rpb24uZGVsZXRlKHJvdyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1BhZ2VGdWxseVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZpc2libGVSb3dzID0gdGhpcy5zZWxlY3RhYmxlUGFnZVJvd3MoKTtcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIHJldHVybiB2aXNpYmxlUm93cy5ldmVyeSgocm93KSA9PiBzZWxlY3RlZFJvd3MuaGFzKHJvdykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzUGFnZVBhcnRpYWxseVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZpc2libGVSb3dzID0gdGhpcy5zZWxlY3RhYmxlUGFnZVJvd3MoKTtcblxuICAgIGlmICh2aXNpYmxlUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGlvblNldCgpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSB2aXNpYmxlUm93cy5maWx0ZXIoKHJvdykgPT4gc2VsZWN0ZWRSb3dzLmhhcyhyb3cpKS5sZW5ndGg7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0ZWRDb3VudCA8IHZpc2libGVSb3dzLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYXNTZWxlY3RhYmxlUGFnZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZVBhZ2VSb3dzKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQYWdlU2VsZWN0aW9uQXJpYUNoZWNrZWQoKTogJ2ZhbHNlJyB8ICdtaXhlZCcgfCAndHJ1ZScge1xuICAgIGlmICh0aGlzLmlzUGFnZVBhcnRpYWxseVNlbGVjdGVkKCkpIHtcbiAgICAgIHJldHVybiAnbWl4ZWQnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzUGFnZUZ1bGx5U2VsZWN0ZWQoKSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2hlY2tlZFZhbHVlKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Um93Q2hlY2tib3hJZChyb3c6IFQpOiBzdHJpbmcge1xuICAgIGlmICghcm93IHx8IHR5cGVvZiByb3cgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gYnVpbGRSb3dDaGVja2JveElkKHJvdyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yb3dDaGVja2JveElkQ2FjaGUuZ2V0KHJvdyk7XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRJZCA9IGJ1aWxkUm93Q2hlY2tib3hJZChyb3cpO1xuICAgIHRoaXMucm93Q2hlY2tib3hJZENhY2hlLnNldChyb3csIG5leHRJZCk7XG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSb3dDaGVja2JveExhYmVsKHJvdzogVCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVSb3dJZGVudGl0eUxhYmVsKHJvdyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2VsZWN0QWxsQ2hlY2tib3hJZChjb2x1bW5JbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHNkYy10YWJsZS0ke3RoaXMudGFibGVJbnN0YW5jZUlkfS1zZWxlY3QtYWxsLWNoZWNrYm94LSR7Y29sdW1uSW5kZXh9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0YWJsZUFyaWFMYWJlbEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbFNpZ25hbCgpID8/ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3RhYmxlX2Rlc2NyaXB0aW9uJztcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVBY3Rpb25zTWVudShldmVudDogRXZlbnQsIHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgdHJpZ2dlckVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5pc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkpIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnNPcHRpb25zID0gdGhpcy5jZWxsQ2ZnKCdhY3Rpb25zJyk7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmFjdGlvbkl0ZW1zRm9yKHJvdywgYWN0aW9uc09wdGlvbnMpO1xuICAgIGNvbnN0IHJlY3QgPSB0cmlnZ2VyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtZW51SWQgPSB0aGlzLm5leHRBY3Rpb25zTWVudUlkKCk7XG5cbiAgICB0aGlzLm9wZW5NZW51U3RhdGUuc2V0KHtcbiAgICAgIHJvdyxcbiAgICAgIGNvbCxcbiAgICAgIGl0ZW1zLFxuICAgICAgbWVudUlkLFxuICAgICAgY2xvc2VPbkNsaWNrOiBhY3Rpb25zT3B0aW9ucz8uY2xvc2VPbkNsaWNrICE9PSBmYWxzZSxcbiAgICAgIHRyaWdnZXI6IHRyaWdnZXJFbGVtZW50LFxuICAgICAgdG9wOiByZWN0LmJvdHRvbSArIE1FTlVfR0FQX1BYLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbG9zZUFjdGlvbnNNZW51KGZvY3VzVGFyZ2V0OiBUYWJsZU1lbnVGb2N1c1RhcmdldCA9IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5vbmUpOiB2b2lkIHtcbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG4gICAgdGhpcy5vcGVuTWVudVN0YXRlLnNldChudWxsKTtcblxuICAgIGlmICghbWVudSB8fCBmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuTm9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZm9jdXNDbG9zZWRNZW51VGFyZ2V0KG1lbnUudHJpZ2dlciwgbWVudS5tZW51SWQsIGZvY3VzVGFyZ2V0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNBY3Rpb25zTWVudU9wZW4ocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnUucm93ID09PSByb3cgJiYgbWVudS5jb2wgPT09IGNvbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY3Rpb25JdGVtc0Zvcihyb3c6IFQsIG9wdGlvbnM6IFRhYmxlQ2VsbENvbmZpZzxULCAnYWN0aW9ucyc+KTogTmF0aXZlQWN0aW9uTWVudUl0ZW1bXSB7XG4gICAgY29uc3QgaXRlbXMgPSBvcHRpb25zLml0ZW1zID8/IFtdO1xuXG4gICAgcmV0dXJuIGl0ZW1zLm1hcCgoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4pID0+ICh7XG4gICAgICBrZXk6IGl0ZW0ua2V5LFxuICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICBpY29uOiBpdGVtLmljb24sXG4gICAgICBkaXNhYmxlZDogdGhpcy5yZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbSwgcm93KVxuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblBvcnRhbEFjdGlvbkNsaWNrKGl0ZW06IE5hdGl2ZUFjdGlvbk1lbnVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGl0ZW0uZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtZW51ID0gdGhpcy5vcGVuTWVudVN0YXRlKCk7XG5cbiAgICBpZiAoIW1lbnUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQWN0aW9uU2VsZWN0KG1lbnUucm93LCBtZW51LmNvbCwgaXRlbSk7XG5cbiAgICBpZiAobWVudS5jbG9zZU9uQ2xpY2spIHtcbiAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1lbnVDbG9zZShldmVudDogVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudShldmVudC5mb2N1c1RhcmdldCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25BY3Rpb25TZWxlY3Qocm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+LCBpdGVtOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBpY29uPzogc3RyaW5nOyBkaXNhYmxlZD86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2wuYWN0aW9uRmllbGQgPz8gY29sLmZpZWxkO1xuICAgIGNvbnN0IHJvd1ZhbHVlID0gZmllbGRLZXkgPyB0aGlzLnJlc29sdmVWYWx1ZShyb3csIGZpZWxkS2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCBjb2x1bW46IGNvbCwgdmFsdWU6IHsgcm93VmFsdWUsIGFjdGlvbjogaXRlbSB9IH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQnV0dG9uQ2xpY2socm93OiBULCBjb2w6IFRhYmxlQ29sdW1uPFQ+KTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gY29sLmFjdGlvbkZpZWxkID8/IGNvbC5maWVsZDtcbiAgICBjb25zdCB2YWx1ZSA9IGtleSA/IHRoaXMucmVzb2x2ZVZhbHVlKHJvdywga2V5KSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgcm93LCB2YWx1ZSwgY29sdW1uOiBjb2wgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUNlbGxJZChjb2w6IFRhYmxlQ29sdW1uPFQ+LCByb3c6IFQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIWNvbC5jZWxsSWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlb2YgY29sLmNlbGxJZCA9PT0gJ2Z1bmN0aW9uJyA/IChjb2wuY2VsbElkKHJvdykgfHwgbnVsbCkgOiAoY29sLmNlbGxJZCB8fCBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgY2VsbENmZzxLIGV4dGVuZHMgVGFibGVDZWxsQ29uZmlnS2V5PihraW5kOiBLKSB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHNDZmcoKVtraW5kXTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdExhenlMb2FkKHRyaWdnZXI6ICdwYWdlJyB8ICdzb3J0JyB8ICdzZWFyY2gnKTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZDoge1xuICAgICAgZmlyc3Q6IG51bWJlcjtcbiAgICAgIHJvd3M6IG51bWJlcjtcbiAgICAgIHNvcnRGaWVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgICBzb3J0T3JkZXI/OiBTb3J0T3JkZXI7XG4gICAgICB0cmlnZ2VyPzogJ3BhZ2UnIHwgJ3NvcnQnIHwgJ3NlYXJjaCc7XG4gICAgICBzZWFyY2hUZXJtPzogc3RyaW5nO1xuICAgIH0gPSB7XG4gICAgICBmaXJzdDogdGhpcy5maXJzdCgpLFxuICAgICAgcm93czogdGhpcy5yb3dzKCksXG4gICAgICBzb3J0RmllbGQ6IHRoaXMuc29ydEZpZWxkKCksXG4gICAgICBzb3J0T3JkZXI6IHRoaXMuc29ydE9yZGVyKCksXG4gICAgICB0cmlnZ2VyXG4gICAgfTtcblxuICAgIGlmICh0cmlnZ2VyID09PSAnc2VhcmNoJykge1xuICAgICAgcGF5bG9hZC5zZWFyY2hUZXJtID0gdGhpcy5nbG9iYWxGaWx0ZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhenlMb2FkLmVtaXQocGF5bG9hZCk7XG4gIH1cblxuICBwcml2YXRlIGNsYW1wUGFnZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4Rmlyc3QgPSBNYXRoLm1heChJTkRFWF9aRVJPLCB0aGlzLnRvdGFsUmVjb3JkcygpIC0gdGhpcy5yb3dzKCkpO1xuXG4gICAgaWYgKHRoaXMuZmlyc3QoKSA+IG1heEZpcnN0KSB7XG4gICAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB9XG4gIH1cblxuICAvLyBOT1RFOiBpbiBgYXBpYCBtb2RlIChgY29uZmlnLnRhYmxlLm1vZGUgPT09ICdhcGknYCwgdXNlZCBieSBjb25zdW1lcnMgbGlrZSBzZGMtbG9va3VwIHRoYXRcbiAgLy8gZmV0Y2ggZWFjaCBwYWdlIGV4dGVybmFsbHkpLCBgZGF0YWAgaXMgc3dhcHBlZCBlbnRpcmVseSBvbiBldmVyeSBwYWdlL3NlYXJjaCBjaGFuZ2UgYW5kXG4gIC8vIG9ubHkgZXZlciByZXByZXNlbnRzIE9ORSBwYWdlJ3Mgd29ydGggb2Ygcm93cy4gUHJldmlvdXNseSwgYW55IHNlbGVjdGVkIHJvdyBub3QgZm91bmQgaW5cbiAgLy8gdGhlIGN1cnJlbnQgYGRhdGFgIGFycmF5IHdhcyB0cmVhdGVkIGFzIFwibm8gbG9uZ2VyIGV4aXN0c1wiIGFuZCBzaWxlbnRseSBkcm9wcGVkIOKAlCB3aGljaFxuICAvLyB3aXBlZCBvdXQgY3Jvc3MtcGFnZSBzZWxlY3Rpb25zIHRoZSBtb21lbnQgdGhlIHVzZXIgbmF2aWdhdGVkIHRvIGFub3RoZXIgcGFnZS4gSW4gYGFwaWBcbiAgLy8gbW9kZSB3ZSBub3cgcHJlc2VydmUgc2VsZWN0aW9ucyBmb3Igcm93cyBub3QgcHJlc2VudCBvbiB0aGUgY3VycmVudCBwYWdlLiBJbiBgbG9jYWxgIG1vZGUsXG4gIC8vIGBkYXRhYCBpcyBleHBlY3RlZCB0byByZXByZXNlbnQgdGhlIGZ1bGwvY3VycmVudCBkYXRhc2V0LCBzbyB0aGUgb3JpZ2luYWwgXCJkcm9wIHdoYXQncyBub3RcbiAgLy8gdGhlcmVcIiBiZWhhdmlvciBpcyBrZXB0IChhIGNvbnN1bWVyIHN3YXBwaW5nIHRvIGEgZ2VudWluZWx5IGRpZmZlcmVudCBkYXRhc2V0IHNob3VsZCBzdGlsbFxuICAvLyBjbGVhciBzdGFsZSBzZWxlY3Rpb25zKS5cbiAgcHJpdmF0ZSByZWNvbmNpbGVTZWxlY3Rpb25XaXRoRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBpc0FwaU1vZGUgPSB0aGlzLmlzQXBpTW9kZSgpO1xuICAgIGNvbnN0IHJvd3NCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5kYXRhU2lnbmFsKCkpIHtcbiAgICAgIGNvbnN0IHJvd0tleSA9IHRoaXMuZ2V0U2VsZWN0aW9uS2V5KHJvdyk7XG5cbiAgICAgIGlmICghcm93c0J5S2V5Lmhhcyhyb3dLZXkpKSB7XG4gICAgICAgIHJvd3NCeUtleS5zZXQocm93S2V5LCByb3cpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgbmV4dFNlbGVjdGlvbjogVFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnNlbGVjdGlvblNpZ25hbCgpKSB7XG4gICAgICBjb25zdCByb3dLZXkgPSB0aGlzLmdldFNlbGVjdGlvbktleShyb3cpO1xuXG4gICAgICBpZiAoIXNlZW5LZXlzLmhhcyhyb3dLZXkpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlUm93ID0gcm93c0J5S2V5LmdldChyb3dLZXkpO1xuICAgICAgICBjb25zdCBrZWVwUm93ID0gY3VycmVudFBhZ2VSb3cgPyAhdGhpcy5pc1Jvd1NlbGVjdGlvbkRpc2FibGVkKGN1cnJlbnRQYWdlUm93KSA6IGlzQXBpTW9kZTtcblxuICAgICAgICBpZiAoa2VlcFJvdykge1xuICAgICAgICAgIHNlZW5LZXlzLmFkZChyb3dLZXkpO1xuICAgICAgICAgIG5leHRTZWxlY3Rpb24ucHVzaChjdXJyZW50UGFnZVJvdyA/PyByb3cpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVBY3Rpb25EaXNhYmxlZChpdGVtOiBBY3Rpb25NZW51SXRlbTxUPiwgcm93OiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBpdGVtLmRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlbS5kaXNhYmxlZChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtLmRpc2FibGVkID09PSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RhYmxlUGFnZVJvd3MoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlRGF0YSgpLmZpbHRlcigocm93KSA9PiAhdGhpcy5pc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdykpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbjogSXRlcmFibGU8VD4pOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2VsZWN0aW9uID0gdGhpcy5ub3JtYWxpemVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbik7XG5cbiAgICBpZiAodGhpcy5oYXNTYW1lU2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uU2lnbmFsKCksIG5vcm1hbGl6ZWRTZWxlY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb25TaWduYWwuc2V0KG5vcm1hbGl6ZWRTZWxlY3Rpb24pO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoWy4uLm5vcm1hbGl6ZWRTZWxlY3Rpb25dKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplU2VsZWN0aW9uKG5leHRTZWxlY3Rpb246IEl0ZXJhYmxlPFQ+KTogVFtdIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2VsZWN0aW9uOiBUW10gPSBbXTtcbiAgICBjb25zdCBzZWVuUm93cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgbmV4dFNlbGVjdGlvbikge1xuICAgICAgY29uc3Qgcm93S2V5ID0gdGhpcy5nZXRTZWxlY3Rpb25LZXkocm93KTtcblxuICAgICAgY29uc3Qgc2hvdWxkQXBwZW5kID0gIXNlZW5Sb3dzLmhhcyhyb3dLZXkpICYmICF0aGlzLmlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KTtcblxuICAgICAgaWYgKHNob3VsZEFwcGVuZCkge1xuICAgICAgICBzZWVuUm93cy5hZGQocm93S2V5KTtcbiAgICAgICAgbm9ybWFsaXplZFNlbGVjdGlvbi5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRTZWxlY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGlvbktleShyb3c6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlUm93U2VsZWN0aW9uS2V5KHJvdyk7XG4gIH1cblxuICBwcml2YXRlIGhhc1NhbWVTZWxlY3Rpb24oY3VycmVudFNlbGVjdGlvbjogVFtdLCBuZXh0U2VsZWN0aW9uOiBUW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbi5sZW5ndGggPT09IG5leHRTZWxlY3Rpb24ubGVuZ3RoXG4gICAgICAmJiBjdXJyZW50U2VsZWN0aW9uLmV2ZXJ5KChyb3csIGluZGV4KSA9PiByb3cgPT09IG5leHRTZWxlY3Rpb25baW5kZXhdKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9Db21wYXJhYmxlVGV4dCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIG5leHRBY3Rpb25zTWVudUlkKCk6IHN0cmluZyB7XG4gICAgdGhpcy5hY3Rpb25zTWVudUlkU2VxdWVuY2UgKz0gMTtcbiAgICByZXR1cm4gYHNkYy10YWJsZS1hY3Rpb25zLW1lbnUtJHt0aGlzLmFjdGlvbnNNZW51SWRTZXF1ZW5jZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0Nsb3NlZE1lbnVUYXJnZXQoXG4gICAgdHJpZ2dlcjogSFRNTEVsZW1lbnQsXG4gICAgbWVudUlkOiBzdHJpbmcsXG4gICAgZm9jdXNUYXJnZXQ6IFRhYmxlTWVudUZvY3VzVGFyZ2V0XG4gICk6IHZvaWQge1xuICAgIGlmICghdHJpZ2dlci5pc0Nvbm5lY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuVHJpZ2dlcikge1xuICAgICAgdHJpZ2dlci5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSB0cmlnZ2VyLm93bmVyRG9jdW1lbnQ7XG4gICAgY29uc3QgbWVudUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1lbnVJZCk7XG4gICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBnZXRGb2N1c2FibGVFbGVtZW50cyhvd25lckRvY3VtZW50KS5maWx0ZXIoKGVsZW1lbnQpID0+ICFtZW51RWxlbWVudD8uY29udGFpbnMoZWxlbWVudCkpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2YodHJpZ2dlcik7XG5cbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gZm9jdXNUYXJnZXQgPT09IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5leHQgPyBjdXJyZW50SW5kZXggKyAxIDogY3VycmVudEluZGV4IC0gMTtcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzW3RhcmdldEluZGV4XTtcblxuICAgIG5leHRFbGVtZW50Py5mb2N1cygpO1xuICB9XG59XG4iLCI8c2VjdGlvblxuICBjbGFzcz1cInNkYy10YWJsZVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtc3RhY2tdPVwiaXNNb2JpbGUoKVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtZmlsdGVyZWRdPVwiISFnbG9iYWxGaWx0ZXIoKS50cmltKClcIlxuICBbY2xhc3Muc2RjLXRhYmxlLS1sb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWluaXRpYWwtbG9hZGluZ109XCJzaG93SW5pdGlhbExvYWRpbmcoKVwiXG4+XG4gIDxzZGMtbG9hZGluZy1zdGF0ZVxuICAgIGNsYXNzPVwic2RjLXRhYmxlLWxvYWRpbmctd3JhcFwiXG4gICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgICBbYmxvY2tXaW5kb3ddPVwiZmFsc2VcIlxuICAgIFtibG9ja0RlbGF5TXNdPVwiMFwiXG4gICAgW2luZGljYXRvcl09XCJsb2FkaW5nSW5kaWNhdG9yXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtc2hlbGxcIiBbc3R5bGUuLS1zZGMtdGFibGUtYm9keS1oZWlnaHQucHhdPVwiYm9keVZpZXdwb3J0SGVpZ2h0UHgoKVwiPlxuICAgICAgQGlmIChzaG93U2VhcmNoKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1jYXB0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1jYXB0aW9uX19zZWFyY2hcIiBbY2xhc3Muc2RjLXRhYmxlLWNhcHRpb25fX3NlYXJjaC0tZnVsbC13aWR0aF09XCJzZWFyY2hGdWxsV2lkdGgoKVwiPlxuICAgICAgICAgICAgPHNkYy1zZWFyY2hib3hcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgICAgW3RyaWdnZXJNb2RlXT1cInRyaWdnZXJNb2RlKClcIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25TZWFyY2hUZXJtKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkNsZWFyU2VhcmNoKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlYXJjaF9maWVsZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoIWlzTW9iaWxlKCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXNjcm9sbFwiXG4gICAgICAgICAgW3N0eWxlLi0tc2RjLXRhYmxlLW1pbi13aWR0aF09XCJpc0ZpdExheW91dCgpID8gJzEwMCUnIDogdGFibGVNaW5XaWR0aFB4KCkgKyAncHgnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0YWJsZVxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZ3JpZFwiXG4gICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWdyaWQtLWZpdF09XCJpc0ZpdExheW91dCgpXCJcbiAgICAgICAgICAgIHJvbGU9XCJ0YWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3djb3VudF09XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Y29sZ3JvdXA+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8Y29sIFtzdHlsZS53aWR0aF09XCJjb2xXaWR0aFN0eWxlKGNvbClcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2NvbGdyb3VwPlxuXG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciByb2xlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1zb3J0YWJsZV09XCJjYW5Tb3J0Q29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXNvcnRhYmxlLWRpc2FibGVkXT1cImlzU29ydGFibGVDb2x1bW4oY29sKSAmJiAhY2FuU29ydENvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1oZWFkZXItZGlzYWJsZWRdPVwiIWhhc0RhdGFSb3dzKClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWlzLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbCwgJ2hlYWRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldFNvcnRBcmlhQXR0cmlidXRlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJoYXNEYXRhUm93cygpICYmIGNhblNvcnRDb2x1bW4oY29sKSA/IDAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhaGFzRGF0YVJvd3MoKSB8fCAoaXNTb3J0YWJsZUNvbHVtbihjb2wpICYmICFjYW5Tb3J0Q29sdW1uKGNvbCkpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNTb3J0YWJsZUNvbHVtbihjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfc29ydGFibGVfY29sdW1uJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhc0RhdGFSb3dzKCkgJiYgY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGNhblNvcnRDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFzRGF0YVJvd3MoKSAmJiBjb2wuZmllbGQgPyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgY2FuU29ydENvbHVtbihjb2wpKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNEYXRhUm93cygpICYmIGNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjYW5Tb3J0Q29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nICYmIChjZWxsc0NmZygpLmNoZWNrYm94LnNlbGVjdEFsbCA/PyB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGgtaW5uZXIgc2RjLXRhYmxlLXRoLWlubmVyLS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWwgc3Itb25seVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGNvbC5oZWFkZXIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10aC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0U2VsZWN0QWxsQ2hlY2tib3hJZCgkaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1BhZ2VGdWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzUGFnZVBhcnRpYWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzU2VsZWN0YWJsZVBhZ2VSb3dzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0UGFnZShnZXRDaGVja2VkVmFsdWUoJGV2ZW50KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVTZWxlY3RQYWdlKCFpc1BhZ2VGdWxseVNlbGVjdGVkKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJnZXRQYWdlU2VsZWN0aW9uQXJpYUNoZWNrZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cImdldFNlbGVjdEFsbENoZWNrYm94SWQoJGluZGV4KVwiIGNsYXNzPVwic3Itb25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10aC1pbm5lclwiIFtjbGFzcy5zZGMtdGFibGUtdGgtaW5uZXItLXNvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBjb2wuaGVhZGVyIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5oZWFkZXJUb29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXRoLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wuaGVhZGVyVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJjb2wuaGVhZGVyVG9vbHRpcFBvc2l0aW9uID8/ICd0b3AnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcEV2ZW50XT1cImNvbC5oZWFkZXJUb29sdGlwRXZlbnQgPz8gJ2hvdmVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1pbmZvIHNkYy10YWJsZS10aC10b29sdGlwX19pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NkYy10b29sdGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1zb3J0LW92ZXJsYXlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1zb3J0LWluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtblR5cGVdPVwiY29sLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0T3JkZXJdPVwic29ydE9yZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtc29ydC1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICBAaWYgKHNob3dJbml0aWFsTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic2RjLXRhYmxlLWluaXRpYWwtbG9hZGluZy1yb3dcIiByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyICsgMVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjIHNkYy10YWJsZS10ZC0taW5pdGlhbC1sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImNvbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsIHNkYy10YWJsZS10ZC12YWwtLWluaXRpYWwtbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInIgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2tlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25Sb3dDbGlja2VkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaXMtc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNvbC5jb2xJZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5jZWxsVGFnID09PSAnc3BhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdpJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChjb2wuY2VsbFRhZyA9PT0gJ3AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgICAgPHNkYy1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZW1wdHlUaXRsZSgpXCJcbiAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodC5weF09XCJlbXB0eUJvZHlIZWlnaHRQeCgpXCJcbiAgICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAobW9iaWxlTW9kZSgpID09PSAnc3RhY2tlZCcpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1saXN0XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1jYXJkIHNkYy10YWJsZS1tb2JpbGUtY2FyZC0tbG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWZpZWxkIHNkYy10YWJsZS1tb2JpbGUtZmllbGQtLWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwgc2RjLXRhYmxlLW1vYmlsZS1sYWJlbC0tbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1za2VsZXRvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBwYWdlRGF0YSgpOyB0cmFjayAkaW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1mdWxsLXdpZHRoXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09PSAnYnV0dG9uJyB8fCBjb2wudHlwZSA9PT0gJ2FjdGlvbnMnIHx8IGNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1zb3J0YWJsZV09XCJjb2wuZmllbGQgJiYgaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5maWVsZCAmJiB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobW9iaWxlRmllbGRMYWJlbChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuZmllbGQgJiYgaXNTb3J0YWJsZUNvbHVtbihjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwgc2RjLXRhYmxlLW1vYmlsZS1sYWJlbC0tc29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NvcnRhYmxlX2NvbHVtbicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwidG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1zb3J0LWluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbkZpZWxkXT1cImNvbC5maWVsZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5UeXBlXT1cImNvbC50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRGaWVsZF09XCJzb3J0RmllbGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydE9yZGVyXT1cInNvcnRPcmRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtc29ydC1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLXZhbHVlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHVsXG4gICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1saXN0XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4KSB7XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWl0ZW0gc2RjLXRhYmxlLWV4cGFuZGFibGUtaXRlbS0tbG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5IHNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnktLWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1za2VsZXRvbiBzZGMtdGFibGUtZXhwYW5kYWJsZS1za2VsZXRvbi1wcmltYXJ5XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLXNrZWxldG9uIHNkYy10YWJsZS1leHBhbmRhYmxlLXNrZWxldG9uLXNlY29uZGFyeVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWNoZXZyb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2VEYXRhKCk7IHRyYWNrICRpbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1pdGVtXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWV4cGFuZGFibGUtaXRlbS0tZXhwYW5kZWRdPVwiaXNSb3dFeHBhbmRlZChyKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJ0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChjaGVja2JveENvbCgpOyBhcyBjYkNvbCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9yY2VMZWZ0QWxpZ25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNiQ29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNiQ29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjYkNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2Ygc3VtbWFyeUNvbHMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnktZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS1sYWJlbFwiPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc1Jvd0V4cGFuZGVkKHIpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBpc1Jvd0V4cGFuZGVkKHIpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9jb2xsYXBzZV9yb3cnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfZXhwYW5kX3JvdycgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlRXhwYW5kUm93KHIpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlRXhwYW5kUm93KHIpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWNoZXZyb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtZXhwYW5kYWJsZS1jaGV2cm9uLS1vcGVuXT1cImlzUm93RXhwYW5kZWQocilcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChpc1Jvd0V4cGFuZGVkKHIpKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wudHlwZSAhPT0gJ2NoZWNrYm94LXNlbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtZXhwYW5kYWJsZS1maWVsZC0tZnVsbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gJ2J1dHRvbicgfHwgY29sLnR5cGUgPT09ICdhY3Rpb25zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC50eXBlICE9PSAnYnV0dG9uJyAmJiBjb2wudHlwZSAhPT0gJ2FjdGlvbnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtbGFiZWxcIj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXZhbHVlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC91bD5cblxuICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtcGFnaW5hdG9yXCI+XG4gICAgICAgICAgPHNkYy1wYWdpbmF0b3JcbiAgICAgICAgICAgIFtmaXJzdF09XCJmaXJzdCgpXCJcbiAgICAgICAgICAgIFtyb3dzXT1cInJvd3MoKVwiXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiaXNNb2JpbGUoKSA/IFtdIDogcm93c1BlclBhZ2VPcHRpb25zKClcIlxuICAgICAgICAgICAgW3Nob3dSb3dzUGVyUGFnZVNlbGVjdG9yXT1cInNob3dSb3dzUGVyUGFnZVNlbGVjdG9yKClcIlxuICAgICAgICAgICAgW2lzTW9iaWxlXT1cImlzTW9iaWxlKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc0xhYmVsXT1cInRvdGFsUmVjb3Jkc0xhYmVsKClcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L3NkYy1wYWdpbmF0b3I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L3NkYy1sb2FkaW5nLXN0YXRlPlxuPC9zZWN0aW9uPlxuXG5AaWYgKG9wZW5NZW51U3RhdGUoKTsgYXMgbWVudSkge1xuICA8c2RjLXRhYmxlLWFjdGlvbnMtbWVudVxuICAgIFtpdGVtc109XCJtZW51Lml0ZW1zXCJcbiAgICBbbWVudUlkXT1cIm1lbnUubWVudUlkXCJcbiAgICBbdG9wXT1cIm1lbnUudG9wXCJcbiAgICBbbGVmdF09XCJtZW51LmxlZnRcIlxuICAgIFt3aWR0aF09XCJtZW51LndpZHRoXCJcbiAgICAoY2xvc2UpPVwib25NZW51Q2xvc2UoJGV2ZW50KVwiXG4gICAgKHNlbGVjdCk9XCJvblBvcnRhbEFjdGlvbkNsaWNrKCRldmVudClcIlxuICA+PC9zZGMtdGFibGUtYWN0aW9ucy1tZW51PlxufVxuIl19
|
|
681
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixvQ0FBb0MsSUFBSSw4QkFBOEIsRUFDdEUseUNBQXlDLElBQUksbUNBQW1DLEVBQ2hGLG1DQUFtQyxJQUFJLDZCQUE2QixFQUNwRSwyQkFBMkIsSUFBSSxxQkFBcUIsRUFDcEQsMkJBQTJCLElBQUkscUJBQXFCLEVBQ3BELGdCQUFnQixJQUFJLFVBQVUsRUFDOUIsaUJBQWlCLElBQUksV0FBVyxFQUNoQyxrQ0FBa0MsRUFDbEMscUNBQXFDLEVBQ3RDLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFJM0YsT0FBTyxFQVlMLG9CQUFvQixFQUNyQixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFl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d0JBQ2YscUJBQXFCO3dCQUNyQixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2YsMkJBQTJCO3dCQUMzQix5QkFBeUI7d0JBQ3pCLHlCQUF5Qjt3QkFDekIsZ0JBQWdCO3FCQUNqQixpQkFHYyxpQkFBaUIsQ0FBQyxRQUFRLG1CQUN4Qix1QkFBdUIsQ0FBQyxNQUFNOzhCQXdDM0MsSUFBSTtzQkFEUCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFVckIsSUFBSTtzQkFEUCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFhckIsU0FBUztzQkFEWixLQUFLO2dCQVVGLE9BQU87c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Z0JBY25CLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFJRixNQUFNO3NCQURULEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO2dCQTBCdEIsU0FBUztzQkFEWixLQUFLO2dCQVNJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkE4SEcsZUFBZTtzQkFEeEIsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBTXBCLFdBQVc7c0JBRHBCLFlBQVk7dUJBQUMseUJBQXlCO2dCQXFCN0IsY0FBYztzQkFEdkIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHsgZ2V0Vmlld3BvcnRXaWR0aCwgaXNNb2JpbGVWaWV3cG9ydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvbGF5b3V0LnV0aWwnO1xuaW1wb3J0IHsgZ2V0Rm9jdXNhYmxlRWxlbWVudHMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2ZvY3VzLnV0aWwnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUJMRV9PUFRJT05TLFxuICBUQUJMRV9DT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04gYXMgQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OLFxuICBUQUJMRV9ERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCBhcyBERUZBVUxUX0xPQURJTkdfVkVSVElDQUxfUEFERElOR19QWCxcbiAgVEFCTEVfREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFggYXMgREVGQVVMVF9NSU5fTE9BRElOR19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XX0hFSUdIVF9QWCBhcyBERUZBVUxUX1JPV19IRUlHSFRfUFgsXG4gIFRBQkxFX0RFRkFVTFRfUk9XU19QRVJfUEFHRSBhcyBERUZBVUxUX1JPV1NfUEVSX1BBR0UsXG4gIFRBQkxFX0lOREVYX1pFUk8gYXMgSU5ERVhfWkVSTyxcbiAgVEFCTEVfTUVOVV9HQVBfUFggYXMgTUVOVV9HQVBfUFgsXG4gIFRBQkxFX0VNUFRZX1NUQVRFX01PQklMRV9IRUlHSFRfUFgsXG4gIFRBQkxFX01PQklMRV9DQVJEX0VTVElNQVRFRF9IRUlHSFRfUFhcbn0gZnJvbSAnLi4vLi4vY29yZS9jb25zdGFudHMvdGFibGUuY29uc3QnO1xuaW1wb3J0IHsgREVGQVVMVF9MT0FESU5HX1NUQVRFX0lORElDQVRPUiB9IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2xvYWRpbmctc3RhdGUuY29uc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWdpbmF0b3JTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvcGFnaW5hdG9yLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBMb2FkaW5nU3RhdGVJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2xvYWRpbmctc3RhdGUudHlwZSc7XG5pbXBvcnQgeyB0eXBlIFNlYXJjaFRyaWdnZXJNb2RlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZWFyY2hib3gudHlwZSc7XG5pbXBvcnQge1xuICB0eXBlIEFjdGlvbk1lbnVJdGVtLFxuICB0eXBlIFJvd0Jhc2UsXG4gIHR5cGUgU29ydE9yZGVyLFxuICB0eXBlIFRhYmxlQWN0aW9uTWVudUl0ZW0gYXMgTmF0aXZlQWN0aW9uTWVudUl0ZW0sXG4gIHR5cGUgVGFibGVBY3Rpb25NZW51Q2xvc2VFdmVudCxcbiAgdHlwZSBUYWJsZUNlbGxDb25maWcsXG4gIHR5cGUgVGFibGVDZWxsQ29uZmlnS2V5LFxuICB0eXBlIFRhYmxlQ29sdW1uLFxuICB0eXBlIFRhYmxlT3Blbk1lbnVTdGF0ZSBhcyBPcGVuTWVudVN0YXRlLFxuICB0eXBlIFRhYmxlT3B0aW9ucyxcbiAgdHlwZSBUYWJsZVNlYXJjaEV2ZW50LFxuICBUYWJsZU1lbnVGb2N1c1RhcmdldFxufSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3RhYmxlLnR5cGUnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaGJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2xvYWRpbmctc3RhdGUvbG9hZGluZy1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVBY3Rpb25zTWVudUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90YWJsZS1hY3Rpb25zLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQ2VsbENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtY2VsbC1jb250ZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZVNvcnRJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdGFibGUtc29ydC1pbmRpY2F0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IGJ1aWxkVGFibGVDZWxsQ29uZmlnTWFwLCBtZXJnZVRhYmxlT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvdGFibGUtY29uZmlnLnV0aWwnO1xuaW1wb3J0IHtcbiAgYnVpbGRSb3dDaGVja2JveElkLFxuICBjeWNsZVNvcnRTdGF0ZSxcbiAgZmlsdGVyVGFibGVSb3dzLFxuICBnZXROZXN0ZWRWYWx1ZSxcbiAgcmVzb2x2ZVJvd0lkZW50aXR5TGFiZWwsXG4gIHJlc29sdmVSb3dTZWxlY3Rpb25LZXksXG4gIHNvcnRUYWJsZVJvd3Ncbn0gZnJvbSAnLi91dGlscy90YWJsZS1kYXRhLnV0aWwnO1xuaW1wb3J0IHtcbiAgZ2V0VGFibGVDb2x1bW5NaW5XaWR0aFB4LFxuICBnZXRUYWJsZU1pbldpZHRoUHgsXG4gIHJlc29sdmVUYWJsZUNvbHVtbkFsaWdubWVudFxufSBmcm9tICcuL3V0aWxzL3RhYmxlLWxheW91dC51dGlsJztcblxubGV0IHRhYmxlSW5zdGFuY2VTZXF1ZW5jZSA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy10YWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgU2VhcmNoYm94Q29tcG9uZW50LFxuICAgIFBhZ2luYXRvckNvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnQsXG4gICAgTG9hZGluZ1N0YXRlQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIFRhYmxlU29ydEluZGljYXRvckNvbXBvbmVudCxcbiAgICBUYWJsZUNlbGxDb250ZW50Q29tcG9uZW50LFxuICAgIFRhYmxlQWN0aW9uc01lbnVDb21wb25lbnQsXG4gICAgVG9vbHRpcENvbXBvbmVudFxuICBdLFxuICBzdHlsZVVybDogJy4vdGFibGUuY29tcG9uZW50LnNjc3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8VCBleHRlbmRzIFJvd0Jhc2UgPSBSb3dCYXNlPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgc3RhdGljIGFsbG9jYXRlVGFibGVJbnN0YW5jZUlkKCk6IG51bWJlciB7XG4gICAgY29uc3QgbmV4dElkID0gdGFibGVJbnN0YW5jZVNlcXVlbmNlO1xuICAgIHRhYmxlSW5zdGFuY2VTZXF1ZW5jZSArPSAxO1xuICAgIHJldHVybiBuZXh0SWQ7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgX3RhYmxlSW5zdGFuY2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYWN0aW9uc01lbnVJZFNlcXVlbmNlID0gMDtcblxuICBwcml2YXRlIGdldCB0YWJsZUluc3RhbmNlSWQoKTogbnVtYmVyIHtcbiAgICB0aGlzLl90YWJsZUluc3RhbmNlSWQgPz89IFRhYmxlQ29tcG9uZW50LmFsbG9jYXRlVGFibGVJbnN0YW5jZUlkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5zdGFuY2VJZDtcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGNvbHNTaWduYWwgPSBzaWduYWw8VGFibGVDb2x1bW48VD5bXT4oW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTaWduYWwgPSBzaWduYWw8VFtdPihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGluZ1NpZ25hbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRXaWR0aFNpZ25hbCA9IHNpZ25hbDxudW1iZXI+KGdldFZpZXdwb3J0V2lkdGgoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTaWduYWwgPSBzaWduYWw8VGFibGVPcHRpb25zPFQ+PihtZXJnZVRhYmxlT3B0aW9ucyhERUZBVUxUX1RBQkxFX09QVElPTlMgYXMgVGFibGVPcHRpb25zPFQ+KSk7XG4gIHByaXZhdGUgX2NvbmZpZzogVGFibGVPcHRpb25zPFQ+ID0gREVGQVVMVF9UQUJMRV9PUFRJT05TO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGF0aFBhcnRzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIHByaXZhdGUgcm93Q2hlY2tib3hJZENhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBzdHJpbmc+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wZW5NZW51U3RhdGUgPSBzaWduYWw8T3Blbk1lbnVTdGF0ZTxUPiB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXJpYUxhYmVsU2lnbmFsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2xvYmFsRmlsdGVyID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydEZpZWxkID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydE9yZGVyID0gc2lnbmFsPFNvcnRPcmRlcj4oMCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uU2lnbmFsID0gc2lnbmFsPFRbXT4oW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlyc3QgPSBzaWduYWw8bnVtYmVyPihJTkRFWF9aRVJPKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3MgPSBzaWduYWw8bnVtYmVyPihERUZBVUxUX1JPV1NfUEVSX1BBR0UpO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBjb2xzKHZhbHVlOiBUYWJsZUNvbHVtbjxUPltdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY29sc1NpZ25hbC5zZXQodmFsdWUgPz8gW10pO1xuICB9XG5cbiAgZ2V0IGNvbHMoKTogVGFibGVDb2x1bW48VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sc1NpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc2V0IGRhdGEodmFsdWU6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmRhdGFTaWduYWwuc2V0KHZhbHVlID8/IFtdKTtcbiAgICB0aGlzLnJlY29uY2lsZVNlbGVjdGlvbldpdGhEYXRhKCk7XG4gICAgdGhpcy5jbGFtcFBhZ2UoKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBkYXRhKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHNlbGVjdGlvbih2YWx1ZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc2VsZWN0aW9uU2lnbmFsLnNldCh0aGlzLm5vcm1hbGl6ZVNlbGVjdGlvbih2YWx1ZSA/PyBbXSkpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbigpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNpZ25hbCgpO1xuICB9XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IGZhbHNlIH0pXG4gIHNldCBsb2FkaW5nKHZhbHVlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMubG9hZGluZ1NpZ25hbC5zZXQodmFsdWUgPT09IHRydWUpO1xuXG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgbG9hZGluZ0luZGljYXRvcjogTG9hZGluZ1N0YXRlSW5kaWNhdG9yID0gREVGQVVMVF9MT0FESU5HX1NUQVRFX0lORElDQVRPUjtcblxuICBASW5wdXQoeyByZXF1aXJlZDogZmFsc2UgfSlcbiAgc2V0IGNvbmZpZyh2YWx1ZTogVGFibGVPcHRpb25zPFQ+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA/PyBERUZBVUxUX1RBQkxFX09QVElPTlM7XG5cbiAgICBpZiAodGhpcy5fY29uZmlnID09PSBuZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnID0gbmV4dDtcbiAgICB0aGlzLmNvbmZpZ1NpZ25hbC5zZXQobWVyZ2VUYWJsZU9wdGlvbnMobmV4dCkpO1xuXG4gICAgY29uc3QgbmV4dFJvd3MgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICB0aGlzLnJvd3Muc2V0KG5leHRSb3dzKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcblxuICAgIHRoaXMucGF0aFBhcnRzQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJvd0NoZWNrYm94SWRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgc3RyaW5nPigpO1xuICAgIHRoaXMucmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgfVxuXG4gIGdldCBjb25maWcoKTogVGFibGVPcHRpb25zPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGFyaWFMYWJlbCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hcmlhTGFiZWxTaWduYWwuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxTaWduYWwoKTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29sdW1uOiBUYWJsZUNvbHVtbjxUPjsgcm93OiBUOyB2YWx1ZTogdW5rbm93biB9PigpO1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBsYXp5TG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGZpcnN0OiBudW1iZXI7XG4gICAgcm93czogbnVtYmVyO1xuICAgIHNvcnRGaWVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgc29ydE9yZGVyPzogU29ydE9yZGVyO1xuICAgIHRyaWdnZXI/OiAncGFnZScgfCAnc29ydCcgfCAnc2VhcmNoJztcbiAgICBzZWFyY2hUZXJtPzogc3RyaW5nO1xuICB9PigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU2lnbmFsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPFRhYmxlT3B0aW9uczxUPj4oKCkgPT4gdGhpcy5jb25maWdTaWduYWwoKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc01vYmlsZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICBjb25zdCByZXNwb25zaXZlID0gdGhpcy5vcHRpb25zKCkudGFibGU/LnJlc3BvbnNpdmU7XG4gICAgaWYgKHJlc3BvbnNpdmUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpc01vYmlsZVZpZXdwb3J0KHRoaXMudmlld3BvcnRXaWR0aFNpZ25hbCgpKTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTZWFyY2ggPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnNob3cgPz8gZmFsc2UpO1xuICAvLyBPcHQtaW4gcG9yIHRhYmVsYSAoZGVmYXVsdCBmYWxzZSAtIHByZXNlcnZhIGEgbGFyZ3VyYSBhdHVhbCwgbWluKDEwMCUsIDIycmVtKSwgcHJhXG4gIC8vIG7Do28gYWZldGFyIGNvbnN1bWlkb3JlcyBleGlzdGVudGVzKSAtIHZlciB0YWJsZS5jb21wb25lbnQuc2Nzcy5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlYXJjaEZ1bGxXaWR0aCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMub3B0aW9ucygpLnNlYXJjaD8uZnVsbFdpZHRoID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dQYWdpbmF0b3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5zaG93ID8/IGZhbHNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dJbml0aWFsTG9hZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMubG9hZGluZ1NpZ25hbCgpICYmIHRoaXMuZGF0YVNpZ25hbCgpLmxlbmd0aCA9PT0gMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3NQZXJQYWdlT3B0aW9ucyA9IGNvbXB1dGVkPG51bWJlcltdPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5yb3dzUGVyUGFnZU9wdGlvbnMgPz8gW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd1Jvd3NQZXJQYWdlU2VsZWN0b3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy5zaG93Um93c1BlclBhZ2VTZWxlY3RvciA/PyBmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWFyY2hQbGFjZWhvbGRlciA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gdGhpcy5vcHRpb25zKCkuc2VhcmNoPy5wbGFjZWhvbGRlciA/PyAnJyk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmlnZ2VyTW9kZSA9IGNvbXB1dGVkPFNlYXJjaFRyaWdnZXJNb2RlPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5zZWFyY2g/LnR5cGUgPz8gJ2F1dG8nKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRvdGFsUmVjb3Jkc0xhYmVsID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8udG90YWxSZWNvcmRzTGFiZWwgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdFRleHRPdmVyZmxvdyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpLnRhYmxlPy50ZXh0T3ZlcmZsb3cpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFibGVNb2RlID0gY29tcHV0ZWQ8J2xvY2FsJyB8ICdhcGknPigoKSA9PiB0aGlzLm9wdGlvbnMoKS50YWJsZT8ubW9kZSA/PyAnbG9jYWwnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQXBpTW9kZSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHRoaXMudGFibGVNb2RlKCkgPT09ICdhcGknKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRml0TGF5b3V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/LmxheW91dCA9PT0gJ2ZpdCcpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9iaWxlTW9kZSA9IGNvbXB1dGVkPCdleHBhbmRhYmxlJyB8ICdzdGFja2VkJz4oKCkgPT4gdGhpcy5vcHRpb25zKCkudGFibGU/Lm1vYmlsZU1vZGUgPz8gJ2V4cGFuZGFibGUnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cGFuZGVkUm93SW5kZXggPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzdW1tYXJ5Q29scyA9IGNvbXB1dGVkPFRhYmxlQ29sdW1uPFQ+W10+KCgpID0+IHtcbiAgICBjb25zdCBTVU1NQVJZX0NPTF9DT1VOVCA9IDI7XG4gICAgcmV0dXJuIHRoaXMuY29sc1NpZ25hbCgpXG4gICAgICAuZmlsdGVyKGNvbCA9PiBjb2wudHlwZSAhPT0gQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OICYmIGNvbC50eXBlICE9PSAnYWN0aW9ucycgJiYgY29sLnR5cGUgIT09ICdidXR0b24nKVxuICAgICAgLnNsaWNlKDAsIFNVTU1BUllfQ09MX0NPVU5UKTtcbiAgfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjaGVja2JveENvbCA9IGNvbXB1dGVkPFRhYmxlQ29sdW1uPFQ+IHwgbnVsbD4oKCkgPT5cbiAgICB0aGlzLmNvbHNTaWduYWwoKS5maW5kKGNvbCA9PiBjb2wudHlwZSA9PT0gQ09MVU1OX1RZUEVfQ0hFQ0tCT1hfU0VMRUNUSU9OKSA/PyBudWxsXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlbXB0eVRpdGxlID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGl0bGUgPz8gJycpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZW1wdHlUZXh0ID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB0aGlzLm9wdGlvbnMoKS5lbXB0eT8udGV4dCA/PyAnJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxzQ2ZnID0gY29tcHV0ZWQoKCkgPT4gYnVpbGRUYWJsZUNlbGxDb25maWdNYXAodGhpcy5vcHRpb25zKCkpKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyZWREYXRhID0gY29tcHV0ZWQ8VFtdPigoKSA9PiB7XG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTaWduYWwoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyVGFibGVSb3dzKHRoaXMuZGF0YVNpZ25hbCgpLCB0aGlzLmNvbHNTaWduYWwoKSwgdGhpcy5nbG9iYWxGaWx0ZXIoKSwgdGhpcy5yZXNvbHZlVmFsdWUpO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ydGVkRGF0YSA9IGNvbXB1dGVkPFRbXT4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGEoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydFRhYmxlUm93cyh0aGlzLmZpbHRlcmVkRGF0YSgpLCB0aGlzLnNvcnRGaWVsZCgpLCB0aGlzLnNvcnRPcmRlcigpLCB0aGlzLnJlc29sdmVWYWx1ZSk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0b3RhbFJlY29yZHMgPSBjb21wdXRlZDxudW1iZXI+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVG90YWwgPSB0aGlzLm9wdGlvbnMoKS5wYWdpbmF0aW9uPy50b3RhbFJlY29yZHM7XG5cbiAgICBpZiAodHlwZW9mIGFwaVRvdGFsID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoYXBpVG90YWwpICYmIGFwaVRvdGFsID49IDApIHtcbiAgICAgIHJldHVybiBNYXRoLnRydW5jKGFwaVRvdGFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zb3J0ZWREYXRhKCkubGVuZ3RoO1xuICB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFnZURhdGEgPSBjb21wdXRlZDxUW10+KCgpID0+IHtcbiAgICBpZiAoIXRoaXMuc2hvd1BhZ2luYXRvcigpIHx8IHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IHRoaXMuZmlyc3QoKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucm93cygpO1xuICAgIHJldHVybiB0aGlzLnNvcnRlZERhdGEoKS5zbGljZShzdGFydCwgZW5kKTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGluaXRpYWxMb2FkaW5nUm93cyA9IGNvbXB1dGVkPG51bWJlcltdPigoKSA9PiB7XG4gICAgY29uc3Qgcm93c0Zyb21TdGF0ZSA9IHRoaXMucm93cygpO1xuICAgIGNvbnN0IHJvd3NGcm9tQ29uZmlnID0gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSb3dzID0gTnVtYmVyKHJvd3NGcm9tU3RhdGUgfHwgcm93c0Zyb21Db25maWcgfHwgREVGQVVMVF9ST1dTX1BFUl9QQUdFKTtcbiAgICBjb25zdCBzYWZlUm93cyA9IE51bWJlci5pc0Zpbml0ZShub3JtYWxpemVkUm93cykgJiYgbm9ybWFsaXplZFJvd3MgPiAwID8gbm9ybWFsaXplZFJvd3MgOiBERUZBVUxUX1JPV1NfUEVSX1BBR0U7XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogc2FmZVJvd3MgfSwgKF8sIGluZGV4KSA9PiBpbmRleCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3Rpb25TZXQgPSBjb21wdXRlZDxTZXQ8VD4+KCgpID0+IG5ldyBTZXQodGhpcy5zZWxlY3Rpb25TaWduYWwoKSkpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBib2R5Vmlld3BvcnRIZWlnaHRQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4ge1xuICAgIGNvbnN0IHJvd3NGcm9tU3RhdGUgPSB0aGlzLnJvd3MoKTtcbiAgICBjb25zdCByb3dzRnJvbUNvbmZpZyA9IHRoaXMub3B0aW9ucygpLnBhZ2luYXRpb24/LnJvd3NQZXJQYWdlID8/IERFRkFVTFRfUk9XU19QRVJfUEFHRTtcbiAgICBjb25zdCBub3JtYWxpemVkUm93cyA9IE51bWJlcihyb3dzRnJvbVN0YXRlIHx8IHJvd3NGcm9tQ29uZmlnIHx8IERFRkFVTFRfUk9XU19QRVJfUEFHRSk7XG4gICAgY29uc3Qgc2FmZVJvd3MgPSBOdW1iZXIuaXNGaW5pdGUobm9ybWFsaXplZFJvd3MpICYmIG5vcm1hbGl6ZWRSb3dzID4gMCA/IG5vcm1hbGl6ZWRSb3dzIDogREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuXG4gICAgY29uc3Qgcm93SGVpZ2h0ID0gdGhpcy5pc01vYmlsZSgpID8gVEFCTEVfTU9CSUxFX0NBUkRfRVNUSU1BVEVEX0hFSUdIVF9QWCA6IERFRkFVTFRfUk9XX0hFSUdIVF9QWDtcbiAgICBjb25zdCBlc3RpbWF0ZWRIZWlnaHQgPSBzYWZlUm93cyAqIHJvd0hlaWdodCArIERFRkFVTFRfTE9BRElOR19WRVJUSUNBTF9QQURESU5HX1BYO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KERFRkFVTFRfTUlOX0xPQURJTkdfSEVJR0hUX1BYLCBlc3RpbWF0ZWRIZWlnaHQpO1xuICB9KTtcblxuICAvLyBPIGNvcnBvIHJlc2VydmEgXCJsaW5oYXMgcG9yIHBhZ2luYSB4IGFsdHVyYSBkYSBsaW5oYVwiIHByYSBuYW8gZGFyIHNhbHRvIGRlIGxheW91dFxuICAvLyBxdWFuZG8gb3MgZGFkb3MgY2hlZ2FtLiBObyBlc3RhZG8gVkFaSU8gbmFvIGNoZWdhIG5hZGEsIGUgZW1waWxoYWRvIGEgY29udGFcbiAgLy8gZXhwbG9kZTogY2FkYSBsaW5oYSBlIHVtIGNhcnRhbyBkZSAxMjBweCwgZW50YW8gMTAgbGluaGFzIHBlZGVtIDEyMjRweCBkZSBuYWRhIC1cbiAgLy8gbWVkaWRvIG51bSBHYWxheHkgUzkrLCBhIGxpc3RhIHZhemlhIHZpcmF2YSAzLDQgdGVsYXMgZGUgcm9sYWdlbS5cbiAgLy9cbiAgLy8gU28gbm8gZW1waWxoYWRvOiBlbSB0ZWxhIGxhcmdhIGEgcmVzZXJ2YSBkYSB1bnMgNDYwcHggZSBzZWd1cmEgbyByb2RhcGUgbm8gbHVnYXIsXG4gIC8vIHF1ZSBlIG8gY29tcG9ydGFtZW50byBxdWUgamEgZXhpc3RpYS5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtcHR5Qm9keUhlaWdodFB4ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PlxuICAgIHRoaXMuaXNNb2JpbGUoKSA/IFRBQkxFX0VNUFRZX1NUQVRFX01PQklMRV9IRUlHSFRfUFggOiB0aGlzLmJvZHlWaWV3cG9ydEhlaWdodFB4KClcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlTWluV2lkdGhQeCA9IGNvbXB1dGVkPG51bWJlcj4oKCkgPT4gZ2V0VGFibGVNaW5XaWR0aFB4KHRoaXMuY29sc1NpZ25hbCgpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVWYWx1ZSA9IChvYmo6IFQsIHBhdGg/OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgZ2V0TmVzdGVkVmFsdWUob2JqLCBwYXRoLCB0aGlzLnBhdGhQYXJ0c0NhY2hlKTtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXG4gIHByb3RlY3RlZCBvbkRvY3VtZW50Q2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIHByb3RlY3RlZCBvbkVzY2FwZUtleSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoVGFibGVNZW51Rm9jdXNUYXJnZXQuVHJpZ2dlcik7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5mbG9vcihlbnRyaWVzWzBdPy5jb250ZW50UmVjdC53aWR0aCA/PyAwKTtcbiAgICAgIGlmICh3aWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy52aWV3cG9ydFdpZHRoU2lnbmFsLnNldCh3aWR0aCk7XG4gICAgICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcbiAgcHJvdGVjdGVkIG9uV2luZG93U2Nyb2xsKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2VhcmNoVGVybShldmVudE9yVmFsdWU6IFRhYmxlU2VhcmNoRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXJtID0gdHlwZW9mIGV2ZW50T3JWYWx1ZSA9PT0gJ3N0cmluZycgPyBldmVudE9yVmFsdWUgOiBldmVudE9yVmFsdWU/LmRldGFpbCA/PyAnJztcbiAgICB0aGlzLmdsb2JhbEZpbHRlci5zZXQoU3RyaW5nKHRlcm0pKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcblxuICAgIGlmICh0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICB0aGlzLmVtaXRMYXp5TG9hZCgnc2VhcmNoJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xlYXJTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXIuc2V0KCcnKTtcbiAgICB0aGlzLmZpcnN0LnNldChJTkRFWF9aRVJPKTtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcblxuICAgIGlmICh0aGlzLmlzQXBpTW9kZSgpKSB7XG4gICAgICB0aGlzLmVtaXRMYXp5TG9hZCgnc2VhcmNoJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNvcnQoZmllbGQ6IHN0cmluZywgZW5hYmxlZCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVuYWJsZWQgfHwgIWZpZWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IGN5Y2xlU29ydFN0YXRlKHRoaXMuc29ydEZpZWxkKCksIHRoaXMuc29ydE9yZGVyKCksIGZpZWxkKTtcbiAgICB0aGlzLnNvcnRGaWVsZC5zZXQobmV4dC5maWVsZCk7XG4gICAgdGhpcy5zb3J0T3JkZXIuc2V0KG5leHQub3JkZXIpO1xuXG4gICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgaWYgKHRoaXMuaXNBcGlNb2RlKCkpIHtcbiAgICAgIHRoaXMuZW1pdExhenlMb2FkKCdzb3J0Jyk7XG4gICAgfVxuICAgIHRoaXMuY2xvc2VBY3Rpb25zTWVudSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNvcnRBcmlhQXR0cmlidXRlKGNvbDogVGFibGVDb2x1bW48VD4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmIChjb2wuc29ydGFibGUgPT09IGZhbHNlIHx8ICFjb2wuZmllbGQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEZpZWxkKCkgIT09IGNvbC5maWVsZCkge1xuICAgICAgcmV0dXJuICdub25lJztcbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IHRoaXMuc29ydE9yZGVyKCk7XG5cbiAgICBpZiAob3JkZXIgPT09IDEpIHtcbiAgICAgIHJldHVybiAnYXNjZW5kaW5nJztcbiAgICB9XG5cbiAgICBpZiAob3JkZXIgPT09IC0xKSB7XG4gICAgICByZXR1cm4gJ2Rlc2NlbmRpbmcnO1xuICAgIH1cblxuICAgIHJldHVybiAnbm9uZSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29sdW1uQWxpZ25DbGFzcyhjb2w6IFRhYmxlQ29sdW1uPFQ+LCB0YXJnZXQ6ICdjZWxsJyB8ICdoZWFkZXInID0gJ2NlbGwnKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGlnbiA9IHJlc29sdmVUYWJsZUNvbHVtbkFsaWdubWVudChjb2wsIHRhcmdldCk7XG4gICAgcmV0dXJuIHRhcmdldCA9PT0gJ2hlYWRlcidcbiAgICAgID8gYHNkYy10YWJsZS10aC1hbGlnbi0ke2FsaWdufWBcbiAgICAgIDogYHNkYy10YWJsZS10ZC1hbGlnbi0ke2FsaWdufWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNTb3J0YWJsZUNvbHVtbihjb2w6IFRhYmxlQ29sdW1uPFQ+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbC50eXBlICE9PSBDT0xVTU5fVFlQRV9DSEVDS0JPWF9TRUxFQ1RJT04gJiYgY29sLnNvcnRhYmxlICE9PSBmYWxzZSAmJiAhIWNvbC5maWVsZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYXNEYXRhUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2lnbmFsKCkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjYW5Tb3J0Q29sdW1uKGNvbDogVGFibGVDb2x1bW48VD4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEYXRhUm93cygpICYmIHRoaXMuaXNTb3J0YWJsZUNvbHVtbihjb2wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbHVtbk1pbldpZHRoUHgoY29sOiBUYWJsZUNvbHVtbjxUPik6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFRhYmxlQ29sdW1uTWluV2lkdGhQeChjb2wpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbFdpZHRoU3R5bGUoY29sOiBUYWJsZUNvbHVtbjxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaXNGaXRMYXlvdXQoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sLndpZHRoICE9IG51bGwgPyBgJHtjb2wud2lkdGh9JWAgOiBgJHtnZXRUYWJsZUNvbHVtbk1pbldpZHRoUHgoY29sKX1weGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW9iaWxlRmllbGRMYWJlbChjb2w6IFRhYmxlQ29sdW1uPFQ+KTogc3RyaW5nIHtcbiAgICBpZiAoY29sLmhlYWRlcikge1xuICAgICAgcmV0dXJuIGNvbC5oZWFkZXI7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2wudHlwZSkge1xuICAgICAgY2FzZSAnYWN0aW9ucyc6XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKCkuYWN0aW9ucy5idXR0b25MYWJlbCB8fCAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9hY3Rpb25zX21lbnUnO1xuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHNDZmcoKS5idXR0b24ubGFiZWxcbiAgICAgICAgICB8fCB0aGlzLmNlbGxzQ2ZnKCkuYnV0dG9uLnRvb2x0aXBcbiAgICAgICAgICB8fCAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9hY3Rpb25fYnV0dG9uJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlRXhwYW5kUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkUm93SW5kZXguc2V0KHRoaXMuZXhwYW5kZWRSb3dJbmRleCgpID09PSBpbmRleCA/IG51bGwgOiBpbmRleCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNSb3dFeHBhbmRlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRSb3dJbmRleCgpID09PSBpbmRleDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2luYXRvclN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dEZpcnN0ID0gZXZlbnQuZmlyc3QgPz8gSU5ERVhfWkVSTztcbiAgICBjb25zdCBuZXh0Um93cyA9IGV2ZW50LnJvd3MgPz8gdGhpcy5vcHRpb25zKCkucGFnaW5hdGlvbj8ucm93c1BlclBhZ2UgPz8gREVGQVVMVF9ST1dTX1BFUl9QQUdFO1xuXG4gICAgdGhpcy5maXJzdC5zZXQobmV4dEZpcnN0KTtcbiAgICB0aGlzLnJvd3Muc2V0KG5leHRSb3dzKTtcbiAgICB0aGlzLmV4cGFuZGVkUm93SW5kZXguc2V0KG51bGwpO1xuICAgIHRoaXMuZW1pdExhenlMb2FkKCdwYWdlJyk7XG4gICAgdGhpcy5jbG9zZUFjdGlvbnNNZW51KCk7XG4gIH1cblxuICAvLyBTZW1wcmUgZW1pdGUgYHJvd0NsaWNrYCAoY29tcG9ydGFtZW50byBwcsOpLWV4aXN0ZW50ZSk7IGFsw6ltIGRpc3NvLCBhbHRlcm5hIGEgc2VsZcOnw6NvXG4gIC8vIGRhIGxpbmhhIHF1YW5kbyBgY2VsbHMuY2hlY2tib3guc2VsZWN0T25Sb3dDbGlja2AgZXN0w6EgaGFiaWxpdGFkbyBlIGEgbGluaGEgdGVtIHVtYVxuICAvLyBjb2x1bmEgZGUgc2VsZcOnw6NvIChjaGVja2JveENvbCkuIE8gcHLDs3ByaW8gaW5wdXQgZG8gY2hlY2tib3ggZmF6IHN0b3BQcm9wYWdhdGlvbiBub1xuICAvLyBjbGljayAodmVyIHRhYmxlLWNlbGwtY29udGVudC5jb21wb25lbnQuaHRtbCksIGVudMOjbyBlc3NlIGhhbmRsZXIgc8OzIGRpc3BhcmEgcGFyYVxuICAvLyBjbGlxdWVzIGZvcmEgZG8gY2hlY2tib3ggLSBzZW0gdG9nZ2xlIGR1cGxpY2Fkby5cbiAgcHJvdGVjdGVkIG9uUm93Q2xpY2tlZChyb3c6IFQpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQocm93KTtcblxuICAgIGlmICghdGhpcy5jaGVja2JveENvbCgpIHx8ICF0aGlzLmNlbGxzQ2ZnKCkuY2hlY2tib3guc2VsZWN0T25Sb3dDbGljayB8fCB0aGlzLmlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25Ub2dnbGVSb3cocm93LCAhdGhpcy5pc1Jvd1NlbGVjdGVkKHJvdykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVG9nZ2xlUm93KHJvdzogVCwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2V0KCkpO1xuXG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRTZWxlY3Rpb24uZGVsZXRlKHJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNSb3dTZWxlY3RlZChyb3c6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXQoKS5oYXMocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdzogVCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRpc2FibGVkID0gdGhpcy5jZWxsc0NmZygpLmNoZWNrYm94LmRpc2FibGVkO1xuXG4gICAgaWYgKHR5cGVvZiBkaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGRpc2FibGVkKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc2FibGVkID09PSB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVNlbGVjdFBhZ2UoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb24gPSBuZXcgU2V0KHRoaXMuc2VsZWN0aW9uU2V0KCkpO1xuXG4gICAgdGhpcy5zZWxlY3RhYmxlUGFnZVJvd3MoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIG5leHRTZWxlY3Rpb24uYWRkKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0U2VsZWN0aW9uLmRlbGV0ZShyb3cpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVTZWxlY3Rpb24obmV4dFNlbGVjdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNQYWdlRnVsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IHRoaXMuc2VsZWN0YWJsZVBhZ2VSb3dzKCk7XG5cbiAgICBpZiAodmlzaWJsZVJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rpb25TZXQoKTtcbiAgICByZXR1cm4gdmlzaWJsZVJvd3MuZXZlcnkoKHJvdykgPT4gc2VsZWN0ZWRSb3dzLmhhcyhyb3cpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1BhZ2VQYXJ0aWFsbHlTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlUm93cyA9IHRoaXMuc2VsZWN0YWJsZVBhZ2VSb3dzKCk7XG5cbiAgICBpZiAodmlzaWJsZVJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5zZWxlY3Rpb25TZXQoKTtcbiAgICBjb25zdCBzZWxlY3RlZENvdW50ID0gdmlzaWJsZVJvd3MuZmlsdGVyKChyb3cpID0+IHNlbGVjdGVkUm93cy5oYXMocm93KSkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkQ291bnQgPiAwICYmIHNlbGVjdGVkQ291bnQgPCB2aXNpYmxlUm93cy5sZW5ndGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFzU2VsZWN0YWJsZVBhZ2VSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGFibGVQYWdlUm93cygpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UGFnZVNlbGVjdGlvbkFyaWFDaGVja2VkKCk6ICdmYWxzZScgfCAnbWl4ZWQnIHwgJ3RydWUnIHtcbiAgICBpZiAodGhpcy5pc1BhZ2VQYXJ0aWFsbHlTZWxlY3RlZCgpKSB7XG4gICAgICByZXR1cm4gJ21peGVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1BhZ2VGdWxseVNlbGVjdGVkKCkgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENoZWNrZWRWYWx1ZShldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0NoZWNrYm94SWQocm93OiBUKTogc3RyaW5nIHtcbiAgICBpZiAoIXJvdyB8fCB0eXBlb2Ygcm93ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGJ1aWxkUm93Q2hlY2tib3hJZChyb3cpO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucm93Q2hlY2tib3hJZENhY2hlLmdldChyb3cpO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0SWQgPSBidWlsZFJvd0NoZWNrYm94SWQocm93KTtcbiAgICB0aGlzLnJvd0NoZWNrYm94SWRDYWNoZS5zZXQocm93LCBuZXh0SWQpO1xuICAgIHJldHVybiBuZXh0SWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Um93Q2hlY2tib3hMYWJlbChyb3c6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlUm93SWRlbnRpdHlMYWJlbChyb3cpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNlbGVjdEFsbENoZWNrYm94SWQoY29sdW1uSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBzZGMtdGFibGUtJHt0aGlzLnRhYmxlSW5zdGFuY2VJZH0tc2VsZWN0LWFsbC1jaGVja2JveC0ke2NvbHVtbkluZGV4fWA7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGFibGVBcmlhTGFiZWxLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcmlhTGFiZWxTaWduYWwoKSA/PyAncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV90YWJsZV9kZXNjcmlwdGlvbic7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlQWN0aW9uc01lbnUoZXZlbnQ6IEV2ZW50LCByb3c6IFQsIGNvbDogVGFibGVDb2x1bW48VD4sIHRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpKSB7XG4gICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb25zT3B0aW9ucyA9IHRoaXMuY2VsbENmZygnYWN0aW9ucycpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5hY3Rpb25JdGVtc0Zvcihyb3csIGFjdGlvbnNPcHRpb25zKTtcbiAgICBjb25zdCByZWN0ID0gdHJpZ2dlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbWVudUlkID0gdGhpcy5uZXh0QWN0aW9uc01lbnVJZCgpO1xuXG4gICAgdGhpcy5vcGVuTWVudVN0YXRlLnNldCh7XG4gICAgICByb3csXG4gICAgICBjb2wsXG4gICAgICBpdGVtcyxcbiAgICAgIG1lbnVJZCxcbiAgICAgIGNsb3NlT25DbGljazogYWN0aW9uc09wdGlvbnM/LmNsb3NlT25DbGljayAhPT0gZmFsc2UsXG4gICAgICB0cmlnZ2VyOiB0cmlnZ2VyRWxlbWVudCxcbiAgICAgIHRvcDogcmVjdC5ib3R0b20gKyBNRU5VX0dBUF9QWCxcbiAgICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICAgIHdpZHRoOiByZWN0LndpZHRoXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xvc2VBY3Rpb25zTWVudShmb2N1c1RhcmdldDogVGFibGVNZW51Rm9jdXNUYXJnZXQgPSBUYWJsZU1lbnVGb2N1c1RhcmdldC5Ob25lKTogdm9pZCB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuICAgIHRoaXMub3Blbk1lbnVTdGF0ZS5zZXQobnVsbCk7XG5cbiAgICBpZiAoIW1lbnUgfHwgZm9jdXNUYXJnZXQgPT09IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5vbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB0aGlzLmZvY3VzQ2xvc2VkTWVudVRhcmdldChtZW51LnRyaWdnZXIsIG1lbnUubWVudUlkLCBmb2N1c1RhcmdldCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQWN0aW9uc01lbnVPcGVuKHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1lbnUgPSB0aGlzLm9wZW5NZW51U3RhdGUoKTtcblxuICAgIGlmICghbWVudSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBtZW51LnJvdyA9PT0gcm93ICYmIG1lbnUuY29sID09PSBjb2w7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWN0aW9uSXRlbXNGb3Iocm93OiBULCBvcHRpb25zOiBUYWJsZUNlbGxDb25maWc8VCwgJ2FjdGlvbnMnPik6IE5hdGl2ZUFjdGlvbk1lbnVJdGVtW10ge1xuICAgIGNvbnN0IGl0ZW1zID0gb3B0aW9ucy5pdGVtcyA/PyBbXTtcblxuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW06IEFjdGlvbk1lbnVJdGVtPFQ+KSA9PiAoe1xuICAgICAga2V5OiBpdGVtLmtleSxcbiAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgaWNvbjogaXRlbS5pY29uLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMucmVzb2x2ZUFjdGlvbkRpc2FibGVkKGl0ZW0sIHJvdylcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Qb3J0YWxBY3Rpb25DbGljayhpdGVtOiBOYXRpdmVBY3Rpb25NZW51SXRlbSk6IHZvaWQge1xuICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVudSA9IHRoaXMub3Blbk1lbnVTdGF0ZSgpO1xuXG4gICAgaWYgKCFtZW51KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkFjdGlvblNlbGVjdChtZW51LnJvdywgbWVudS5jb2wsIGl0ZW0pO1xuXG4gICAgaWYgKG1lbnUuY2xvc2VPbkNsaWNrKSB7XG4gICAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25NZW51Q2xvc2UoZXZlbnQ6IFRhYmxlQWN0aW9uTWVudUNsb3NlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQWN0aW9uc01lbnUoZXZlbnQuZm9jdXNUYXJnZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQWN0aW9uU2VsZWN0KHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPiwgaXRlbTogeyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgaWNvbj86IHN0cmluZzsgZGlzYWJsZWQ/OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBpZiAoaXRlbS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sLmFjdGlvbkZpZWxkID8/IGNvbC5maWVsZDtcbiAgICBjb25zdCByb3dWYWx1ZSA9IGZpZWxkS2V5ID8gdGhpcy5yZXNvbHZlVmFsdWUocm93LCBmaWVsZEtleSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5hY3Rpb24uZW1pdCh7IHJvdywgY29sdW1uOiBjb2wsIHZhbHVlOiB7IHJvd1ZhbHVlLCBhY3Rpb246IGl0ZW0gfSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkJ1dHRvbkNsaWNrKHJvdzogVCwgY29sOiBUYWJsZUNvbHVtbjxUPik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGNvbC5hY3Rpb25GaWVsZCA/PyBjb2wuZmllbGQ7XG4gICAgY29uc3QgdmFsdWUgPSBrZXkgPyB0aGlzLnJlc29sdmVWYWx1ZShyb3csIGtleSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5hY3Rpb24uZW1pdCh7IHJvdywgdmFsdWUsIGNvbHVtbjogY29sIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVDZWxsSWQoY29sOiBUYWJsZUNvbHVtbjxUPiwgcm93OiBUKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFjb2wuY2VsbElkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIGNvbC5jZWxsSWQgPT09ICdmdW5jdGlvbicgPyAoY29sLmNlbGxJZChyb3cpIHx8IG51bGwpIDogKGNvbC5jZWxsSWQgfHwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGNlbGxDZmc8SyBleHRlbmRzIFRhYmxlQ2VsbENvbmZpZ0tleT4oa2luZDogSykge1xuICAgIHJldHVybiB0aGlzLmNlbGxzQ2ZnKClba2luZF07XG4gIH1cblxuICBwcml2YXRlIGVtaXRMYXp5TG9hZCh0cmlnZ2VyOiAncGFnZScgfCAnc29ydCcgfCAnc2VhcmNoJyk6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgIGZpcnN0OiBudW1iZXI7XG4gICAgICByb3dzOiBudW1iZXI7XG4gICAgICBzb3J0RmllbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgc29ydE9yZGVyPzogU29ydE9yZGVyO1xuICAgICAgdHJpZ2dlcj86ICdwYWdlJyB8ICdzb3J0JyB8ICdzZWFyY2gnO1xuICAgICAgc2VhcmNoVGVybT86IHN0cmluZztcbiAgICB9ID0ge1xuICAgICAgZmlyc3Q6IHRoaXMuZmlyc3QoKSxcbiAgICAgIHJvd3M6IHRoaXMucm93cygpLFxuICAgICAgc29ydEZpZWxkOiB0aGlzLnNvcnRGaWVsZCgpLFxuICAgICAgc29ydE9yZGVyOiB0aGlzLnNvcnRPcmRlcigpLFxuICAgICAgdHJpZ2dlclxuICAgIH07XG5cbiAgICBpZiAodHJpZ2dlciA9PT0gJ3NlYXJjaCcpIHtcbiAgICAgIHBheWxvYWQuc2VhcmNoVGVybSA9IHRoaXMuZ2xvYmFsRmlsdGVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXp5TG9hZC5lbWl0KHBheWxvYWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcFBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dQYWdpbmF0b3IoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heEZpcnN0ID0gTWF0aC5tYXgoSU5ERVhfWkVSTywgdGhpcy50b3RhbFJlY29yZHMoKSAtIHRoaXMucm93cygpKTtcblxuICAgIGlmICh0aGlzLmZpcnN0KCkgPiBtYXhGaXJzdCkge1xuICAgICAgdGhpcy5maXJzdC5zZXQoSU5ERVhfWkVSTyk7XG4gICAgfVxuICB9XG5cbiAgLy8gTk9URTogaW4gYGFwaWAgbW9kZSAoYGNvbmZpZy50YWJsZS5tb2RlID09PSAnYXBpJ2AsIHVzZWQgYnkgY29uc3VtZXJzIGxpa2Ugc2RjLWxvb2t1cCB0aGF0XG4gIC8vIGZldGNoIGVhY2ggcGFnZSBleHRlcm5hbGx5KSwgYGRhdGFgIGlzIHN3YXBwZWQgZW50aXJlbHkgb24gZXZlcnkgcGFnZS9zZWFyY2ggY2hhbmdlIGFuZFxuICAvLyBvbmx5IGV2ZXIgcmVwcmVzZW50cyBPTkUgcGFnZSdzIHdvcnRoIG9mIHJvd3MuIFByZXZpb3VzbHksIGFueSBzZWxlY3RlZCByb3cgbm90IGZvdW5kIGluXG4gIC8vIHRoZSBjdXJyZW50IGBkYXRhYCBhcnJheSB3YXMgdHJlYXRlZCBhcyBcIm5vIGxvbmdlciBleGlzdHNcIiBhbmQgc2lsZW50bHkgZHJvcHBlZCDigJQgd2hpY2hcbiAgLy8gd2lwZWQgb3V0IGNyb3NzLXBhZ2Ugc2VsZWN0aW9ucyB0aGUgbW9tZW50IHRoZSB1c2VyIG5hdmlnYXRlZCB0byBhbm90aGVyIHBhZ2UuIEluIGBhcGlgXG4gIC8vIG1vZGUgd2Ugbm93IHByZXNlcnZlIHNlbGVjdGlvbnMgZm9yIHJvd3Mgbm90IHByZXNlbnQgb24gdGhlIGN1cnJlbnQgcGFnZS4gSW4gYGxvY2FsYCBtb2RlLFxuICAvLyBgZGF0YWAgaXMgZXhwZWN0ZWQgdG8gcmVwcmVzZW50IHRoZSBmdWxsL2N1cnJlbnQgZGF0YXNldCwgc28gdGhlIG9yaWdpbmFsIFwiZHJvcCB3aGF0J3Mgbm90XG4gIC8vIHRoZXJlXCIgYmVoYXZpb3IgaXMga2VwdCAoYSBjb25zdW1lciBzd2FwcGluZyB0byBhIGdlbnVpbmVseSBkaWZmZXJlbnQgZGF0YXNldCBzaG91bGQgc3RpbGxcbiAgLy8gY2xlYXIgc3RhbGUgc2VsZWN0aW9ucykuXG4gIHByaXZhdGUgcmVjb25jaWxlU2VsZWN0aW9uV2l0aERhdGEoKTogdm9pZCB7XG4gICAgY29uc3QgaXNBcGlNb2RlID0gdGhpcy5pc0FwaU1vZGUoKTtcbiAgICBjb25zdCByb3dzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuZGF0YVNpZ25hbCgpKSB7XG4gICAgICBjb25zdCByb3dLZXkgPSB0aGlzLmdldFNlbGVjdGlvbktleShyb3cpO1xuXG4gICAgICBpZiAoIXJvd3NCeUtleS5oYXMocm93S2V5KSkge1xuICAgICAgICByb3dzQnlLZXkuc2V0KHJvd0tleSwgcm93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZWVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG5leHRTZWxlY3Rpb246IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5zZWxlY3Rpb25TaWduYWwoKSkge1xuICAgICAgY29uc3Qgcm93S2V5ID0gdGhpcy5nZXRTZWxlY3Rpb25LZXkocm93KTtcblxuICAgICAgaWYgKCFzZWVuS2V5cy5oYXMocm93S2V5KSkge1xuICAgICAgICBjb25zdCBjdXJyZW50UGFnZVJvdyA9IHJvd3NCeUtleS5nZXQocm93S2V5KTtcbiAgICAgICAgY29uc3Qga2VlcFJvdyA9IGN1cnJlbnRQYWdlUm93ID8gIXRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChjdXJyZW50UGFnZVJvdykgOiBpc0FwaU1vZGU7XG5cbiAgICAgICAgaWYgKGtlZXBSb3cpIHtcbiAgICAgICAgICBzZWVuS2V5cy5hZGQocm93S2V5KTtcbiAgICAgICAgICBuZXh0U2VsZWN0aW9uLnB1c2goY3VycmVudFBhZ2VSb3cgPz8gcm93KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKG5leHRTZWxlY3Rpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQWN0aW9uRGlzYWJsZWQoaXRlbTogQWN0aW9uTWVudUl0ZW08VD4sIHJvdzogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgaXRlbS5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW0uZGlzYWJsZWQocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbS5kaXNhYmxlZCA9PT0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0YWJsZVBhZ2VSb3dzKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZURhdGEoKS5maWx0ZXIoKHJvdykgPT4gIXRoaXMuaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU2VsZWN0aW9uKG5leHRTZWxlY3Rpb246IEl0ZXJhYmxlPFQ+KTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplU2VsZWN0aW9uKG5leHRTZWxlY3Rpb24pO1xuXG4gICAgaWYgKHRoaXMuaGFzU2FtZVNlbGVjdGlvbih0aGlzLnNlbGVjdGlvblNpZ25hbCgpLCBub3JtYWxpemVkU2VsZWN0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uU2lnbmFsLnNldChub3JtYWxpemVkU2VsZWN0aW9uKTtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KFsuLi5ub3JtYWxpemVkU2VsZWN0aW9uXSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVNlbGVjdGlvbihuZXh0U2VsZWN0aW9uOiBJdGVyYWJsZTxUPik6IFRbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlbGVjdGlvbjogVFtdID0gW107XG4gICAgY29uc3Qgc2VlblJvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIG5leHRTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHJvd0tleSA9IHRoaXMuZ2V0U2VsZWN0aW9uS2V5KHJvdyk7XG5cbiAgICAgIGNvbnN0IHNob3VsZEFwcGVuZCA9ICFzZWVuUm93cy5oYXMocm93S2V5KSAmJiAhdGhpcy5pc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdyk7XG5cbiAgICAgIGlmIChzaG91bGRBcHBlbmQpIHtcbiAgICAgICAgc2VlblJvd3MuYWRkKHJvd0tleSk7XG4gICAgICAgIG5vcm1hbGl6ZWRTZWxlY3Rpb24ucHVzaChyb3cpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkU2VsZWN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3Rpb25LZXkocm93OiBUKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJvd1NlbGVjdGlvbktleShyb3cpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNTYW1lU2VsZWN0aW9uKGN1cnJlbnRTZWxlY3Rpb246IFRbXSwgbmV4dFNlbGVjdGlvbjogVFtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb24ubGVuZ3RoID09PSBuZXh0U2VsZWN0aW9uLmxlbmd0aFxuICAgICAgJiYgY3VycmVudFNlbGVjdGlvbi5ldmVyeSgocm93LCBpbmRleCkgPT4gcm93ID09PSBuZXh0U2VsZWN0aW9uW2luZGV4XSk7XG4gIH1cblxuICBwcml2YXRlIG5leHRBY3Rpb25zTWVudUlkKCk6IHN0cmluZyB7XG4gICAgdGhpcy5hY3Rpb25zTWVudUlkU2VxdWVuY2UgKz0gMTtcbiAgICByZXR1cm4gYHNkYy10YWJsZS1hY3Rpb25zLW1lbnUtJHt0aGlzLmFjdGlvbnNNZW51SWRTZXF1ZW5jZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0Nsb3NlZE1lbnVUYXJnZXQoXG4gICAgdHJpZ2dlcjogSFRNTEVsZW1lbnQsXG4gICAgbWVudUlkOiBzdHJpbmcsXG4gICAgZm9jdXNUYXJnZXQ6IFRhYmxlTWVudUZvY3VzVGFyZ2V0XG4gICk6IHZvaWQge1xuICAgIGlmICghdHJpZ2dlci5pc0Nvbm5lY3RlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb2N1c1RhcmdldCA9PT0gVGFibGVNZW51Rm9jdXNUYXJnZXQuVHJpZ2dlcikge1xuICAgICAgdHJpZ2dlci5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG93bmVyRG9jdW1lbnQgPSB0cmlnZ2VyLm93bmVyRG9jdW1lbnQ7XG4gICAgY29uc3QgbWVudUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1lbnVJZCk7XG4gICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBnZXRGb2N1c2FibGVFbGVtZW50cyhvd25lckRvY3VtZW50KS5maWx0ZXIoKGVsZW1lbnQpID0+ICFtZW51RWxlbWVudD8uY29udGFpbnMoZWxlbWVudCkpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2YodHJpZ2dlcik7XG5cbiAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldEluZGV4ID0gZm9jdXNUYXJnZXQgPT09IFRhYmxlTWVudUZvY3VzVGFyZ2V0Lk5leHQgPyBjdXJyZW50SW5kZXggKyAxIDogY3VycmVudEluZGV4IC0gMTtcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGZvY3VzYWJsZUVsZW1lbnRzW3RhcmdldEluZGV4XTtcblxuICAgIG5leHRFbGVtZW50Py5mb2N1cygpO1xuICB9XG59XG4iLCI8c2VjdGlvblxuICBjbGFzcz1cInNkYy10YWJsZVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtc3RhY2tdPVwiaXNNb2JpbGUoKVwiXG4gIFtjbGFzcy5zZGMtdGFibGUtZmlsdGVyZWRdPVwiISFnbG9iYWxGaWx0ZXIoKS50cmltKClcIlxuICBbY2xhc3Muc2RjLXRhYmxlLS1sb2FkaW5nXT1cImlzTG9hZGluZ1wiXG4gIFtjbGFzcy5zZGMtdGFibGUtLWluaXRpYWwtbG9hZGluZ109XCJzaG93SW5pdGlhbExvYWRpbmcoKVwiXG4+XG4gIDxzZGMtbG9hZGluZy1zdGF0ZVxuICAgIGNsYXNzPVwic2RjLXRhYmxlLWxvYWRpbmctd3JhcFwiXG4gICAgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgICBbYmxvY2tXaW5kb3ddPVwiZmFsc2VcIlxuICAgIFtibG9ja0RlbGF5TXNdPVwiMFwiXG4gICAgW2luZGljYXRvcl09XCJsb2FkaW5nSW5kaWNhdG9yXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtc2hlbGxcIiBbc3R5bGUuLS1zZGMtdGFibGUtYm9keS1oZWlnaHQucHhdPVwiYm9keVZpZXdwb3J0SGVpZ2h0UHgoKVwiPlxuICAgICAgQGlmIChzaG93U2VhcmNoKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1jYXB0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1jYXB0aW9uX19zZWFyY2hcIiBbY2xhc3Muc2RjLXRhYmxlLWNhcHRpb25fX3NlYXJjaC0tZnVsbC13aWR0aF09XCJzZWFyY2hGdWxsV2lkdGgoKVwiPlxuICAgICAgICAgICAgPHNkYy1zZWFyY2hib3hcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgICAgW3RyaWdnZXJNb2RlXT1cInRyaWdnZXJNb2RlKClcIlxuICAgICAgICAgICAgICAob25TZWFyY2gpPVwib25TZWFyY2hUZXJtKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkNsZWFyU2VhcmNoKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlYXJjaF9maWVsZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoIWlzTW9iaWxlKCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXNjcm9sbFwiXG4gICAgICAgICAgW3N0eWxlLi0tc2RjLXRhYmxlLW1pbi13aWR0aF09XCJpc0ZpdExheW91dCgpID8gJzEwMCUnIDogdGFibGVNaW5XaWR0aFB4KCkgKyAncHgnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0YWJsZVxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZ3JpZFwiXG4gICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWdyaWQtLWZpdF09XCJpc0ZpdExheW91dCgpXCJcbiAgICAgICAgICAgIHJvbGU9XCJ0YWJsZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3djb3VudF09XCJ0b3RhbFJlY29yZHMoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Y29sZ3JvdXA+XG4gICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8Y29sIFtzdHlsZS53aWR0aF09XCJjb2xXaWR0aFN0eWxlKGNvbClcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2NvbGdyb3VwPlxuXG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciByb2xlPVwicm93XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10aC1jdXJyZW5jeV09XCJjb2wudHlwZSA9PT0gJ2N1cnJlbmN5J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYnV0dG9uXT1cImNvbC50eXBlID09PSAnYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGgtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1zb3J0YWJsZV09XCJjYW5Tb3J0Q29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLXNvcnRhYmxlLWRpc2FibGVkXT1cImlzU29ydGFibGVDb2x1bW4oY29sKSAmJiAhY2FuU29ydENvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS1oZWFkZXItZGlzYWJsZWRdPVwiIWhhc0RhdGFSb3dzKClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWlzLXNlbGVjdGVkXT1cInNvcnRGaWVsZCgpID09PSBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbCwgJ2hlYWRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zb3J0XT1cImdldFNvcnRBcmlhQXR0cmlidXRlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJoYXNEYXRhUm93cygpICYmIGNhblNvcnRDb2x1bW4oY29sKSA/IDAgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhaGFzRGF0YVJvd3MoKSB8fCAoaXNTb3J0YWJsZUNvbHVtbihjb2wpICYmICFjYW5Tb3J0Q29sdW1uKGNvbCkpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNTb3J0YWJsZUNvbHVtbihjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfc29ydGFibGVfY29sdW1uJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoY29sLmhlYWRlciB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhc0RhdGFSb3dzKCkgJiYgY29sLmZpZWxkID8gdG9nZ2xlU29ydChjb2wuZmllbGQsIGNhblNvcnRDb2x1bW4oY29sKSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFzRGF0YVJvd3MoKSAmJiBjb2wuZmllbGQgPyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgY2FuU29ydENvbHVtbihjb2wpKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNEYXRhUm93cygpICYmIGNvbC5maWVsZCA/IHRvZ2dsZVNvcnQoY29sLmZpZWxkLCBjYW5Tb3J0Q29sdW1uKGNvbCkpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nICYmIChjZWxsc0NmZygpLmNoZWNrYm94LnNlbGVjdEFsbCA/PyB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGgtaW5uZXIgc2RjLXRhYmxlLXRoLWlubmVyLS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWwgc3Itb25seVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IGNvbC5oZWFkZXIgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS10aC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0U2VsZWN0QWxsQ2hlY2tib3hJZCgkaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc1BhZ2VGdWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzUGFnZVBhcnRpYWxseVNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzU2VsZWN0YWJsZVBhZ2VSb3dzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0UGFnZShnZXRDaGVja2VkVmFsdWUoJGV2ZW50KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVTZWxlY3RQYWdlKCFpc1BhZ2VGdWxseVNlbGVjdGVkKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJnZXRQYWdlU2VsZWN0aW9uQXJpYUNoZWNrZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cImdldFNlbGVjdEFsbENoZWNrYm94SWQoJGluZGV4KVwiIGNsYXNzPVwic3Itb25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NlbGVjdF9hbGxfcm93cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS10aC1pbm5lclwiIFtjbGFzcy5zZGMtdGFibGUtdGgtaW5uZXItLXNvcnRhYmxlXT1cImlzU29ydGFibGVDb2x1bW4oY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGgtbGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBjb2wuaGVhZGVyIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5oZWFkZXJUb29sdGlwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLXRoLXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJjb2wuaGVhZGVyVG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJjb2wuaGVhZGVyVG9vbHRpcFBvc2l0aW9uID8/ICd0b3AnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcEV2ZW50XT1cImNvbC5oZWFkZXJUb29sdGlwRXZlbnQgPz8gJ2hvdmVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNpcmNsZS1pbmZvIHNkYy10YWJsZS10aC10b29sdGlwX19pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NkYy10b29sdGlwPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1zb3J0LW92ZXJsYXlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1zb3J0LWluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5GaWVsZF09XCJjb2wuZmllbGQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtblR5cGVdPVwiY29sLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0RmllbGRdPVwic29ydEZpZWxkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0T3JkZXJdPVwic29ydE9yZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtc29ydC1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cblxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICBAaWYgKHNob3dJbml0aWFsTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic2RjLXRhYmxlLWluaXRpYWwtbG9hZGluZy1yb3dcIiByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyICsgMVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjIHNkYy10YWJsZS10ZC0taW5pdGlhbC1sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbkFsaWduQ2xhc3MoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImNvbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsIHNkYy10YWJsZS10ZC12YWwtLWluaXRpYWwtbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgcGFnZURhdGEoKTsgdHJhY2sgJGluZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInIgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2tlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25Sb3dDbGlja2VkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS10ZCBzZGMtdGFibGUtdGRjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY2hlY2tib3hdPVwiY29sLnR5cGUgPT09ICdjaGVja2JveC1zZWxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtY3VycmVuY3ldPVwiY29sLnR5cGUgPT09ICdjdXJyZW5jeSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy10YWJsZS10ZC1idXR0b25dPVwiY29sLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtdGQtYWN0aW9uc109XCJjb2wudHlwZSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtaXMtc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5BbGlnbkNsYXNzKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXRsZV09XCJjb2wuaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNvbC5jb2xJZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5jZWxsVGFnID09PSAnc3BhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtdGFibGUtdGQtdmFsXCIgW25nU3R5bGVdPVwiY29sLmNlbGxTdHlsZVwiIFthdHRyLmlkXT1cInJlc29sdmVDZWxsSWQoY29sLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1jZWxsLWNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xdPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVJZF09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbCkgPyBvcGVuTWVudVN0YXRlKCk/Lm1lbnVJZCA/PyBudWxsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlUm93KT1cIm9uVG9nZ2xlUm93KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjb2wsICRldmVudC50cmlnZ2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoY29sLmNlbGxUYWcgPT09ICdpJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInNkYy10YWJsZS10ZC12YWxcIiBbbmdTdHlsZV09XCJjb2wuY2VsbFN0eWxlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIGlmIChjb2wuY2VsbFRhZyA9PT0gJ3AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLXRkLXZhbFwiIFtuZ1N0eWxlXT1cImNvbC5jZWxsU3R5bGVcIiBbYXR0ci5pZF09XCJyZXNvbHZlQ2VsbElkKGNvbCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2VsbENvbmZpZ3NdPVwiY2VsbHNDZmcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzb2x2ZVZhbHVlXT1cInJlc29sdmVWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0xhYmVsXT1cImdldFJvd0NoZWNrYm94TGFiZWwocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0aW9uRGlzYWJsZWRdPVwiaXNSb3dTZWxlY3Rpb25EaXNhYmxlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51T3Blbl09XCJpc0FjdGlvbnNNZW51T3Blbihyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbnNNZW51SWRdPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpID8gb3Blbk1lbnVTdGF0ZSgpPy5tZW51SWQgPz8gbnVsbCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVBY3Rpb25zTWVudSk9XCJ0b2dnbGVBY3Rpb25zTWVudSgkZXZlbnQuZXZlbnQsIHJvdywgY29sLCAkZXZlbnQudHJpZ2dlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy10YWJsZS1jZWxsLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgICAgPHNkYy1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICBpZD1cIm15LWVtcHR5LXN0YXRlXCJcbiAgICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZW1wdHlUaXRsZSgpXCJcbiAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cImVtcHR5VGV4dCgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodC5weF09XCJlbXB0eUJvZHlIZWlnaHRQeCgpXCJcbiAgICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAobW9iaWxlTW9kZSgpID09PSAnc3RhY2tlZCcpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1saXN0XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4OyBsZXQgciA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1jYXJkIHNkYy10YWJsZS1tb2JpbGUtY2FyZC0tbG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWZpZWxkIHNkYy10YWJsZS1tb2JpbGUtZmllbGQtLWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwgc2RjLXRhYmxlLW1vYmlsZS1sYWJlbC0tbG9hZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1za2VsZXRvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBwYWdlRGF0YSgpOyB0cmFjayAkaW5kZXg7IGxldCByID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1mdWxsLXdpZHRoXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09PSAnYnV0dG9uJyB8fCBjb2wudHlwZSA9PT0gJ2FjdGlvbnMnIHx8IGNvbC50eXBlID09PSAnY2hlY2tib3gtc2VsZWN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLW1vYmlsZS1maWVsZC0tc2VsZWN0ZWRdPVwic29ydEZpZWxkKCkgPT09IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtbW9iaWxlLWZpZWxkLS1zb3J0YWJsZV09XCJjb2wuZmllbGQgJiYgaXNTb3J0YWJsZUNvbHVtbihjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5maWVsZCAmJiB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobW9iaWxlRmllbGRMYWJlbChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuZmllbGQgJiYgaXNTb3J0YWJsZUNvbHVtbihjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1tb2JpbGUtbGFiZWwgc2RjLXRhYmxlLW1vYmlsZS1sYWJlbC0tc29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgLSAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCdwbGF0Zm9ybS5kYXRhY29yZS5hY2Nlc3NpYmlsaXR5X3NvcnRhYmxlX2NvbHVtbicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwidG9nZ2xlU29ydChjb2wuZmllbGQsIGlzU29ydGFibGVDb2x1bW4oY29sKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB0b2dnbGVTb3J0KGNvbC5maWVsZCwgaXNTb3J0YWJsZUNvbHVtbihjb2wpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy10YWJsZS1zb3J0LWluZGljYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbkZpZWxkXT1cImNvbC5maWVsZCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5UeXBlXT1cImNvbC50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0YWJsZV09XCJpc1NvcnRhYmxlQ29sdW1uKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRGaWVsZF09XCJzb3J0RmllbGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydE9yZGVyXT1cInNvcnRPcmRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtc29ydC1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbW9iaWxlRmllbGRMYWJlbChjb2wpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLXZhbHVlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHVsXG4gICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1saXN0XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRhYmxlQXJpYUxhYmVsS2V5KCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJpc0xvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChzaG93SW5pdGlhbExvYWRpbmcoKSkge1xuICAgICAgICAgICAgQGZvciAocm93SW5kZXggb2YgaW5pdGlhbExvYWRpbmdSb3dzKCk7IHRyYWNrIHJvd0luZGV4KSB7XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWl0ZW0gc2RjLXRhYmxlLWV4cGFuZGFibGUtaXRlbS0tbG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5IHNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnktLWxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLW1vYmlsZS1za2VsZXRvbiBzZGMtdGFibGUtZXhwYW5kYWJsZS1za2VsZXRvbi1wcmltYXJ5XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtbW9iaWxlLXNrZWxldG9uIHNkYy10YWJsZS1leHBhbmRhYmxlLXNrZWxldG9uLXNlY29uZGFyeVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWNoZXZyb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgQGZvciAocm93IG9mIHBhZ2VEYXRhKCk7IHRyYWNrICRpbmRleDsgbGV0IHIgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1pdGVtXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLXRhYmxlLWV4cGFuZGFibGUtaXRlbS0tZXhwYW5kZWRdPVwiaXNSb3dFeHBhbmRlZChyKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJ0b2dnbGVFeHBhbmRSb3cocilcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChjaGVja2JveENvbCgpOyBhcyBjYkNvbCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9yY2VMZWZ0QWxpZ25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNiQ29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsQ29uZmlnc109XCJjZWxsc0NmZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dDaGVja2JveElkXT1cImdldFJvd0NoZWNrYm94SWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93TGFiZWxdPVwiZ2V0Um93Q2hlY2tib3hMYWJlbChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGVkXT1cImlzUm93U2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uc01lbnVPcGVuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZVJvdyk9XCJvblRvZ2dsZVJvdyhyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRyaWdnZXJCdXR0b25BY3Rpb24pPVwib25CdXR0b25DbGljayhyb3csIGNiQ29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRPdmVyZmxvd109XCJkZWZhdWx0VGV4dE92ZXJmbG93KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvZ2dsZUFjdGlvbnNNZW51KT1cInRvZ2dsZUFjdGlvbnNNZW51KCRldmVudC5ldmVudCwgcm93LCBjYkNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2Ygc3VtbWFyeUNvbHMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXN1bW1hcnktZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtc3VtbWFyeS1sYWJlbFwiPnt7IG1vYmlsZUZpZWxkTGFiZWwoY29sKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1zdW1tYXJ5LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtdGFibGUtY2VsbC1jb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXNvbHZlVmFsdWVdPVwicmVzb2x2ZVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93Q2hlY2tib3hJZF09XCJnZXRSb3dDaGVja2JveElkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3Rpb25EaXNhYmxlZF09XCJpc1Jvd1NlbGVjdGlvbkRpc2FibGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dTZWxlY3RlZF09XCJpc1Jvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJpZ2dlckJ1dHRvbkFjdGlvbik9XCJvbkJ1dHRvbkNsaWNrKHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0T3ZlcmZsb3ddPVwiZGVmYXVsdFRleHRPdmVyZmxvdygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLXRhYmxlLWNlbGwtY29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc1Jvd0V4cGFuZGVkKHIpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBpc1Jvd0V4cGFuZGVkKHIpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICgncGxhdGZvcm0uZGF0YWNvcmUuYWNjZXNzaWJpbGl0eV9jb2xsYXBzZV9yb3cnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ3BsYXRmb3JtLmRhdGFjb3JlLmFjY2Vzc2liaWxpdHlfZXhwYW5kX3JvdycgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZUV4cGFuZFJvdyhyKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlRXhwYW5kUm93KHIpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdG9nZ2xlRXhwYW5kUm93KHIpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWNoZXZyb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtZXhwYW5kYWJsZS1jaGV2cm9uLS1vcGVuXT1cImlzUm93RXhwYW5kZWQocilcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChpc1Jvd0V4cGFuZGVkKHIpKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wudHlwZSAhPT0gJ2NoZWNrYm94LXNlbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZXhwYW5kYWJsZS1maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtdGFibGUtZXhwYW5kYWJsZS1maWVsZC0tZnVsbC13aWR0aF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PT0gJ2J1dHRvbicgfHwgY29sLnR5cGUgPT09ICdhY3Rpb25zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC50eXBlICE9PSAnYnV0dG9uJyAmJiBjb2wudHlwZSAhPT0gJ2FjdGlvbnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLXRhYmxlLWV4cGFuZGFibGUtbGFiZWxcIj57eyBtb2JpbGVGaWVsZExhYmVsKGNvbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy10YWJsZS1leHBhbmRhYmxlLXZhbHVlXCIgW2F0dHIuaWRdPVwicmVzb2x2ZUNlbGxJZChjb2wsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLXRhYmxlLWNlbGwtY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvcmNlTGVmdEFsaWduXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbF09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxDb25maWdzXT1cImNlbGxzQ2ZnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc29sdmVWYWx1ZV09XCJyZXNvbHZlVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0NoZWNrYm94SWRdPVwiZ2V0Um93Q2hlY2tib3hJZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dMYWJlbF09XCJnZXRSb3dDaGVja2JveExhYmVsKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbkRpc2FibGVkXT1cImlzUm93U2VsZWN0aW9uRGlzYWJsZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93U2VsZWN0ZWRdPVwiaXNSb3dTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudU9wZW5dPVwiaXNBY3Rpb25zTWVudU9wZW4ocm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25zTWVudUlkXT1cImlzQWN0aW9uc01lbnVPcGVuKHJvdywgY29sKSA/IG9wZW5NZW51U3RhdGUoKT8ubWVudUlkID8/IG51bGwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVSb3cpPVwib25Ub2dnbGVSb3cocm93LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmlnZ2VyQnV0dG9uQWN0aW9uKT1cIm9uQnV0dG9uQ2xpY2socm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dE92ZXJmbG93XT1cImRlZmF1bHRUZXh0T3ZlcmZsb3coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQWN0aW9uc01lbnUpPVwidG9nZ2xlQWN0aW9uc01lbnUoJGV2ZW50LmV2ZW50LCByb3csIGNvbCwgJGV2ZW50LnRyaWdnZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGFibGUtY2VsbC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC91bD5cblxuICAgICAgICBAaWYgKCFpc0xvYWRpbmcgJiYgb3B0aW9ucygpLmVtcHR5Py5zaG93ICE9PSBmYWxzZSAmJiB0b3RhbFJlY29yZHMoKSA9PT0gMCkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGlkPVwibXktZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtaW5ib3hcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImVtcHR5VGl0bGUoKVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlUZXh0KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtdGFibGUtZW1wdHktc3RhdGVcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHQucHhdPVwiZW1wdHlCb2R5SGVpZ2h0UHgoKVwiXG4gICAgICAgICAgPjwvc2RjLWVtcHR5LXN0YXRlPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd1BhZ2luYXRvcigpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtdGFibGUtcGFnaW5hdG9yXCI+XG4gICAgICAgICAgPHNkYy1wYWdpbmF0b3JcbiAgICAgICAgICAgIFtmaXJzdF09XCJmaXJzdCgpXCJcbiAgICAgICAgICAgIFtyb3dzXT1cInJvd3MoKVwiXG4gICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiaXNNb2JpbGUoKSA/IFtdIDogcm93c1BlclBhZ2VPcHRpb25zKClcIlxuICAgICAgICAgICAgW3Nob3dSb3dzUGVyUGFnZVNlbGVjdG9yXT1cInNob3dSb3dzUGVyUGFnZVNlbGVjdG9yKClcIlxuICAgICAgICAgICAgW2lzTW9iaWxlXT1cImlzTW9iaWxlKClcIlxuICAgICAgICAgICAgW3RvdGFsUmVjb3Jkc0xhYmVsXT1cInRvdGFsUmVjb3Jkc0xhYmVsKClcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgID48L3NkYy1wYWdpbmF0b3I+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L3NkYy1sb2FkaW5nLXN0YXRlPlxuPC9zZWN0aW9uPlxuXG5AaWYgKG9wZW5NZW51U3RhdGUoKTsgYXMgbWVudSkge1xuICA8c2RjLXRhYmxlLWFjdGlvbnMtbWVudVxuICAgIFtpdGVtc109XCJtZW51Lml0ZW1zXCJcbiAgICBbbWVudUlkXT1cIm1lbnUubWVudUlkXCJcbiAgICBbdG9wXT1cIm1lbnUudG9wXCJcbiAgICBbbGVmdF09XCJtZW51LmxlZnRcIlxuICAgIFt3aWR0aF09XCJtZW51LndpZHRoXCJcbiAgICAoY2xvc2UpPVwib25NZW51Q2xvc2UoJGV2ZW50KVwiXG4gICAgKHNlbGVjdCk9XCJvblBvcnRhbEFjdGlvbkNsaWNrKCRldmVudClcIlxuICA+PC9zZGMtdGFibGUtYWN0aW9ucy1tZW51PlxufVxuIl19
|