@aquera/ngx-smart-table 0.0.3-alpha → 0.0.5-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/editors/nile-calendar-editor.mjs +2 -5
- package/esm2020/lib/editors/nile-date-picker-editor.mjs +38 -77
- package/esm2020/lib/editors/nile-select-editor.mjs +2 -1
- package/esm2020/lib/models/cell-strategies.interface.mjs +1 -1
- package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +10 -4
- package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +2 -2
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +18 -10
- package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +15 -17
- package/fesm2015/aquera-ngx-smart-table.mjs +438 -468
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -1
- package/fesm2020/aquera-ngx-smart-table.mjs +429 -458
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -1
- package/lib/editors/nile-calendar-editor.d.ts +1 -2
- package/lib/editors/nile-date-picker-editor.d.ts +6 -4
- package/lib/editors/nile-select-editor.d.ts +1 -0
- package/lib/models/cell-strategies.interface.d.ts +7 -0
- package/package.json +1 -1
|
@@ -14,13 +14,12 @@ import * as i3 from "../../../services/virtual-scroll.service";
|
|
|
14
14
|
import * as i4 from "../st-pagination/st-pagination.component";
|
|
15
15
|
import * as i5 from "../st-column-menu/st-column-menu.component";
|
|
16
16
|
import * as i6 from "../st-row-actions-dropdown/st-row-actions-dropdown.component";
|
|
17
|
-
import * as i7 from "../st-
|
|
18
|
-
import * as i8 from "../st-
|
|
19
|
-
import * as i9 from "../st-
|
|
20
|
-
import * as i10 from "
|
|
21
|
-
import * as i11 from "
|
|
22
|
-
import * as i12 from "../../directives/st-
|
|
23
|
-
import * as i13 from "../../directives/st-column-resize.directive";
|
|
17
|
+
import * as i7 from "../st-header/st-header.component";
|
|
18
|
+
import * as i8 from "../st-table-actions/st-table-actions.component";
|
|
19
|
+
import * as i9 from "../st-cell/st-cell.component";
|
|
20
|
+
import * as i10 from "@angular/common";
|
|
21
|
+
import * as i11 from "../../directives/st-keyboard-navigation.directive";
|
|
22
|
+
import * as i12 from "../../directives/st-column-resize.directive";
|
|
24
23
|
export class StTableComponent {
|
|
25
24
|
constructor(schemaValidator, logger, virtualScrollService) {
|
|
26
25
|
this.schemaValidator = schemaValidator;
|
|
@@ -170,6 +169,15 @@ export class StTableComponent {
|
|
|
170
169
|
// Update visible columns and cell grid
|
|
171
170
|
this.updateVisibleData();
|
|
172
171
|
}
|
|
172
|
+
// Handle tableState input changes (when external state is provided, e.g., in workbook)
|
|
173
|
+
if (changes['tableState'] && !changes['tableState'].firstChange && this.tableState) {
|
|
174
|
+
// Unsubscribe from old tableState's focus observable to prevent memory leaks
|
|
175
|
+
this.focusSubscription?.unsubscribe();
|
|
176
|
+
// Reinitialize keyboard navigation with new tableState
|
|
177
|
+
if (this.isKeyboardNavigationEnabled()) {
|
|
178
|
+
this.initializeKeyboardNavigation();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
173
181
|
// Recalculate virtual scroll when data changes
|
|
174
182
|
if ((changes['data'] || changes['cellGrid']) && !changes['data']?.firstChange) {
|
|
175
183
|
if (this.isVirtualScrollEnabled()) {
|
|
@@ -1194,10 +1202,10 @@ export class StTableComponent {
|
|
|
1194
1202
|
}
|
|
1195
1203
|
}
|
|
1196
1204
|
StTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StTableComponent, deps: [{ token: i1.JsonSchemaValidatorService }, { token: i2.ValidationLoggerService }, { token: i3.VirtualScrollService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1197
|
-
StTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StTableComponent, selector: "st-table", inputs: { tableConfig: "tableConfig", data: "data", data$: "data$", tableState: "tableState", enableSorting: "enableSorting", enableFiltering: "enableFiltering", validateConfig: "validateConfig" }, outputs: { stateChange: "stateChange", dataChange: "dataChange", cellEdit: "cellEdit", cellSave: "cellSave", cellCancel: "cellCancel", cellChange: "cellChange", columnResized: "columnResized", columnMoved: "columnMoved", configValidationErrors: "configValidationErrors", columnAdded: "columnAdded", rowAction: "rowAction", validationStateChange: "validationStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<!-- Top pagination controls -->\n<st-pagination \n *ngIf=\"showTopPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"top\">\n</st-pagination>\n\n<div class=\"st-table\" *ngIf=\"!(mergedConfig.tableSkeleton?.enabled | async)\" \n [ngClass]=\"{\n 'virtual-scroll-enabled': isVirtualScrollEnabled(),\n 'keyboard-navigation-enabled': isKeyboardNavigationEnabled()\n }\"\n [ngStyle]=\"{\n 'max-height.px': !isVirtualScrollEnabled() ? mergedConfig.display?.maxHeight : null\n }\"\n stKeyboardNavigation\n [tableState]=\"getActiveTableState()\" \n [attr.tabindex]=\"isKeyboardNavigationEnabled() ? 0 : -1\"\n (focus)=\"onTableContainerFocus($event)\"\n [attr.title]=\"isKeyboardNavigationEnabled() ? 'Click a cell or press Tab to start keyboard navigation' : null\">\n <!-- Unified Table Actions Menu -->\n\n <!-- Virtual scroll viewport wrapper -->\n <div class=\"st-scroll-viewport\" #scrollViewport *ngIf=\"isVirtualScrollEnabled()\"\n [ngStyle]=\"{ 'height.px': getVirtualScrollViewportHeight() }\">\n\n <!-- Spacer to create scrollable area -->\n <div class=\"st-scroll-spacer\" [ngStyle]=\"{ 'height.px': virtualScrollTotalHeight$ | async }\">\n </div>\n\n <!-- Table positioner with transform (instead of tbody) -->\n <div class=\"st-table-positioner\" [ngStyle]=\"{ transform: 'translateY(' + (virtualScrollOffsetY$ | async) + 'px)' }\">\n <!-- Table with only visible rows -->\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'virtual',\n theadStyle: { top: (virtualScrollOffsetYNeg$ | async) + 'px' }\n }\"></ng-container>\n </div>\n </div>\n \n <!-- Standard table (when virtual scroll disabled) -->\n <ng-container *ngIf=\"!isVirtualScrollEnabled()\">\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'standard',\n theadStyle: null\n }\"></ng-container>\n </ng-container>\n\n <!-- Shared Column Menu Dropdown -->\n <st-column-menu-dropdown \n [isOpen]=\"columnMenuState.isOpen\"\n [position]=\"columnMenuState.position\"\n [context]=\"columnMenuState.context\"\n (actionClicked)=\"onColumnActionClicked($event)\"\n (closed)=\"closeColumnMenu()\">\n </st-column-menu-dropdown>\n</div>\n\n<ng-container *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\n</ng-container>\n\n<!-- Shared Row Actions Dropdown -->\n<st-row-actions-dropdown [isOpen]=\"dropdownState.isOpen\" [position]=\"dropdownState.position\"\n [context]=\"dropdownState.context\" (actionClicked)=\"onRowActionClicked($event)\" (closed)=\"closeRowActionsDropdown()\">\n</st-row-actions-dropdown>\n\n\n<!-- Bottom pagination controls -->\n<st-pagination \n *ngIf=\"showBottomPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"bottom\">\n</st-pagination>\n\n<!-- Add Column Modal -->\n<st-column-editor-modal *ngIf=\"showColumnModal\" (columnCreated)=\"onColumnCreated($event)\"\n (cancelled)=\"onModalCancelled()\">\n</st-column-editor-modal>\n\n <!-- ========================================== -->\n <!-- REUSABLE TABLE TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #tableTemplate let-mode=\"mode\" let-theadStyle=\"theadStyle\">\n <table class=\"st-table-element\">\n <!-- TABLE HEADER -->\n <thead [ngClass]=\"{ 'sticky': mergedConfig.display?.stickyHeader }\" [ngStyle]=\"theadStyle\">\n <tr>\n <!-- Row Number Header -->\n <th *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-header header-cell sticky-left\"\n [ngStyle]=\"{\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_HEADER_CELL,\n 'width.px': 30\n }\">\n #\n </th>\n <!-- Column Headers -->\n <th \n *ngFor=\"let column of visibleColumns; let colIndex = index; let isFirst = first; let isLast = last\"\n [ngClass]=\"{\n 'header-cell': mode === 'standard',\n 'sticky-left': column.sticky === 'left',\n 'sticky-right': column.sticky === 'right',\n 'sticky-right-first': column.sticky === 'right' && isFirstStickyRight(column.key),\n 'resizable': column.resizable !== false\n }\"\n [ngStyle]=\"{\n position: column.sticky ? 'sticky' : null,\n 'left.px': column.sticky === 'left' ? (column.stickyOffset || 0) : null,\n 'right.px': column.sticky === 'right' ? (column.stickyOffset || 0) : null,\n 'z-index': column.sticky ? ZIndex.STICKY_HEADER_CELL : null,\n 'width.px': column.width\n }\">\n \n <st-header \n [column]=\"column\"\n [columnIndex]=\"colIndex\"\n [isFirstColumn]=\"isFirst\"\n [isLastColumn]=\"isLast\"\n [tableState]=\"getActiveTableState()\"\n [enableSorting]=\"mergedConfig.sorting?.enabled ?? enableSorting\"\n [enableFiltering]=\"mergedConfig.filtering?.enabled ?? enableFiltering\"\n (columnMoved)=\"onColumnMoved($event)\"\n (menuClick)=\"openColumnMenu($event, column, colIndex, isFirst, isLast)\">\n </st-header>\n\n <div \n class=\"resize-handle\" \n stColumnResize\n [column]=\"column\"\n (columnResized)=\"onColumnResized($event)\"\n *ngIf=\"column.resizable !== false\">\n </div>\n </th>\n \n <!-- Settings Column Header -->\n <th \n class=\"settings-column sticky-right\"\n [ngClass]=\"{ 'header-cell': mode === 'standard' }\"\n [ngStyle]=\"{ 'z-index': ZIndex.STICKY_HEADER_CELL }\">\n <div [ngClass]=\"{ 'flex-center': mode === 'virtual', 'header-content': mode === 'standard' }\">\n <st-table-actions \n [tableState]=\"getActiveTableState()\"\n [allowAddColumn]=\"mergedConfig.features?.columnManagement?.allowAdd || false\"\n (addColumnClicked)=\"onAddColumnClick()\">\n </st-table-actions>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- TABLE BODY -->\n <tbody>\n <!-- Virtual Scroll Rows -->\n <ng-container *ngIf=\"mode === 'virtual'\">\n <tr *ngFor=\"let row of visibleRows$ | async; let relativeIndex = index; trackBy: trackByRowIndex\"\n [attr.data-row-index]=\"getAbsoluteRowIndex(relativeIndex)\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{getAbsoluteRowIndex(relativeIndex) + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: getAbsoluteRowIndex(relativeIndex),\n mode: 'virtual',\n relativeIndex: relativeIndex\n }\"></ng-container>\n </tr>\n </ng-container>\n\n <!-- Standard Rows -->\n <ng-container *ngIf=\"mode === 'standard'\">\n <tr *ngFor=\"let row of visibleCellGrid; let rowIndex = index\" [attr.data-row-index]=\"rowIndex\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{rowIndex + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: rowIndex,\n mode: 'standard'\n }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n\n <!-- ========================================== -->\n <!-- REUSABLE BODY CELL TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #bodyCellTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-mode=\"mode\" let-relativeIndex=\"relativeIndex\">\n <!-- Data Cells -->\n <td \n *ngFor=\"let cell of row; let colIndex = index\"\n [ngClass]=\"{\n 'sticky-left': visibleColumns[colIndex]?.sticky === 'left',\n 'sticky-right': visibleColumns[colIndex]?.sticky === 'right',\n 'sticky-right-first': visibleColumns[colIndex]?.sticky === 'right' && visibleColumns[colIndex]?.key && isFirstStickyRight(visibleColumns[colIndex].key),\n 'align-center': visibleColumns[colIndex]?.alignment === 'center',\n 'align-right': visibleColumns[colIndex]?.alignment === 'right',\n 'cell-focused': cell.isFocused()\n }\"\n [ngStyle]=\"{\n position: visibleColumns[colIndex]?.sticky ? 'sticky' : null,\n 'left.px': visibleColumns[colIndex]?.sticky === 'left' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'right.px': visibleColumns[colIndex]?.sticky === 'right' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'z-index': visibleColumns[colIndex]?.sticky ? ZIndex.STICKY_BODY_CELL : null,\n 'width.px': visibleColumns[colIndex]?.width,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\"\n (click)=\"isKeyboardNavigationEnabled() ? onCellClick(rowIndex, colIndex) : null\">\n \n <!-- Virtual Scroll Cell -->\n <st-cell \n *ngIf=\"mode === 'virtual'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\" \n [editMode]=\"getEditModeForCells()\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellEdit)=\"onCellEdit($event)\" \n (cellSave)=\"onCellSave($event)\"\n (cellSaveAndNavigate)=\"onCellSaveAndNavigate($event)\" \n (cellCancel)=\"onCellCancel($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n\n <!-- Standard Cell -->\n <st-cell \n *ngIf=\"mode === 'standard'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellSave)=\"onCellSave($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n </td>\n \n <!-- Row Actions Cell -->\n <td class=\"settings-column\"\n [ngClass]=\"{\n 'has-actions': hasRowActions()\n }\"\n [ngStyle]=\"{\n position: hasRowActions() ? 'sticky' : null,\n 'right.px': hasRowActions() ? 0 : null,\n 'z-index': hasRowActions() ? ZIndex.STICKY_BODY_CELL : null\n }\">\n <button \n *ngIf=\"hasRowActions()\"\n class=\"settings-trigger\"\n (click)=\"openRowActionsDropdown($event, getRowData(rowIndex), rowIndex)\"\n type=\"button\" \n aria-label=\"Row actions\">\n \u22EF\n </button>\n </td>\n </ng-template>\n\n<ng-template #skeletonLoader>\n <div class=\"list-row\" *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <div *ngFor=\"let i of skeletonColumns\" class=\"list-content\">\n <nile-skeleton-loader variant=\"text\" width=\"90%\" height=\"18\" *ngFor=\"let j of skeletonRows\"></nile-skeleton-loader>\n </div>\n </div>\n</ng-template>", styles: [".st-table{width:100%;overflow:auto;position:relative;height:100%;max-height:30rem;border-radius:4px;border:1px solid #E6E9EB}.st-table st-table-actions{position:sticky;right:0}.st-table.keyboard-navigation-enabled{cursor:pointer}.st-table.keyboard-navigation-enabled:focus{outline:none;box-shadow:0 0 0 2px #3b82f64d}.st-table.keyboard-navigation-enabled td.cell-focused{outline:2px solid #4299e1;outline-offset:-1px;position:relative;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:focus{outline:2px solid #4299e1;outline-offset:-1px;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:has(.st-cell.editing){box-shadow:0 0 0 4px #2563eb26}.st-table.virtual-scroll-enabled{overflow-x:visible;margin:0;border:1px solid #E6E9EB;border-collapse:collapse}.st-table.virtual-scroll-enabled .st-scroll-viewport{position:relative;overflow-y:auto;overflow-x:auto;scroll-behavior:smooth}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-scroll-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none;z-index:-1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-positioner{position:absolute;top:0;left:0;right:0;will-change:transform}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element{position:relative;width:100%;border-collapse:collapse;border-spacing:0;background-color:#fff;table-layout:fixed}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;border:none;background-color:#fff;will-change:top;border-right:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;border-right:1px solid #E6E9EB!important}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr{border-bottom:1px solid #E6E9EB;transition:background-color .15s;height:2rem;box-sizing:border-box}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr:last-child{border-bottom:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td{padding:0;vertical-align:middle;box-sizing:border-box;height:2rem;border:1px solid #E6E9EB;border-left:none;background-color:#fff}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-center{text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-right{text-align:right}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;border-right:1px solid #E6E9EB!important}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column{width:2rem;text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger:focus{outline:2px solid #4299e1;outline-offset:2px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table:not(.virtual-scroll-enabled) .st-table-element{width:100%;height:100%;overflow:auto;border-collapse:collapse;table-layout:fixed}.st-table:not(.virtual-scroll-enabled) .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;background-color:#fff;border-right:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left{position:sticky;left:0;border-right:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right{position:sticky;right:0;border-left:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column){box-shadow:-2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;border-right:none;position:sticky;right:0}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr{height:2rem;box-sizing:border-box}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr:last-child{border-bottom:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td{padding:0;vertical-align:middle;height:2rem;background-color:#fff;border:1px solid #E6E9EB;border-left:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-center{text-align:center}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-right{text-align:right}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;border-right:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;border-left:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column){box-shadow:-2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column{position:sticky;right:0;width:2rem;text-align:center;border-right:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content{display:flex;height:2rem;align-items:center}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content .table-header-text{flex-grow:1;padding-left:4px}.st-table:not(.virtual-scroll-enabled) .st-table-element .settings-column>.header-content{display:flex;align-items:center;justify-content:center}.flex-center{display:flex;align-items:center;justify-content:center}.list-row{padding:1rem}.list-row .list-content{display:flex;justify-content:space-evenly;gap:4px;margin-bottom:1rem}\n"], components: [{ type: i4.StPaginationComponent, selector: "st-pagination", inputs: ["tableState", "tableConfig", "position"] }, { type: i5.StColumnMenuDropdownComponent, selector: "st-column-menu-dropdown", inputs: ["isOpen", "position", "context"], outputs: ["actionClicked", "closed"] }, { type: i6.StRowActionsDropdownComponent, selector: "st-row-actions-dropdown", inputs: ["isOpen", "position", "context"], outputs: ["actionClicked", "closed"] }, { type: i7.StColumnEditorModalComponent, selector: "st-column-editor-modal", outputs: ["columnCreated", "cancelled"] }, { type: i8.StHeaderComponent, selector: "st-header", inputs: ["column", "columnIndex", "isFirstColumn", "isLastColumn", "tableState", "enableSorting", "enableFiltering"], outputs: ["sortToggle", "filterChange", "columnMoved", "menuClick"] }, { type: i9.StTableActionsComponent, selector: "st-table-actions", inputs: ["tableState", "allowAddColumn"], outputs: ["addColumnClicked"] }, { type: i10.StCellComponent, selector: "st-cell", inputs: ["cell", "editMode", "tableState", "tableConfig", "columnIndex"], outputs: ["cellChange", "cellEdit", "cellSave", "cellCancel", "cellSaveAndNavigate"] }], directives: [{ type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.StKeyboardNavigationDirective, selector: "[stKeyboardNavigation]", inputs: ["tableState"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.StColumnResizeDirective, selector: "[stColumnResize]", inputs: ["column"], outputs: ["columnResized"] }], pipes: { "async": i11.AsyncPipe } });
|
|
1205
|
+
StTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StTableComponent, selector: "st-table", inputs: { tableConfig: "tableConfig", data: "data", data$: "data$", tableState: "tableState", enableSorting: "enableSorting", enableFiltering: "enableFiltering", validateConfig: "validateConfig" }, outputs: { stateChange: "stateChange", dataChange: "dataChange", cellEdit: "cellEdit", cellSave: "cellSave", cellCancel: "cellCancel", cellChange: "cellChange", columnResized: "columnResized", columnMoved: "columnMoved", configValidationErrors: "configValidationErrors", columnAdded: "columnAdded", rowAction: "rowAction", validationStateChange: "validationStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<!-- Top pagination controls -->\n<st-pagination \n *ngIf=\"showTopPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"top\">\n</st-pagination>\n\n<div class=\"st-table\" *ngIf=\"!(mergedConfig.tableSkeleton?.enabled | async)\" \n [ngClass]=\"{\n 'virtual-scroll-enabled': isVirtualScrollEnabled(),\n 'keyboard-navigation-enabled': isKeyboardNavigationEnabled()\n }\"\n [ngStyle]=\"{\n 'max-height.px': !isVirtualScrollEnabled() ? mergedConfig.display?.maxHeight : null\n }\"\n stKeyboardNavigation\n [tableState]=\"getActiveTableState()\" \n [attr.tabindex]=\"isKeyboardNavigationEnabled() ? 0 : -1\"\n (focus)=\"onTableContainerFocus($event)\"\n [attr.title]=\"isKeyboardNavigationEnabled() ? 'Click a cell or press Tab to start keyboard navigation' : null\">\n <!-- Unified Table Actions Menu -->\n\n <!-- Virtual scroll viewport wrapper -->\n <div class=\"st-scroll-viewport\" #scrollViewport *ngIf=\"isVirtualScrollEnabled()\"\n [ngStyle]=\"{ 'height.px': getVirtualScrollViewportHeight() }\">\n\n <!-- Spacer to create scrollable area -->\n <div class=\"st-scroll-spacer\" [ngStyle]=\"{ 'height.px': virtualScrollTotalHeight$ | async }\">\n </div>\n\n <!-- Table positioner with transform (instead of tbody) -->\n <div class=\"st-table-positioner\" [ngStyle]=\"{ transform: 'translateY(' + (virtualScrollOffsetY$ | async) + 'px)' }\">\n <!-- Table with only visible rows -->\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'virtual',\n theadStyle: { top: (virtualScrollOffsetYNeg$ | async) + 'px' }\n }\"></ng-container>\n </div>\n </div>\n \n <!-- Standard table (when virtual scroll disabled) -->\n <ng-container *ngIf=\"!isVirtualScrollEnabled()\">\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'standard',\n theadStyle: null\n }\"></ng-container>\n </ng-container>\n\n <!-- Shared Column Menu Dropdown -->\n <st-column-menu-dropdown \n [isOpen]=\"columnMenuState.isOpen\"\n [position]=\"columnMenuState.position\"\n [context]=\"columnMenuState.context\"\n (actionClicked)=\"onColumnActionClicked($event)\"\n (closed)=\"closeColumnMenu()\">\n </st-column-menu-dropdown>\n</div>\n\n<ng-container *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\n</ng-container>\n\n<!-- Shared Row Actions Dropdown -->\n<st-row-actions-dropdown [isOpen]=\"dropdownState.isOpen\" [position]=\"dropdownState.position\"\n [context]=\"dropdownState.context\" (actionClicked)=\"onRowActionClicked($event)\" (closed)=\"closeRowActionsDropdown()\">\n</st-row-actions-dropdown>\n\n\n<!-- Bottom pagination controls -->\n<st-pagination \n *ngIf=\"showBottomPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"bottom\">\n</st-pagination>\n\n\n <!-- ========================================== -->\n <!-- REUSABLE TABLE TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #tableTemplate let-mode=\"mode\" let-theadStyle=\"theadStyle\">\n <table class=\"st-table-element\">\n <!-- TABLE HEADER -->\n <thead [ngClass]=\"{ 'sticky': mergedConfig.display?.stickyHeader }\" [ngStyle]=\"theadStyle\">\n <tr>\n <!-- Row Number Header -->\n <th *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-header header-cell sticky-left\"\n [ngStyle]=\"{\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_HEADER_CELL,\n 'width.px': 30\n }\">\n #\n </th>\n <!-- Column Headers -->\n <th \n *ngFor=\"let column of visibleColumns; let colIndex = index; let isFirst = first; let isLast = last\"\n [ngClass]=\"{\n 'header-cell': mode === 'standard',\n 'sticky-left': column.sticky === 'left',\n 'sticky-right': column.sticky === 'right',\n 'sticky-right-first': column.sticky === 'right' && isFirstStickyRight(column.key),\n 'resizable': column.resizable !== false\n }\"\n [ngStyle]=\"{\n position: column.sticky ? 'sticky' : null,\n 'left.px': column.sticky === 'left' ? (column.stickyOffset || 0) : null,\n 'right.px': column.sticky === 'right' ? (column.stickyOffset || 0) : null,\n 'z-index': column.sticky ? ZIndex.STICKY_HEADER_CELL : null,\n 'width.px': column.width\n }\">\n \n <st-header \n [column]=\"column\"\n [columnIndex]=\"colIndex\"\n [isFirstColumn]=\"isFirst\"\n [isLastColumn]=\"isLast\"\n [tableState]=\"getActiveTableState()\"\n [enableSorting]=\"mergedConfig.sorting?.enabled ?? enableSorting\"\n [enableFiltering]=\"mergedConfig.filtering?.enabled ?? enableFiltering\"\n (columnMoved)=\"onColumnMoved($event)\"\n (menuClick)=\"openColumnMenu($event, column, colIndex, isFirst, isLast)\">\n </st-header>\n\n <div \n class=\"resize-handle\" \n stColumnResize\n [column]=\"column\"\n (columnResized)=\"onColumnResized($event)\"\n *ngIf=\"column.resizable !== false\">\n </div>\n </th>\n \n <!-- Settings Column Header -->\n <th \n class=\"settings-column sticky-right\"\n [ngClass]=\"{ 'header-cell': mode === 'standard' }\"\n [ngStyle]=\"{ 'z-index': ZIndex.STICKY_HEADER_CELL }\">\n <div [ngClass]=\"{ 'flex-center': mode === 'virtual', 'header-content': mode === 'standard' }\">\n <st-table-actions \n [tableState]=\"getActiveTableState()\"\n [allowAddColumn]=\"mergedConfig.features?.columnManagement?.allowAdd || false\"\n (addColumnClicked)=\"onAddColumnClick()\">\n </st-table-actions>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- TABLE BODY -->\n <tbody>\n <!-- Virtual Scroll Rows -->\n <ng-container *ngIf=\"mode === 'virtual'\">\n <tr *ngFor=\"let row of visibleRows$ | async; let relativeIndex = index; trackBy: trackByRowIndex\"\n [attr.data-row-index]=\"getAbsoluteRowIndex(relativeIndex)\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{getAbsoluteRowIndex(relativeIndex) + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: getAbsoluteRowIndex(relativeIndex),\n mode: 'virtual',\n relativeIndex: relativeIndex\n }\"></ng-container>\n </tr>\n </ng-container>\n\n <!-- Standard Rows -->\n <ng-container *ngIf=\"mode === 'standard'\">\n <tr *ngFor=\"let row of visibleCellGrid; let rowIndex = index\" [attr.data-row-index]=\"rowIndex\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{rowIndex + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: rowIndex,\n mode: 'standard'\n }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n\n <!-- ========================================== -->\n <!-- REUSABLE BODY CELL TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #bodyCellTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-mode=\"mode\" let-relativeIndex=\"relativeIndex\">\n <!-- Data Cells -->\n <td \n *ngFor=\"let cell of row; let colIndex = index\"\n [ngClass]=\"{\n 'sticky-left': visibleColumns[colIndex]?.sticky === 'left',\n 'sticky-right': visibleColumns[colIndex]?.sticky === 'right',\n 'sticky-right-first': visibleColumns[colIndex]?.sticky === 'right' && visibleColumns[colIndex]?.key && isFirstStickyRight(visibleColumns[colIndex].key),\n 'align-center': visibleColumns[colIndex]?.alignment === 'center',\n 'align-right': visibleColumns[colIndex]?.alignment === 'right',\n 'cell-focused': cell.isFocused()\n }\"\n [ngStyle]=\"{\n position: visibleColumns[colIndex]?.sticky ? 'sticky' : null,\n 'left.px': visibleColumns[colIndex]?.sticky === 'left' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'right.px': visibleColumns[colIndex]?.sticky === 'right' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'z-index': visibleColumns[colIndex]?.sticky ? ZIndex.STICKY_BODY_CELL : null,\n 'width.px': visibleColumns[colIndex]?.width,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\"\n (click)=\"isKeyboardNavigationEnabled() ? onCellClick(rowIndex, colIndex) : null\">\n \n <!-- Virtual Scroll Cell -->\n <st-cell \n *ngIf=\"mode === 'virtual'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\" \n [editMode]=\"getEditModeForCells()\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellEdit)=\"onCellEdit($event)\" \n (cellSave)=\"onCellSave($event)\"\n (cellSaveAndNavigate)=\"onCellSaveAndNavigate($event)\" \n (cellCancel)=\"onCellCancel($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n\n <!-- Standard Cell -->\n <st-cell \n *ngIf=\"mode === 'standard'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellSave)=\"onCellSave($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n </td>\n \n <!-- Row Actions Cell -->\n <td class=\"settings-column\"\n [ngClass]=\"{\n 'has-actions': hasRowActions()\n }\"\n [ngStyle]=\"{\n position: hasRowActions() ? 'sticky' : null,\n 'right.px': hasRowActions() ? 0 : null,\n 'z-index': hasRowActions() ? ZIndex.STICKY_BODY_CELL : null\n }\">\n <button \n *ngIf=\"hasRowActions()\"\n class=\"settings-trigger\"\n (click)=\"openRowActionsDropdown($event, getRowData(rowIndex), rowIndex)\"\n type=\"button\" \n aria-label=\"Row actions\">\n \u22EF\n </button>\n </td>\n </ng-template>\n\n<ng-template #skeletonLoader>\n <div class=\"list-row\" *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <div *ngFor=\"let i of skeletonColumns\" class=\"list-content\">\n <nile-skeleton-loader variant=\"text\" width=\"90%\" height=\"18\" *ngFor=\"let j of skeletonRows\"></nile-skeleton-loader>\n </div>\n </div>\n</ng-template>", styles: [".st-table{width:100%;overflow:auto;position:relative;height:100%;max-height:30rem;border-radius:4px;border:1px solid #E6E9EB}.st-table st-table-actions{position:sticky;right:0}.st-table.keyboard-navigation-enabled{cursor:pointer}.st-table.keyboard-navigation-enabled:focus{outline:none;box-shadow:0 0 0 2px #3b82f64d}.st-table.keyboard-navigation-enabled td.cell-focused{outline:2px solid #4299e1;outline-offset:-1px;position:relative;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:focus{outline:2px solid #4299e1;outline-offset:-1px;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:has(.st-cell.editing){box-shadow:0 0 0 4px #2563eb26}.st-table.virtual-scroll-enabled{overflow-x:visible;margin:0;border:1px solid #E6E9EB;border-collapse:collapse}.st-table.virtual-scroll-enabled .st-scroll-viewport{position:relative;overflow-y:auto;overflow-x:auto;scroll-behavior:smooth}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-scroll-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none;z-index:-1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-positioner{position:absolute;top:0;left:0;right:0;will-change:transform}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element{position:relative;width:100%;border-collapse:collapse;border-spacing:0;background-color:#fff;table-layout:fixed}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;border:none;background-color:#fff;will-change:top;border-right:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;border-right:1px solid #E6E9EB!important}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr{border-bottom:1px solid #E6E9EB;transition:background-color .15s;height:2rem;box-sizing:border-box}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr:last-child{border-bottom:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td{padding:0;vertical-align:middle;box-sizing:border-box;height:2rem;border:1px solid #E6E9EB;border-left:none;background-color:#fff}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-center{text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-right{text-align:right}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;border-right:1px solid #E6E9EB!important}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column{width:2rem;text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger:focus{outline:2px solid #4299e1;outline-offset:2px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table:not(.virtual-scroll-enabled) .st-table-element{width:100%;height:100%;overflow:auto;border-collapse:collapse;table-layout:fixed}.st-table:not(.virtual-scroll-enabled) .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;background-color:#fff;border-right:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left{position:sticky;left:0;border-right:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right{position:sticky;right:0;border-left:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column){box-shadow:-2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;border-right:none;position:sticky;right:0}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr{height:2rem;box-sizing:border-box}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr:last-child{border-bottom:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td{padding:0;vertical-align:middle;height:2rem;background-color:#fff;border:1px solid #E6E9EB;border-left:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-center{text-align:center}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-right{text-align:right}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;border-right:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;border-left:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column){box-shadow:-2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column{position:sticky;right:0;width:2rem;text-align:center;border-right:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content{display:flex;height:2rem;align-items:center}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content .table-header-text{flex-grow:1;padding-left:4px}.st-table:not(.virtual-scroll-enabled) .st-table-element .settings-column>.header-content{display:flex;align-items:center;justify-content:center}.flex-center{display:flex;align-items:center;justify-content:center}.list-row{padding:1rem}.list-row .list-content{display:flex;justify-content:space-evenly;gap:4px;margin-bottom:1rem}\n"], components: [{ type: i4.StPaginationComponent, selector: "st-pagination", inputs: ["tableState", "tableConfig", "position"] }, { type: i5.StColumnMenuDropdownComponent, selector: "st-column-menu-dropdown", inputs: ["isOpen", "position", "context"], outputs: ["actionClicked", "closed"] }, { type: i6.StRowActionsDropdownComponent, selector: "st-row-actions-dropdown", inputs: ["isOpen", "position", "context"], outputs: ["actionClicked", "closed"] }, { type: i7.StHeaderComponent, selector: "st-header", inputs: ["column", "columnIndex", "isFirstColumn", "isLastColumn", "tableState", "enableSorting", "enableFiltering"], outputs: ["sortToggle", "filterChange", "columnMoved", "menuClick"] }, { type: i8.StTableActionsComponent, selector: "st-table-actions", inputs: ["tableState", "allowAddColumn"], outputs: ["addColumnClicked"] }, { type: i9.StCellComponent, selector: "st-cell", inputs: ["cell", "editMode", "tableState", "tableConfig", "columnIndex"], outputs: ["cellChange", "cellEdit", "cellSave", "cellCancel", "cellSaveAndNavigate"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.StKeyboardNavigationDirective, selector: "[stKeyboardNavigation]", inputs: ["tableState"] }, { type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i10.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.StColumnResizeDirective, selector: "[stColumnResize]", inputs: ["column"], outputs: ["columnResized"] }], pipes: { "async": i10.AsyncPipe } });
|
|
1198
1206
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StTableComponent, decorators: [{
|
|
1199
1207
|
type: Component,
|
|
1200
|
-
args: [{ selector: 'st-table', template: "<!-- Top pagination controls -->\n<st-pagination \n *ngIf=\"showTopPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"top\">\n</st-pagination>\n\n<div class=\"st-table\" *ngIf=\"!(mergedConfig.tableSkeleton?.enabled | async)\" \n [ngClass]=\"{\n 'virtual-scroll-enabled': isVirtualScrollEnabled(),\n 'keyboard-navigation-enabled': isKeyboardNavigationEnabled()\n }\"\n [ngStyle]=\"{\n 'max-height.px': !isVirtualScrollEnabled() ? mergedConfig.display?.maxHeight : null\n }\"\n stKeyboardNavigation\n [tableState]=\"getActiveTableState()\" \n [attr.tabindex]=\"isKeyboardNavigationEnabled() ? 0 : -1\"\n (focus)=\"onTableContainerFocus($event)\"\n [attr.title]=\"isKeyboardNavigationEnabled() ? 'Click a cell or press Tab to start keyboard navigation' : null\">\n <!-- Unified Table Actions Menu -->\n\n <!-- Virtual scroll viewport wrapper -->\n <div class=\"st-scroll-viewport\" #scrollViewport *ngIf=\"isVirtualScrollEnabled()\"\n [ngStyle]=\"{ 'height.px': getVirtualScrollViewportHeight() }\">\n\n <!-- Spacer to create scrollable area -->\n <div class=\"st-scroll-spacer\" [ngStyle]=\"{ 'height.px': virtualScrollTotalHeight$ | async }\">\n </div>\n\n <!-- Table positioner with transform (instead of tbody) -->\n <div class=\"st-table-positioner\" [ngStyle]=\"{ transform: 'translateY(' + (virtualScrollOffsetY$ | async) + 'px)' }\">\n <!-- Table with only visible rows -->\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'virtual',\n theadStyle: { top: (virtualScrollOffsetYNeg$ | async) + 'px' }\n }\"></ng-container>\n </div>\n </div>\n \n <!-- Standard table (when virtual scroll disabled) -->\n <ng-container *ngIf=\"!isVirtualScrollEnabled()\">\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'standard',\n theadStyle: null\n }\"></ng-container>\n </ng-container>\n\n <!-- Shared Column Menu Dropdown -->\n <st-column-menu-dropdown \n [isOpen]=\"columnMenuState.isOpen\"\n [position]=\"columnMenuState.position\"\n [context]=\"columnMenuState.context\"\n (actionClicked)=\"onColumnActionClicked($event)\"\n (closed)=\"closeColumnMenu()\">\n </st-column-menu-dropdown>\n</div>\n\n<ng-container *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\n</ng-container>\n\n<!-- Shared Row Actions Dropdown -->\n<st-row-actions-dropdown [isOpen]=\"dropdownState.isOpen\" [position]=\"dropdownState.position\"\n [context]=\"dropdownState.context\" (actionClicked)=\"onRowActionClicked($event)\" (closed)=\"closeRowActionsDropdown()\">\n</st-row-actions-dropdown>\n\n\n<!-- Bottom pagination controls -->\n<st-pagination \n *ngIf=\"showBottomPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"bottom\">\n</st-pagination>\n\n<!-- Add Column Modal -->\n<st-column-editor-modal *ngIf=\"showColumnModal\" (columnCreated)=\"onColumnCreated($event)\"\n (cancelled)=\"onModalCancelled()\">\n</st-column-editor-modal>\n\n <!-- ========================================== -->\n <!-- REUSABLE TABLE TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #tableTemplate let-mode=\"mode\" let-theadStyle=\"theadStyle\">\n <table class=\"st-table-element\">\n <!-- TABLE HEADER -->\n <thead [ngClass]=\"{ 'sticky': mergedConfig.display?.stickyHeader }\" [ngStyle]=\"theadStyle\">\n <tr>\n <!-- Row Number Header -->\n <th *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-header header-cell sticky-left\"\n [ngStyle]=\"{\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_HEADER_CELL,\n 'width.px': 30\n }\">\n #\n </th>\n <!-- Column Headers -->\n <th \n *ngFor=\"let column of visibleColumns; let colIndex = index; let isFirst = first; let isLast = last\"\n [ngClass]=\"{\n 'header-cell': mode === 'standard',\n 'sticky-left': column.sticky === 'left',\n 'sticky-right': column.sticky === 'right',\n 'sticky-right-first': column.sticky === 'right' && isFirstStickyRight(column.key),\n 'resizable': column.resizable !== false\n }\"\n [ngStyle]=\"{\n position: column.sticky ? 'sticky' : null,\n 'left.px': column.sticky === 'left' ? (column.stickyOffset || 0) : null,\n 'right.px': column.sticky === 'right' ? (column.stickyOffset || 0) : null,\n 'z-index': column.sticky ? ZIndex.STICKY_HEADER_CELL : null,\n 'width.px': column.width\n }\">\n \n <st-header \n [column]=\"column\"\n [columnIndex]=\"colIndex\"\n [isFirstColumn]=\"isFirst\"\n [isLastColumn]=\"isLast\"\n [tableState]=\"getActiveTableState()\"\n [enableSorting]=\"mergedConfig.sorting?.enabled ?? enableSorting\"\n [enableFiltering]=\"mergedConfig.filtering?.enabled ?? enableFiltering\"\n (columnMoved)=\"onColumnMoved($event)\"\n (menuClick)=\"openColumnMenu($event, column, colIndex, isFirst, isLast)\">\n </st-header>\n\n <div \n class=\"resize-handle\" \n stColumnResize\n [column]=\"column\"\n (columnResized)=\"onColumnResized($event)\"\n *ngIf=\"column.resizable !== false\">\n </div>\n </th>\n \n <!-- Settings Column Header -->\n <th \n class=\"settings-column sticky-right\"\n [ngClass]=\"{ 'header-cell': mode === 'standard' }\"\n [ngStyle]=\"{ 'z-index': ZIndex.STICKY_HEADER_CELL }\">\n <div [ngClass]=\"{ 'flex-center': mode === 'virtual', 'header-content': mode === 'standard' }\">\n <st-table-actions \n [tableState]=\"getActiveTableState()\"\n [allowAddColumn]=\"mergedConfig.features?.columnManagement?.allowAdd || false\"\n (addColumnClicked)=\"onAddColumnClick()\">\n </st-table-actions>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- TABLE BODY -->\n <tbody>\n <!-- Virtual Scroll Rows -->\n <ng-container *ngIf=\"mode === 'virtual'\">\n <tr *ngFor=\"let row of visibleRows$ | async; let relativeIndex = index; trackBy: trackByRowIndex\"\n [attr.data-row-index]=\"getAbsoluteRowIndex(relativeIndex)\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{getAbsoluteRowIndex(relativeIndex) + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: getAbsoluteRowIndex(relativeIndex),\n mode: 'virtual',\n relativeIndex: relativeIndex\n }\"></ng-container>\n </tr>\n </ng-container>\n\n <!-- Standard Rows -->\n <ng-container *ngIf=\"mode === 'standard'\">\n <tr *ngFor=\"let row of visibleCellGrid; let rowIndex = index\" [attr.data-row-index]=\"rowIndex\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{rowIndex + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: rowIndex,\n mode: 'standard'\n }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n\n <!-- ========================================== -->\n <!-- REUSABLE BODY CELL TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #bodyCellTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-mode=\"mode\" let-relativeIndex=\"relativeIndex\">\n <!-- Data Cells -->\n <td \n *ngFor=\"let cell of row; let colIndex = index\"\n [ngClass]=\"{\n 'sticky-left': visibleColumns[colIndex]?.sticky === 'left',\n 'sticky-right': visibleColumns[colIndex]?.sticky === 'right',\n 'sticky-right-first': visibleColumns[colIndex]?.sticky === 'right' && visibleColumns[colIndex]?.key && isFirstStickyRight(visibleColumns[colIndex].key),\n 'align-center': visibleColumns[colIndex]?.alignment === 'center',\n 'align-right': visibleColumns[colIndex]?.alignment === 'right',\n 'cell-focused': cell.isFocused()\n }\"\n [ngStyle]=\"{\n position: visibleColumns[colIndex]?.sticky ? 'sticky' : null,\n 'left.px': visibleColumns[colIndex]?.sticky === 'left' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'right.px': visibleColumns[colIndex]?.sticky === 'right' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'z-index': visibleColumns[colIndex]?.sticky ? ZIndex.STICKY_BODY_CELL : null,\n 'width.px': visibleColumns[colIndex]?.width,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\"\n (click)=\"isKeyboardNavigationEnabled() ? onCellClick(rowIndex, colIndex) : null\">\n \n <!-- Virtual Scroll Cell -->\n <st-cell \n *ngIf=\"mode === 'virtual'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\" \n [editMode]=\"getEditModeForCells()\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellEdit)=\"onCellEdit($event)\" \n (cellSave)=\"onCellSave($event)\"\n (cellSaveAndNavigate)=\"onCellSaveAndNavigate($event)\" \n (cellCancel)=\"onCellCancel($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n\n <!-- Standard Cell -->\n <st-cell \n *ngIf=\"mode === 'standard'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellSave)=\"onCellSave($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n </td>\n \n <!-- Row Actions Cell -->\n <td class=\"settings-column\"\n [ngClass]=\"{\n 'has-actions': hasRowActions()\n }\"\n [ngStyle]=\"{\n position: hasRowActions() ? 'sticky' : null,\n 'right.px': hasRowActions() ? 0 : null,\n 'z-index': hasRowActions() ? ZIndex.STICKY_BODY_CELL : null\n }\">\n <button \n *ngIf=\"hasRowActions()\"\n class=\"settings-trigger\"\n (click)=\"openRowActionsDropdown($event, getRowData(rowIndex), rowIndex)\"\n type=\"button\" \n aria-label=\"Row actions\">\n \u22EF\n </button>\n </td>\n </ng-template>\n\n<ng-template #skeletonLoader>\n <div class=\"list-row\" *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <div *ngFor=\"let i of skeletonColumns\" class=\"list-content\">\n <nile-skeleton-loader variant=\"text\" width=\"90%\" height=\"18\" *ngFor=\"let j of skeletonRows\"></nile-skeleton-loader>\n </div>\n </div>\n</ng-template>", styles: [".st-table{width:100%;overflow:auto;position:relative;height:100%;max-height:30rem;border-radius:4px;border:1px solid #E6E9EB}.st-table st-table-actions{position:sticky;right:0}.st-table.keyboard-navigation-enabled{cursor:pointer}.st-table.keyboard-navigation-enabled:focus{outline:none;box-shadow:0 0 0 2px #3b82f64d}.st-table.keyboard-navigation-enabled td.cell-focused{outline:2px solid #4299e1;outline-offset:-1px;position:relative;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:focus{outline:2px solid #4299e1;outline-offset:-1px;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:has(.st-cell.editing){box-shadow:0 0 0 4px #2563eb26}.st-table.virtual-scroll-enabled{overflow-x:visible;margin:0;border:1px solid #E6E9EB;border-collapse:collapse}.st-table.virtual-scroll-enabled .st-scroll-viewport{position:relative;overflow-y:auto;overflow-x:auto;scroll-behavior:smooth}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-scroll-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none;z-index:-1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-positioner{position:absolute;top:0;left:0;right:0;will-change:transform}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element{position:relative;width:100%;border-collapse:collapse;border-spacing:0;background-color:#fff;table-layout:fixed}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;border:none;background-color:#fff;will-change:top;border-right:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;border-right:1px solid #E6E9EB!important}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr{border-bottom:1px solid #E6E9EB;transition:background-color .15s;height:2rem;box-sizing:border-box}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr:last-child{border-bottom:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td{padding:0;vertical-align:middle;box-sizing:border-box;height:2rem;border:1px solid #E6E9EB;border-left:none;background-color:#fff}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-center{text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-right{text-align:right}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;border-right:1px solid #E6E9EB!important}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column{width:2rem;text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger:focus{outline:2px solid #4299e1;outline-offset:2px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table:not(.virtual-scroll-enabled) .st-table-element{width:100%;height:100%;overflow:auto;border-collapse:collapse;table-layout:fixed}.st-table:not(.virtual-scroll-enabled) .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;background-color:#fff;border-right:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left{position:sticky;left:0;border-right:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right{position:sticky;right:0;border-left:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column){box-shadow:-2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;border-right:none;position:sticky;right:0}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr{height:2rem;box-sizing:border-box}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr:last-child{border-bottom:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td{padding:0;vertical-align:middle;height:2rem;background-color:#fff;border:1px solid #E6E9EB;border-left:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-center{text-align:center}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-right{text-align:right}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;border-right:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;border-left:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column){box-shadow:-2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column{position:sticky;right:0;width:2rem;text-align:center;border-right:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content{display:flex;height:2rem;align-items:center}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content .table-header-text{flex-grow:1;padding-left:4px}.st-table:not(.virtual-scroll-enabled) .st-table-element .settings-column>.header-content{display:flex;align-items:center;justify-content:center}.flex-center{display:flex;align-items:center;justify-content:center}.list-row{padding:1rem}.list-row .list-content{display:flex;justify-content:space-evenly;gap:4px;margin-bottom:1rem}\n"] }]
|
|
1208
|
+
args: [{ selector: 'st-table', template: "<!-- Top pagination controls -->\n<st-pagination \n *ngIf=\"showTopPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"top\">\n</st-pagination>\n\n<div class=\"st-table\" *ngIf=\"!(mergedConfig.tableSkeleton?.enabled | async)\" \n [ngClass]=\"{\n 'virtual-scroll-enabled': isVirtualScrollEnabled(),\n 'keyboard-navigation-enabled': isKeyboardNavigationEnabled()\n }\"\n [ngStyle]=\"{\n 'max-height.px': !isVirtualScrollEnabled() ? mergedConfig.display?.maxHeight : null\n }\"\n stKeyboardNavigation\n [tableState]=\"getActiveTableState()\" \n [attr.tabindex]=\"isKeyboardNavigationEnabled() ? 0 : -1\"\n (focus)=\"onTableContainerFocus($event)\"\n [attr.title]=\"isKeyboardNavigationEnabled() ? 'Click a cell or press Tab to start keyboard navigation' : null\">\n <!-- Unified Table Actions Menu -->\n\n <!-- Virtual scroll viewport wrapper -->\n <div class=\"st-scroll-viewport\" #scrollViewport *ngIf=\"isVirtualScrollEnabled()\"\n [ngStyle]=\"{ 'height.px': getVirtualScrollViewportHeight() }\">\n\n <!-- Spacer to create scrollable area -->\n <div class=\"st-scroll-spacer\" [ngStyle]=\"{ 'height.px': virtualScrollTotalHeight$ | async }\">\n </div>\n\n <!-- Table positioner with transform (instead of tbody) -->\n <div class=\"st-table-positioner\" [ngStyle]=\"{ transform: 'translateY(' + (virtualScrollOffsetY$ | async) + 'px)' }\">\n <!-- Table with only visible rows -->\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'virtual',\n theadStyle: { top: (virtualScrollOffsetYNeg$ | async) + 'px' }\n }\"></ng-container>\n </div>\n </div>\n \n <!-- Standard table (when virtual scroll disabled) -->\n <ng-container *ngIf=\"!isVirtualScrollEnabled()\">\n <ng-container *ngTemplateOutlet=\"tableTemplate; context: { \n mode: 'standard',\n theadStyle: null\n }\"></ng-container>\n </ng-container>\n\n <!-- Shared Column Menu Dropdown -->\n <st-column-menu-dropdown \n [isOpen]=\"columnMenuState.isOpen\"\n [position]=\"columnMenuState.position\"\n [context]=\"columnMenuState.context\"\n (actionClicked)=\"onColumnActionClicked($event)\"\n (closed)=\"closeColumnMenu()\">\n </st-column-menu-dropdown>\n</div>\n\n<ng-container *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <ng-container *ngTemplateOutlet=\"skeletonLoader\"></ng-container>\n</ng-container>\n\n<!-- Shared Row Actions Dropdown -->\n<st-row-actions-dropdown [isOpen]=\"dropdownState.isOpen\" [position]=\"dropdownState.position\"\n [context]=\"dropdownState.context\" (actionClicked)=\"onRowActionClicked($event)\" (closed)=\"closeRowActionsDropdown()\">\n</st-row-actions-dropdown>\n\n\n<!-- Bottom pagination controls -->\n<st-pagination \n *ngIf=\"showBottomPagination() && !(mergedConfig.tableSkeleton?.enabled | async)\" \n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n position=\"bottom\">\n</st-pagination>\n\n\n <!-- ========================================== -->\n <!-- REUSABLE TABLE TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #tableTemplate let-mode=\"mode\" let-theadStyle=\"theadStyle\">\n <table class=\"st-table-element\">\n <!-- TABLE HEADER -->\n <thead [ngClass]=\"{ 'sticky': mergedConfig.display?.stickyHeader }\" [ngStyle]=\"theadStyle\">\n <tr>\n <!-- Row Number Header -->\n <th *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-header header-cell sticky-left\"\n [ngStyle]=\"{\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_HEADER_CELL,\n 'width.px': 30\n }\">\n #\n </th>\n <!-- Column Headers -->\n <th \n *ngFor=\"let column of visibleColumns; let colIndex = index; let isFirst = first; let isLast = last\"\n [ngClass]=\"{\n 'header-cell': mode === 'standard',\n 'sticky-left': column.sticky === 'left',\n 'sticky-right': column.sticky === 'right',\n 'sticky-right-first': column.sticky === 'right' && isFirstStickyRight(column.key),\n 'resizable': column.resizable !== false\n }\"\n [ngStyle]=\"{\n position: column.sticky ? 'sticky' : null,\n 'left.px': column.sticky === 'left' ? (column.stickyOffset || 0) : null,\n 'right.px': column.sticky === 'right' ? (column.stickyOffset || 0) : null,\n 'z-index': column.sticky ? ZIndex.STICKY_HEADER_CELL : null,\n 'width.px': column.width\n }\">\n \n <st-header \n [column]=\"column\"\n [columnIndex]=\"colIndex\"\n [isFirstColumn]=\"isFirst\"\n [isLastColumn]=\"isLast\"\n [tableState]=\"getActiveTableState()\"\n [enableSorting]=\"mergedConfig.sorting?.enabled ?? enableSorting\"\n [enableFiltering]=\"mergedConfig.filtering?.enabled ?? enableFiltering\"\n (columnMoved)=\"onColumnMoved($event)\"\n (menuClick)=\"openColumnMenu($event, column, colIndex, isFirst, isLast)\">\n </st-header>\n\n <div \n class=\"resize-handle\" \n stColumnResize\n [column]=\"column\"\n (columnResized)=\"onColumnResized($event)\"\n *ngIf=\"column.resizable !== false\">\n </div>\n </th>\n \n <!-- Settings Column Header -->\n <th \n class=\"settings-column sticky-right\"\n [ngClass]=\"{ 'header-cell': mode === 'standard' }\"\n [ngStyle]=\"{ 'z-index': ZIndex.STICKY_HEADER_CELL }\">\n <div [ngClass]=\"{ 'flex-center': mode === 'virtual', 'header-content': mode === 'standard' }\">\n <st-table-actions \n [tableState]=\"getActiveTableState()\"\n [allowAddColumn]=\"mergedConfig.features?.columnManagement?.allowAdd || false\"\n (addColumnClicked)=\"onAddColumnClick()\">\n </st-table-actions>\n </div>\n </th>\n </tr>\n </thead>\n\n <!-- TABLE BODY -->\n <tbody>\n <!-- Virtual Scroll Rows -->\n <ng-container *ngIf=\"mode === 'virtual'\">\n <tr *ngFor=\"let row of visibleRows$ | async; let relativeIndex = index; trackBy: trackByRowIndex\"\n [attr.data-row-index]=\"getAbsoluteRowIndex(relativeIndex)\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{getAbsoluteRowIndex(relativeIndex) + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: getAbsoluteRowIndex(relativeIndex),\n mode: 'virtual',\n relativeIndex: relativeIndex\n }\"></ng-container>\n </tr>\n </ng-container>\n\n <!-- Standard Rows -->\n <ng-container *ngIf=\"mode === 'standard'\">\n <tr *ngFor=\"let row of visibleCellGrid; let rowIndex = index\" [attr.data-row-index]=\"rowIndex\">\n <!-- Row Number Cell -->\n <td *ngIf=\"mergedConfig.showRowNumber\" class=\"row-number-cell\" \n [ngClass]=\"{ 'sticky-left': 'left' }\"\n [ngStyle]=\"{\n 'width.px': 30,\n position: 'sticky',\n 'left.px': 0,\n 'z-index': ZIndex.STICKY_BODY_CELL,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\">\n {{rowIndex + 1}}\n </td>\n <ng-container *ngTemplateOutlet=\"bodyCellTemplate; context: { \n row: row,\n rowIndex: rowIndex,\n mode: 'standard'\n }\"></ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n\n <!-- ========================================== -->\n <!-- REUSABLE BODY CELL TEMPLATE -->\n <!-- ========================================== -->\n <ng-template #bodyCellTemplate let-row=\"row\" let-rowIndex=\"rowIndex\" let-mode=\"mode\" let-relativeIndex=\"relativeIndex\">\n <!-- Data Cells -->\n <td \n *ngFor=\"let cell of row; let colIndex = index\"\n [ngClass]=\"{\n 'sticky-left': visibleColumns[colIndex]?.sticky === 'left',\n 'sticky-right': visibleColumns[colIndex]?.sticky === 'right',\n 'sticky-right-first': visibleColumns[colIndex]?.sticky === 'right' && visibleColumns[colIndex]?.key && isFirstStickyRight(visibleColumns[colIndex].key),\n 'align-center': visibleColumns[colIndex]?.alignment === 'center',\n 'align-right': visibleColumns[colIndex]?.alignment === 'right',\n 'cell-focused': cell.isFocused()\n }\"\n [ngStyle]=\"{\n position: visibleColumns[colIndex]?.sticky ? 'sticky' : null,\n 'left.px': visibleColumns[colIndex]?.sticky === 'left' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'right.px': visibleColumns[colIndex]?.sticky === 'right' ? (visibleColumns[colIndex]?.stickyOffset || 0) : null,\n 'z-index': visibleColumns[colIndex]?.sticky ? ZIndex.STICKY_BODY_CELL : null,\n 'width.px': visibleColumns[colIndex]?.width,\n 'height.px': mode === 'virtual' ? getVirtualScrollItemSize() : null\n }\"\n (click)=\"isKeyboardNavigationEnabled() ? onCellClick(rowIndex, colIndex) : null\">\n \n <!-- Virtual Scroll Cell -->\n <st-cell \n *ngIf=\"mode === 'virtual'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\" \n [editMode]=\"getEditModeForCells()\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellEdit)=\"onCellEdit($event)\" \n (cellSave)=\"onCellSave($event)\"\n (cellSaveAndNavigate)=\"onCellSaveAndNavigate($event)\" \n (cellCancel)=\"onCellCancel($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n\n <!-- Standard Cell -->\n <st-cell \n *ngIf=\"mode === 'standard'\"\n [cell]=\"cell\" \n [attr.tabindex]=\"cell.isFocused() ? 0 : -1\"\n [tableState]=\"getActiveTableState()\"\n [tableConfig]=\"mergedConfig\"\n [columnIndex]=\"colIndex\"\n (cellSave)=\"onCellSave($event)\"\n (cellChange)=\"cellChange.emit($event)\">\n </st-cell>\n </td>\n \n <!-- Row Actions Cell -->\n <td class=\"settings-column\"\n [ngClass]=\"{\n 'has-actions': hasRowActions()\n }\"\n [ngStyle]=\"{\n position: hasRowActions() ? 'sticky' : null,\n 'right.px': hasRowActions() ? 0 : null,\n 'z-index': hasRowActions() ? ZIndex.STICKY_BODY_CELL : null\n }\">\n <button \n *ngIf=\"hasRowActions()\"\n class=\"settings-trigger\"\n (click)=\"openRowActionsDropdown($event, getRowData(rowIndex), rowIndex)\"\n type=\"button\" \n aria-label=\"Row actions\">\n \u22EF\n </button>\n </td>\n </ng-template>\n\n<ng-template #skeletonLoader>\n <div class=\"list-row\" *ngIf=\"(mergedConfig.tableSkeleton?.enabled | async)\">\n <div *ngFor=\"let i of skeletonColumns\" class=\"list-content\">\n <nile-skeleton-loader variant=\"text\" width=\"90%\" height=\"18\" *ngFor=\"let j of skeletonRows\"></nile-skeleton-loader>\n </div>\n </div>\n</ng-template>", styles: [".st-table{width:100%;overflow:auto;position:relative;height:100%;max-height:30rem;border-radius:4px;border:1px solid #E6E9EB}.st-table st-table-actions{position:sticky;right:0}.st-table.keyboard-navigation-enabled{cursor:pointer}.st-table.keyboard-navigation-enabled:focus{outline:none;box-shadow:0 0 0 2px #3b82f64d}.st-table.keyboard-navigation-enabled td.cell-focused{outline:2px solid #4299e1;outline-offset:-1px;position:relative;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:focus{outline:2px solid #4299e1;outline-offset:-1px;box-shadow:0 0 0 3px #3182ce1a}.st-table.keyboard-navigation-enabled td.cell-focused:has(.st-cell.editing){box-shadow:0 0 0 4px #2563eb26}.st-table.virtual-scroll-enabled{overflow-x:visible;margin:0;border:1px solid #E6E9EB;border-collapse:collapse}.st-table.virtual-scroll-enabled .st-scroll-viewport{position:relative;overflow-y:auto;overflow-x:auto;scroll-behavior:smooth}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-scroll-spacer{position:absolute;top:0;left:0;width:1px;pointer-events:none;z-index:-1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-positioner{position:absolute;top:0;left:0;right:0;will-change:transform}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element{position:relative;width:100%;border-collapse:collapse;border-spacing:0;background-color:#fff;table-layout:fixed}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;border:none;background-color:#fff;will-change:top;border-right:1px solid #E6E9EB}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left{position:sticky;left:0;background-color:#fff;border-right:1px solid #E6E9EB!important}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right{position:sticky;right:0;background-color:#fff}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element thead tr th.sticky-right-first:not(.settings-column):before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr{border-bottom:1px solid #E6E9EB;transition:background-color .15s;height:2rem;box-sizing:border-box}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr:last-child{border-bottom:none}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td{padding:0;vertical-align:middle;box-sizing:border-box;height:2rem;border:1px solid #E6E9EB;border-left:none;background-color:#fff}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-center{text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.align-right{text-align:right}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;border-right:1px solid #E6E9EB!important}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column{width:2rem;text-align:center}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.settings-column .settings-trigger:focus{outline:2px solid #4299e1;outline-offset:2px}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)):after{content:\"\";position:absolute;right:-6px;top:0;bottom:-1px;width:5px;border-left:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,.08) 0%,rgba(0,0,0,0) 100%)}.st-table.virtual-scroll-enabled .st-scroll-viewport .st-table-element tbody tr td.sticky-right-first:before{content:\"\";position:absolute;left:-6px;top:0;bottom:-1px;width:5px;border-right:1px solid var(--borderColor);background:linear-gradient(90deg,rgba(0,0,0,0) 0%,rgba(0,0,0,.08) 100%)}.st-table:not(.virtual-scroll-enabled) .st-table-element{width:100%;height:100%;overflow:auto;border-collapse:collapse;table-layout:fixed}.st-table:not(.virtual-scroll-enabled) .st-table-element thead{background-color:#fff;border-bottom:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky{position:sticky;top:0;z-index:3;background-color:#fff;will-change:top;backface-visibility:hidden}.st-table:not(.virtual-scroll-enabled) .st-table-element thead.sticky:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;background:linear-gradient(to bottom,rgba(0,0,0,.1),transparent)}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th{padding:0;vertical-align:middle;position:relative;background-color:#fff;border-right:1px solid #E6E9EB}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left{position:sticky;left:0;border-right:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-left:not(:has(~ th.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right{position:sticky;right:0;border-left:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.sticky-right-first:not(.settings-column){box-shadow:-2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.settings-column{width:2rem;text-align:center;font-weight:600;font-size:12px;border-right:none;position:sticky;right:0}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle{position:absolute;top:0;right:0;bottom:0;width:8px;cursor:col-resize;z-index:4;pointer-events:auto}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:after{content:\"\";position:absolute;top:50%;right:3px;transform:translateY(-50%);width:2px;height:20px;background-color:#cbd5e0;opacity:0;transition:opacity .2s}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:hover:after,.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.resizable .resize-handle:active:after{opacity:1}.st-table:not(.virtual-scroll-enabled) .st-table-element thead tr th.row-number-header{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody{will-change:transform;position:relative;z-index:1}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr{height:2rem;box-sizing:border-box}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr:last-child{border-bottom:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td{padding:0;vertical-align:middle;height:2rem;background-color:#fff;border:1px solid #E6E9EB;border-left:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.row-number-cell{text-align:center;font-weight:300;font-size:12px;background-color:#f8f8f8}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-center{text-align:center}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.align-right{text-align:right}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left{position:sticky;z-index:2;border-right:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-left:not(:has(~ td.sticky-left)){box-shadow:2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right{position:sticky;z-index:2;border-left:1px solid #E6E9EB!important}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.sticky-right-first:not(.settings-column){box-shadow:-2px 0 5px -2px #0003}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column{position:sticky;right:0;width:2rem;text-align:center;border-right:none}.st-table:not(.virtual-scroll-enabled) .st-table-element tbody tr td.settings-column .settings-trigger{background:none;border:none;font-size:1rem;line-height:1;cursor:pointer;border-radius:4px;transition:all .15s ease}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content{display:flex;height:2rem;align-items:center}.st-table:not(.virtual-scroll-enabled) .st-table-element .header-content .table-header-text{flex-grow:1;padding-left:4px}.st-table:not(.virtual-scroll-enabled) .st-table-element .settings-column>.header-content{display:flex;align-items:center;justify-content:center}.flex-center{display:flex;align-items:center;justify-content:center}.list-row{padding:1rem}.list-row .list-content{display:flex;justify-content:space-evenly;gap:4px;margin-bottom:1rem}\n"] }]
|
|
1201
1209
|
}], ctorParameters: function () { return [{ type: i1.JsonSchemaValidatorService }, { type: i2.ValidationLoggerService }, { type: i3.VirtualScrollService }]; }, propDecorators: { tableConfig: [{
|
|
1202
1210
|
type: Input
|
|
1203
1211
|
}], data: [{
|
|
@@ -1243,4 +1251,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
1243
1251
|
type: HostListener,
|
|
1244
1252
|
args: ['document:click', ['$event']]
|
|
1245
1253
|
}] } });
|
|
1246
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXRhYmxlL3N0LXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC10YWJsZS9zdC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUErQyxTQUFTLEVBQUUsVUFBVSxFQUFpQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEssT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RixPQUFPLEVBQWtFLFFBQVEsRUFBdUIsTUFBTSw0QkFBNEIsQ0FBQztBQUMzSSxPQUFPLEVBQUUsZUFBZSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBUXpELE1BQU0sT0FBTyxnQkFBZ0I7SUEwSDNCLFlBQ1UsZUFBMkMsRUFDM0MsTUFBK0IsRUFDL0Isb0JBQTBDO1FBRjFDLG9CQUFlLEdBQWYsZUFBZSxDQUE0QjtRQUMzQyxXQUFNLEdBQU4sTUFBTSxDQUF5QjtR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O3NCQUFsQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUdHLFVBQVU7c0JBQW5CLE1BQU07Z0JBR0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0csc0JBQXNCO3NCQUEvQixNQUFNO2dCQUdHLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0csU0FBUztzQkFBbEIsTUFBTTtnQkFHRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBR0UsY0FBYztzQkFBdEIsS0FBSztnQkEwRTZDLGNBQWM7c0JBQWhFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQXN3Q2pELGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbHVtbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2VsbC5jbGFzcyc7XG5pbXBvcnQgeyBUYWJsZVN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXN0YXRlLmNsYXNzJztcbmltcG9ydCB7IFRhYmxlQ29uZmlnLCBtZXJnZVRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVTdGF0ZUNoYW5nZUV2ZW50LCBDb2x1bW5SZXNpemVFdmVudCwgQ29sdW1uQWRkRXZlbnQsIENvbHVtbk1vdmVFdmVudCwgQ2VsbEZvY3VzUG9zaXRpb24sIERhdGFDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS10eXBlcyc7XG5pbXBvcnQgeyBDZWxsQ2hhbmdlRXZlbnQsIENlbGxTYXZlRXZlbnQsIENlbGxFZGl0RXZlbnQsIENlbGxDYW5jZWxFdmVudCwgRWRpdE1vZGUsIE5hdmlnYXRpb25EaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEpzb25TY2hlbWFWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvanNvbi1zY2hlbWEtdmFsaWRhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3NjaGVtYS12YWxpZGF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24tbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlydHVhbFNjcm9sbFNlcnZpY2UsIFZpcnR1YWxTY3JvbGxTdGF0ZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZpcnR1YWwtc2Nyb2xsLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm93QWN0aW9uLCBSb3dBY3Rpb25Db250ZXh0LCBSb3dBY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9yb3ctYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2x1bW5BY3Rpb24sIENvbHVtbkFjdGlvbkNvbnRleHQsIENvbHVtbkFjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbHVtbi1hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFRhYmxlWkluZGV4IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3otaW5kZXguZW51bSc7XG5pbXBvcnQgeyBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXR5cGVzJztcbmltcG9ydCB7IFRhYmxlVmFsaWRhdGlvblN0YXRlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLXZhbGlkYXRpb24tc3RhdGUuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3QtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3QtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC10YWJsZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFN0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gWi1JbmRleCBjb25zdGFudHMgZm9yIHRlbXBsYXRlIHVzZVxuICByZWFkb25seSBaSW5kZXggPSBUYWJsZVpJbmRleDtcbiAgXG4gIC8vIE5FVzogUHJpbWFyeSBjb25maWd1cmF0aW9uIGlucHV0XG4gIEBJbnB1dCgpIHRhYmxlQ29uZmlnITogVGFibGVDb25maWc7XG4gIFxuICAvLyBORVc6IFJhdyBkYXRhIGlucHV0IChhbHRlcm5hdGl2ZSB0byBjZWxsR3JpZClcbiAgQElucHV0KCkgZGF0YT86IGFueVtdO1xuICBcbiAgLy8gTkVXOiBPYnNlcnZhYmxlL0JlaGF2aW9yU3ViamVjdCBkYXRhIGlucHV0IChmb3IgcmVhY3RpdmUgZGF0YSBzdHJlYW1zKVxuICBASW5wdXQoKSBkYXRhJD86IE9ic2VydmFibGU8YW55W10+IHwgQmVoYXZpb3JTdWJqZWN0PGFueVtdPjtcbiAgXG4gIEBJbnB1dCgpIHRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBcbiAgLy8gREVQUkVDQVRFRDogVXNlIHRhYmxlQ29uZmlnIGluc3RlYWRcbiAgQElucHV0KCkgZW5hYmxlU29ydGluZzogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGVuYWJsZUZpbHRlcmluZzogYm9vbGVhbiA9IHRydWU7XG4gIFxuICAvLyBORVc6IFN0YXRlIGNoYW5nZSBvdXRwdXRcbiAgQE91dHB1dCgpIHN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJsZVN0YXRlQ2hhbmdlRXZlbnQ+KCk7XG4gIFxuICAvLyBORVc6IERhdGEgY2hhbmdlIG91dHB1dCAoZm9yIGFzeW5jIGRhdGEgdXBkYXRlcylcbiAgQE91dHB1dCgpIGRhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFDaGFuZ2VFdmVudD4oKTtcbiAgXG4gIC8vIEVYSVNUSU5HOiBDZWxsIGFuZCBjb2x1bW4gZXZlbnRzXG4gIEBPdXRwdXQoKSBjZWxsRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbEVkaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsU2F2ZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbENhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENhbmNlbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgY2VsbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENoYW5nZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY29sdW1uUmVzaXplZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uUmVzaXplRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5Nb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uTW92ZUV2ZW50PigpO1xuICBcbiAgLy8gTkVXOiBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gb3V0cHV0XG4gIEBPdXRwdXQoKSBjb25maWdWYWxpZGF0aW9uRXJyb3JzID0gbmV3IEV2ZW50RW1pdHRlcjxTY2hlbWFWYWxpZGF0aW9uRXJyb3JbXT4oKTtcbiAgXG4gIC8vIE5FVzogQ29sdW1uIG1hbmFnZW1lbnQgb3V0cHV0XG4gIEBPdXRwdXQoKSBjb2x1bW5BZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uQWRkRXZlbnQ+KCk7XG4gIFxuICAvLyBORVc6IFJvdyBhY3Rpb24gb3V0cHV0XG4gIEBPdXRwdXQoKSByb3dBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFJvd0FjdGlvbkV2ZW50PigpO1xuICBcbiAgLy8gTkVXOiBWYWxpZGF0aW9uIHN0YXRlIGNoYW5nZSBvdXRwdXRcbiAgQE91dHB1dCgpIHZhbGlkYXRpb25TdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVWYWxpZGF0aW9uU3RhdGU+KCk7XG4gIFxuICAvLyBORVc6IE9wdGlvbmFsIHZhbGlkYXRpb24gZmxhZ1xuICBASW5wdXQoKSB2YWxpZGF0ZUNvbmZpZzogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gSW50ZXJuYWwgc3RhdGVcbiAgcHJpdmF0ZSBpbnRlcm5hbFRhYmxlU3RhdGU/OiBUYWJsZVN0YXRlO1xuICBwcml2YXRlIGludGVybmFsQ2VsbEdyaWQ/OiBDZWxsPGFueT5bXVtdO1xuICBwcml2YXRlIHN0YXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGZvY3VzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHZhbGlkYXRpb25TdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgZGF0YVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBpbnRlcm5hbERhdGEkOiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICBwcml2YXRlIHByZXZpb3VzRGF0YTogYW55W10gPSBbXTtcbiAgbWVyZ2VkQ29uZmlnITogVGFibGVDb25maWc7XG4gIFxuICAvLyBNb2RhbCBzdGF0ZVxuICBwdWJsaWMgc2hvd0NvbHVtbk1vZGFsOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBDYWNoZWQgdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWQgdG8gcHJldmVudCByZS1jcmVhdGlvbiBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uXG4gIHB1YmxpYyB2aXNpYmxlQ29sdW1uczogQ29sdW1uQ29uZmlnPGFueT5bXSA9IFtdO1xuICBwdWJsaWMgdmlzaWJsZUNlbGxHcmlkOiBDZWxsPGFueT5bXVtdID0gW107XG4gIFxuICAvLyBSb3cgYWN0aW9ucyBkcm9wZG93biBzdGF0ZVxuICBwdWJsaWMgZHJvcGRvd25TdGF0ZToge1xuICAgIGlzT3BlbjogYm9vbGVhbjtcbiAgICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAgIGNvbnRleHQ6IFJvd0FjdGlvbkNvbnRleHQgfCBudWxsO1xuICB9ID0ge1xuICAgIGlzT3BlbjogZmFsc2UsXG4gICAgcG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgIGNvbnRleHQ6IG51bGxcbiAgfTtcbiAgXG4gIHB1YmxpYyBza2VsZXRvbkNvbHVtbnM/OiBudW1iZXJbXTtcbiAgcHVibGljIHNrZWxldG9uUm93cz86IG51bWJlcltdO1xuXG4gIC8vIENvbHVtbiBtZW51IGRyb3Bkb3duIHN0YXRlXG4gIHB1YmxpYyBjb2x1bW5NZW51U3RhdGU6IHtcbiAgICBpc09wZW46IGJvb2xlYW47XG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICBjb250ZXh0OiBDb2x1bW5BY3Rpb25Db250ZXh0IHwgbnVsbDtcbiAgfSA9IHtcbiAgICBpc09wZW46IGZhbHNlLFxuICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICBjb250ZXh0OiBudWxsXG4gIH07XG4gIFxuICAvLyBWaXJ0dWFsIHNjcm9sbCBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyPzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgc2Nyb2xsU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHZpcnR1YWxTY3JvbGxTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZpcnR1YWxTY3JvbGxTdGF0ZSB8IG51bGw+KG51bGwpO1xuICBcbiAgLy8gT2JzZXJ2YWJsZSBzdHJlYW1zIGRlcml2ZWQgZnJvbSB2aXJ0dWFsIHNjcm9sbCBzdGF0ZVxuICBwdWJsaWMgdmlydHVhbFNjcm9sbFRvdGFsSGVpZ2h0JDogT2JzZXJ2YWJsZTxudW1iZXI+ID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnBpcGUoXG4gICAgbWFwKHN0YXRlID0+IHN0YXRlPy50b3RhbEhlaWdodCA/PyAwKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG4gIFxuICBwdWJsaWMgdmlydHVhbFNjcm9sbE9mZnNldFkkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQucGlwZShcbiAgICBtYXAoc3RhdGUgPT4gc3RhdGU/Lm9mZnNldFkgPz8gMCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsT2Zmc2V0WU5lZyQ6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5waXBlKFxuICAgIG1hcChzdGF0ZSA9PiBOdW1iZXIoc3RhdGU/Lm9mZnNldFkgPz8gMCkgKiAtMSApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcbiAgXG4gIHB1YmxpYyB2aXNpYmxlUm93cyQ6IE9ic2VydmFibGU8Q2VsbDxhbnk+W11bXT4gPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQucGlwZShcbiAgICBtYXAoc3RhdGUgPT4ge1xuICAgICAgaWYgKCFzdGF0ZSkgcmV0dXJuIHRoaXMudmlzaWJsZUNlbGxHcmlkO1xuICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gc3RhdGU7XG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ2VsbEdyaWQuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH0pXG4gICk7XG4gIFxuICBAVmlld0NoaWxkKCdzY3JvbGxWaWV3cG9ydCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBzY3JvbGxWaWV3cG9ydD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY2hlbWFWYWxpZGF0b3I6IEpzb25TY2hlbWFWYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9nZ2VyOiBWYWxpZGF0aW9uTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIHZpcnR1YWxTY3JvbGxTZXJ2aWNlOiBWaXJ0dWFsU2Nyb2xsU2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIHRoYXQgYXQgbGVhc3QgdGFibGVDb25maWcgb3IgY29sdW1ucyBpcyBwcm92aWRlZFxuICAgIGlmICghdGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFaXRoZXIgdGFibGVDb25maWcgb3IgY29sdW1ucyBtdXN0IGJlIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIE1lcmdlIGNvbmZpZyB3aXRoIGRlZmF1bHRzXG4gICAgaWYgKHRoaXMudGFibGVDb25maWcpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnID0gbWVyZ2VUYWJsZUNvbmZpZyh0aGlzLnRhYmxlQ29uZmlnKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgY29uZmlndXJhdGlvbiBpZiBlbmFibGVkXG4gICAgICBpZiAodGhpcy52YWxpZGF0ZUNvbmZpZykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbih0aGlzLm1lcmdlZENvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBvciB1c2UgVGFibGVTdGF0ZVxuICAgIGlmICghdGhpcy50YWJsZVN0YXRlKSB7XG4gICAgICB0aGlzLmNyZWF0ZUludGVybmFsVGFibGVTdGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdWJzY3JpYmUgdG8gZXh0ZXJuYWwgdGFibGVTdGF0ZSBjaGFuZ2VzXG4gICAgICB0aGlzLnN1YnNjcmliZVRvRXh0ZXJuYWxUYWJsZVN0YXRlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNldHVwIGRhdGEgc291cmNlIChzeW5jIG9yIGFzeW5jKVxuICAgIHRoaXMuc2V0dXBEYXRhU291cmNlKCk7XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzXG4gICAgY29uc3Qgcm93TnVtYmVyV2lkdGggPSB0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyID8gMzAgOiAwO1xuICAgIGNvbnN0IHNldHRpbmdzQ29sdW1uV2lkdGggPSB0aGlzLmhhc1Jvd0FjdGlvbnMoKSA/IDI4IDogMDsgLy8gU2V0dGluZ3MgY29sdW1uIGlzIH4zMnB4IHdpZGUgd2hlbiB2aXNpYmxlXG4gICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuY2FsY3VsYXRlU3RpY2t5T2Zmc2V0cyhyb3dOdW1iZXJXaWR0aCwgc2V0dGluZ3NDb2x1bW5XaWR0aCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZFxuICAgIHRoaXMudXBkYXRlVmlzaWJsZURhdGEoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHZpcnR1YWwgc2Nyb2xsIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxTY3JvbGwoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBrZXlib2FyZCBuYXZpZ2F0aW9uIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplS2V5Ym9hcmROYXZpZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5za2VsZXRvbkNvbHVtbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLm1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5jb2x1bW5zID8/IDEwIH0sIChfLCBpKSA9PiBpKTtcbiAgICB0aGlzLnNrZWxldG9uUm93cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMubWVyZ2VkQ29uZmlnLnRhYmxlU2tlbGV0b24/LnJvd3MgPz8gMTAgfSwgKF8sIGkpID0+IGkpO1xuICB9XG4gIFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gU2V0dXAgdmlydHVhbCBzY3JvbGwgYWZ0ZXIgdmlldyBpcyByZWFkeVxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICB0aGlzLnNldHVwVmlydHVhbFNjcm9sbExpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gd2hlbiB0YWJsZUNvbmZpZyBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ3RhYmxlQ29uZmlnJ10gJiYgIWNoYW5nZXNbJ3RhYmxlQ29uZmlnJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgdGhpcy5tZXJnZWRDb25maWcgPSBtZXJnZVRhYmxlQ29uZmlnKHRoaXMudGFibGVDb25maWcpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBjb25maWd1cmF0aW9uIGlmIGVuYWJsZWRcbiAgICAgIGlmICh0aGlzLnZhbGlkYXRlQ29uZmlnKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVDb25maWd1cmF0aW9uKHRoaXMubWVyZ2VkQ29uZmlnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGludGVybmFsIHRhYmxlIHN0YXRlIHdpdGggbmV3IGNvbHVtbnMgaWYgdXNpbmcgaW50ZXJuYWwgc3RhdGVcbiAgICAgIGlmICh0aGlzLmludGVybmFsVGFibGVTdGF0ZSkge1xuICAgICAgICB0aGlzLmludGVybmFsVGFibGVTdGF0ZS51cGRhdGVDb2x1bW5zKHRoaXMubWVyZ2VkQ29uZmlnLmNvbHVtbnMpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWRcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZURhdGEoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVjcmVhdGUgY2VsbCBncmlkIHdoZW4gZGF0YSBjaGFuZ2VzIChvbmx5IGlmIG5vdCB1c2luZyBkYXRhJCBPYnNlcnZhYmxlKVxuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gJiYgIWNoYW5nZXNbJ2RhdGEnXS5maXJzdENoYW5nZSAmJiB0aGlzLmRhdGEgJiYgIXRoaXMuZGF0YSQpIHtcbiAgICAgIHRoaXMuaGFuZGxlU3luY0RhdGFDaGFuZ2UoY2hhbmdlc1snZGF0YSddLnByZXZpb3VzVmFsdWUgfHwgW10pO1xuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgZGF0YSQgT2JzZXJ2YWJsZSBpbnB1dCBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEkJ10gJiYgIWNoYW5nZXNbJ2RhdGEkJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuc2V0dXBEYXRhU291cmNlKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlY3JlYXRlIGNlbGwgZ3JpZCB3aGVuIGNlbGxHcmlkIGNoYW5nZXNcbiAgICBpZiAoY2hhbmdlc1snY2VsbEdyaWQnXSAmJiAhY2hhbmdlc1snY2VsbEdyaWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgLy8gQ2VsbCBncmlkIHdhcyB1cGRhdGVkIGV4dGVybmFsbHksIG5vIG5lZWQgdG8gcmVjcmVhdGVcbiAgICAgIC8vIEp1c3QgcmVjYWxjdWxhdGUgc3RpY2t5IG9mZnNldHMgaWYgbmVlZGVkXG4gICAgICBpZiAodGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkpIHtcbiAgICAgICAgY29uc3Qgcm93TnVtYmVyV2lkdGggPSB0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyID8gMzAgOiAwO1xuICAgICAgICBjb25zdCBzZXR0aW5nc0NvbHVtbldpZHRoID0gdGhpcy5oYXNSb3dBY3Rpb25zKCkgPyAzMiA6IDA7XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMocm93TnVtYmVyV2lkdGgsIHNldHRpbmdzQ29sdW1uV2lkdGgpO1xuICAgICAgfVxuICAgICAgLy8gVXBkYXRlIHZpc2libGUgY29sdW1ucyBhbmQgY2VsbCBncmlkXG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHZpcnR1YWwgc2Nyb2xsIHdoZW4gZGF0YSBjaGFuZ2VzXG4gICAgaWYgKChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY2VsbEdyaWQnXSkgJiYgIWNoYW5nZXNbJ2RhdGEnXT8uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQudmFsdWU7XG4gICAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgICAgICAgIHNjcm9sbFRvcDogY3VycmVudFN0YXRlLnNjcm9sbFRvcCxcbiAgICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0OiB0aGlzLmdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpLFxuICAgICAgICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgICAgaXRlbVNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCksXG4gICAgICAgICAgICBidWZmZXJTaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxCdWZmZXJTaXplKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dChuZXdTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGtleWJvYXJkIG5hdmlnYXRpb24gZGltZW5zaW9ucyBpZiBlbmFibGVkXG4gICAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSAmJiAoY2hhbmdlc1snZGF0YSddIHx8IGNoYW5nZXNbJ2NlbGxHcmlkJ10pKSB7XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLnNldERpbWVuc2lvbnMoXG4gICAgICAgICAgdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnRlcm5hbCBUYWJsZVN0YXRlIGZyb20gY29uZmlnXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUludGVybmFsVGFibGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUgPSBuZXcgVGFibGVTdGF0ZShjb2x1bW5zLCB7XG4gICAgICBwYWdlU2l6ZTogdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemUsXG4gICAgICBpbml0aWFsUGFnZTogdGhpcy5tZXJnZWRDb25maWcuaW5pdGlhbFN0YXRlPy5wYWdlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gU2V0IHRvdGFsIGl0ZW1zIGlmIHByb3ZpZGVkIGluIGNvbmZpZyAoZm9yIHNlcnZlci1zaWRlIHBhZ2luYXRpb24pXG4gICAgaWYgKHRoaXMubWVyZ2VkQ29uZmlnLnBhZ2luYXRpb24/LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUuc2V0VG90YWxJdGVtcyh0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uLnRvdGFsSXRlbXMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBcHBseSBpbml0aWFsIHNvcnQgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5tZXJnZWRDb25maWcuaW5pdGlhbFN0YXRlPy5zb3J0QnkpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnLmluaXRpYWxTdGF0ZS5zb3J0QnkuZm9yRWFjaChzb3J0ID0+IHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUhLmFkZFNvcnRUb0NvbHVtbihzb3J0LmtleSwgc29ydC5kaXJlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGluaXRpYWwgZmlsdGVycyBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLm1lcmdlZENvbmZpZy5pbml0aWFsU3RhdGU/LmZpbHRlcnMpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnLmluaXRpYWxTdGF0ZS5maWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUhLnNldEZpbHRlck9uQ29sdW1uKGZpbHRlci5rZXksIGZpbHRlci5vcGVyYXRvciwgZmlsdGVyLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gaW50ZXJuYWwgc3RhdGUgY2hhbmdlcyBhbmQgcmUtZW1pdFxuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLmludGVybmFsVGFibGVTdGF0ZS5zdGF0ZUNoYW5nZSRcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZpc2libGUgY29sdW1ucyBhbmQgY2VsbCBncmlkIG9uIHZpc2liaWxpdHkgY2hhbmdlc1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvbHVtbi12aXNpYmlsaXR5JyB8fCBldmVudC50eXBlID09PSAnY29sdW1uLWNvbmZpZycpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byB2YWxpZGF0aW9uIHN0YXRlIGNoYW5nZXMgYW5kIHJlLWVtaXRcbiAgICB0aGlzLnZhbGlkYXRpb25TdWJzY3JpcHRpb24gPSB0aGlzLmludGVybmFsVGFibGVTdGF0ZS50YWJsZVZhbGlkYXRpb25TdGF0ZSRcbiAgICAgIC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25TdGF0ZUNoYW5nZS5lbWl0KHN0YXRlKTtcbiAgICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGV4dGVybmFsIFRhYmxlU3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0V4dGVybmFsVGFibGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlU3RhdGUuc3RhdGVDaGFuZ2UkXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZCBvbiB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb2x1bW4tdmlzaWJpbGl0eScgfHwgZXZlbnQudHlwZSA9PT0gJ2NvbHVtbi1jb25maWcnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlRGF0YSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gdmFsaWRhdGlvbiBzdGF0ZSBjaGFuZ2VzIGFuZCByZS1lbWl0XG4gICAgdGhpcy52YWxpZGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZVN0YXRlLnRhYmxlVmFsaWRhdGlvblN0YXRlJFxuICAgICAgLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXRlQ2hhbmdlLmVtaXQoc3RhdGUpO1xuICAgICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgY2VsbCBncmlkIGZyb20gcmF3IGRhdGFcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ2VsbEdyaWRGcm9tRGF0YSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICB0aGlzLmludGVybmFsQ2VsbEdyaWQgPSB0aGlzLmRhdGEubWFwKChyb3dEYXRhLCByb3dJbmRleCkgPT5cbiAgICAgIGNvbHVtbnMubWFwKGNvbHVtbiA9PiBcbiAgICAgICAgbmV3IENlbGwoY29sdW1uLCByb3dEYXRhW2NvbHVtbi5rZXldLCByb3dEYXRhLCByb3dJbmRleClcbiAgICAgIClcbiAgICApO1xuICB9XG4gIFxuICAvKipcbiAgICogU2V0dXAgZGF0YSBzb3VyY2UgLSBlaXRoZXIgc3luYyBhcnJheSBvciBhc3luYyBPYnNlcnZhYmxlXG4gICAqIEhhbmRsZXMgaW5pdGlhbGl6YXRpb24gYW5kIHN1YnNjcmlwdGlvbiB0byBkYXRhIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEYXRhU291cmNlKCk6IHZvaWQge1xuICAgIC8vIFdhcm4gaWYgYm90aCBkYXRhIGFuZCBkYXRhJCBhcmUgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YSQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3RUYWJsZUNvbXBvbmVudDogQm90aCBkYXRhIGFuZCBkYXRhJCBpbnB1dHMgYXJlIHByb3ZpZGVkLiBVc2luZyBkYXRhJCAoT2JzZXJ2YWJsZSkgYW5kIGlnbm9yaW5nIGRhdGEgYXJyYXkuJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBcbiAgICAvLyBQcmlvcml0eTogZGF0YSQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGRhdGFcbiAgICBpZiAodGhpcy5kYXRhJCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIC8vIEZvciBzeW5jIGRhdGEsIGVtaXQgb25jZSB0aHJvdWdoIGludGVybmFsIG9ic2VydmFibGVcbiAgICAgIHRoaXMucHJldmlvdXNEYXRhID0gW107XG4gICAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dCh0aGlzLmRhdGEpO1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGRhdGEgcHJvdmlkZWQsIGVtaXQgZW1wdHkgYXJyYXlcbiAgICAgIHRoaXMucHJldmlvdXNEYXRhID0gW107XG4gICAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dChbXSk7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0YUNoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gZGF0YSBjaGFuZ2VzIChlaXRoZXIgZnJvbSBkYXRhJCBpbnB1dCBvciBpbnRlcm5hbCBCZWhhdmlvclN1YmplY3QpXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvRGF0YUNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSQgPSB0aGlzLmRhdGEkIHx8IHRoaXMuaW50ZXJuYWxEYXRhJC5hc09ic2VydmFibGUoKTtcbiAgICBcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24gPSBkYXRhU291cmNlJC5zdWJzY3JpYmUobmV3RGF0YSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZURhdGFDaGFuZ2UobmV3RGF0YSk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgZGF0YSBjaGFuZ2UgZnJvbSBPYnNlcnZhYmxlIGVtaXNzaW9uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURhdGFDaGFuZ2UobmV3RGF0YTogYW55W10pOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHNvdXJjZTogJ3N5bmMnIHwgJ2FzeW5jJyA9IHRoaXMuZGF0YSQgPyAnYXN5bmMnIDogJ3N5bmMnO1xuICAgIFxuICAgIC8vIEVtaXQgZGF0YSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLmRhdGFDaGFuZ2UuZW1pdCh7XG4gICAgICBwcmV2aW91c0RhdGE6IHRoaXMucHJldmlvdXNEYXRhLFxuICAgICAgY3VycmVudERhdGE6IG5ld0RhdGEsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICBzb3VyY2VcbiAgICB9KTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZGF0YSByZWZlcmVuY2VcbiAgICB0aGlzLmRhdGEgPSBuZXdEYXRhO1xuICAgIHRoaXMucHJldmlvdXNEYXRhID0gWy4uLm5ld0RhdGFdO1xuICAgIFxuICAgIC8vIFJlY3JlYXRlIGNlbGwgZ3JpZFxuICAgIHRoaXMuY3JlYXRlQ2VsbEdyaWRGcm9tRGF0YSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB2aXNpYmxlIGRhdGFcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgXG4gICAgLy8gUmVjYWxjdWxhdGUgdmlydHVhbCBzY3JvbGwgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgICAgICBzY3JvbGxUb3A6IGN1cnJlbnRTdGF0ZS5zY3JvbGxUb3AsXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHQ6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFZpZXdwb3J0SGVpZ2h0KCksXG4gICAgICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgIGl0ZW1TaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpLFxuICAgICAgICAgIGJ1ZmZlclNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEJ1ZmZlclNpemUoKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQobmV3U3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBkaW1lbnNpb25zIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuc2V0RGltZW5zaW9ucyhcbiAgICAgICAgdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc3luYyBkYXRhIGNoYW5nZSAoZnJvbSBASW5wdXQoKSBkYXRhIGNoYW5nZXMpXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVN5bmNEYXRhQ2hhbmdlKHByZXZpb3VzRGF0YTogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpb3VzRGF0YSA9IHByZXZpb3VzRGF0YTtcbiAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dCh0aGlzLmRhdGEgfHwgW10pO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBUYWJsZVN0YXRlIChwcm92aWRlZCBvciBpbnRlcm5hbClcbiAgICovXG4gIGdldEFjdGl2ZVRhYmxlU3RhdGUoKTogVGFibGVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVTdGF0ZSB8fCB0aGlzLmludGVybmFsVGFibGVTdGF0ZSE7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGNlbGwgZ3JpZCAocHJvdmlkZWQgb3IgaW50ZXJuYWwpXG4gICAqL1xuICBnZXRBY3RpdmVDZWxsR3JpZCgpOiBDZWxsPGFueT5bXVtdIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbENlbGxHcmlkIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2aXNpYmxlIGNlbGwgZ3JpZCAoZmlsdGVyZWQgdG8gb25seSBpbmNsdWRlIHZpc2libGUgY29sdW1ucylcbiAgICovXG4gIGdldFZpc2libGVDZWxsR3JpZCgpOiBDZWxsPGFueT5bXVtdIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdldFZpc2libGVDb2x1bW5zKCk7XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbktleXMgPSBuZXcgU2V0KHZpc2libGVDb2x1bW5zLm1hcChjb2wgPT4gY29sLmtleSkpO1xuICAgIFxuICAgIC8vIEdldCBjb2x1bW4gaW5kaWNlcyBmb3IgdmlzaWJsZSBjb2x1bW5zXG4gICAgY29uc3QgdmlzaWJsZUluZGljZXMgPSBhbGxDb2x1bW5zXG4gICAgICAubWFwKChjb2wsIGluZGV4KSA9PiB2aXNpYmxlQ29sdW1uS2V5cy5oYXMoY29sLmtleSkgPyBpbmRleCA6IC0xKVxuICAgICAgLmZpbHRlcihpbmRleCA9PiBpbmRleCAhPT0gLTEpO1xuICAgIFxuICAgIGNvbnN0IGZ1bGxHcmlkID0gdGhpcy5nZXRBY3RpdmVDZWxsR3JpZCgpO1xuICAgIHJldHVybiBmdWxsR3JpZC5tYXAocm93ID0+IFxuICAgICAgdmlzaWJsZUluZGljZXMubWFwKGluZGV4ID0+IHJvd1tpbmRleF0pLmZpbHRlcihjZWxsID0+IGNlbGwgIT09IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmlzaWJsZSBjZWxsIGdyaWQgYmFzZWQgb24gY3VycmVudCB2aXNpYmlsaXR5IGFuZCBjb2x1bW4gb3JkZXJcbiAgICogQ2FsbGVkIHdoZW4gZGF0YSwgdmlzaWJpbGl0eSwgb3IgY29sdW1uIG9yZGVyIGNoYW5nZXNcbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIHByb3Blcmx5IGhhbmRsZXMgY29sdW1uIHJlb3JkZXJpbmcgYnkgbWFwcGluZyBjZWxscyBiYXNlZCBvblxuICAgKiBjb2x1bW4ga2V5cyByYXRoZXIgdGhhbiBpbmRpY2VzLCBlbnN1cmluZyBjZWxscyBmb2xsb3cgdGhlaXIgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUNlbGxHcmlkKCk6IHZvaWQge1xuICAgIGNvbnN0IGZ1bGxHcmlkID0gdGhpcy5nZXRBY3RpdmVDZWxsR3JpZCgpO1xuICAgIFxuICAgIC8vIEhhbmRsZSBlbXB0eSBncmlkXG4gICAgaWYgKCFmdWxsR3JpZCB8fCBmdWxsR3JpZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIGEgbWFwIG9mIGNvbHVtbktleSDihpIgY2VsbEluZGV4IGZvciB0aGUgY3VycmVudCBncmlkIHN0cnVjdHVyZVxuICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGZpbmQgY2VsbHMgYnkgY29sdW1uIGtleSByZWdhcmRsZXNzIG9mIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25cbiAgICBjb25zdCBrZXlUb0luZGV4TWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmdWxsR3JpZFswXT8uZm9yRWFjaCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkNvbmZpZyA9IGNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICAgIGtleVRvSW5kZXhNYXAuc2V0KGNvbHVtbkNvbmZpZy5rZXksIGluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBSZW9yZGVyIGNlbGxzIHRvIG1hdGNoIHRoZSB2aXNpYmxlQ29sdW1ucyBvcmRlclxuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gY29sdW1ucyBhcmUgbW92ZWQsIHRoZSBjZWxsIGRhdGEgZm9sbG93c1xuICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkID0gZnVsbEdyaWQubWFwKHJvdyA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29uc3QgY2VsbEluZGV4ID0ga2V5VG9JbmRleE1hcC5nZXQoY29sLmtleSk7XG4gICAgICAgICAgcmV0dXJuIGNlbGxJbmRleCAhPT0gdW5kZWZpbmVkID8gcm93W2NlbGxJbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGNlbGwpOiBjZWxsIGlzIENlbGw8YW55PiA9PiBjZWxsICE9PSB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmlzaWJsZSBjb2x1bW5zIGJhc2VkIG9uIGN1cnJlbnQgdmlzaWJpbGl0eVxuICAgKiBDYWxsZWQgb25seSB3aGVuIHZpc2liaWxpdHkgYWN0dWFsbHkgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlQ29sdW1ucygpOiB2b2lkIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpO1xuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGZvciB2aXNpYmxlIGNvbHVtbnMgb25seVxuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlU3RpY2t5T2Zmc2V0cyh0aGlzLnZpc2libGVDb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYm90aCB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZFxuICAgKiBDYWxsIHRoaXMgd2hlbmV2ZXIgZGF0YSBvciB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZURhdGEoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlQ29sdW1ucygpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUNlbGxHcmlkKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGNvbHVtbnMgKGZyb20gY29uZmlnIG9yIGxlZ2FjeSBpbnB1dClcbiAgICovXG4gIGdldEFjdGl2ZUNvbHVtbnMoKTogQ29sdW1uQ29uZmlnPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZpc2libGUgY29sdW1ucyAoZmlsdGVyZWQgYnkgdmlzaWJpbGl0eSBwcm9wZXJ0eSlcbiAgICogQWxzbyByZWNhbGN1bGF0ZXMgc3RpY2t5IG9mZnNldHMgYmFzZWQgb24gdmlzaWJsZSBjb2x1bW5zIG9ubHlcbiAgICovXG4gIGdldFZpc2libGVDb2x1bW5zKCk6IENvbHVtbkNvbmZpZzxhbnk+W10ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpOyAvLyBEZWZhdWx0IHRvIHRydWUgaWYgbm90IHNldFxuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGZvciB2aXNpYmxlIGNvbHVtbnMgb25seVxuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlU3RpY2t5T2Zmc2V0cyh2aXNpYmxlQ29sdW1ucyk7XG4gICAgXG4gICAgcmV0dXJuIHZpc2libGVDb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGJhc2VkIG9uIHZpc2libGUgY29sdW1ucyBvbmx5XG4gICAqIFRoaXMgZW5zdXJlcyBjb3JyZWN0IHBvc2l0aW9uaW5nIHdoZW4gY29sdW1ucyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHJlY2FsY3VsYXRlVmlzaWJsZVN0aWNreU9mZnNldHModmlzaWJsZUNvbHVtbnM6IENvbHVtbkNvbmZpZzxhbnk+W10pOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgbGVmdCBzdGlja3kgb2Zmc2V0c1xuICAgIC8vIEFjY291bnQgZm9yIHJvdyBudW1iZXIgY29sdW1uIHdpZHRoIGlmIHNob3duXG4gICAgbGV0IGxlZnRPZmZzZXQgPSB0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyID8gMzAgOiAwO1xuICAgIHZpc2libGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAnbGVmdCcpIHtcbiAgICAgICAgKGNvbCBhcyBhbnkpLnN0aWNreU9mZnNldCA9IGxlZnRPZmZzZXQ7XG4gICAgICAgIGxlZnRPZmZzZXQgKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSByaWdodCBzdGlja3kgb2Zmc2V0c1xuICAgIGxldCByaWdodE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHZpc2libGVDb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2wgPSB2aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAncmlnaHQnKSB7XG4gICAgICAgIChjb2wgYXMgYW55KS5zdGlja3lPZmZzZXQgPSByaWdodE9mZnNldDtcbiAgICAgICAgcmlnaHRPZmZzZXQgKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNlbGxDaGFuZ2UoZXZlbnQ6IENlbGxDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2VsbENoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQ29sdW1uUmVzaXplZChldmVudDogQ29sdW1uUmVzaXplRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBSZWNhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0cyBhZnRlciByZXNpemVcbiAgICBjb25zdCByb3dOdW1iZXJXaWR0aCA9IHRoaXMubWVyZ2VkQ29uZmlnLnNob3dSb3dOdW1iZXIgPyAzMCA6IDA7XG4gICAgY29uc3Qgc2V0dGluZ3NDb2x1bW5XaWR0aCA9IHRoaXMuaGFzUm93QWN0aW9ucygpID8gMzIgOiAwO1xuICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMocm93TnVtYmVyV2lkdGgsIHNldHRpbmdzQ29sdW1uV2lkdGgpO1xuICAgIFxuICAgIC8vIEVtaXQgdG8gcGFyZW50XG4gICAgdGhpcy5jb2x1bW5SZXNpemVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25Db2x1bW5Nb3ZlZChldmVudDoge2NvbHVtbktleTogc3RyaW5nLCBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCd9KTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5rZXkgPT09IGV2ZW50LmNvbHVtbktleSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgdGFyZ2V0IGluZGV4XG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSBldmVudC5kaXJlY3Rpb24gPT09ICdsZWZ0JyBcbiAgICAgID8gY3VycmVudEluZGV4IC0gMSBcbiAgICAgIDogY3VycmVudEluZGV4ICsgMTtcbiAgICBcbiAgICAvLyBDaGVjayBib3VuZHNcbiAgICBpZiAodGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IGNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFN3YXAgY29sdW1uc1xuICAgIFtjb2x1bW5zW2N1cnJlbnRJbmRleF0sIGNvbHVtbnNbdGFyZ2V0SW5kZXhdXSA9IFxuICAgIFtjb2x1bW5zW3RhcmdldEluZGV4XSwgY29sdW1uc1tjdXJyZW50SW5kZXhdXTtcbiAgICBcbiAgICAvLyBVcGRhdGUgVGFibGVTdGF0ZSB3aXRoIG5ldyBjb2x1bW4gb3JkZXJcbiAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS51cGRhdGVDb2x1bW5zKGNvbHVtbnMpO1xuICAgIHRoaXMuY29sdW1uTW92ZWQuZW1pdCh7XG4gICAgICBjb2x1bW5LZXk6IGV2ZW50LmNvbHVtbktleSxcbiAgICAgIGRpcmVjdGlvbjogZXZlbnQuZGlyZWN0aW9uLFxuICAgICAgb2xkSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgIG5ld0luZGV4OiB0YXJnZXRJbmRleCxcbiAgICAgIGNvbHVtbjogY29sdW1uc1tjdXJyZW50SW5kZXhdXG4gICAgfSk7XG4gICAgLy8gRm9yY2UgdmlydHVhbCBzY3JvbGwgdG8gcmUtcmVuZGVyIGJ5IHJlLWVtaXR0aW5nIGN1cnJlbnQgc3RhdGVcbiAgICAvLyBUaGlzIGVuc3VyZXMgdmlzaWJsZVJvd3MkIHBpY2tzIHVwIHRoZSB1cGRhdGVkIHZpc2libGVDZWxsR3JpZFxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dCh7Li4uY3VycmVudFN0YXRlfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgY29sdW1uIHRvIHBvc2l0aW9uIGp1c3QgYmVmb3JlIHJpZ2h0IHN0aWNreSBjb2x1bW5zICh1c2VkIHdoZW4gcGlubmluZyByaWdodClcbiAgICovXG4gIHByaXZhdGUgbW92ZUNvbHVtblRvRW5kKGNvbHVtbktleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcmlnaHQtc3RpY2t5IGNvbHVtblxuICAgIGNvbnN0IGZpcnN0UmlnaHRTdGlja3lJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5zdGlja3kgPT09ICdyaWdodCcpO1xuICAgIFxuICAgIC8vIERldGVybWluZSB0YXJnZXQgaW5kZXg6IGp1c3QgYmVmb3JlIGZpcnN0IHJpZ2h0LXN0aWNreSwgb3IgYXQgZW5kIGlmIG5vbmUgZXhpc3RcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IGZpcnN0UmlnaHRTdGlja3lJbmRleCAhPT0gLTEgPyBmaXJzdFJpZ2h0U3RpY2t5SW5kZXggOiBjb2x1bW5zLmxlbmd0aDtcbiAgICBcbiAgICAvLyBJZiBhbHJlYWR5IGF0IHRhcmdldCBwb3NpdGlvbiwgbm8gbmVlZCB0byBtb3ZlXG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gdGFyZ2V0SW5kZXggfHwgY3VycmVudEluZGV4ID09PSB0YXJnZXRJbmRleCAtIDEpIHJldHVybjtcbiAgICBcbiAgICAvLyBSZW1vdmUgY29sdW1uIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIGNvbnN0IFtjb2x1bW5dID0gY29sdW1ucy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICBcbiAgICAvLyBBZGp1c3QgdGFyZ2V0IGluZGV4IGlmIHdlIHJlbW92ZWQgYW4gZWxlbWVudCBiZWZvcmUgaXRcbiAgICBjb25zdCBhZGp1c3RlZFRhcmdldEluZGV4ID0gY3VycmVudEluZGV4IDwgdGFyZ2V0SW5kZXggPyB0YXJnZXRJbmRleCAtIDEgOiB0YXJnZXRJbmRleDtcbiAgICBcbiAgICAvLyBJbnNlcnQgYXQgdGFyZ2V0IHBvc2l0aW9uIChiZWZvcmUgZmlyc3QgcmlnaHQtc3RpY2t5IGNvbHVtbiwgb3IgYXQgZW5kKVxuICAgIGNvbHVtbnMuc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNvbHVtbik7XG4gICAgXG4gICAgLy8gVXBkYXRlIFRhYmxlU3RhdGUgd2l0aCBuZXcgY29sdW1uIG9yZGVyXG4gICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkudXBkYXRlQ29sdW1ucyhjb2x1bW5zKTtcbiAgICBcbiAgICAvLyBGb3JjZSB2aXJ0dWFsIHNjcm9sbCB0byByZS1yZW5kZXJcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC52YWx1ZTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQoey4uLmN1cnJlbnRTdGF0ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VtdWxhdGl2ZSBsZWZ0IG9mZnNldCBmb3IgYSBzdGlja3kgY29sdW1uIG9uIHRoZSBsZWZ0IHNpZGVcbiAgICovXG4gIGdldFN0aWNreUxlZnRPZmZzZXQoY29sdW1uS2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBpZiAoY29sLmtleSA9PT0gY29sdW1uS2V5KSBicmVhaztcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAnbGVmdCcpIHtcbiAgICAgICAgb2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgcmlnaHQgb2Zmc2V0IGZvciBhIHN0aWNreSBjb2x1bW4gb24gdGhlIHJpZ2h0IHNpZGVcbiAgICovXG4gIGdldFN0aWNreVJpZ2h0T2Zmc2V0KGNvbHVtbktleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGZvciAobGV0IGkgPSBjb2xJbmRleCArIDE7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb2wgPSBjb2x1bW5zW2ldO1xuICAgICAgaWYgKGNvbC5zdGlja3kgPT09ICdyaWdodCcpIHtcbiAgICAgICAgb2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0b3AgcGFnaW5hdGlvbiBzaG91bGQgYmUgc2hvd25cbiAgICovXG4gIHNob3dUb3BQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uPy5lbmFibGVkID09IHRydWUgJiZcbiAgICAgICAgICAgdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8uc2hvd1RvcENvbnRyb2xzID09PSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYm90dG9tIHBhZ2luYXRpb24gc2hvdWxkIGJlIHNob3duXG4gICAqL1xuICBzaG93Qm90dG9tUGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCA9PSB0cnVlICYmXG4gICAgICAgICAgICh0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uPy5zaG93Qm90dG9tQ29udHJvbHMgPz8gdHJ1ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjb25maWcgVGFibGUgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnOiBUYWJsZUNvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2NoZW1hVmFsaWRhdG9yLnZhbGlkYXRlKGNvbmZpZywgdHJ1ZSwgZmFsc2UpOyAvLyBEaXNhYmxlIGxvZ2dpbmcgaGVyZSwgd2UnbGwgbG9nIG1hbnVhbGx5IHdpdGggY29udGV4dFxuICAgIFxuICAgIGlmICghcmVzdWx0LnZhbGlkICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRW1pdCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgdGhpcy5jb25maWdWYWxpZGF0aW9uRXJyb3JzLmVtaXQocmVzdWx0LmVycm9ycyk7XG4gICAgICBcbiAgICAgIC8vIExvZyB2YWxpZGF0aW9uIGVycm9ycyB3aXRoIGNvbnRleHRcbiAgICAgIGNvbnN0IGNvbmZpZ1NuaXBwZXQgPSBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpLnN1YnN0cmluZygwLCA1MDApOyAvLyBGaXJzdCA1MDAgY2hhcnMgb2YgY29uZmlnXG4gICAgICB0aGlzLmxvZ2dlci5sb2dWYWxpZGF0aW9uRXJyb3JzKHJlc3VsdC5lcnJvcnMsICdyZW5kZXJlcicsIHtcbiAgICAgICAgY29uZmlnU25pcHBldDogY29uZmlnU25pcHBldFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIExvZyB3YXJuaW5ncyB0byBjb25zb2xlIChkb24ndCBicmVhayByZW5kZXJpbmcpXG4gICAgICBjb25zb2xlLndhcm4oJ1NtYXJ0IFRhYmxlOiBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZXJyb3JzIGRldGVjdGVkOicsIHJlc3VsdC5lcnJvcnMpO1xuICAgICAgcmVzdWx0LmVycm9ycy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgIC0gJHtlcnJvci5maWVsZCB8fCBlcnJvci5wYXRofTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGFkZCBjb2x1bW4gYnV0dG9uIGNsaWNrXG4gICAqL1xuICBvbkFkZENvbHVtbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjb2x1bW4gY3JlYXRlZCBmcm9tIG1vZGFsXG4gICAqL1xuICBvbkNvbHVtbkNyZWF0ZWQoY29sdW1uOiBDb2x1bW5Db25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgY29uc3QgYWRkRXZlbnQ6IENvbHVtbkFkZEV2ZW50ID0ge1xuICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICBpbmRleDogY29sdW1ucy5sZW5ndGgsXG4gICAgICB0b3RhbENvbHVtbnM6IGNvbHVtbnMubGVuZ3RoICsgMVxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgbmV3IGNvbHVtbiB0byBwYXJlbnQgY29tcG9uZW50XG4gICAgdGhpcy5jb2x1bW5BZGRlZC5lbWl0KGFkZEV2ZW50KTtcbiAgICBcbiAgICAvLyBDbG9zZSB0aGUgbW9kYWxcbiAgICB0aGlzLnNob3dDb2x1bW5Nb2RhbCA9IGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIG1vZGFsIGNhbmNlbGxlZFxuICAgKi9cbiAgb25Nb2RhbENhbmNlbGxlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDb2x1bW5Nb2RhbCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZpcnR1YWwgc2Nyb2xsIGlzIGVuYWJsZWRcbiAgICovXG4gIGlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LmVuYWJsZWQgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb2x1bW4gaXMgdGhlIGZpcnN0IHN0aWNreS1yaWdodCBjb2x1bW4gKGZvciBzaGFkb3cgc3R5bGluZylcbiAgICovXG4gIGlzRmlyc3RTdGlja3lSaWdodChjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0aWNreVJpZ2h0Q29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuc3RpY2t5ID09PSAncmlnaHQnICYmICFjb2wua2V5LmluY2x1ZGVzKCdzZXR0aW5ncycpKTtcbiAgICByZXR1cm4gc3RpY2t5UmlnaHRDb2x1bW5zLmxlbmd0aCA+IDAgJiYgc3RpY2t5UmlnaHRDb2x1bW5zWzBdLmtleSA9PT0gY29sdW1uS2V5O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHZpcnR1YWwgc2Nyb2xsIGl0ZW0gc2l6ZVxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/Lml0ZW1TaXplID8/IDQ4O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHZpZXdwb3J0IGhlaWdodFxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbFZpZXdwb3J0SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LnZpZXdwb3J0SGVpZ2h0ID8/IDYwMDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBidWZmZXIgc2l6ZVxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbEJ1ZmZlclNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuZGlzcGxheT8udmlydHVhbFNjcm9sbD8uYnVmZmVyU2l6ZSA/PyA1O1xuICB9XG4gIFxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB2aXJ0dWFsIHNjcm9sbCBzdGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplVmlydHVhbFNjcm9sbCgpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgIHNjcm9sbFRvcDogMCxcbiAgICAgIHZpZXdwb3J0SGVpZ2h0OiB0aGlzLmdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpLFxuICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgaXRlbVNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCksXG4gICAgICBidWZmZXJTaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxCdWZmZXJTaXplKClcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dChuZXdTdGF0ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXR1cCBzY3JvbGwgZXZlbnQgbGlzdGVuZXJcbiAgICovXG4gIHByaXZhdGUgc2V0dXBWaXJ0dWFsU2Nyb2xsTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbFZpZXdwb3J0KSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGVsZW1lbnQ7XG4gICAgXG4gICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLnZpcnR1YWxTY3JvbGxTZXJ2aWNlXG4gICAgICAuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShlbGVtZW50KVxuICAgICAgLnN1YnNjcmliZShzY3JvbGxUb3AgPT4gdGhpcy5vblZpcnR1YWxTY3JvbGwoc2Nyb2xsVG9wKSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdmlydHVhbCBzY3JvbGwgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgb25WaXJ0dWFsU2Nyb2xsKHNjcm9sbFRvcDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTZXJ2aWNlLmNhbGN1bGF0ZVZpc2libGVSYW5nZSh7XG4gICAgICBzY3JvbGxUb3AsXG4gICAgICB2aWV3cG9ydEhlaWdodDogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsVmlld3BvcnRIZWlnaHQoKSxcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgIGl0ZW1TaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpLFxuICAgICAgYnVmZmVyU2l6ZTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsQnVmZmVyU2l6ZSgpXG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQobmV3U3RhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJvdyBpbmRleCBmb3IgdHJhY2tpbmdcbiAgICovXG4gIGdldEFic29sdXRlUm93SW5kZXgocmVsYXRpdmVJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQudmFsdWU7XG4gICAgaWYgKCFjdXJyZW50U3RhdGUpIHJldHVybiByZWxhdGl2ZUluZGV4O1xuICAgIHJldHVybiBjdXJyZW50U3RhdGUuc3RhcnRJbmRleCArIHJlbGF0aXZlSW5kZXg7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIHRyYWNrQnlSb3dJbmRleCA9IChpbmRleDogbnVtYmVyLCByb3c6IENlbGw8YW55PltdKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBYnNvbHV0ZVJvd0luZGV4KGluZGV4KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNjcm9sbCB0byBzcGVjaWZpYyByb3cgcHJvZ3JhbW1hdGljYWxseVxuICAgKi9cbiAgc2Nyb2xsVG9Sb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY3JvbGxDb250YWluZXIgfHwgIXRoaXMuaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpKSByZXR1cm47XG4gICAgXG4gICAgY29uc3Qgc2Nyb2xsVG9wID0gaW5kZXggKiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpO1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIHJvdyBhY3Rpb25zIGFyZSBlbmFibGVkXG4gICAqL1xuICBoYXNSb3dBY3Rpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLm1lcmdlZENvbmZpZy5mZWF0dXJlcz8ucm93TWFuYWdlbWVudD8uYWN0aW9ucyAmJiBcbiAgICAgICAgICAgICAgdGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXMucm93TWFuYWdlbWVudC5hY3Rpb25zLmxlbmd0aCA+IDApO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJvdyBhY3Rpb25zIGZyb20gY29uZmlnXG4gICAqL1xuICBnZXRSb3dBY3Rpb25zKCk6IFJvd0FjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXM/LnJvd01hbmFnZW1lbnQ/LmFjdGlvbnMgfHwgW107XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcm93IGRhdGEgZnJvbSBjZWxsIGdyaWRcbiAgICovXG4gIGdldFJvd0RhdGEocm93SW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgY2VsbEdyaWQgPSB0aGlzLmdldEFjdGl2ZUNlbGxHcmlkKCk7XG4gICAgaWYgKCFjZWxsR3JpZCB8fCByb3dJbmRleCA8IDAgfHwgcm93SW5kZXggPj0gY2VsbEdyaWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgcm93ID0gY2VsbEdyaWRbcm93SW5kZXhdO1xuICAgIGlmICghcm93IHx8IHJvdy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgcmF3IGRhdGEgZnJvbSBmaXJzdCBjZWxsIChhbGwgY2VsbHMgaW4gYSByb3cgc2hhcmUgdGhlIHNhbWUgcm93RGF0YSlcbiAgICByZXR1cm4gcm93WzBdPy5nZXRSb3dEYXRhKCkgfHwgbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE9wZW4gcm93IGFjdGlvbnMgZHJvcGRvd25cbiAgICovXG4gIG9wZW5Sb3dBY3Rpb25zRHJvcGRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiAoYmVsb3cgdGhlIGJ1dHRvbiBieSBkZWZhdWx0KVxuICAgIGNvbnN0IHBvc2l0aW9uID0ge1xuICAgICAgeDogcmVjdC5sZWZ0LFxuICAgICAgeTogcmVjdC5ib3R0b20gKyA0IC8vIDRweCBnYXBcbiAgICB9O1xuICAgIFxuICAgIC8vIENyZWF0ZSBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dDogUm93QWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHJvd0RhdGEsXG4gICAgICByb3dJbmRleCxcbiAgICAgIGFjdGlvbnM6IHRoaXMuZ2V0Um93QWN0aW9ucygpXG4gICAgfTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZHJvcGRvd24gc3RhdGVcbiAgICB0aGlzLmRyb3Bkb3duU3RhdGUgPSB7XG4gICAgICBpc09wZW46IHRydWUsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIGNvbnRleHRcbiAgICB9O1xuICAgIFxuICAgIC8vIERpc2FibGUgYm9keSBzY3JvbGxcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgXG4gICAgLy8gSWYgdmlydHVhbCBzY3JvbGwgaXMgZW5hYmxlZCwgYWRkIHNjcm9sbCBsaXN0ZW5lciB0byBjbG9zZSBkcm9wZG93blxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgY29uc3Qgc2Nyb2xsTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VSb3dBY3Rpb25zRHJvcGRvd24oKTtcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbExpc3RlbmVyKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENsb3NlIHJvdyBhY3Rpb25zIGRyb3Bkb3duXG4gICAqL1xuICBjbG9zZVJvd0FjdGlvbnNEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duU3RhdGUgPSB7XG4gICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgcG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgICAgY29udGV4dDogbnVsbFxuICAgIH07XG4gICAgXG4gICAgLy8gUmUtZW5hYmxlIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHJvdyBhY3Rpb24gY2xpY2tlZFxuICAgKi9cbiAgb25Sb3dBY3Rpb25DbGlja2VkKGV2ZW50OiBSb3dBY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIC8vIEV4ZWN1dGUgYWN0aW9uIGNhbGxiYWNrIGlmIHByb3ZpZGVkXG4gICAgaWYgKGV2ZW50LmFjdGlvbi5hY3Rpb24pIHtcbiAgICAgIGV2ZW50LmFjdGlvbi5hY3Rpb24oZXZlbnQucm93RGF0YSwgZXZlbnQucm93SW5kZXgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbWl0IGV2ZW50IHRvIHBhcmVudFxuICAgIHRoaXMucm93QWN0aW9uLmVtaXQoZXZlbnQpO1xuICAgIFxuICAgIC8vIENsb3NlIGRyb3Bkb3duXG4gICAgdGhpcy5jbG9zZVJvd0FjdGlvbnNEcm9wZG93bigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDT0xVTU4gTUVOVSBBQ1RJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT3BlbiBjb2x1bW4gbWVudSBkcm9wZG93blxuICAgKi9cbiAgb3BlbkNvbHVtbk1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbHVtbjogQ29sdW1uQ29uZmlnPGFueT4sIGNvbHVtbkluZGV4OiBudW1iZXIsIGlzRmlyc3Q6IGJvb2xlYW4sIGlzTGFzdDogYm9vbGVhbik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gKGJlbG93IHRoZSBidXR0b24gYnkgZGVmYXVsdClcbiAgICBjb25zdCBwb3NpdGlvbiA9IHtcbiAgICAgIHg6IHJlY3QubGVmdCxcbiAgICAgIHk6IHJlY3QuYm90dG9tICsgNCAvLyA0cHggZ2FwXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dDogQ29sdW1uQWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgaXNGaXJzdENvbHVtbjogaXNGaXJzdCxcbiAgICAgIGlzTGFzdENvbHVtbjogaXNMYXN0LFxuICAgICAgdGFibGVTdGF0ZTogdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCksXG4gICAgICBhY3Rpb25zOiB0aGlzLmdldENvbHVtbkFjdGlvbnMoY29sdW1uLCBjb2x1bW5JbmRleCwgaXNGaXJzdCwgaXNMYXN0KVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgY29sdW1uIG1lbnUgc3RhdGVcbiAgICB0aGlzLmNvbHVtbk1lbnVTdGF0ZSA9IHtcbiAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgY29udGV4dFxuICAgIH07XG5cbiAgICAvLyBEaXNhYmxlIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgLy8gSWYgdmlydHVhbCBzY3JvbGwgaXMgZW5hYmxlZCwgYWRkIHNjcm9sbCBsaXN0ZW5lciB0byBjbG9zZSBkcm9wZG93blxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgY29uc3Qgc2Nyb2xsTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VDb2x1bW5NZW51KCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgY29sdW1uIG1lbnUgZHJvcGRvd25cbiAgICovXG4gIGNsb3NlQ29sdW1uTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbk1lbnVTdGF0ZSA9IHtcbiAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICBwb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICBjb250ZXh0OiBudWxsXG4gICAgfTtcblxuICAgIC8vIFJlLWVuYWJsZSBib2R5IHNjcm9sbFxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY29sdW1uIGFjdGlvbiBjbGlja2VkXG4gICAqL1xuICBvbkNvbHVtbkFjdGlvbkNsaWNrZWQoZXZlbnQ6IENvbHVtbkFjdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgLy8gRXhlY3V0ZSBhY3Rpb24gY2FsbGJhY2sgaWYgcHJvdmlkZWRcbiAgICBpZiAoZXZlbnQuYWN0aW9uLmFjdGlvbikge1xuICAgICAgZXZlbnQuYWN0aW9uLmFjdGlvbihldmVudC5jb2x1bW4sIGV2ZW50LmNvbHVtbkluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBEb24ndCBjbG9zZSBtZW51IGlmIGl0J3MgYSBmaWx0ZXIgYWN0aW9uIChmaWx0ZXIgbmVlZHMgbWVudSB0byBzdGF5IG9wZW4pXG4gICAgaWYgKGV2ZW50LmFjdGlvbi5pZCA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkcm9wZG93biBmb3Igb3RoZXIgYWN0aW9uc1xuICAgIHRoaXMuY2xvc2VDb2x1bW5NZW51KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbHVtbiBhY3Rpb25zIChidWlsdC1pbiArIGN1c3RvbSlcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29sdW1uQWN0aW9ucyhcbiAgICBjb2x1bW46IENvbHVtbkNvbmZpZzxhbnk+LCBcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLCBcbiAgICBpc0ZpcnN0OiBib29sZWFuLCBcbiAgICBpc0xhc3Q6IGJvb2xlYW5cbiAgKTogQ29sdW1uQWN0aW9uW10ge1xuICAgIGNvbnN0IGFjdGlvbnM6IENvbHVtbkFjdGlvbltdID0gW107XG4gICAgXG4gICAgLy8gQWRkIGJ1aWx0LWluIGFjdGlvbnMgaWYgZW5hYmxlZCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBjb25zdCBpbmNsdWRlQnVpbHRJbiA9IGNvbHVtbi5pbmNsdWRlQnVpbHRJbkFjdGlvbnMgPz8gdHJ1ZTtcbiAgICBpZiAoaW5jbHVkZUJ1aWx0SW4pIHtcbiAgICAgIGFjdGlvbnMucHVzaCguLi50aGlzLmdldEJ1aWx0SW5Db2x1bW5BY3Rpb25zKGNvbHVtbiwgY29sdW1uSW5kZXgsIGlzRmlyc3QsIGlzTGFzdCkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgY3VzdG9tIGNvbHVtbiBhY3Rpb25zIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbHVtbi5jb2x1bW5BY3Rpb25zICYmIGNvbHVtbi5jb2x1bW5BY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjdGlvbnMucHVzaCguLi5jb2x1bW4uY29sdW1uQWN0aW9ucyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBidWlsdC1pbiBjb2x1bW4gYWN0aW9ucyAoc29ydCwgZmlsdGVyLCBwaW4sIG1vdmUpXG4gICAqL1xuICBwcml2YXRlIGdldEJ1aWx0SW5Db2x1bW5BY3Rpb25zKFxuICAgIGNvbHVtbjogQ29sdW1uQ29uZmlnPGFueT4sXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBpc0ZpcnN0OiBib29sZWFuLFxuICAgIGlzTGFzdDogYm9vbGVhblxuICApOiBDb2x1bW5BY3Rpb25bXSB7XG4gICAgY29uc3QgdGFibGVTdGF0ZSA9IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpO1xuICAgIGNvbnN0IGFjdGlvbnM6IENvbHVtbkFjdGlvbltdID0gW107XG5cbiAgICAvLyBTb3J0IGFzY2VuZGluZ1xuICAgIGlmIChjb2x1bW4uc29ydGFibGUgIT09IGZhbHNlKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3NvcnQtYXNjJyxcbiAgICAgICAgbGFiZWw6IHRoaXMuZ2V0U29ydExhYmVsKGNvbHVtbiwgJ2FzYycpLFxuICAgICAgICBpY29uOiAn4oaRJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5hZGRTb3J0VG9Db2x1bW4oY29sLmtleSwgU29ydERpcmVjdGlvbi5BU0MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGRlc2NlbmRpbmdcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdzb3J0LWRlc2MnLFxuICAgICAgICBsYWJlbDogdGhpcy5nZXRTb3J0TGFiZWwoY29sdW1uLCAnZGVzYycpLFxuICAgICAgICBpY29uOiAn4oaTJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5hZGRTb3J0VG9Db2x1bW4oY29sLmtleSwgU29ydERpcmVjdGlvbi5ERVNDKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgc29ydCAob25seSBzaG93IGlmIGN1cnJlbnRseSBzb3J0ZWQpXG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSAhPT0gZmFsc2UgJiYgY29sdW1uLnNvcnREaXJlY3Rpb24gJiYgY29sdW1uLnNvcnREaXJlY3Rpb24gIT09IFNvcnREaXJlY3Rpb24uTk9ORSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdjbGVhci1zb3J0JyxcbiAgICAgICAgbGFiZWw6ICdDbGVhciBTb3J0JyxcbiAgICAgICAgaWNvbjogJ+KclScsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRhYmxlU3RhdGUuYWRkU29ydFRvQ29sdW1uKGNvbC5rZXksIFNvcnREaXJlY3Rpb24uTk9ORSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZpbHRlclxuICAgIGlmIChjb2x1bW4uZmlsdGVyYWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkOiAnZmlsdGVyJyxcbiAgICAgICAgbGFiZWw6ICdGaWx0ZXInLFxuICAgICAgICBpY29uOiAn4pqRJyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgLy8gRmlsdGVyIGFjdGlvbiBoYW5kbGVkIGJ5IGNvbHVtbiBtZW51IGNvbXBvbmVudFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQaW4gTGVmdCAoaWYgbm90IGFscmVhZHkgcGlubmVkKVxuICAgIGlmIChjb2x1bW4ucGlubmFibGUgIT09IGZhbHNlICYmIGNvbHVtbi5zdGlja3kgIT09ICdsZWZ0JyAmJiBjb2x1bW4uc3RpY2t5ICE9PSAncmlnaHQnKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3Bpbi1sZWZ0JyxcbiAgICAgICAgbGFiZWw6ICdQaW4gTGVmdCcsXG4gICAgICAgIGljb246ICfwn5OMJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5zZXRTdGlja3lDb2x1bW4oY29sLmtleSwgJ2xlZnQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUGluIFJpZ2h0IChpZiBub3QgYWxyZWFkeSBwaW5uZWQpXG4gICAgaWYgKGNvbHVtbi5waW5uYWJsZSAhPT0gZmFsc2UgJiYgY29sdW1uLnN0aWNreSAhPT0gJ2xlZnQnICYmIGNvbHVtbi5zdGlja3kgIT09ICdyaWdodCcpIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkOiAncGluLXJpZ2h0JyxcbiAgICAgICAgbGFiZWw6ICdQaW4gUmlnaHQnLFxuICAgICAgICBpY29uOiAn8J+TjCcsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRoaXMubW92ZUNvbHVtblRvRW5kKGNvbC5rZXkpO1xuICAgICAgICAgIHRhYmxlU3RhdGUuc2V0U3RpY2t5Q29sdW1uKGNvbC5rZXksICdyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBVbnBpbiAoaWYgY3VycmVudGx5IHBpbm5lZClcbiAgICBpZiAoY29sdW1uLnBpbm5hYmxlICE9PSBmYWxzZSAmJiAoY29sdW1uLnN0aWNreSA9PT0gJ2xlZnQnIHx8IGNvbHVtbi5zdGlja3kgPT09ICdyaWdodCcpKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3VucGluJyxcbiAgICAgICAgbGFiZWw6ICdVbnBpbicsXG4gICAgICAgIGljb246ICfwn5ONJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5zZXRTdGlja3lDb2x1bW4oY29sLmtleSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIGxlZnQgKG9ubHkgaWYgbW92YWJsZSBhbmQgbm90IHBpbm5lZClcbiAgICBpZiAoIWlzRmlyc3QgJiYgY29sdW1uLm1vdmFibGUgIT09IGZhbHNlICYmICFjb2x1bW4uc3RpY2t5KSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ21vdmUtbGVmdCcsXG4gICAgICAgIGxhYmVsOiAnTW92ZSBMZWZ0JyxcbiAgICAgICAgaWNvbjogJ+KGkCcsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRoaXMub25Db2x1bW5Nb3ZlZCh7XG4gICAgICAgICAgICBjb2x1bW5LZXk6IGNvbC5rZXksXG4gICAgICAgICAgICBkaXJlY3Rpb246ICdsZWZ0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIHJpZ2h0IChvbmx5IGlmIG1vdmFibGUgYW5kIG5vdCBwaW5uZWQpXG4gICAgaWYgKCFpc0xhc3QgJiYgY29sdW1uLm1vdmFibGUgIT09IGZhbHNlICYmICFjb2x1bW4uc3RpY2t5KSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ21vdmUtcmlnaHQnLFxuICAgICAgICBsYWJlbDogJ01vdmUgUmlnaHQnLFxuICAgICAgICBpY29uOiAn4oaSJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkNvbHVtbk1vdmVkKHtcbiAgICAgICAgICAgIGNvbHVtbktleTogY29sLmtleSxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ3JpZ2h0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc29ydCBsYWJlbCBiYXNlZCBvbiBjb2x1bW4gZGF0YSB0eXBlXG4gICAqL1xuICBwcml2YXRlIGdldFNvcnRMYWJlbChjb2x1bW46IENvbHVtbkNvbmZpZzxhbnk+LCBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IGNvbHVtbi5kYXRhVHlwZTtcblxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdhc2MnID8gJ1NvcnQgMOKGkjknIDogJ1NvcnQgOeKGkjAnO1xuICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnU29ydCBPbGRlc3QgRmlyc3QnIDogJ1NvcnQgTmV3ZXN0IEZpcnN0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnU29ydCBB4oaSWicgOiAnU29ydCBa4oaSQSc7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBLRVlCT0FSRCBOQVZJR0FUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVLZXlib2FyZE5hdmlnYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdGFibGVTdGF0ZSA9IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpO1xuICAgIFxuICAgIHRhYmxlU3RhdGUuc2V0RGltZW5zaW9ucyhcbiAgICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoXG4gICAgKTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gZm9jdXMgcG9zaXRpb24gY2hhbmdlc1xuICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24gPSB0YWJsZVN0YXRlLmZvY3VzZWRDZWxsUG9zaXRpb24kLnN1YnNjcmliZShwb3NpdGlvbiA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUNlbGxGb2N1c1N0YXRlcyhwb3NpdGlvbik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQXV0by1mb2N1cyBmaXJzdCBjZWxsIHRvIGVuYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgaWYgKHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGFibGVTdGF0ZS5mb2N1c0NlbGwoMCwgMCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgZm9jdXMgc3RhdGUgaW4gYWxsIGNlbGxzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNlbGxGb2N1c1N0YXRlcyhwb3NpdGlvbjogQ2VsbEZvY3VzUG9zaXRpb24gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpc2libGVDZWxsR3JpZCkgcmV0dXJuO1xuICAgIFxuICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGg7IHJvd0luZGV4KyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMudmlzaWJsZUNlbGxHcmlkW3Jvd0luZGV4XTtcbiAgICAgIGZvciAobGV0IGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCByb3cubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSByb3dbY29sSW5kZXhdO1xuICAgICAgICBpZiAoIWNlbGwpIGNvbnRpbnVlO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc2hvdWxkRm9jdXMgPSBwb3NpdGlvbiAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnJvd0luZGV4ID09PSByb3dJbmRleCAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbkluZGV4ID09PSBjb2xJbmRleDtcbiAgICAgICAgXG4gICAgICAgIGlmIChzaG91bGRGb2N1cykge1xuICAgICAgICAgIGNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAvLyBGb2N1cyB0aGUgYWN0dWFsIERPTSBlbGVtZW50XG4gICAgICAgICAgdGhpcy5mb2N1c1RkRWxlbWVudChyb3dJbmRleCwgY29sSW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNlbGwuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRm9jdXMgdGhlIFREIGVsZW1lbnQgaW4gdGhlIERPTVxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c1RkRWxlbWVudChyb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIERPTSBoYXMgdXBkYXRlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gTW9yZSByb2J1c3Q6IGZpbmQgdGhlIHRkIGJ5IGRhdGEgYXR0cmlidXRlc1xuICAgICAgY29uc3QgdHIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXJvdy1pbmRleD1cIiR7cm93SW5kZXh9XCJdYCk7XG4gICAgICBpZiAodHIpIHtcbiAgICAgICAgY29uc3QgY2VsbHMgPSB0ci5xdWVyeVNlbGVjdG9yQWxsKCd0ZDpub3QoLnNldHRpbmdzLWNvbHVtbiknKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q2VsbCA9IGNlbGxzW2NvbEluZGV4XSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldENlbGwpIHtcbiAgICAgICAgICB0YXJnZXRDZWxsLmZvY3VzKHsgcHJldmVudFNjcm9sbDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjZWxsIGNsaWNrXG4gICAqL1xuICBvbkNlbGxDbGljayhyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSByZXR1cm47XG4gICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuZm9jdXNDZWxsKHJvd0luZGV4LCBjb2x1bW5JbmRleCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCBlbnRlcmluZyBlZGl0IG1vZGVcbiAgICovXG4gIG9uQ2VsbEVkaXQoZXZlbnQ6IENlbGxFZGl0RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxFZGl0LmVtaXQoZXZlbnQpO1xuICAgIFxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSB7XG4gICAgICBjb25zdCByb3dJbmRleCA9IGV2ZW50LmNlbGwuZ2V0Um93SW5kZXgoKTtcbiAgICAgIGNvbnN0IGNvbHVtbktleSA9IGV2ZW50LmNvbHVtbktleTtcbiAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kSW5kZXgoY29sID0+IGNvbC5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgICBcbiAgICAgIGlmIChyb3dJbmRleCAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbkluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuc2V0RWRpdGluZ0NlbGwocm93SW5kZXgsIGNvbHVtbkluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCBzYXZlXG4gICAqL1xuICBvbkNlbGxTYXZlKGV2ZW50OiBDZWxsU2F2ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jZWxsU2F2ZS5lbWl0KGV2ZW50KTtcbiAgICBcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjZWxsIGNhbmNlbFxuICAgKi9cbiAgb25DZWxsQ2FuY2VsKGV2ZW50OiBDZWxsQ2FuY2VsRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxDYW5jZWwuZW1pdChldmVudCk7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCBzYXZlIHdpdGggbmF2aWdhdGlvbiAoRXhjZWwtbGlrZSBiZWhhdmlvcilcbiAgICovXG4gIG9uQ2VsbFNhdmVBbmROYXZpZ2F0ZShldmVudDoge2V2ZW50OiBLZXlib2FyZEV2ZW50LCBkaXJlY3Rpb246IE5hdmlnYXRpb25EaXJlY3Rpb259KTogdm9pZCB7XG4gICAgLy8gTmF2aWdhdGlvbiBpcyBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIGRpcmVjdGl2ZSBhZnRlciBzYXZlXG4gICAgLy8gSnVzdCBlbnN1cmUgZWRpdGluZyBzdGF0ZSBpcyBjbGVhcmVkXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICAgIC8vIE1vdmUgZm9jdXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5tb3ZlRm9jdXMoZXZlbnQuZGlyZWN0aW9uKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBmb2N1cyBvbiB0YWJsZSBjb250YWluZXIgLSBmb2N1cyBmaXJzdCBjZWxsIGlmIG5vIGNlbGwgaXMgZm9jdXNlZFxuICAgKi9cbiAgb25UYWJsZUNvbnRhaW5lckZvY3VzKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdGFibGVTdGF0ZSA9IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRGb2N1cyA9IHRhYmxlU3RhdGUuZ2V0Rm9jdXNlZFBvc2l0aW9uKCk7XG4gICAgXG4gICAgLy8gSWYgbm8gY2VsbCBpcyBmb2N1c2VkLCBmb2N1cyB0aGUgZmlyc3QgY2VsbFxuICAgIGlmICghY3VycmVudEZvY3VzICYmIHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0YWJsZVN0YXRlLmZvY3VzQ2VsbCgwLCAwKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWRcbiAgICovXG4gIGlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXM/LmtleWJvYXJkTmF2aWdhdGlvbj8uZW5hYmxlZCA/PyBmYWxzZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBFZGl0TW9kZSBlbnVtIHZhbHVlIGZvciBjZWxsc1xuICAgKiBGb3IgRXhjZWwtbGlrZSB0YWJsZXMgd2l0aCBrZXlib2FyZCBuYXZpZ2F0aW9uLCB1c2UgRU5URVIgbW9kZVxuICAgKiB3aGljaCBhbGxvd3MgYXJyb3cga2V5IG5hdmlnYXRpb24gd2l0aG91dCB0cmlnZ2VyaW5nIGVkaXQuXG4gICAqIERvdWJsZS1jbGljayB3aWxsIHN0aWxsIHdvcmsgdG8gc3RhcnQgZWRpdGluZy5cbiAgICovXG4gIGdldEVkaXRNb2RlRm9yQ2VsbHMoKTogRWRpdE1vZGUge1xuICAgIC8vIElmIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgZW5hYmxlZCwgdXNlIEVOVEVSIG1vZGUgZm9yIEV4Y2VsLWxpa2UgYmVoYXZpb3JcbiAgICAvLyBPdGhlcndpc2UgdXNlIENMSUNLIG1vZGUgZm9yIGltbWVkaWF0ZSBlZGl0aW5nXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBFZGl0TW9kZS5FTlRFUjtcbiAgICB9XG4gICAgcmV0dXJuIEVkaXRNb2RlLkNMSUNLO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgZm9jdXMgd2hlbiBjbGlja2luZyBvdXRzaWRlIHRhYmxlXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSB0YXJnZXQuY2xvc2VzdCgnLnN0LXRhYmxlJyk7XG4gICAgXG4gICAgaWYgKCF0YWJsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRm9jdXMoKTtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmludGVybmFsRGF0YSQuY29tcGxldGUoKTtcbiAgfVxuICBcbn1cblxuIiwiPCEtLSBUb3AgcGFnaW5hdGlvbiBjb250cm9scyAtLT5cbjxzdC1wYWdpbmF0aW9uIFxuICAqbmdJZj1cInNob3dUb3BQYWdpbmF0aW9uKCkgJiYgIShtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiIFxuICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICBbdGFibGVDb25maWddPVwibWVyZ2VkQ29uZmlnXCJcbiAgcG9zaXRpb249XCJ0b3BcIj5cbjwvc3QtcGFnaW5hdGlvbj5cblxuPGRpdiBjbGFzcz1cInN0LXRhYmxlXCIgKm5nSWY9XCIhKG1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5lbmFibGVkIHwgYXN5bmMpXCIgXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndmlydHVhbC1zY3JvbGwtZW5hYmxlZCc6IGlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSxcbiAgICAna2V5Ym9hcmQtbmF2aWdhdGlvbi1lbmFibGVkJzogaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKClcbiAgfVwiXG4gIFtuZ1N0eWxlXT1cIntcbiAgICAnbWF4LWhlaWdodC5weCc6ICFpc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkgPyBtZXJnZWRDb25maWcuZGlzcGxheT8ubWF4SGVpZ2h0IDogbnVsbFxuICB9XCJcbiAgc3RLZXlib2FyZE5hdmlnYXRpb25cbiAgW3RhYmxlU3RhdGVdPVwiZ2V0QWN0aXZlVGFibGVTdGF0ZSgpXCIgXG4gIFthdHRyLnRhYmluZGV4XT1cImlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpID8gMCA6IC0xXCJcbiAgKGZvY3VzKT1cIm9uVGFibGVDb250YWluZXJGb2N1cygkZXZlbnQpXCJcbiAgW2F0dHIudGl0bGVdPVwiaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkgPyAnQ2xpY2sgYSBjZWxsIG9yIHByZXNzIFRhYiB0byBzdGFydCBrZXlib2FyZCBuYXZpZ2F0aW9uJyA6IG51bGxcIj5cbiAgPCEtLSBVbmlmaWVkIFRhYmxlIEFjdGlvbnMgTWVudSAtLT5cblxuICA8IS0tIFZpcnR1YWwgc2Nyb2xsIHZpZXdwb3J0IHdyYXBwZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJzdC1zY3JvbGwtdmlld3BvcnRcIiAjc2Nyb2xsVmlld3BvcnQgKm5nSWY9XCJpc1ZpcnR1YWxTY3JvbGxFbmFibGVkKClcIlxuICAgIFtuZ1N0eWxlXT1cInsgJ2hlaWdodC5weCc6IGdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpIH1cIj5cblxuICAgIDwhLS0gU3BhY2VyIHRvIGNyZWF0ZSBzY3JvbGxhYmxlIGFyZWEgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0LXNjcm9sbC1zcGFjZXJcIiBbbmdTdHlsZV09XCJ7ICdoZWlnaHQucHgnOiB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQkIHwgYXN5bmMgfVwiPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUYWJsZSBwb3NpdGlvbmVyIHdpdGggdHJhbnNmb3JtIChpbnN0ZWFkIG9mIHRib2R5KSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3QtdGFibGUtcG9zaXRpb25lclwiIFtuZ1N0eWxlXT1cInsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgnICsgKHZpcnR1YWxTY3JvbGxPZmZzZXRZJCB8IGFzeW5jKSArICdweCknIH1cIj5cbiAgICAgIDwhLS0gVGFibGUgd2l0aCBvbmx5IHZpc2libGUgcm93cyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVRlbXBsYXRlOyBjb250ZXh0OiB7IFxuICAgICAgICBtb2RlOiAndmlydHVhbCcsXG4gICAgICAgIHRoZWFkU3R5bGU6IHsgdG9wOiAodmlydHVhbFNjcm9sbE9mZnNldFlOZWckIHwgYXN5bmMpICsgJ3B4JyB9XG4gICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBcbiAgPCEtLSBTdGFuZGFyZCB0YWJsZSAod2hlbiB2aXJ0dWFsIHNjcm9sbCBkaXNhYmxlZCkgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlVGVtcGxhdGU7IGNvbnRleHQ6IHsgXG4gICAgICBtb2RlOiAnc3RhbmRhcmQnLFxuICAgICAgdGhlYWRTdHlsZTogbnVsbFxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBTaGFyZWQgQ29sdW1uIE1lbnUgRHJvcGRvd24gLS0+XG4gIDxzdC1jb2x1bW4tbWVudS1kcm9wZG93biBcbiAgW2lzT3Blbl09XCJjb2x1bW5NZW51U3RhdGUuaXNPcGVuXCJcbiAgW3Bvc2l0aW9uXT1cImNvbHVtbk1lbnVTdGF0ZS5wb3NpdGlvblwiXG4gIFtjb250ZXh0XT1cImNvbHVtbk1lbnVTdGF0ZS5jb250ZXh0XCJcbiAgKGFjdGlvbkNsaWNrZWQpPVwib25Db2x1bW5BY3Rpb25DbGlja2VkKCRldmVudClcIlxuICAoY2xvc2VkKT1cImNsb3NlQ29sdW1uTWVudSgpXCI+XG4gIDwvc3QtY29sdW1uLW1lbnUtZHJvcGRvd24+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIihtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIFNoYXJlZCBSb3cgQWN0aW9ucyBEcm9wZG93biAtLT5cbjxzdC1yb3ctYWN0aW9ucy1kcm9wZG93biBbaXNPcGVuXT1cImRyb3Bkb3duU3RhdGUuaXNPcGVuXCIgW3Bvc2l0aW9uXT1cImRyb3Bkb3duU3RhdGUucG9zaXRpb25cIlxuICBbY29udGV4dF09XCJkcm9wZG93blN0YXRlLmNvbnRleHRcIiAoYWN0aW9uQ2xpY2tlZCk9XCJvblJvd0FjdGlvbkNsaWNrZWQoJGV2ZW50KVwiIChjbG9zZWQpPVwiY2xvc2VSb3dBY3Rpb25zRHJvcGRvd24oKVwiPlxuPC9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bj5cblxuXG48IS0tIEJvdHRvbSBwYWdpbmF0aW9uIGNvbnRyb2xzIC0tPlxuPHN0LXBhZ2luYXRpb24gXG4gICpuZ0lmPVwic2hvd0JvdHRvbVBhZ2luYXRpb24oKSAmJiAhKG1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5lbmFibGVkIHwgYXN5bmMpXCIgXG4gIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gIFt0YWJsZUNvbmZpZ109XCJtZXJnZWRDb25maWdcIlxuICBwb3NpdGlvbj1cImJvdHRvbVwiPlxuPC9zdC1wYWdpbmF0aW9uPlxuXG48IS0tIEFkZCBDb2x1bW4gTW9kYWwgLS0+XG48c3QtY29sdW1uLWVkaXRvci1tb2RhbCAqbmdJZj1cInNob3dDb2x1bW5Nb2RhbFwiIChjb2x1bW5DcmVhdGVkKT1cIm9uQ29sdW1uQ3JlYXRlZCgkZXZlbnQpXCJcbiAgKGNhbmNlbGxlZCk9XCJvbk1vZGFsQ2FuY2VsbGVkKClcIj5cbjwvc3QtY29sdW1uLWVkaXRvci1tb2RhbD5cblxuICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgPCEtLSBSRVVTQUJMRSBUQUJMRSBURU1QTEFURSAtLT5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gIDxuZy10ZW1wbGF0ZSAjdGFibGVUZW1wbGF0ZSBsZXQtbW9kZT1cIm1vZGVcIiBsZXQtdGhlYWRTdHlsZT1cInRoZWFkU3R5bGVcIj5cbiAgICA8dGFibGUgY2xhc3M9XCJzdC10YWJsZS1lbGVtZW50XCI+XG4gICAgICA8IS0tIFRBQkxFIEhFQURFUiAtLT5cbiAgICAgIDx0aGVhZCBbbmdDbGFzc109XCJ7ICdzdGlja3knOiBtZXJnZWRDb25maWcuZGlzcGxheT8uc3RpY2t5SGVhZGVyIH1cIiBbbmdTdHlsZV09XCJ0aGVhZFN0eWxlXCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8IS0tIFJvdyBOdW1iZXIgSGVhZGVyIC0tPlxuICAgICAgICAgIDx0aCAqbmdJZj1cIm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyXCIgY2xhc3M9XCJyb3ctbnVtYmVyLWhlYWRlciBoZWFkZXItY2VsbCBzdGlja3ktbGVmdFwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXG4gICAgICAgICAgICAgICAgJ2xlZnQucHgnOiAwLFxuICAgICAgICAgICAgICAgICd6LWluZGV4JzogWkluZGV4LlNUSUNLWV9IRUFERVJfQ0VMTCxcbiAgICAgICAgICAgICAgICAnd2lkdGgucHgnOiAzMFxuICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAjXG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8IS0tIENvbHVtbiBIZWFkZXJzIC0tPlxuICAgICAgICAgIDx0aCBcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdmlzaWJsZUNvbHVtbnM7IGxldCBjb2xJbmRleCA9IGluZGV4OyBsZXQgaXNGaXJzdCA9IGZpcnN0OyBsZXQgaXNMYXN0ID0gbGFzdFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdoZWFkZXItY2VsbCc6IG1vZGUgPT09ICdzdGFuZGFyZCcsXG4gICAgICAgICAgICAgICdzdGlja3ktbGVmdCc6IGNvbHVtbi5zdGlja3kgPT09ICdsZWZ0JyxcbiAgICAgICAgICAgICAgJ3N0aWNreS1yaWdodCc6IGNvbHVtbi5zdGlja3kgPT09ICdyaWdodCcsXG4gICAgICAgICAgICAgICdzdGlja3ktcmlnaHQtZmlyc3QnOiBjb2x1bW4uc3RpY2t5ID09PSAncmlnaHQnICYmIGlzRmlyc3RTdGlja3lSaWdodChjb2x1bW4ua2V5KSxcbiAgICAgICAgICAgICAgJ3Jlc2l6YWJsZSc6IGNvbHVtbi5yZXNpemFibGUgIT09IGZhbHNlXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgcG9zaXRpb246IGNvbHVtbi5zdGlja3kgPyAnc3RpY2t5JyA6IG51bGwsXG4gICAgICAgICAgICAgICdsZWZ0LnB4JzogY29sdW1uLnN0aWNreSA9PT0gJ2xlZnQnID8gKGNvbHVtbi5zdGlja3lPZmZzZXQgfHwgMCkgOiBudWxsLFxuICAgICAgICAgICAgICAncmlnaHQucHgnOiBjb2x1bW4uc3RpY2t5ID09PSAncmlnaHQnID8gKGNvbHVtbi5zdGlja3lPZmZzZXQgfHwgMCkgOiBudWxsLFxuICAgICAgICAgICAgICAnei1pbmRleCc6IGNvbHVtbi5zdGlja3kgPyBaSW5kZXguU1RJQ0tZX0hFQURFUl9DRUxMIDogbnVsbCxcbiAgICAgICAgICAgICAgJ3dpZHRoLnB4JzogY29sdW1uLndpZHRoXG4gICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxzdC1oZWFkZXIgXG4gICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbEluZGV4XCJcbiAgICAgICAgICAgICAgW2lzRmlyc3RDb2x1bW5dPVwiaXNGaXJzdFwiXG4gICAgICAgICAgICAgIFtpc0xhc3RDb2x1bW5dPVwiaXNMYXN0XCJcbiAgICAgICAgICAgICAgW3RhYmxlU3RhdGVdPVwiZ2V0QWN0aXZlVGFibGVTdGF0ZSgpXCJcbiAgICAgICAgICAgICAgW2VuYWJsZVNvcnRpbmddPVwibWVyZ2VkQ29uZmlnLnNvcnRpbmc/LmVuYWJsZWQgPz8gZW5hYmxlU29ydGluZ1wiXG4gICAgICAgICAgICAgIFtlbmFibGVGaWx0ZXJpbmddPVwibWVyZ2VkQ29uZmlnLmZpbHRlcmluZz8uZW5hYmxlZCA/PyBlbmFibGVGaWx0ZXJpbmdcIlxuICAgICAgICAgICAgICAoY29sdW1uTW92ZWQpPVwib25Db2x1bW5Nb3ZlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG1lbnVDbGljayk9XCJvcGVuQ29sdW1uTWVudSgkZXZlbnQsIGNvbHVtbiwgY29sSW5kZXgsIGlzRmlyc3QsIGlzTGFzdClcIj5cbiAgICAgICAgICAgIDwvc3QtaGVhZGVyPlxuXG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiBcbiAgICAgICAgICAgICAgc3RDb2x1bW5SZXNpemVcbiAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAoY29sdW1uUmVzaXplZCk9XCJvbkNvbHVtblJlc2l6ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnJlc2l6YWJsZSAhPT0gZmFsc2VcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgXG4gICAgICAgICAgPCEtLSBTZXR0aW5ncyBDb2x1bW4gSGVhZGVyIC0tPlxuICAgICAgICAgIDx0aCBcbiAgICAgICAgICAgIGNsYXNzPVwic2V0dGluZ3MtY29sdW1uIHN0aWNreS1yaWdodFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdoZWFkZXItY2VsbCc6IG1vZGUgPT09ICdzdGFuZGFyZCcgfVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd6LWluZGV4JzogWkluZGV4LlNUSUNLWV9IRUFERVJfQ0VMTCB9XCI+XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ2ZsZXgtY2VudGVyJzogbW9kZSA9PT0gJ3ZpcnR1YWwnLCAnaGVhZGVyLWNvbnRlbnQnOiBtb2RlID09PSAnc3RhbmRhcmQnIH1cIj5cbiAgICAgICAgICAgICAgPHN0LXRhYmxlLWFjdGlvbnMgXG4gICAgICAgICAgICAgICAgW3RhYmxlU3RhdGVdPVwiZ2V0QWN0aXZlVGFibGVTdGF0ZSgpXCJcbiAgICAgICAgICAgICAgICBbYWxsb3dBZGRDb2x1bW5dPVwibWVyZ2VkQ29uZmlnLmZlYXR1cmVzPy5jb2x1bW5NYW5hZ2VtZW50Py5hbGxvd0FkZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKGFkZENvbHVtbkNsaWNrZWQpPVwib25BZGRDb2x1bW5DbGljaygpXCI+XG4gICAgICAgICAgICAgIDwvc3QtdGFibGUtYWN0aW9ucz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuXG4gICAgICA8IS0tIFRBQkxFIEJPRFkgLS0+XG4gICAgICA8dGJvZHk+XG4gICAgICAgIDwhLS0gVmlydHVhbCBTY3JvbGwgUm93cyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGUgPT09ICd2aXJ0dWFsJ1wiPlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHZpc2libGVSb3dzJCB8IGFzeW5jOyBsZXQgcmVsYXRpdmVJbmRleCA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Um93SW5kZXhcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1yb3ctaW5kZXhdPVwiZ2V0QWJzb2x1dGVSb3dJbmRleChyZWxhdGl2ZUluZGV4KVwiPlxuICAgICAgICAgICAgPCEtLSBSb3cgTnVtYmVyIENlbGwgLS0+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJtZXJnZWRDb25maWcuc2hvd1Jvd051bWJlclwiIGNsYXNzPVwicm93LW51bWJlci1jZWxsXCIgXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3N0aWNreS1sZWZ0JzogJ2xlZnQnIH1cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgJ3dpZHRoLnB4JzogMzAsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxuICAgICAgICAgICAgICAgICdsZWZ0LnB4JzogMCxcbiAgICAgICAgICAgICAgICAnei1pbmRleCc6IFpJbmRleC5TVElDS1lfQk9EWV9DRUxMLFxuICAgICAgICAgICAgICAgICdoZWlnaHQucHgnOiBtb2RlID09PSAndmlydHVhbCcgPyBnZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSA6IG51bGxcbiAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICB7e2dldEFic29sdXRlUm93SW5kZXgocmVsYXRpdmVJbmRleCkgKyAxfX1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm9keUNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyBcbiAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgIHJvd0luZGV4OiBnZXRBYnNvbHV0ZVJvd0luZGV4KHJlbGF0aXZlSW5kZXgpLFxuICAgICAgICAgICAgICBtb2RlOiAndmlydHVhbCcsXG4gICAgICAgICAgICAgIHJlbGF0aXZlSW5kZXg6IHJlbGF0aXZlSW5kZXhcbiAgICAgICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFN0YW5kYXJkIFJvd3MgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAnc3RhbmRhcmQnXCI+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgdmlzaWJsZUNlbGxHcmlkOyBsZXQgcm93SW5kZXggPSBpbmRleFwiIFthdHRyLmRhdGEtcm93LWluZGV4XT1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICA8IS0tIFJvdyBOdW1iZXIgQ2VsbCAtLT5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cIm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyXCIgY2xhc3M9XCJyb3ctbnVtYmVyLWNlbGxcIiBcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc3RpY2t5LWxlZnQnOiAnbGVmdCcgfVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAnd2lkdGgucHgnOiAzMCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXG4gICAgICAgICAgICAgICAgJ2xlZnQucHgnOiAwLFxuICAgICAgICAgICAgICAgICd6LWluZGV4JzogWkluZGV4LlNUSUNLWV9CT0RZX0NFTEwsXG4gICAgICAgICAgICAgICAgJ2hlaWdodC5weCc6IG1vZGUgPT09ICd2aXJ0dWFsJyA/IGdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpIDogbnVsbFxuICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgIHt7cm93SW5kZXggKyAxfX1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYm9keUNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyBcbiAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgICAgICAgICAgbW9kZTogJ3N0YW5kYXJkJ1xuICAgICAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gIDwhLS0gUkVVU0FCTEUgQk9EWSBDRUxMIFRFTVBMQVRFIC0tPlxuICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT5cbiAgPG5nLXRlbXBsYXRlICNib2R5Q2VsbFRlbXBsYXRlIGxldC1yb3c9XCJyb3dcIiBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIGxldC1tb2RlPVwibW9kZVwiIGxldC1yZWxhdGl2ZUluZGV4PVwicmVsYXRpdmVJbmRleFwiPlxuICAgIDwhLS0gRGF0YSBDZWxscyAtLT5cbiAgICA8dGQgXG4gICAgICAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3c7IGxldCBjb2xJbmRleCA9IGluZGV4XCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3N0aWNreS1sZWZ0JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3kgPT09ICdsZWZ0JyxcbiAgICAgICAgJ3N0aWNreS1yaWdodCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID09PSAncmlnaHQnLFxuICAgICAgICAnc3RpY2t5LXJpZ2h0LWZpcnN0JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3kgPT09ICdyaWdodCcgJiYgdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5rZXkgJiYgaXNGaXJzdFN0aWNreVJpZ2h0KHZpc2libGVDb2x1bW5zW2NvbEluZGV4XS5rZXkpLFxuICAgICAgICAnYWxpZ24tY2VudGVyJzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5hbGlnbm1lbnQgPT09ICdjZW50ZXInLFxuICAgICAgICAnYWxpZ24tcmlnaHQnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LmFsaWdubWVudCA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgJ2NlbGwtZm9jdXNlZCc6IGNlbGwuaXNGb2N1c2VkKClcbiAgICAgIH1cIlxuICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICBwb3NpdGlvbjogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3kgPyAnc3RpY2t5JyA6IG51bGwsXG4gICAgICAgICdsZWZ0LnB4JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3kgPT09ICdsZWZ0JyA/ICh2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreU9mZnNldCB8fCAwKSA6IG51bGwsXG4gICAgICAgICdyaWdodC5weCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID09PSAncmlnaHQnID8gKHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5T2Zmc2V0IHx8IDApIDogbnVsbCxcbiAgICAgICAgJ3otaW5kZXgnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA/IFpJbmRleC5TVElDS1lfQk9EWV9DRUxMIDogbnVsbCxcbiAgICAgICAgJ3dpZHRoLnB4JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy53aWR0aCxcbiAgICAgICAgJ2hlaWdodC5weCc6IG1vZGUgPT09ICd2aXJ0dWFsJyA/IGdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpIDogbnVsbFxuICAgICAgfVwiXG4gICAgICAoY2xpY2spPVwiaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkgPyBvbkNlbGxDbGljayhyb3dJbmRleCwgY29sSW5kZXgpIDogbnVsbFwiPlxuICAgICAgXG4gICAgICA8IS0tIFZpcnR1YWwgU2Nyb2xsIENlbGwgLS0+XG4gICAgICA8c3QtY2VsbCBcbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAndmlydHVhbCdcIlxuICAgICAgICBbY2VsbF09XCJjZWxsXCIgXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwuaXNGb2N1c2VkKCkgPyAwIDogLTFcIiBcbiAgICAgICAgW2VkaXRNb2RlXT1cImdldEVkaXRNb2RlRm9yQ2VsbHMoKVwiXG4gICAgICAgIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gICAgICAgIFt0YWJsZUNvbmZpZ109XCJtZXJnZWRDb25maWdcIlxuICAgICAgICBbY29sdW1uSW5kZXhdPVwiY29sSW5kZXhcIlxuICAgICAgICAoY2VsbEVkaXQpPVwib25DZWxsRWRpdCgkZXZlbnQpXCIgXG4gICAgICAgIChjZWxsU2F2ZSk9XCJvbkNlbGxTYXZlKCRldmVudClcIlxuICAgICAgICAoY2VsbFNhdmVBbmROYXZpZ2F0ZSk9XCJvbkNlbGxTYXZlQW5kTmF2aWdhdGUoJGV2ZW50KVwiIFxuICAgICAgICAoY2VsbENhbmNlbCk9XCJvbkNlbGxDYW5jZWwoJGV2ZW50KVwiXG4gICAgICAgIChjZWxsQ2hhbmdlKT1cImNlbGxDaGFuZ2UuZW1pdCgkZXZlbnQpXCI+XG4gICAgICA8L3N0LWNlbGw+XG5cbiAgICAgIDwhLS0gU3RhbmRhcmQgQ2VsbCAtLT5cbiAgICAgIDxzdC1jZWxsIFxuICAgICAgICAqbmdJZj1cIm1vZGUgPT09ICdzdGFuZGFyZCdcIlxuICAgICAgICBbY2VsbF09XCJjZWxsXCIgIFxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjZWxsLmlzRm9jdXNlZCgpID8gMCA6IC0xXCJcbiAgICAgICAgW3RhYmxlU3RhdGVdPVwiZ2V0QWN0aXZlVGFibGVTdGF0ZSgpXCJcbiAgICAgICAgW3RhYmxlQ29uZmlnXT1cIm1lcmdlZENvbmZpZ1wiXG4gICAgICAgIFtjb2x1bW5JbmRleF09XCJjb2xJbmRleFwiXG4gICAgICAgIChjZWxsU2F2ZSk9XCJvbkNlbGxTYXZlKCRldmVudClcIlxuICAgICAgICAoY2VsbENoYW5nZSk9XCJjZWxsQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9zdC1jZWxsPlxuICAgIDwvdGQ+XG4gICAgXG4gICAgPCEtLSBSb3cgQWN0aW9ucyBDZWxsIC0tPlxuICAgIDx0ZCBjbGFzcz1cInNldHRpbmdzLWNvbHVtblwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdoYXMtYWN0aW9ucyc6IGhhc1Jvd0FjdGlvbnMoKVxuICAgICAgfVwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgIHBvc2l0aW9uOiBoYXNSb3dBY3Rpb25zKCkgPyAnc3RpY2t5JyA6IG51bGwsXG4gICAgICAgICdyaWdodC5weCc6IGhhc1Jvd0FjdGlvbnMoKSA/IDAgOiBudWxsLFxuICAgICAgICAnei1pbmRleCc6IGhhc1Jvd0FjdGlvbnMoKSA/IFpJbmRleC5TVElDS1lfQk9EWV9DRUxMIDogbnVsbFxuICAgICAgfVwiPlxuICAgICAgPGJ1dHRvbiBcbiAgICAgICAgKm5nSWY9XCJoYXNSb3dBY3Rpb25zKClcIlxuICAgICAgICBjbGFzcz1cInNldHRpbmdzLXRyaWdnZXJcIlxuICAgICAgICAoY2xpY2spPVwib3BlblJvd0FjdGlvbnNEcm9wZG93bigkZXZlbnQsIGdldFJvd0RhdGEocm93SW5kZXgpLCByb3dJbmRleClcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgIGFyaWEtbGFiZWw9XCJSb3cgYWN0aW9uc1wiPlxuICAgICAgICDii69cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvdGQ+XG4gIDwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2tlbGV0b25Mb2FkZXI+XG4gIDxkaXYgY2xhc3M9XCJsaXN0LXJvd1wiICpuZ0lmPVwiKG1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5lbmFibGVkIHwgYXN5bmMpXCI+XG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgaSBvZiBza2VsZXRvbkNvbHVtbnNcIiBjbGFzcz1cImxpc3QtY29udGVudFwiPlxuICAgICAgPG5pbGUtc2tlbGV0b24tbG9hZGVyIHZhcmlhbnQ9XCJ0ZXh0XCIgd2lkdGg9XCI5MCVcIiBoZWlnaHQ9XCIxOFwiICpuZ0Zvcj1cImxldCBqIG9mIHNrZWxldG9uUm93c1wiPjwvbmlsZS1za2VsZXRvbi1sb2FkZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
1254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXRhYmxlL3N0LXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC10YWJsZS9zdC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUErQyxTQUFTLEVBQUUsVUFBVSxFQUFpQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEssT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RixPQUFPLEVBQWtFLFFBQVEsRUFBdUIsTUFBTSw0QkFBNEIsQ0FBQztBQUMzSSxPQUFPLEVBQUUsZUFBZSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFRekQsTUFBTSxPQUFPLGdCQUFnQjtJQTBIM0IsWUFDVSxlQUEyQyxFQUMzQyxNQUErQixFQUMvQixvQkFBMEM7UUFGMUMsb0JBQWUsR0FBZixlQUFlLENBQTRCO1FBQzNDLFdBQU0sR0FBTixNQUFNLENBQXlCO1FB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SSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7NkdBNzVDVSxnQkFBZ0I7aUdBQWhCLGdCQUFnQiw4d0JBd0hVLFVBQVUsa0RDaEpqRCxzMlhBNlJjOzJGRHJRRCxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsVUFBVTswTEFTWCxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0ksV0FBVztzQkFBcEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUdHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFHRyxXQUFXO3NCQUFwQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBR0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUdFLGNBQWM7c0JBQXRCLEtBQUs7Z0JBMEU2QyxjQUFjO3NCQUFoRSxTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFpeENqRCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb2x1bW4tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDZWxsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NlbGwuY2xhc3MnO1xuaW1wb3J0IHsgVGFibGVTdGF0ZSB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS1zdGF0ZS5jbGFzcyc7XG5pbXBvcnQgeyBUYWJsZUNvbmZpZywgbWVyZ2VUYWJsZUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90YWJsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRhYmxlU3RhdGVDaGFuZ2VFdmVudCwgQ29sdW1uUmVzaXplRXZlbnQsIENvbHVtbkFkZEV2ZW50LCBDb2x1bW5Nb3ZlRXZlbnQsIENlbGxGb2N1c1Bvc2l0aW9uLCBEYXRhQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFibGUtdHlwZXMnO1xuaW1wb3J0IHsgQ2VsbENoYW5nZUV2ZW50LCBDZWxsU2F2ZUV2ZW50LCBDZWxsRWRpdEV2ZW50LCBDZWxsQ2FuY2VsRXZlbnQsIEVkaXRNb2RlLCBOYXZpZ2F0aW9uRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NlbGwtdHlwZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBKc29uU2NoZW1hVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2pzb24tc2NoZW1hLXZhbGlkYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9zY2hlbWEtdmFsaWRhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFZpcnR1YWxTY3JvbGxTZXJ2aWNlLCBWaXJ0dWFsU2Nyb2xsU3RhdGUgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy92aXJ0dWFsLXNjcm9sbC5zZXJ2aWNlJztcbmltcG9ydCB7IFJvd0FjdGlvbiwgUm93QWN0aW9uQ29udGV4dCwgUm93QWN0aW9uRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvcm93LWFjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sdW1uQWN0aW9uLCBDb2x1bW5BY3Rpb25Db250ZXh0LCBDb2x1bW5BY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb2x1bW4tYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBUYWJsZVpJbmRleCB9IGZyb20gJy4uLy4uL21vZGVscy96LWluZGV4LmVudW0nO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS10eXBlcyc7XG5pbXBvcnQgeyBUYWJsZVZhbGlkYXRpb25TdGF0ZSB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS12YWxpZGF0aW9uLXN0YXRlLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3QtdGFibGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTdFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vIFotSW5kZXggY29uc3RhbnRzIGZvciB0ZW1wbGF0ZSB1c2VcbiAgcmVhZG9ubHkgWkluZGV4ID0gVGFibGVaSW5kZXg7XG4gIFxuICAvLyBORVc6IFByaW1hcnkgY29uZmlndXJhdGlvbiBpbnB1dFxuICBASW5wdXQoKSB0YWJsZUNvbmZpZyE6IFRhYmxlQ29uZmlnO1xuICBcbiAgLy8gTkVXOiBSYXcgZGF0YSBpbnB1dCAoYWx0ZXJuYXRpdmUgdG8gY2VsbEdyaWQpXG4gIEBJbnB1dCgpIGRhdGE/OiBhbnlbXTtcbiAgXG4gIC8vIE5FVzogT2JzZXJ2YWJsZS9CZWhhdmlvclN1YmplY3QgZGF0YSBpbnB1dCAoZm9yIHJlYWN0aXZlIGRhdGEgc3RyZWFtcylcbiAgQElucHV0KCkgZGF0YSQ/OiBPYnNlcnZhYmxlPGFueVtdPiB8IEJlaGF2aW9yU3ViamVjdDxhbnlbXT47XG4gIFxuICBASW5wdXQoKSB0YWJsZVN0YXRlPzogVGFibGVTdGF0ZTtcbiAgXG4gIC8vIERFUFJFQ0FURUQ6IFVzZSB0YWJsZUNvbmZpZyBpbnN0ZWFkXG4gIEBJbnB1dCgpIGVuYWJsZVNvcnRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBlbmFibGVGaWx0ZXJpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgLy8gTkVXOiBTdGF0ZSBjaGFuZ2Ugb3V0cHV0XG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVTdGF0ZUNoYW5nZUV2ZW50PigpO1xuICBcbiAgLy8gTkVXOiBEYXRhIGNoYW5nZSBvdXRwdXQgKGZvciBhc3luYyBkYXRhIHVwZGF0ZXMpXG4gIEBPdXRwdXQoKSBkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhQ2hhbmdlRXZlbnQ+KCk7XG4gIFxuICAvLyBFWElTVElORzogQ2VsbCBhbmQgY29sdW1uIGV2ZW50c1xuICBAT3V0cHV0KCkgY2VsbEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxFZGl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjZWxsU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbFNhdmVFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxDYW5jZWxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxDaGFuZ2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtblJlc2l6ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtblJlc2l6ZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgY29sdW1uTW92ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbk1vdmVFdmVudD4oKTtcbiAgXG4gIC8vIE5FVzogQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIG91dHB1dFxuICBAT3V0cHV0KCkgY29uZmlnVmFsaWRhdGlvbkVycm9ycyA9IG5ldyBFdmVudEVtaXR0ZXI8U2NoZW1hVmFsaWRhdGlvbkVycm9yW10+KCk7XG4gIFxuICAvLyBORVc6IENvbHVtbiBtYW5hZ2VtZW50IG91dHB1dFxuICBAT3V0cHV0KCkgY29sdW1uQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbkFkZEV2ZW50PigpO1xuICBcbiAgLy8gTkVXOiBSb3cgYWN0aW9uIG91dHB1dFxuICBAT3V0cHV0KCkgcm93QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dBY3Rpb25FdmVudD4oKTtcbiAgXG4gIC8vIE5FVzogVmFsaWRhdGlvbiBzdGF0ZSBjaGFuZ2Ugb3V0cHV0XG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRhYmxlVmFsaWRhdGlvblN0YXRlPigpO1xuICBcbiAgLy8gTkVXOiBPcHRpb25hbCB2YWxpZGF0aW9uIGZsYWdcbiAgQElucHV0KCkgdmFsaWRhdGVDb25maWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIEludGVybmFsIHN0YXRlXG4gIHByaXZhdGUgaW50ZXJuYWxUYWJsZVN0YXRlPzogVGFibGVTdGF0ZTtcbiAgcHJpdmF0ZSBpbnRlcm5hbENlbGxHcmlkPzogQ2VsbDxhbnk+W11bXTtcbiAgcHJpdmF0ZSBzdGF0ZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBmb2N1c1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRhdGFTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgaW50ZXJuYWxEYXRhJDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgcHJpdmF0ZSBwcmV2aW91c0RhdGE6IGFueVtdID0gW107XG4gIG1lcmdlZENvbmZpZyE6IFRhYmxlQ29uZmlnO1xuICBcbiAgLy8gTW9kYWwgc3RhdGVcbiAgcHVibGljIHNob3dDb2x1bW5Nb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gQ2FjaGVkIHZpc2libGUgY29sdW1ucyBhbmQgY2VsbCBncmlkIHRvIHByZXZlbnQgcmUtY3JlYXRpb24gb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IENvbHVtbkNvbmZpZzxhbnk+W10gPSBbXTtcbiAgcHVibGljIHZpc2libGVDZWxsR3JpZDogQ2VsbDxhbnk+W11bXSA9IFtdO1xuICBcbiAgLy8gUm93IGFjdGlvbnMgZHJvcGRvd24gc3RhdGVcbiAgcHVibGljIGRyb3Bkb3duU3RhdGU6IHtcbiAgICBpc09wZW46IGJvb2xlYW47XG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICBjb250ZXh0OiBSb3dBY3Rpb25Db250ZXh0IHwgbnVsbDtcbiAgfSA9IHtcbiAgICBpc09wZW46IGZhbHNlLFxuICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICBjb250ZXh0OiBudWxsXG4gIH07XG4gIFxuICBwdWJsaWMgc2tlbGV0b25Db2x1bW5zPzogbnVtYmVyW107XG4gIHB1YmxpYyBza2VsZXRvblJvd3M/OiBudW1iZXJbXTtcblxuICAvLyBDb2x1bW4gbWVudSBkcm9wZG93biBzdGF0ZVxuICBwdWJsaWMgY29sdW1uTWVudVN0YXRlOiB7XG4gICAgaXNPcGVuOiBib29sZWFuO1xuICAgIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgY29udGV4dDogQ29sdW1uQWN0aW9uQ29udGV4dCB8IG51bGw7XG4gIH0gPSB7XG4gICAgaXNPcGVuOiBmYWxzZSxcbiAgICBwb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgY29udGV4dDogbnVsbFxuICB9O1xuICBcbiAgLy8gVmlydHVhbCBzY3JvbGwgcHJvcGVydGllc1xuICBwcml2YXRlIHNjcm9sbENvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHNjcm9sbFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSB2aXJ0dWFsU2Nyb2xsU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWaXJ0dWFsU2Nyb2xsU3RhdGUgfCBudWxsPihudWxsKTtcbiAgXG4gIC8vIE9ic2VydmFibGUgc3RyZWFtcyBkZXJpdmVkIGZyb20gdmlydHVhbCBzY3JvbGwgc3RhdGVcbiAgcHVibGljIHZpcnR1YWxTY3JvbGxUb3RhbEhlaWdodCQ6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC5waXBlKFxuICAgIG1hcChzdGF0ZSA9PiBzdGF0ZT8udG90YWxIZWlnaHQgPz8gMCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuICBcbiAgcHVibGljIHZpcnR1YWxTY3JvbGxPZmZzZXRZJDogT2JzZXJ2YWJsZTxudW1iZXI+ID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnBpcGUoXG4gICAgbWFwKHN0YXRlID0+IHN0YXRlPy5vZmZzZXRZID8/IDApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcblxuICBwdWJsaWMgdmlydHVhbFNjcm9sbE9mZnNldFlOZWckOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQucGlwZShcbiAgICBtYXAoc3RhdGUgPT4gTnVtYmVyKHN0YXRlPy5vZmZzZXRZID8/IDApICogLTEgKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG4gIFxuICBwdWJsaWMgdmlzaWJsZVJvd3MkOiBPYnNlcnZhYmxlPENlbGw8YW55PltdW10+ID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnBpcGUoXG4gICAgbWFwKHN0YXRlID0+IHtcbiAgICAgIGlmICghc3RhdGUpIHJldHVybiB0aGlzLnZpc2libGVDZWxsR3JpZDtcbiAgICAgIGNvbnN0IHsgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHN0YXRlO1xuICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZUNlbGxHcmlkLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9KVxuICApO1xuICBcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsVmlld3BvcnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgc2Nyb2xsVmlld3BvcnQ/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2NoZW1hVmFsaWRhdG9yOiBKc29uU2NoZW1hVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlcjogVmFsaWRhdGlvbkxvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB2aXJ0dWFsU2Nyb2xsU2VydmljZTogVmlydHVhbFNjcm9sbFNlcnZpY2UsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGF0IGxlYXN0IHRhYmxlQ29uZmlnIG9yIGNvbHVtbnMgaXMgcHJvdmlkZWRcbiAgICBpZiAoIXRoaXMudGFibGVDb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRWl0aGVyIHRhYmxlQ29uZmlnIG9yIGNvbHVtbnMgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNZXJnZSBjb25maWcgd2l0aCBkZWZhdWx0c1xuICAgIGlmICh0aGlzLnRhYmxlQ29uZmlnKSB7XG4gICAgICB0aGlzLm1lcmdlZENvbmZpZyA9IG1lcmdlVGFibGVDb25maWcodGhpcy50YWJsZUNvbmZpZyk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gaWYgZW5hYmxlZFxuICAgICAgaWYgKHRoaXMudmFsaWRhdGVDb25maWcpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZ3VyYXRpb24odGhpcy5tZXJnZWRDb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgb3IgdXNlIFRhYmxlU3RhdGVcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkge1xuICAgICAgdGhpcy5jcmVhdGVJbnRlcm5hbFRhYmxlU3RhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3Vic2NyaWJlIHRvIGV4dGVybmFsIHRhYmxlU3RhdGUgY2hhbmdlc1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0V4dGVybmFsVGFibGVTdGF0ZSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBkYXRhIHNvdXJjZSAoc3luYyBvciBhc3luYylcbiAgICB0aGlzLnNldHVwRGF0YVNvdXJjZSgpO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0c1xuICAgIGNvbnN0IHJvd051bWJlcldpZHRoID0gdGhpcy5tZXJnZWRDb25maWcuc2hvd1Jvd051bWJlciA/IDMwIDogMDtcbiAgICBjb25zdCBzZXR0aW5nc0NvbHVtbldpZHRoID0gdGhpcy5oYXNSb3dBY3Rpb25zKCkgPyAyOCA6IDA7IC8vIFNldHRpbmdzIGNvbHVtbiBpcyB+MzJweCB3aWRlIHdoZW4gdmlzaWJsZVxuICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMocm93TnVtYmVyV2lkdGgsIHNldHRpbmdzQ29sdW1uV2lkdGgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgdmlzaWJsZSBjb2x1bW5zIGFuZCBjZWxsIGdyaWRcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB2aXJ0dWFsIHNjcm9sbCBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVWaXJ0dWFsU2Nyb2xsKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEluaXRpYWxpemUga2V5Ym9hcmQgbmF2aWdhdGlvbiBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUtleWJvYXJkTmF2aWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuc2tlbGV0b25Db2x1bW5zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5tZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uY29sdW1ucyA/PyAxMCB9LCAoXywgaSkgPT4gaSk7XG4gICAgdGhpcy5za2VsZXRvblJvd3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLm1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5yb3dzID8/IDEwIH0sIChfLCBpKSA9PiBpKTtcbiAgfVxuICBcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIC8vIFNldHVwIHZpcnR1YWwgc2Nyb2xsIGFmdGVyIHZpZXcgaXMgcmVhZHlcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkgJiYgdGhpcy5zY3JvbGxWaWV3cG9ydCkge1xuICAgICAgdGhpcy5zZXR1cFZpcnR1YWxTY3JvbGxMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBjb25maWd1cmF0aW9uIHdoZW4gdGFibGVDb25maWcgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUNvbmZpZyddICYmICFjaGFuZ2VzWyd0YWJsZUNvbmZpZyddLmZpcnN0Q2hhbmdlICYmIHRoaXMudGFibGVDb25maWcpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnID0gbWVyZ2VUYWJsZUNvbmZpZyh0aGlzLnRhYmxlQ29uZmlnKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgY29uZmlndXJhdGlvbiBpZiBlbmFibGVkXG4gICAgICBpZiAodGhpcy52YWxpZGF0ZUNvbmZpZykge1xuICAgICAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbih0aGlzLm1lcmdlZENvbmZpZyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBpbnRlcm5hbCB0YWJsZSBzdGF0ZSB3aXRoIG5ldyBjb2x1bW5zIGlmIHVzaW5nIGludGVybmFsIHN0YXRlXG4gICAgICBpZiAodGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUudXBkYXRlQ29sdW1ucyh0aGlzLm1lcmdlZENvbmZpZy5jb2x1bW5zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHZpc2libGUgY29sdW1ucyBhbmQgY2VsbCBncmlkXG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlY3JlYXRlIGNlbGwgZ3JpZCB3aGVuIGRhdGEgY2hhbmdlcyAob25seSBpZiBub3QgdXNpbmcgZGF0YSQgT2JzZXJ2YWJsZSlcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddICYmICFjaGFuZ2VzWydkYXRhJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy5kYXRhICYmICF0aGlzLmRhdGEkKSB7XG4gICAgICB0aGlzLmhhbmRsZVN5bmNEYXRhQ2hhbmdlKGNoYW5nZXNbJ2RhdGEnXS5wcmV2aW91c1ZhbHVlIHx8IFtdKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIGRhdGEkIE9ic2VydmFibGUgaW5wdXQgY2hhbmdlc1xuICAgIGlmIChjaGFuZ2VzWydkYXRhJCddICYmICFjaGFuZ2VzWydkYXRhJCddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnNldHVwRGF0YVNvdXJjZSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBSZWNyZWF0ZSBjZWxsIGdyaWQgd2hlbiBjZWxsR3JpZCBjaGFuZ2VzXG4gICAgaWYgKGNoYW5nZXNbJ2NlbGxHcmlkJ10gJiYgIWNoYW5nZXNbJ2NlbGxHcmlkJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIC8vIENlbGwgZ3JpZCB3YXMgdXBkYXRlZCBleHRlcm5hbGx5LCBubyBuZWVkIHRvIHJlY3JlYXRlXG4gICAgICAvLyBKdXN0IHJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGlmIG5lZWRlZFxuICAgICAgaWYgKHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpKSB7XG4gICAgICAgIGNvbnN0IHJvd051bWJlcldpZHRoID0gdGhpcy5tZXJnZWRDb25maWcuc2hvd1Jvd051bWJlciA/IDMwIDogMDtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3NDb2x1bW5XaWR0aCA9IHRoaXMuaGFzUm93QWN0aW9ucygpID8gMzIgOiAwO1xuICAgICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5jYWxjdWxhdGVTdGlja3lPZmZzZXRzKHJvd051bWJlcldpZHRoLCBzZXR0aW5nc0NvbHVtbldpZHRoKTtcbiAgICAgIH1cbiAgICAgIC8vIFVwZGF0ZSB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZFxuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlRGF0YSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgdGFibGVTdGF0ZSBpbnB1dCBjaGFuZ2VzICh3aGVuIGV4dGVybmFsIHN0YXRlIGlzIHByb3ZpZGVkLCBlLmcuLCBpbiB3b3JrYm9vaylcbiAgICBpZiAoY2hhbmdlc1sndGFibGVTdGF0ZSddICYmICFjaGFuZ2VzWyd0YWJsZVN0YXRlJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy50YWJsZVN0YXRlKSB7XG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIG9sZCB0YWJsZVN0YXRlJ3MgZm9jdXMgb2JzZXJ2YWJsZSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIFxuICAgICAgLy8gUmVpbml0aWFsaXplIGtleWJvYXJkIG5hdmlnYXRpb24gd2l0aCBuZXcgdGFibGVTdGF0ZVxuICAgICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplS2V5Ym9hcmROYXZpZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHZpcnR1YWwgc2Nyb2xsIHdoZW4gZGF0YSBjaGFuZ2VzXG4gICAgaWYgKChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snY2VsbEdyaWQnXSkgJiYgIWNoYW5nZXNbJ2RhdGEnXT8uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQudmFsdWU7XG4gICAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgICAgICAgIHNjcm9sbFRvcDogY3VycmVudFN0YXRlLnNjcm9sbFRvcCxcbiAgICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0OiB0aGlzLmdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpLFxuICAgICAgICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgICAgaXRlbVNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCksXG4gICAgICAgICAgICBidWZmZXJTaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxCdWZmZXJTaXplKClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dChuZXdTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGtleWJvYXJkIG5hdmlnYXRpb24gZGltZW5zaW9ucyBpZiBlbmFibGVkXG4gICAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSAmJiAoY2hhbmdlc1snZGF0YSddIHx8IGNoYW5nZXNbJ2NlbGxHcmlkJ10pKSB7XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLnNldERpbWVuc2lvbnMoXG4gICAgICAgICAgdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnRlcm5hbCBUYWJsZVN0YXRlIGZyb20gY29uZmlnXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUludGVybmFsVGFibGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUgPSBuZXcgVGFibGVTdGF0ZShjb2x1bW5zLCB7XG4gICAgICBwYWdlU2l6ZTogdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8ucGFnZVNpemUsXG4gICAgICBpbml0aWFsUGFnZTogdGhpcy5tZXJnZWRDb25maWcuaW5pdGlhbFN0YXRlPy5wYWdlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gU2V0IHRvdGFsIGl0ZW1zIGlmIHByb3ZpZGVkIGluIGNvbmZpZyAoZm9yIHNlcnZlci1zaWRlIHBhZ2luYXRpb24pXG4gICAgaWYgKHRoaXMubWVyZ2VkQ29uZmlnLnBhZ2luYXRpb24/LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUuc2V0VG90YWxJdGVtcyh0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uLnRvdGFsSXRlbXMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBcHBseSBpbml0aWFsIHNvcnQgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5tZXJnZWRDb25maWcuaW5pdGlhbFN0YXRlPy5zb3J0QnkpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnLmluaXRpYWxTdGF0ZS5zb3J0QnkuZm9yRWFjaChzb3J0ID0+IHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUhLmFkZFNvcnRUb0NvbHVtbihzb3J0LmtleSwgc29ydC5kaXJlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IGluaXRpYWwgZmlsdGVycyBpZiBwcm92aWRlZFxuICAgIGlmICh0aGlzLm1lcmdlZENvbmZpZy5pbml0aWFsU3RhdGU/LmZpbHRlcnMpIHtcbiAgICAgIHRoaXMubWVyZ2VkQ29uZmlnLmluaXRpYWxTdGF0ZS5maWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlU3RhdGUhLnNldEZpbHRlck9uQ29sdW1uKGZpbHRlci5rZXksIGZpbHRlci5vcGVyYXRvciwgZmlsdGVyLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gaW50ZXJuYWwgc3RhdGUgY2hhbmdlcyBhbmQgcmUtZW1pdFxuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLmludGVybmFsVGFibGVTdGF0ZS5zdGF0ZUNoYW5nZSRcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHZpc2libGUgY29sdW1ucyBhbmQgY2VsbCBncmlkIG9uIHZpc2liaWxpdHkgY2hhbmdlc1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvbHVtbi12aXNpYmlsaXR5JyB8fCBldmVudC50eXBlID09PSAnY29sdW1uLWNvbmZpZycpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byB2YWxpZGF0aW9uIHN0YXRlIGNoYW5nZXMgYW5kIHJlLWVtaXRcbiAgICB0aGlzLnZhbGlkYXRpb25TdWJzY3JpcHRpb24gPSB0aGlzLmludGVybmFsVGFibGVTdGF0ZS50YWJsZVZhbGlkYXRpb25TdGF0ZSRcbiAgICAgIC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25TdGF0ZUNoYW5nZS5lbWl0KHN0YXRlKTtcbiAgICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGV4dGVybmFsIFRhYmxlU3RhdGUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0V4dGVybmFsVGFibGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVTdGF0ZSkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnRhYmxlU3RhdGUuc3RhdGVDaGFuZ2UkXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVwZGF0ZSB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZCBvbiB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjb2x1bW4tdmlzaWJpbGl0eScgfHwgZXZlbnQudHlwZSA9PT0gJ2NvbHVtbi1jb25maWcnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlRGF0YSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gdmFsaWRhdGlvbiBzdGF0ZSBjaGFuZ2VzIGFuZCByZS1lbWl0XG4gICAgdGhpcy52YWxpZGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy50YWJsZVN0YXRlLnRhYmxlVmFsaWRhdGlvblN0YXRlJFxuICAgICAgLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvblN0YXRlQ2hhbmdlLmVtaXQoc3RhdGUpO1xuICAgICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgY2VsbCBncmlkIGZyb20gcmF3IGRhdGFcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ2VsbEdyaWRGcm9tRGF0YSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICB0aGlzLmludGVybmFsQ2VsbEdyaWQgPSB0aGlzLmRhdGEubWFwKChyb3dEYXRhLCByb3dJbmRleCkgPT5cbiAgICAgIGNvbHVtbnMubWFwKGNvbHVtbiA9PiBcbiAgICAgICAgbmV3IENlbGwoY29sdW1uLCByb3dEYXRhW2NvbHVtbi5rZXldLCByb3dEYXRhLCByb3dJbmRleClcbiAgICAgIClcbiAgICApO1xuICB9XG4gIFxuICAvKipcbiAgICogU2V0dXAgZGF0YSBzb3VyY2UgLSBlaXRoZXIgc3luYyBhcnJheSBvciBhc3luYyBPYnNlcnZhYmxlXG4gICAqIEhhbmRsZXMgaW5pdGlhbGl6YXRpb24gYW5kIHN1YnNjcmlwdGlvbiB0byBkYXRhIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBEYXRhU291cmNlKCk6IHZvaWQge1xuICAgIC8vIFdhcm4gaWYgYm90aCBkYXRhIGFuZCBkYXRhJCBhcmUgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YSQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3RUYWJsZUNvbXBvbmVudDogQm90aCBkYXRhIGFuZCBkYXRhJCBpbnB1dHMgYXJlIHByb3ZpZGVkLiBVc2luZyBkYXRhJCAoT2JzZXJ2YWJsZSkgYW5kIGlnbm9yaW5nIGRhdGEgYXJyYXkuJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBcbiAgICAvLyBQcmlvcml0eTogZGF0YSQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGRhdGFcbiAgICBpZiAodGhpcy5kYXRhJCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIC8vIEZvciBzeW5jIGRhdGEsIGVtaXQgb25jZSB0aHJvdWdoIGludGVybmFsIG9ic2VydmFibGVcbiAgICAgIHRoaXMucHJldmlvdXNEYXRhID0gW107XG4gICAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dCh0aGlzLmRhdGEpO1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGRhdGEgcHJvdmlkZWQsIGVtaXQgZW1wdHkgYXJyYXlcbiAgICAgIHRoaXMucHJldmlvdXNEYXRhID0gW107XG4gICAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dChbXSk7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvRGF0YUNoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gZGF0YSBjaGFuZ2VzIChlaXRoZXIgZnJvbSBkYXRhJCBpbnB1dCBvciBpbnRlcm5hbCBCZWhhdmlvclN1YmplY3QpXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvRGF0YUNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVNvdXJjZSQgPSB0aGlzLmRhdGEkIHx8IHRoaXMuaW50ZXJuYWxEYXRhJC5hc09ic2VydmFibGUoKTtcbiAgICBcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24gPSBkYXRhU291cmNlJC5zdWJzY3JpYmUobmV3RGF0YSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZURhdGFDaGFuZ2UobmV3RGF0YSk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgZGF0YSBjaGFuZ2UgZnJvbSBPYnNlcnZhYmxlIGVtaXNzaW9uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURhdGFDaGFuZ2UobmV3RGF0YTogYW55W10pOiB2b2lkIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHNvdXJjZTogJ3N5bmMnIHwgJ2FzeW5jJyA9IHRoaXMuZGF0YSQgPyAnYXN5bmMnIDogJ3N5bmMnO1xuICAgIFxuICAgIC8vIEVtaXQgZGF0YSBjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLmRhdGFDaGFuZ2UuZW1pdCh7XG4gICAgICBwcmV2aW91c0RhdGE6IHRoaXMucHJldmlvdXNEYXRhLFxuICAgICAgY3VycmVudERhdGE6IG5ld0RhdGEsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgICBzb3VyY2VcbiAgICB9KTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZGF0YSByZWZlcmVuY2VcbiAgICB0aGlzLmRhdGEgPSBuZXdEYXRhO1xuICAgIHRoaXMucHJldmlvdXNEYXRhID0gWy4uLm5ld0RhdGFdO1xuICAgIFxuICAgIC8vIFJlY3JlYXRlIGNlbGwgZ3JpZFxuICAgIHRoaXMuY3JlYXRlQ2VsbEdyaWRGcm9tRGF0YSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB2aXNpYmxlIGRhdGFcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVEYXRhKCk7XG4gICAgXG4gICAgLy8gUmVjYWxjdWxhdGUgdmlydHVhbCBzY3JvbGwgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgICAgICBzY3JvbGxUb3A6IGN1cnJlbnRTdGF0ZS5zY3JvbGxUb3AsXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHQ6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbFZpZXdwb3J0SGVpZ2h0KCksXG4gICAgICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICAgIGl0ZW1TaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpLFxuICAgICAgICAgIGJ1ZmZlclNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEJ1ZmZlclNpemUoKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQobmV3U3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUga2V5Ym9hcmQgbmF2aWdhdGlvbiBkaW1lbnNpb25zIGlmIGVuYWJsZWRcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuc2V0RGltZW5zaW9ucyhcbiAgICAgICAgdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgc3luYyBkYXRhIGNoYW5nZSAoZnJvbSBASW5wdXQoKSBkYXRhIGNoYW5nZXMpXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVN5bmNEYXRhQ2hhbmdlKHByZXZpb3VzRGF0YTogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpb3VzRGF0YSA9IHByZXZpb3VzRGF0YTtcbiAgICB0aGlzLmludGVybmFsRGF0YSQubmV4dCh0aGlzLmRhdGEgfHwgW10pO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBUYWJsZVN0YXRlIChwcm92aWRlZCBvciBpbnRlcm5hbClcbiAgICovXG4gIGdldEFjdGl2ZVRhYmxlU3RhdGUoKTogVGFibGVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVTdGF0ZSB8fCB0aGlzLmludGVybmFsVGFibGVTdGF0ZSE7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGNlbGwgZ3JpZCAocHJvdmlkZWQgb3IgaW50ZXJuYWwpXG4gICAqL1xuICBnZXRBY3RpdmVDZWxsR3JpZCgpOiBDZWxsPGFueT5bXVtdIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcm5hbENlbGxHcmlkIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2aXNpYmxlIGNlbGwgZ3JpZCAoZmlsdGVyZWQgdG8gb25seSBpbmNsdWRlIHZpc2libGUgY29sdW1ucylcbiAgICovXG4gIGdldFZpc2libGVDZWxsR3JpZCgpOiBDZWxsPGFueT5bXVtdIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLmdldFZpc2libGVDb2x1bW5zKCk7XG4gICAgY29uc3QgdmlzaWJsZUNvbHVtbktleXMgPSBuZXcgU2V0KHZpc2libGVDb2x1bW5zLm1hcChjb2wgPT4gY29sLmtleSkpO1xuICAgIFxuICAgIC8vIEdldCBjb2x1bW4gaW5kaWNlcyBmb3IgdmlzaWJsZSBjb2x1bW5zXG4gICAgY29uc3QgdmlzaWJsZUluZGljZXMgPSBhbGxDb2x1bW5zXG4gICAgICAubWFwKChjb2wsIGluZGV4KSA9PiB2aXNpYmxlQ29sdW1uS2V5cy5oYXMoY29sLmtleSkgPyBpbmRleCA6IC0xKVxuICAgICAgLmZpbHRlcihpbmRleCA9PiBpbmRleCAhPT0gLTEpO1xuICAgIFxuICAgIGNvbnN0IGZ1bGxHcmlkID0gdGhpcy5nZXRBY3RpdmVDZWxsR3JpZCgpO1xuICAgIHJldHVybiBmdWxsR3JpZC5tYXAocm93ID0+IFxuICAgICAgdmlzaWJsZUluZGljZXMubWFwKGluZGV4ID0+IHJvd1tpbmRleF0pLmZpbHRlcihjZWxsID0+IGNlbGwgIT09IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmlzaWJsZSBjZWxsIGdyaWQgYmFzZWQgb24gY3VycmVudCB2aXNpYmlsaXR5IGFuZCBjb2x1bW4gb3JkZXJcbiAgICogQ2FsbGVkIHdoZW4gZGF0YSwgdmlzaWJpbGl0eSwgb3IgY29sdW1uIG9yZGVyIGNoYW5nZXNcbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIHByb3Blcmx5IGhhbmRsZXMgY29sdW1uIHJlb3JkZXJpbmcgYnkgbWFwcGluZyBjZWxscyBiYXNlZCBvblxuICAgKiBjb2x1bW4ga2V5cyByYXRoZXIgdGhhbiBpbmRpY2VzLCBlbnN1cmluZyBjZWxscyBmb2xsb3cgdGhlaXIgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUNlbGxHcmlkKCk6IHZvaWQge1xuICAgIGNvbnN0IGZ1bGxHcmlkID0gdGhpcy5nZXRBY3RpdmVDZWxsR3JpZCgpO1xuICAgIFxuICAgIC8vIEhhbmRsZSBlbXB0eSBncmlkXG4gICAgaWYgKCFmdWxsR3JpZCB8fCBmdWxsR3JpZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIGEgbWFwIG9mIGNvbHVtbktleSDihpIgY2VsbEluZGV4IGZvciB0aGUgY3VycmVudCBncmlkIHN0cnVjdHVyZVxuICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGZpbmQgY2VsbHMgYnkgY29sdW1uIGtleSByZWdhcmRsZXNzIG9mIHRoZWlyIGN1cnJlbnQgcG9zaXRpb25cbiAgICBjb25zdCBrZXlUb0luZGV4TWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmdWxsR3JpZFswXT8uZm9yRWFjaCgoY2VsbCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkNvbmZpZyA9IGNlbGwuZ2V0Q29sdW1uQ29uZmlnKCk7XG4gICAgICAgIGtleVRvSW5kZXhNYXAuc2V0KGNvbHVtbkNvbmZpZy5rZXksIGluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBSZW9yZGVyIGNlbGxzIHRvIG1hdGNoIHRoZSB2aXNpYmxlQ29sdW1ucyBvcmRlclxuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdoZW4gY29sdW1ucyBhcmUgbW92ZWQsIHRoZSBjZWxsIGRhdGEgZm9sbG93c1xuICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkID0gZnVsbEdyaWQubWFwKHJvdyA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29uc3QgY2VsbEluZGV4ID0ga2V5VG9JbmRleE1hcC5nZXQoY29sLmtleSk7XG4gICAgICAgICAgcmV0dXJuIGNlbGxJbmRleCAhPT0gdW5kZWZpbmVkID8gcm93W2NlbGxJbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGNlbGwpOiBjZWxsIGlzIENlbGw8YW55PiA9PiBjZWxsICE9PSB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmlzaWJsZSBjb2x1bW5zIGJhc2VkIG9uIGN1cnJlbnQgdmlzaWJpbGl0eVxuICAgKiBDYWxsZWQgb25seSB3aGVuIHZpc2liaWxpdHkgYWN0dWFsbHkgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlQ29sdW1ucygpOiB2b2lkIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpO1xuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGZvciB2aXNpYmxlIGNvbHVtbnMgb25seVxuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlU3RpY2t5T2Zmc2V0cyh0aGlzLnZpc2libGVDb2x1bW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYm90aCB2aXNpYmxlIGNvbHVtbnMgYW5kIGNlbGwgZ3JpZFxuICAgKiBDYWxsIHRoaXMgd2hlbmV2ZXIgZGF0YSBvciB2aXNpYmlsaXR5IGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZURhdGEoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlQ29sdW1ucygpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUNlbGxHcmlkKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGNvbHVtbnMgKGZyb20gY29uZmlnIG9yIGxlZ2FjeSBpbnB1dClcbiAgICovXG4gIGdldEFjdGl2ZUNvbHVtbnMoKTogQ29sdW1uQ29uZmlnPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmNvbHVtbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZpc2libGUgY29sdW1ucyAoZmlsdGVyZWQgYnkgdmlzaWJpbGl0eSBwcm9wZXJ0eSlcbiAgICogQWxzbyByZWNhbGN1bGF0ZXMgc3RpY2t5IG9mZnNldHMgYmFzZWQgb24gdmlzaWJsZSBjb2x1bW5zIG9ubHlcbiAgICovXG4gIGdldFZpc2libGVDb2x1bW5zKCk6IENvbHVtbkNvbmZpZzxhbnk+W10ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSAhPT0gZmFsc2UpOyAvLyBEZWZhdWx0IHRvIHRydWUgaWYgbm90IHNldFxuICAgIFxuICAgIC8vIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGZvciB2aXNpYmxlIGNvbHVtbnMgb25seVxuICAgIHRoaXMucmVjYWxjdWxhdGVWaXNpYmxlU3RpY2t5T2Zmc2V0cyh2aXNpYmxlQ29sdW1ucyk7XG4gICAgXG4gICAgcmV0dXJuIHZpc2libGVDb2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlIHN0aWNreSBvZmZzZXRzIGJhc2VkIG9uIHZpc2libGUgY29sdW1ucyBvbmx5XG4gICAqIFRoaXMgZW5zdXJlcyBjb3JyZWN0IHBvc2l0aW9uaW5nIHdoZW4gY29sdW1ucyBhcmUgaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIHJlY2FsY3VsYXRlVmlzaWJsZVN0aWNreU9mZnNldHModmlzaWJsZUNvbHVtbnM6IENvbHVtbkNvbmZpZzxhbnk+W10pOiB2b2lkIHtcbiAgICAvLyBDYWxjdWxhdGUgbGVmdCBzdGlja3kgb2Zmc2V0c1xuICAgIC8vIEFjY291bnQgZm9yIHJvdyBudW1iZXIgY29sdW1uIHdpZHRoIGlmIHNob3duXG4gICAgbGV0IGxlZnRPZmZzZXQgPSB0aGlzLm1lcmdlZENvbmZpZy5zaG93Um93TnVtYmVyID8gMzAgOiAwO1xuICAgIHZpc2libGVDb2x1bW5zLmZvckVhY2goY29sID0+IHtcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAnbGVmdCcpIHtcbiAgICAgICAgKGNvbCBhcyBhbnkpLnN0aWNreU9mZnNldCA9IGxlZnRPZmZzZXQ7XG4gICAgICAgIGxlZnRPZmZzZXQgKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSByaWdodCBzdGlja3kgb2Zmc2V0c1xuICAgIGxldCByaWdodE9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IHZpc2libGVDb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2wgPSB2aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAncmlnaHQnKSB7XG4gICAgICAgIChjb2wgYXMgYW55KS5zdGlja3lPZmZzZXQgPSByaWdodE9mZnNldDtcbiAgICAgICAgcmlnaHRPZmZzZXQgKz0gKGNvbC53aWR0aCBhcyBudW1iZXIpIHx8IDEwMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNlbGxDaGFuZ2UoZXZlbnQ6IENlbGxDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2VsbENoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQ29sdW1uUmVzaXplZChldmVudDogQ29sdW1uUmVzaXplRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBSZWNhbGN1bGF0ZSBzdGlja3kgb2Zmc2V0cyBhZnRlciByZXNpemVcbiAgICBjb25zdCByb3dOdW1iZXJXaWR0aCA9IHRoaXMubWVyZ2VkQ29uZmlnLnNob3dSb3dOdW1iZXIgPyAzMCA6IDA7XG4gICAgY29uc3Qgc2V0dGluZ3NDb2x1bW5XaWR0aCA9IHRoaXMuaGFzUm93QWN0aW9ucygpID8gMzIgOiAwO1xuICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNhbGN1bGF0ZVN0aWNreU9mZnNldHMocm93TnVtYmVyV2lkdGgsIHNldHRpbmdzQ29sdW1uV2lkdGgpO1xuICAgIFxuICAgIC8vIEVtaXQgdG8gcGFyZW50XG4gICAgdGhpcy5jb2x1bW5SZXNpemVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25Db2x1bW5Nb3ZlZChldmVudDoge2NvbHVtbktleTogc3RyaW5nLCBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCd9KTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5rZXkgPT09IGV2ZW50LmNvbHVtbktleSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgdGFyZ2V0IGluZGV4XG4gICAgY29uc3QgdGFyZ2V0SW5kZXggPSBldmVudC5kaXJlY3Rpb24gPT09ICdsZWZ0JyBcbiAgICAgID8gY3VycmVudEluZGV4IC0gMSBcbiAgICAgIDogY3VycmVudEluZGV4ICsgMTtcbiAgICBcbiAgICAvLyBDaGVjayBib3VuZHNcbiAgICBpZiAodGFyZ2V0SW5kZXggPCAwIHx8IHRhcmdldEluZGV4ID49IGNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFN3YXAgY29sdW1uc1xuICAgIFtjb2x1bW5zW2N1cnJlbnRJbmRleF0sIGNvbHVtbnNbdGFyZ2V0SW5kZXhdXSA9IFxuICAgIFtjb2x1bW5zW3RhcmdldEluZGV4XSwgY29sdW1uc1tjdXJyZW50SW5kZXhdXTtcbiAgICBcbiAgICAvLyBVcGRhdGUgVGFibGVTdGF0ZSB3aXRoIG5ldyBjb2x1bW4gb3JkZXJcbiAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS51cGRhdGVDb2x1bW5zKGNvbHVtbnMpO1xuICAgIHRoaXMuY29sdW1uTW92ZWQuZW1pdCh7XG4gICAgICBjb2x1bW5LZXk6IGV2ZW50LmNvbHVtbktleSxcbiAgICAgIGRpcmVjdGlvbjogZXZlbnQuZGlyZWN0aW9uLFxuICAgICAgb2xkSW5kZXg6IGN1cnJlbnRJbmRleCxcbiAgICAgIG5ld0luZGV4OiB0YXJnZXRJbmRleCxcbiAgICAgIGNvbHVtbjogY29sdW1uc1tjdXJyZW50SW5kZXhdXG4gICAgfSk7XG4gICAgLy8gRm9yY2UgdmlydHVhbCBzY3JvbGwgdG8gcmUtcmVuZGVyIGJ5IHJlLWVtaXR0aW5nIGN1cnJlbnQgc3RhdGVcbiAgICAvLyBUaGlzIGVuc3VyZXMgdmlzaWJsZVJvd3MkIHBpY2tzIHVwIHRoZSB1cGRhdGVkIHZpc2libGVDZWxsR3JpZFxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSkge1xuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLnZhbHVlO1xuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSkge1xuICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dCh7Li4uY3VycmVudFN0YXRlfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgY29sdW1uIHRvIHBvc2l0aW9uIGp1c3QgYmVmb3JlIHJpZ2h0IHN0aWNreSBjb2x1bW5zICh1c2VkIHdoZW4gcGlubmluZyByaWdodClcbiAgICovXG4gIHByaXZhdGUgbW92ZUNvbHVtblRvRW5kKGNvbHVtbktleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0QWN0aXZlQ29sdW1ucygpO1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gLTEpIHJldHVybjtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcmlnaHQtc3RpY2t5IGNvbHVtblxuICAgIGNvbnN0IGZpcnN0UmlnaHRTdGlja3lJbmRleCA9IGNvbHVtbnMuZmluZEluZGV4KGMgPT4gYy5zdGlja3kgPT09ICdyaWdodCcpO1xuICAgIFxuICAgIC8vIERldGVybWluZSB0YXJnZXQgaW5kZXg6IGp1c3QgYmVmb3JlIGZpcnN0IHJpZ2h0LXN0aWNreSwgb3IgYXQgZW5kIGlmIG5vbmUgZXhpc3RcbiAgICBjb25zdCB0YXJnZXRJbmRleCA9IGZpcnN0UmlnaHRTdGlja3lJbmRleCAhPT0gLTEgPyBmaXJzdFJpZ2h0U3RpY2t5SW5kZXggOiBjb2x1bW5zLmxlbmd0aDtcbiAgICBcbiAgICAvLyBJZiBhbHJlYWR5IGF0IHRhcmdldCBwb3NpdGlvbiwgbm8gbmVlZCB0byBtb3ZlXG4gICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gdGFyZ2V0SW5kZXggfHwgY3VycmVudEluZGV4ID09PSB0YXJnZXRJbmRleCAtIDEpIHJldHVybjtcbiAgICBcbiAgICAvLyBSZW1vdmUgY29sdW1uIGZyb20gY3VycmVudCBwb3NpdGlvblxuICAgIGNvbnN0IFtjb2x1bW5dID0gY29sdW1ucy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICBcbiAgICAvLyBBZGp1c3QgdGFyZ2V0IGluZGV4IGlmIHdlIHJlbW92ZWQgYW4gZWxlbWVudCBiZWZvcmUgaXRcbiAgICBjb25zdCBhZGp1c3RlZFRhcmdldEluZGV4ID0gY3VycmVudEluZGV4IDwgdGFyZ2V0SW5kZXggPyB0YXJnZXRJbmRleCAtIDEgOiB0YXJnZXRJbmRleDtcbiAgICBcbiAgICAvLyBJbnNlcnQgYXQgdGFyZ2V0IHBvc2l0aW9uIChiZWZvcmUgZmlyc3QgcmlnaHQtc3RpY2t5IGNvbHVtbiwgb3IgYXQgZW5kKVxuICAgIGNvbHVtbnMuc3BsaWNlKGFkanVzdGVkVGFyZ2V0SW5kZXgsIDAsIGNvbHVtbik7XG4gICAgXG4gICAgLy8gVXBkYXRlIFRhYmxlU3RhdGUgd2l0aCBuZXcgY29sdW1uIG9yZGVyXG4gICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkudXBkYXRlQ29sdW1ucyhjb2x1bW5zKTtcbiAgICBcbiAgICAvLyBGb3JjZSB2aXJ0dWFsIHNjcm9sbCB0byByZS1yZW5kZXJcbiAgICBpZiAodGhpcy5pc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFN0YXRlJC52YWx1ZTtcbiAgICAgIGlmIChjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQoey4uLmN1cnJlbnRTdGF0ZX0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VtdWxhdGl2ZSBsZWZ0IG9mZnNldCBmb3IgYSBzdGlja3kgY29sdW1uIG9uIHRoZSBsZWZ0IHNpZGVcbiAgICovXG4gIGdldFN0aWNreUxlZnRPZmZzZXQoY29sdW1uS2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdldEFjdGl2ZUNvbHVtbnMoKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBpZiAoY29sLmtleSA9PT0gY29sdW1uS2V5KSBicmVhaztcbiAgICAgIGlmIChjb2wuc3RpY2t5ID09PSAnbGVmdCcpIHtcbiAgICAgICAgb2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgcmlnaHQgb2Zmc2V0IGZvciBhIHN0aWNreSBjb2x1bW4gb24gdGhlIHJpZ2h0IHNpZGVcbiAgICovXG4gIGdldFN0aWNreVJpZ2h0T2Zmc2V0KGNvbHVtbktleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBjb2x1bW5LZXkpO1xuICAgIGZvciAobGV0IGkgPSBjb2xJbmRleCArIDE7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb2wgPSBjb2x1bW5zW2ldO1xuICAgICAgaWYgKGNvbC5zdGlja3kgPT09ICdyaWdodCcpIHtcbiAgICAgICAgb2Zmc2V0ICs9IChjb2wud2lkdGggYXMgbnVtYmVyKSB8fCAxMDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0b3AgcGFnaW5hdGlvbiBzaG91bGQgYmUgc2hvd25cbiAgICovXG4gIHNob3dUb3BQYWdpbmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uPy5lbmFibGVkID09IHRydWUgJiZcbiAgICAgICAgICAgdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8uc2hvd1RvcENvbnRyb2xzID09PSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYm90dG9tIHBhZ2luYXRpb24gc2hvdWxkIGJlIHNob3duXG4gICAqL1xuICBzaG93Qm90dG9tUGFnaW5hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcucGFnaW5hdGlvbj8uZW5hYmxlZCA9PSB0cnVlICYmXG4gICAgICAgICAgICh0aGlzLm1lcmdlZENvbmZpZy5wYWdpbmF0aW9uPy5zaG93Qm90dG9tQ29udHJvbHMgPz8gdHJ1ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjb25maWcgVGFibGUgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnOiBUYWJsZUNvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2NoZW1hVmFsaWRhdG9yLnZhbGlkYXRlKGNvbmZpZywgdHJ1ZSwgZmFsc2UpOyAvLyBEaXNhYmxlIGxvZ2dpbmcgaGVyZSwgd2UnbGwgbG9nIG1hbnVhbGx5IHdpdGggY29udGV4dFxuICAgIFxuICAgIGlmICghcmVzdWx0LnZhbGlkICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRW1pdCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgdGhpcy5jb25maWdWYWxpZGF0aW9uRXJyb3JzLmVtaXQocmVzdWx0LmVycm9ycyk7XG4gICAgICBcbiAgICAgIC8vIExvZyB2YWxpZGF0aW9uIGVycm9ycyB3aXRoIGNvbnRleHRcbiAgICAgIGNvbnN0IGNvbmZpZ1NuaXBwZXQgPSBKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpLnN1YnN0cmluZygwLCA1MDApOyAvLyBGaXJzdCA1MDAgY2hhcnMgb2YgY29uZmlnXG4gICAgICB0aGlzLmxvZ2dlci5sb2dWYWxpZGF0aW9uRXJyb3JzKHJlc3VsdC5lcnJvcnMsICdyZW5kZXJlcicsIHtcbiAgICAgICAgY29uZmlnU25pcHBldDogY29uZmlnU25pcHBldFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIExvZyB3YXJuaW5ncyB0byBjb25zb2xlIChkb24ndCBicmVhayByZW5kZXJpbmcpXG4gICAgICBjb25zb2xlLndhcm4oJ1NtYXJ0IFRhYmxlOiBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZXJyb3JzIGRldGVjdGVkOicsIHJlc3VsdC5lcnJvcnMpO1xuICAgICAgcmVzdWx0LmVycm9ycy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgIC0gJHtlcnJvci5maWVsZCB8fCBlcnJvci5wYXRofTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGFkZCBjb2x1bW4gYnV0dG9uIGNsaWNrXG4gICAqL1xuICBvbkFkZENvbHVtbkNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjb2x1bW4gY3JlYXRlZCBmcm9tIG1vZGFsXG4gICAqL1xuICBvbkNvbHVtbkNyZWF0ZWQoY29sdW1uOiBDb2x1bW5Db25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRBY3RpdmVDb2x1bW5zKCk7XG4gICAgY29uc3QgYWRkRXZlbnQ6IENvbHVtbkFkZEV2ZW50ID0ge1xuICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICBpbmRleDogY29sdW1ucy5sZW5ndGgsXG4gICAgICB0b3RhbENvbHVtbnM6IGNvbHVtbnMubGVuZ3RoICsgMVxuICAgIH07XG4gICAgXG4gICAgLy8gRW1pdCB0aGUgbmV3IGNvbHVtbiB0byBwYXJlbnQgY29tcG9uZW50XG4gICAgdGhpcy5jb2x1bW5BZGRlZC5lbWl0KGFkZEV2ZW50KTtcbiAgICBcbiAgICAvLyBDbG9zZSB0aGUgbW9kYWxcbiAgICB0aGlzLnNob3dDb2x1bW5Nb2RhbCA9IGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIG1vZGFsIGNhbmNlbGxlZFxuICAgKi9cbiAgb25Nb2RhbENhbmNlbGxlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDb2x1bW5Nb2RhbCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZpcnR1YWwgc2Nyb2xsIGlzIGVuYWJsZWRcbiAgICovXG4gIGlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LmVuYWJsZWQgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb2x1bW4gaXMgdGhlIGZpcnN0IHN0aWNreS1yaWdodCBjb2x1bW4gKGZvciBzaGFkb3cgc3R5bGluZylcbiAgICovXG4gIGlzRmlyc3RTdGlja3lSaWdodChjb2x1bW5LZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0aWNreVJpZ2h0Q29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuc3RpY2t5ID09PSAncmlnaHQnICYmICFjb2wua2V5LmluY2x1ZGVzKCdzZXR0aW5ncycpKTtcbiAgICByZXR1cm4gc3RpY2t5UmlnaHRDb2x1bW5zLmxlbmd0aCA+IDAgJiYgc3RpY2t5UmlnaHRDb2x1bW5zWzBdLmtleSA9PT0gY29sdW1uS2V5O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHZpcnR1YWwgc2Nyb2xsIGl0ZW0gc2l6ZVxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/Lml0ZW1TaXplID8/IDQ4O1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHZpZXdwb3J0IGhlaWdodFxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbFZpZXdwb3J0SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnZpcnR1YWxTY3JvbGw/LnZpZXdwb3J0SGVpZ2h0ID8/IDYwMDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBidWZmZXIgc2l6ZVxuICAgKi9cbiAgZ2V0VmlydHVhbFNjcm9sbEJ1ZmZlclNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuZGlzcGxheT8udmlydHVhbFNjcm9sbD8uYnVmZmVyU2l6ZSA/PyA1O1xuICB9XG4gIFxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB2aXJ0dWFsIHNjcm9sbCBzdGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplVmlydHVhbFNjcm9sbCgpOiB2b2lkIHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlydHVhbFNjcm9sbFNlcnZpY2UuY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHtcbiAgICAgIHNjcm9sbFRvcDogMCxcbiAgICAgIHZpZXdwb3J0SGVpZ2h0OiB0aGlzLmdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpLFxuICAgICAgdG90YWxJdGVtczogdGhpcy52aXNpYmxlQ2VsbEdyaWQubGVuZ3RoLFxuICAgICAgaXRlbVNpemU6IHRoaXMuZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCksXG4gICAgICBidWZmZXJTaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxCdWZmZXJTaXplKClcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQubmV4dChuZXdTdGF0ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXR1cCBzY3JvbGwgZXZlbnQgbGlzdGVuZXJcbiAgICovXG4gIHByaXZhdGUgc2V0dXBWaXJ0dWFsU2Nyb2xsTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbFZpZXdwb3J0KSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc2Nyb2xsVmlld3BvcnQubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lciA9IGVsZW1lbnQ7XG4gICAgXG4gICAgdGhpcy5zY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLnZpcnR1YWxTY3JvbGxTZXJ2aWNlXG4gICAgICAuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShlbGVtZW50KVxuICAgICAgLnN1YnNjcmliZShzY3JvbGxUb3AgPT4gdGhpcy5vblZpcnR1YWxTY3JvbGwoc2Nyb2xsVG9wKSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgdmlydHVhbCBzY3JvbGwgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgb25WaXJ0dWFsU2Nyb2xsKHNjcm9sbFRvcDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTZXJ2aWNlLmNhbGN1bGF0ZVZpc2libGVSYW5nZSh7XG4gICAgICBzY3JvbGxUb3AsXG4gICAgICB2aWV3cG9ydEhlaWdodDogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsVmlld3BvcnRIZWlnaHQoKSxcbiAgICAgIHRvdGFsSXRlbXM6IHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgIGl0ZW1TaXplOiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpLFxuICAgICAgYnVmZmVyU2l6ZTogdGhpcy5nZXRWaXJ0dWFsU2Nyb2xsQnVmZmVyU2l6ZSgpXG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3RhdGUkLm5leHQobmV3U3RhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJvdyBpbmRleCBmb3IgdHJhY2tpbmdcbiAgICovXG4gIGdldEFic29sdXRlUm93SW5kZXgocmVsYXRpdmVJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQudmFsdWU7XG4gICAgaWYgKCFjdXJyZW50U3RhdGUpIHJldHVybiByZWxhdGl2ZUluZGV4O1xuICAgIHJldHVybiBjdXJyZW50U3RhdGUuc3RhcnRJbmRleCArIHJlbGF0aXZlSW5kZXg7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBUcmFja0J5IGZ1bmN0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIHRyYWNrQnlSb3dJbmRleCA9IChpbmRleDogbnVtYmVyLCByb3c6IENlbGw8YW55PltdKTogbnVtYmVyID0+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBYnNvbHV0ZVJvd0luZGV4KGluZGV4KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNjcm9sbCB0byBzcGVjaWZpYyByb3cgcHJvZ3JhbW1hdGljYWxseVxuICAgKi9cbiAgc2Nyb2xsVG9Sb3coaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY3JvbGxDb250YWluZXIgfHwgIXRoaXMuaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpKSByZXR1cm47XG4gICAgXG4gICAgY29uc3Qgc2Nyb2xsVG9wID0gaW5kZXggKiB0aGlzLmdldFZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpO1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIHJvdyBhY3Rpb25zIGFyZSBlbmFibGVkXG4gICAqL1xuICBoYXNSb3dBY3Rpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLm1lcmdlZENvbmZpZy5mZWF0dXJlcz8ucm93TWFuYWdlbWVudD8uYWN0aW9ucyAmJiBcbiAgICAgICAgICAgICAgdGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXMucm93TWFuYWdlbWVudC5hY3Rpb25zLmxlbmd0aCA+IDApO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJvdyBhY3Rpb25zIGZyb20gY29uZmlnXG4gICAqL1xuICBnZXRSb3dBY3Rpb25zKCk6IFJvd0FjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXM/LnJvd01hbmFnZW1lbnQ/LmFjdGlvbnMgfHwgW107XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcm93IGRhdGEgZnJvbSBjZWxsIGdyaWRcbiAgICovXG4gIGdldFJvd0RhdGEocm93SW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgY2VsbEdyaWQgPSB0aGlzLmdldEFjdGl2ZUNlbGxHcmlkKCk7XG4gICAgaWYgKCFjZWxsR3JpZCB8fCByb3dJbmRleCA8IDAgfHwgcm93SW5kZXggPj0gY2VsbEdyaWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgcm93ID0gY2VsbEdyaWRbcm93SW5kZXhdO1xuICAgIGlmICghcm93IHx8IHJvdy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgcmF3IGRhdGEgZnJvbSBmaXJzdCBjZWxsIChhbGwgY2VsbHMgaW4gYSByb3cgc2hhcmUgdGhlIHNhbWUgcm93RGF0YSlcbiAgICByZXR1cm4gcm93WzBdPy5nZXRSb3dEYXRhKCkgfHwgbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE9wZW4gcm93IGFjdGlvbnMgZHJvcGRvd25cbiAgICovXG4gIG9wZW5Sb3dBY3Rpb25zRHJvcGRvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiAoYmVsb3cgdGhlIGJ1dHRvbiBieSBkZWZhdWx0KVxuICAgIGNvbnN0IHBvc2l0aW9uID0ge1xuICAgICAgeDogcmVjdC5sZWZ0LFxuICAgICAgeTogcmVjdC5ib3R0b20gKyA0IC8vIDRweCBnYXBcbiAgICB9O1xuICAgIFxuICAgIC8vIENyZWF0ZSBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dDogUm93QWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHJvd0RhdGEsXG4gICAgICByb3dJbmRleCxcbiAgICAgIGFjdGlvbnM6IHRoaXMuZ2V0Um93QWN0aW9ucygpXG4gICAgfTtcbiAgICBcbiAgICAvLyBVcGRhdGUgZHJvcGRvd24gc3RhdGVcbiAgICB0aGlzLmRyb3Bkb3duU3RhdGUgPSB7XG4gICAgICBpc09wZW46IHRydWUsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIGNvbnRleHRcbiAgICB9O1xuICAgIFxuICAgIC8vIERpc2FibGUgYm9keSBzY3JvbGxcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgXG4gICAgLy8gSWYgdmlydHVhbCBzY3JvbGwgaXMgZW5hYmxlZCwgYWRkIHNjcm9sbCBsaXN0ZW5lciB0byBjbG9zZSBkcm9wZG93blxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgY29uc3Qgc2Nyb2xsTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VSb3dBY3Rpb25zRHJvcGRvd24oKTtcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbExpc3RlbmVyKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIENsb3NlIHJvdyBhY3Rpb25zIGRyb3Bkb3duXG4gICAqL1xuICBjbG9zZVJvd0FjdGlvbnNEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duU3RhdGUgPSB7XG4gICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgcG9zaXRpb246IHsgeDogMCwgeTogMCB9LFxuICAgICAgY29udGV4dDogbnVsbFxuICAgIH07XG4gICAgXG4gICAgLy8gUmUtZW5hYmxlIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnO1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHJvdyBhY3Rpb24gY2xpY2tlZFxuICAgKi9cbiAgb25Sb3dBY3Rpb25DbGlja2VkKGV2ZW50OiBSb3dBY3Rpb25FdmVudCk6IHZvaWQge1xuICAgIC8vIEV4ZWN1dGUgYWN0aW9uIGNhbGxiYWNrIGlmIHByb3ZpZGVkXG4gICAgaWYgKGV2ZW50LmFjdGlvbi5hY3Rpb24pIHtcbiAgICAgIGV2ZW50LmFjdGlvbi5hY3Rpb24oZXZlbnQucm93RGF0YSwgZXZlbnQucm93SW5kZXgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbWl0IGV2ZW50IHRvIHBhcmVudFxuICAgIHRoaXMucm93QWN0aW9uLmVtaXQoZXZlbnQpO1xuICAgIFxuICAgIC8vIENsb3NlIGRyb3Bkb3duXG4gICAgdGhpcy5jbG9zZVJvd0FjdGlvbnNEcm9wZG93bigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDT0xVTU4gTUVOVSBBQ1RJT05TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT3BlbiBjb2x1bW4gbWVudSBkcm9wZG93blxuICAgKi9cbiAgb3BlbkNvbHVtbk1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbHVtbjogQ29sdW1uQ29uZmlnPGFueT4sIGNvbHVtbkluZGV4OiBudW1iZXIsIGlzRmlyc3Q6IGJvb2xlYW4sIGlzTGFzdDogYm9vbGVhbik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gKGJlbG93IHRoZSBidXR0b24gYnkgZGVmYXVsdClcbiAgICBjb25zdCBwb3NpdGlvbiA9IHtcbiAgICAgIHg6IHJlY3QubGVmdCxcbiAgICAgIHk6IHJlY3QuYm90dG9tICsgNCAvLyA0cHggZ2FwXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBjb250ZXh0XG4gICAgY29uc3QgY29udGV4dDogQ29sdW1uQWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgaXNGaXJzdENvbHVtbjogaXNGaXJzdCxcbiAgICAgIGlzTGFzdENvbHVtbjogaXNMYXN0LFxuICAgICAgdGFibGVTdGF0ZTogdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCksXG4gICAgICBhY3Rpb25zOiB0aGlzLmdldENvbHVtbkFjdGlvbnMoY29sdW1uLCBjb2x1bW5JbmRleCwgaXNGaXJzdCwgaXNMYXN0KVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgY29sdW1uIG1lbnUgc3RhdGVcbiAgICB0aGlzLmNvbHVtbk1lbnVTdGF0ZSA9IHtcbiAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgY29udGV4dFxuICAgIH07XG5cbiAgICAvLyBEaXNhYmxlIGJvZHkgc2Nyb2xsXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgLy8gSWYgdmlydHVhbCBzY3JvbGwgaXMgZW5hYmxlZCwgYWRkIHNjcm9sbCBsaXN0ZW5lciB0byBjbG9zZSBkcm9wZG93blxuICAgIGlmICh0aGlzLmlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbENvbnRhaW5lcikge1xuICAgICAgY29uc3Qgc2Nyb2xsTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VDb2x1bW5NZW51KCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxMaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsTGlzdGVuZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgY29sdW1uIG1lbnUgZHJvcGRvd25cbiAgICovXG4gIGNsb3NlQ29sdW1uTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbk1lbnVTdGF0ZSA9IHtcbiAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICBwb3NpdGlvbjogeyB4OiAwLCB5OiAwIH0sXG4gICAgICBjb250ZXh0OiBudWxsXG4gICAgfTtcblxuICAgIC8vIFJlLWVuYWJsZSBib2R5IHNjcm9sbFxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY29sdW1uIGFjdGlvbiBjbGlja2VkXG4gICAqL1xuICBvbkNvbHVtbkFjdGlvbkNsaWNrZWQoZXZlbnQ6IENvbHVtbkFjdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgLy8gRXhlY3V0ZSBhY3Rpb24gY2FsbGJhY2sgaWYgcHJvdmlkZWRcbiAgICBpZiAoZXZlbnQuYWN0aW9uLmFjdGlvbikge1xuICAgICAgZXZlbnQuYWN0aW9uLmFjdGlvbihldmVudC5jb2x1bW4sIGV2ZW50LmNvbHVtbkluZGV4KTtcbiAgICB9XG5cbiAgICAvLyBEb24ndCBjbG9zZSBtZW51IGlmIGl0J3MgYSBmaWx0ZXIgYWN0aW9uIChmaWx0ZXIgbmVlZHMgbWVudSB0byBzdGF5IG9wZW4pXG4gICAgaWYgKGV2ZW50LmFjdGlvbi5pZCA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkcm9wZG93biBmb3Igb3RoZXIgYWN0aW9uc1xuICAgIHRoaXMuY2xvc2VDb2x1bW5NZW51KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbHVtbiBhY3Rpb25zIChidWlsdC1pbiArIGN1c3RvbSlcbiAgICovXG4gIHByaXZhdGUgZ2V0Q29sdW1uQWN0aW9ucyhcbiAgICBjb2x1bW46IENvbHVtbkNvbmZpZzxhbnk+LCBcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLCBcbiAgICBpc0ZpcnN0OiBib29sZWFuLCBcbiAgICBpc0xhc3Q6IGJvb2xlYW5cbiAgKTogQ29sdW1uQWN0aW9uW10ge1xuICAgIGNvbnN0IGFjdGlvbnM6IENvbHVtbkFjdGlvbltdID0gW107XG4gICAgXG4gICAgLy8gQWRkIGJ1aWx0LWluIGFjdGlvbnMgaWYgZW5hYmxlZCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBjb25zdCBpbmNsdWRlQnVpbHRJbiA9IGNvbHVtbi5pbmNsdWRlQnVpbHRJbkFjdGlvbnMgPz8gdHJ1ZTtcbiAgICBpZiAoaW5jbHVkZUJ1aWx0SW4pIHtcbiAgICAgIGFjdGlvbnMucHVzaCguLi50aGlzLmdldEJ1aWx0SW5Db2x1bW5BY3Rpb25zKGNvbHVtbiwgY29sdW1uSW5kZXgsIGlzRmlyc3QsIGlzTGFzdCkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgY3VzdG9tIGNvbHVtbiBhY3Rpb25zIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbHVtbi5jb2x1bW5BY3Rpb25zICYmIGNvbHVtbi5jb2x1bW5BY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjdGlvbnMucHVzaCguLi5jb2x1bW4uY29sdW1uQWN0aW9ucyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBidWlsdC1pbiBjb2x1bW4gYWN0aW9ucyAoc29ydCwgZmlsdGVyLCBwaW4sIG1vdmUpXG4gICAqL1xuICBwcml2YXRlIGdldEJ1aWx0SW5Db2x1bW5BY3Rpb25zKFxuICAgIGNvbHVtbjogQ29sdW1uQ29uZmlnPGFueT4sXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBpc0ZpcnN0OiBib29sZWFuLFxuICAgIGlzTGFzdDogYm9vbGVhblxuICApOiBDb2x1bW5BY3Rpb25bXSB7XG4gICAgY29uc3QgdGFibGVTdGF0ZSA9IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpO1xuICAgIGNvbnN0IGFjdGlvbnM6IENvbHVtbkFjdGlvbltdID0gW107XG5cbiAgICAvLyBTb3J0IGFzY2VuZGluZ1xuICAgIGlmIChjb2x1bW4uc29ydGFibGUgIT09IGZhbHNlKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3NvcnQtYXNjJyxcbiAgICAgICAgbGFiZWw6IHRoaXMuZ2V0U29ydExhYmVsKGNvbHVtbiwgJ2FzYycpLFxuICAgICAgICBpY29uOiAn4oaRJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5hZGRTb3J0VG9Db2x1bW4oY29sLmtleSwgU29ydERpcmVjdGlvbi5BU0MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGRlc2NlbmRpbmdcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdzb3J0LWRlc2MnLFxuICAgICAgICBsYWJlbDogdGhpcy5nZXRTb3J0TGFiZWwoY29sdW1uLCAnZGVzYycpLFxuICAgICAgICBpY29uOiAn4oaTJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5hZGRTb3J0VG9Db2x1bW4oY29sLmtleSwgU29ydERpcmVjdGlvbi5ERVNDKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgc29ydCAob25seSBzaG93IGlmIGN1cnJlbnRseSBzb3J0ZWQpXG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSAhPT0gZmFsc2UgJiYgY29sdW1uLnNvcnREaXJlY3Rpb24gJiYgY29sdW1uLnNvcnREaXJlY3Rpb24gIT09IFNvcnREaXJlY3Rpb24uTk9ORSkge1xuICAgICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQ6ICdjbGVhci1zb3J0JyxcbiAgICAgICAgbGFiZWw6ICdDbGVhciBTb3J0JyxcbiAgICAgICAgaWNvbjogJ+KclScsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRhYmxlU3RhdGUuYWRkU29ydFRvQ29sdW1uKGNvbC5rZXksIFNvcnREaXJlY3Rpb24uTk9ORSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZpbHRlclxuICAgIGlmIChjb2x1bW4uZmlsdGVyYWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkOiAnZmlsdGVyJyxcbiAgICAgICAgbGFiZWw6ICdGaWx0ZXInLFxuICAgICAgICBpY29uOiAn4pqRJyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgLy8gRmlsdGVyIGFjdGlvbiBoYW5kbGVkIGJ5IGNvbHVtbiBtZW51IGNvbXBvbmVudFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBQaW4gTGVmdCAoaWYgbm90IGFscmVhZHkgcGlubmVkKVxuICAgIGlmIChjb2x1bW4ucGlubmFibGUgIT09IGZhbHNlICYmIGNvbHVtbi5zdGlja3kgIT09ICdsZWZ0JyAmJiBjb2x1bW4uc3RpY2t5ICE9PSAncmlnaHQnKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3Bpbi1sZWZ0JyxcbiAgICAgICAgbGFiZWw6ICdQaW4gTGVmdCcsXG4gICAgICAgIGljb246ICfwn5OMJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5zZXRTdGlja3lDb2x1bW4oY29sLmtleSwgJ2xlZnQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUGluIFJpZ2h0IChpZiBub3QgYWxyZWFkeSBwaW5uZWQpXG4gICAgaWYgKGNvbHVtbi5waW5uYWJsZSAhPT0gZmFsc2UgJiYgY29sdW1uLnN0aWNreSAhPT0gJ2xlZnQnICYmIGNvbHVtbi5zdGlja3kgIT09ICdyaWdodCcpIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkOiAncGluLXJpZ2h0JyxcbiAgICAgICAgbGFiZWw6ICdQaW4gUmlnaHQnLFxuICAgICAgICBpY29uOiAn8J+TjCcsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRoaXMubW92ZUNvbHVtblRvRW5kKGNvbC5rZXkpO1xuICAgICAgICAgIHRhYmxlU3RhdGUuc2V0U3RpY2t5Q29sdW1uKGNvbC5rZXksICdyaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBVbnBpbiAoaWYgY3VycmVudGx5IHBpbm5lZClcbiAgICBpZiAoY29sdW1uLnBpbm5hYmxlICE9PSBmYWxzZSAmJiAoY29sdW1uLnN0aWNreSA9PT0gJ2xlZnQnIHx8IGNvbHVtbi5zdGlja3kgPT09ICdyaWdodCcpKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ3VucGluJyxcbiAgICAgICAgbGFiZWw6ICdVbnBpbicsXG4gICAgICAgIGljb246ICfwn5ONJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGFibGVTdGF0ZS5zZXRTdGlja3lDb2x1bW4oY29sLmtleSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIGxlZnQgKG9ubHkgaWYgbW92YWJsZSBhbmQgbm90IHBpbm5lZClcbiAgICBpZiAoIWlzRmlyc3QgJiYgY29sdW1uLm1vdmFibGUgIT09IGZhbHNlICYmICFjb2x1bW4uc3RpY2t5KSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ21vdmUtbGVmdCcsXG4gICAgICAgIGxhYmVsOiAnTW92ZSBMZWZ0JyxcbiAgICAgICAgaWNvbjogJ+KGkCcsXG4gICAgICAgIGFjdGlvbjogKGNvbCkgPT4ge1xuICAgICAgICAgIHRoaXMub25Db2x1bW5Nb3ZlZCh7XG4gICAgICAgICAgICBjb2x1bW5LZXk6IGNvbC5rZXksXG4gICAgICAgICAgICBkaXJlY3Rpb246ICdsZWZ0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3ZlIHJpZ2h0IChvbmx5IGlmIG1vdmFibGUgYW5kIG5vdCBwaW5uZWQpXG4gICAgaWYgKCFpc0xhc3QgJiYgY29sdW1uLm1vdmFibGUgIT09IGZhbHNlICYmICFjb2x1bW4uc3RpY2t5KSB7XG4gICAgICBhY3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogJ21vdmUtcmlnaHQnLFxuICAgICAgICBsYWJlbDogJ01vdmUgUmlnaHQnLFxuICAgICAgICBpY29uOiAn4oaSJyxcbiAgICAgICAgYWN0aW9uOiAoY29sKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkNvbHVtbk1vdmVkKHtcbiAgICAgICAgICAgIGNvbHVtbktleTogY29sLmtleSxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ3JpZ2h0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc29ydCBsYWJlbCBiYXNlZCBvbiBjb2x1bW4gZGF0YSB0eXBlXG4gICAqL1xuICBwcml2YXRlIGdldFNvcnRMYWJlbChjb2x1bW46IENvbHVtbkNvbmZpZzxhbnk+LCBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IGNvbHVtbi5kYXRhVHlwZTtcblxuICAgIGlmIChkYXRhVHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09ICdhc2MnID8gJ1NvcnQgMOKGkjknIDogJ1NvcnQgOeKGkjAnO1xuICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09ICdkYXRlJykge1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnU29ydCBPbGRlc3QgRmlyc3QnIDogJ1NvcnQgTmV3ZXN0IEZpcnN0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnU29ydCBB4oaSWicgOiAnU29ydCBa4oaSQSc7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBLRVlCT0FSRCBOQVZJR0FUSU9OXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVLZXlib2FyZE5hdmlnYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdGFibGVTdGF0ZSA9IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpO1xuICAgIFxuICAgIHRhYmxlU3RhdGUuc2V0RGltZW5zaW9ucyhcbiAgICAgIHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCxcbiAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoXG4gICAgKTtcbiAgICBcbiAgICAvLyBTdWJzY3JpYmUgdG8gZm9jdXMgcG9zaXRpb24gY2hhbmdlc1xuICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24gPSB0YWJsZVN0YXRlLmZvY3VzZWRDZWxsUG9zaXRpb24kLnN1YnNjcmliZShwb3NpdGlvbiA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUNlbGxGb2N1c1N0YXRlcyhwb3NpdGlvbik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQXV0by1mb2N1cyBmaXJzdCBjZWxsIHRvIGVuYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgaWYgKHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGFibGVTdGF0ZS5mb2N1c0NlbGwoMCwgMCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgZm9jdXMgc3RhdGUgaW4gYWxsIGNlbGxzXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNlbGxGb2N1c1N0YXRlcyhwb3NpdGlvbjogQ2VsbEZvY3VzUG9zaXRpb24gfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpc2libGVDZWxsR3JpZCkgcmV0dXJuO1xuICAgIFxuICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0aGlzLnZpc2libGVDZWxsR3JpZC5sZW5ndGg7IHJvd0luZGV4KyspIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMudmlzaWJsZUNlbGxHcmlkW3Jvd0luZGV4XTtcbiAgICAgIGZvciAobGV0IGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCByb3cubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSByb3dbY29sSW5kZXhdO1xuICAgICAgICBpZiAoIWNlbGwpIGNvbnRpbnVlO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgc2hvdWxkRm9jdXMgPSBwb3NpdGlvbiAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLnJvd0luZGV4ID09PSByb3dJbmRleCAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbkluZGV4ID09PSBjb2xJbmRleDtcbiAgICAgICAgXG4gICAgICAgIGlmIChzaG91bGRGb2N1cykge1xuICAgICAgICAgIGNlbGwuZm9jdXMoKTtcbiAgICAgICAgICAvLyBGb2N1cyB0aGUgYWN0dWFsIERPTSBlbGVtZW50XG4gICAgICAgICAgdGhpcy5mb2N1c1RkRWxlbWVudChyb3dJbmRleCwgY29sSW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNlbGwuYmx1cigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRm9jdXMgdGhlIFREIGVsZW1lbnQgaW4gdGhlIERPTVxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c1RkRWxlbWVudChyb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIERPTSBoYXMgdXBkYXRlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gTW9yZSByb2J1c3Q6IGZpbmQgdGhlIHRkIGJ5IGRhdGEgYXR0cmlidXRlc1xuICAgICAgY29uc3QgdHIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGB0cltkYXRhLXJvdy1pbmRleD1cIiR7cm93SW5kZXh9XCJdYCk7XG4gICAgICBpZiAodHIpIHtcbiAgICAgICAgY29uc3QgY2VsbHMgPSB0ci5xdWVyeVNlbGVjdG9yQWxsKCd0ZDpub3QoLnNldHRpbmdzLWNvbHVtbiknKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q2VsbCA9IGNlbGxzW2NvbEluZGV4XSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldENlbGwpIHtcbiAgICAgICAgICB0YXJnZXRDZWxsLmZvY3VzKHsgcHJldmVudFNjcm9sbDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjZWxsIGNsaWNrXG4gICAqL1xuICBvbkNlbGxDbGljayhyb3dJbmRleDogbnVtYmVyLCBjb2x1bW5JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSByZXR1cm47XG4gICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuZm9jdXNDZWxsKHJvd0luZGV4LCBjb2x1bW5JbmRleCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCBlbnRlcmluZyBlZGl0IG1vZGVcbiAgICovXG4gIG9uQ2VsbEVkaXQoZXZlbnQ6IENlbGxFZGl0RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxFZGl0LmVtaXQoZXZlbnQpO1xuICAgIFxuICAgIGlmICh0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSB7XG4gICAgICBjb25zdCByb3dJbmRleCA9IGV2ZW50LmNlbGwuZ2V0Um93SW5kZXgoKTtcbiAgICAgIGNvbnN0IGNvbHVtbktleSA9IGV2ZW50LmNvbHVtbktleTtcbiAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kSW5kZXgoY29sID0+IGNvbC5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgICBcbiAgICAgIGlmIChyb3dJbmRleCAhPT0gdW5kZWZpbmVkICYmIGNvbHVtbkluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuc2V0RWRpdGluZ0NlbGwocm93SW5kZXgsIGNvbHVtbkluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCBzYXZlXG4gICAqL1xuICBvbkNlbGxTYXZlKGV2ZW50OiBDZWxsU2F2ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jZWxsU2F2ZS5lbWl0KGV2ZW50KTtcbiAgICBcbiAgICBpZiAodGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgdGhpcy5nZXRBY3RpdmVUYWJsZVN0YXRlKCkuY2xlYXJFZGl0aW5nQ2VsbCgpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBjZWxsIGNhbmNlbFxuICAgKi9cbiAgb25DZWxsQ2FuY2VsKGV2ZW50OiBDZWxsQ2FuY2VsRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNlbGxDYW5jZWwuZW1pdChldmVudCk7XG4gICAgXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgY2VsbCBzYXZlIHdpdGggbmF2aWdhdGlvbiAoRXhjZWwtbGlrZSBiZWhhdmlvcilcbiAgICovXG4gIG9uQ2VsbFNhdmVBbmROYXZpZ2F0ZShldmVudDoge2V2ZW50OiBLZXlib2FyZEV2ZW50LCBkaXJlY3Rpb246IE5hdmlnYXRpb25EaXJlY3Rpb259KTogdm9pZCB7XG4gICAgLy8gTmF2aWdhdGlvbiBpcyBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIGRpcmVjdGl2ZSBhZnRlciBzYXZlXG4gICAgLy8gSnVzdCBlbnN1cmUgZWRpdGluZyBzdGF0ZSBpcyBjbGVhcmVkXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICAgIC8vIE1vdmUgZm9jdXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdldEFjdGl2ZVRhYmxlU3RhdGUoKS5tb3ZlRm9jdXMoZXZlbnQuZGlyZWN0aW9uKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBmb2N1cyBvbiB0YWJsZSBjb250YWluZXIgLSBmb2N1cyBmaXJzdCBjZWxsIGlmIG5vIGNlbGwgaXMgZm9jdXNlZFxuICAgKi9cbiAgb25UYWJsZUNvbnRhaW5lckZvY3VzKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdGFibGVTdGF0ZSA9IHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRGb2N1cyA9IHRhYmxlU3RhdGUuZ2V0Rm9jdXNlZFBvc2l0aW9uKCk7XG4gICAgXG4gICAgLy8gSWYgbm8gY2VsbCBpcyBmb2N1c2VkLCBmb2N1cyB0aGUgZmlyc3QgY2VsbFxuICAgIGlmICghY3VycmVudEZvY3VzICYmIHRoaXMudmlzaWJsZUNlbGxHcmlkLmxlbmd0aCA+IDAgJiYgdGhpcy52aXNpYmxlQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0YWJsZVN0YXRlLmZvY3VzQ2VsbCgwLCAwKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWRcbiAgICovXG4gIGlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZXJnZWRDb25maWcuZmVhdHVyZXM/LmtleWJvYXJkTmF2aWdhdGlvbj8uZW5hYmxlZCA/PyBmYWxzZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBFZGl0TW9kZSBlbnVtIHZhbHVlIGZvciBjZWxsc1xuICAgKiBGb3IgRXhjZWwtbGlrZSB0YWJsZXMgd2l0aCBrZXlib2FyZCBuYXZpZ2F0aW9uLCB1c2UgRU5URVIgbW9kZVxuICAgKiB3aGljaCBhbGxvd3MgYXJyb3cga2V5IG5hdmlnYXRpb24gd2l0aG91dCB0cmlnZ2VyaW5nIGVkaXQuXG4gICAqIERvdWJsZS1jbGljayB3aWxsIHN0aWxsIHdvcmsgdG8gc3RhcnQgZWRpdGluZy5cbiAgICovXG4gIGdldEVkaXRNb2RlRm9yQ2VsbHMoKTogRWRpdE1vZGUge1xuICAgIC8vIElmIGtleWJvYXJkIG5hdmlnYXRpb24gaXMgZW5hYmxlZCwgdXNlIEVOVEVSIG1vZGUgZm9yIEV4Y2VsLWxpa2UgYmVoYXZpb3JcbiAgICAvLyBPdGhlcndpc2UgdXNlIENMSUNLIG1vZGUgZm9yIGltbWVkaWF0ZSBlZGl0aW5nXG4gICAgaWYgKHRoaXMuaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBFZGl0TW9kZS5FTlRFUjtcbiAgICB9XG4gICAgcmV0dXJuIEVkaXRNb2RlLkNMSUNLO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgZm9jdXMgd2hlbiBjbGlja2luZyBvdXRzaWRlIHRhYmxlXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0tleWJvYXJkTmF2aWdhdGlvbkVuYWJsZWQoKSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSB0YXJnZXQuY2xvc2VzdCgnLnN0LXRhYmxlJyk7XG4gICAgXG4gICAgaWYgKCF0YWJsZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRm9jdXMoKTtcbiAgICAgIHRoaXMuZ2V0QWN0aXZlVGFibGVTdGF0ZSgpLmNsZWFyRWRpdGluZ0NlbGwoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2Nyb2xsU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9jdXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxTdGF0ZSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmludGVybmFsRGF0YSQuY29tcGxldGUoKTtcbiAgfVxuICBcbn1cblxuIiwiPCEtLSBUb3AgcGFnaW5hdGlvbiBjb250cm9scyAtLT5cbjxzdC1wYWdpbmF0aW9uIFxuICAqbmdJZj1cInNob3dUb3BQYWdpbmF0aW9uKCkgJiYgIShtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiIFxuICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICBbdGFibGVDb25maWddPVwibWVyZ2VkQ29uZmlnXCJcbiAgcG9zaXRpb249XCJ0b3BcIj5cbjwvc3QtcGFnaW5hdGlvbj5cblxuPGRpdiBjbGFzcz1cInN0LXRhYmxlXCIgKm5nSWY9XCIhKG1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5lbmFibGVkIHwgYXN5bmMpXCIgXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndmlydHVhbC1zY3JvbGwtZW5hYmxlZCc6IGlzVmlydHVhbFNjcm9sbEVuYWJsZWQoKSxcbiAgICAna2V5Ym9hcmQtbmF2aWdhdGlvbi1lbmFibGVkJzogaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKClcbiAgfVwiXG4gIFtuZ1N0eWxlXT1cIntcbiAgICAnbWF4LWhlaWdodC5weCc6ICFpc1ZpcnR1YWxTY3JvbGxFbmFibGVkKCkgPyBtZXJnZWRDb25maWcuZGlzcGxheT8ubWF4SGVpZ2h0IDogbnVsbFxuICB9XCJcbiAgc3RLZXlib2FyZE5hdmlnYXRpb25cbiAgW3RhYmxlU3RhdGVdPVwiZ2V0QWN0aXZlVGFibGVTdGF0ZSgpXCIgXG4gIFthdHRyLnRhYmluZGV4XT1cImlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpID8gMCA6IC0xXCJcbiAgKGZvY3VzKT1cIm9uVGFibGVDb250YWluZXJGb2N1cygkZXZlbnQpXCJcbiAgW2F0dHIudGl0bGVdPVwiaXNLZXlib2FyZE5hdmlnYXRpb25FbmFibGVkKCkgPyAnQ2xpY2sgYSBjZWxsIG9yIHByZXNzIFRhYiB0byBzdGFydCBrZXlib2FyZCBuYXZpZ2F0aW9uJyA6IG51bGxcIj5cbiAgPCEtLSBVbmlmaWVkIFRhYmxlIEFjdGlvbnMgTWVudSAtLT5cblxuICA8IS0tIFZpcnR1YWwgc2Nyb2xsIHZpZXdwb3J0IHdyYXBwZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJzdC1zY3JvbGwtdmlld3BvcnRcIiAjc2Nyb2xsVmlld3BvcnQgKm5nSWY9XCJpc1ZpcnR1YWxTY3JvbGxFbmFibGVkKClcIlxuICAgIFtuZ1N0eWxlXT1cInsgJ2hlaWdodC5weCc6IGdldFZpcnR1YWxTY3JvbGxWaWV3cG9ydEhlaWdodCgpIH1cIj5cblxuICAgIDwhLS0gU3BhY2VyIHRvIGNyZWF0ZSBzY3JvbGxhYmxlIGFyZWEgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0LXNjcm9sbC1zcGFjZXJcIiBbbmdTdHlsZV09XCJ7ICdoZWlnaHQucHgnOiB2aXJ0dWFsU2Nyb2xsVG90YWxIZWlnaHQkIHwgYXN5bmMgfVwiPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUYWJsZSBwb3NpdGlvbmVyIHdpdGggdHJhbnNmb3JtIChpbnN0ZWFkIG9mIHRib2R5KSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3QtdGFibGUtcG9zaXRpb25lclwiIFtuZ1N0eWxlXT1cInsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgnICsgKHZpcnR1YWxTY3JvbGxPZmZzZXRZJCB8IGFzeW5jKSArICdweCknIH1cIj5cbiAgICAgIDwhLS0gVGFibGUgd2l0aCBvbmx5IHZpc2libGUgcm93cyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVRlbXBsYXRlOyBjb250ZXh0OiB7IFxuICAgICAgICBtb2RlOiAndmlydHVhbCcsXG4gICAgICAgIHRoZWFkU3R5bGU6IHsgdG9wOiAodmlydHVhbFNjcm9sbE9mZnNldFlOZWckIHwgYXN5bmMpICsgJ3B4JyB9XG4gICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICBcbiAgPCEtLSBTdGFuZGFyZCB0YWJsZSAod2hlbiB2aXJ0dWFsIHNjcm9sbCBkaXNhYmxlZCkgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNWaXJ0dWFsU2Nyb2xsRW5hYmxlZCgpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlVGVtcGxhdGU7IGNvbnRleHQ6IHsgXG4gICAgICBtb2RlOiAnc3RhbmRhcmQnLFxuICAgICAgdGhlYWRTdHlsZTogbnVsbFxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBTaGFyZWQgQ29sdW1uIE1lbnUgRHJvcGRvd24gLS0+XG4gIDxzdC1jb2x1bW4tbWVudS1kcm9wZG93biBcbiAgW2lzT3Blbl09XCJjb2x1bW5NZW51U3RhdGUuaXNPcGVuXCJcbiAgW3Bvc2l0aW9uXT1cImNvbHVtbk1lbnVTdGF0ZS5wb3NpdGlvblwiXG4gIFtjb250ZXh0XT1cImNvbHVtbk1lbnVTdGF0ZS5jb250ZXh0XCJcbiAgKGFjdGlvbkNsaWNrZWQpPVwib25Db2x1bW5BY3Rpb25DbGlja2VkKCRldmVudClcIlxuICAoY2xvc2VkKT1cImNsb3NlQ29sdW1uTWVudSgpXCI+XG4gIDwvc3QtY29sdW1uLW1lbnUtZHJvcGRvd24+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIihtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2tlbGV0b25Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIFNoYXJlZCBSb3cgQWN0aW9ucyBEcm9wZG93biAtLT5cbjxzdC1yb3ctYWN0aW9ucy1kcm9wZG93biBbaXNPcGVuXT1cImRyb3Bkb3duU3RhdGUuaXNPcGVuXCIgW3Bvc2l0aW9uXT1cImRyb3Bkb3duU3RhdGUucG9zaXRpb25cIlxuICBbY29udGV4dF09XCJkcm9wZG93blN0YXRlLmNvbnRleHRcIiAoYWN0aW9uQ2xpY2tlZCk9XCJvblJvd0FjdGlvbkNsaWNrZWQoJGV2ZW50KVwiIChjbG9zZWQpPVwiY2xvc2VSb3dBY3Rpb25zRHJvcGRvd24oKVwiPlxuPC9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bj5cblxuXG48IS0tIEJvdHRvbSBwYWdpbmF0aW9uIGNvbnRyb2xzIC0tPlxuPHN0LXBhZ2luYXRpb24gXG4gICpuZ0lmPVwic2hvd0JvdHRvbVBhZ2luYXRpb24oKSAmJiAhKG1lcmdlZENvbmZpZy50YWJsZVNrZWxldG9uPy5lbmFibGVkIHwgYXN5bmMpXCIgXG4gIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gIFt0YWJsZUNvbmZpZ109XCJtZXJnZWRDb25maWdcIlxuICBwb3NpdGlvbj1cImJvdHRvbVwiPlxuPC9zdC1wYWdpbmF0aW9uPlxuXG5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gIDwhLS0gUkVVU0FCTEUgVEFCTEUgVEVNUExBVEUgLS0+XG4gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuICA8bmctdGVtcGxhdGUgI3RhYmxlVGVtcGxhdGUgbGV0LW1vZGU9XCJtb2RlXCIgbGV0LXRoZWFkU3R5bGU9XCJ0aGVhZFN0eWxlXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwic3QtdGFibGUtZWxlbWVudFwiPlxuICAgICAgPCEtLSBUQUJMRSBIRUFERVIgLS0+XG4gICAgICA8dGhlYWQgW25nQ2xhc3NdPVwieyAnc3RpY2t5JzogbWVyZ2VkQ29uZmlnLmRpc3BsYXk/LnN0aWNreUhlYWRlciB9XCIgW25nU3R5bGVdPVwidGhlYWRTdHlsZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPCEtLSBSb3cgTnVtYmVyIEhlYWRlciAtLT5cbiAgICAgICAgICA8dGggKm5nSWY9XCJtZXJnZWRDb25maWcuc2hvd1Jvd051bWJlclwiIGNsYXNzPVwicm93LW51bWJlci1oZWFkZXIgaGVhZGVyLWNlbGwgc3RpY2t5LWxlZnRcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxuICAgICAgICAgICAgICAgICdsZWZ0LnB4JzogMCxcbiAgICAgICAgICAgICAgICAnei1pbmRleCc6IFpJbmRleC5TVElDS1lfSEVBREVSX0NFTEwsXG4gICAgICAgICAgICAgICAgJ3dpZHRoLnB4JzogMzBcbiAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgI1xuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPCEtLSBDb2x1bW4gSGVhZGVycyAtLT5cbiAgICAgICAgICA8dGggXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHZpc2libGVDb2x1bW5zOyBsZXQgY29sSW5kZXggPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdDsgbGV0IGlzTGFzdCA9IGxhc3RcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnaGVhZGVyLWNlbGwnOiBtb2RlID09PSAnc3RhbmRhcmQnLFxuICAgICAgICAgICAgICAnc3RpY2t5LWxlZnQnOiBjb2x1bW4uc3RpY2t5ID09PSAnbGVmdCcsXG4gICAgICAgICAgICAgICdzdGlja3ktcmlnaHQnOiBjb2x1bW4uc3RpY2t5ID09PSAncmlnaHQnLFxuICAgICAgICAgICAgICAnc3RpY2t5LXJpZ2h0LWZpcnN0JzogY29sdW1uLnN0aWNreSA9PT0gJ3JpZ2h0JyAmJiBpc0ZpcnN0U3RpY2t5UmlnaHQoY29sdW1uLmtleSksXG4gICAgICAgICAgICAgICdyZXNpemFibGUnOiBjb2x1bW4ucmVzaXphYmxlICE9PSBmYWxzZVxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBjb2x1bW4uc3RpY2t5ID8gJ3N0aWNreScgOiBudWxsLFxuICAgICAgICAgICAgICAnbGVmdC5weCc6IGNvbHVtbi5zdGlja3kgPT09ICdsZWZ0JyA/IChjb2x1bW4uc3RpY2t5T2Zmc2V0IHx8IDApIDogbnVsbCxcbiAgICAgICAgICAgICAgJ3JpZ2h0LnB4JzogY29sdW1uLnN0aWNreSA9PT0gJ3JpZ2h0JyA/IChjb2x1bW4uc3RpY2t5T2Zmc2V0IHx8IDApIDogbnVsbCxcbiAgICAgICAgICAgICAgJ3otaW5kZXgnOiBjb2x1bW4uc3RpY2t5ID8gWkluZGV4LlNUSUNLWV9IRUFERVJfQ0VMTCA6IG51bGwsXG4gICAgICAgICAgICAgICd3aWR0aC5weCc6IGNvbHVtbi53aWR0aFxuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8c3QtaGVhZGVyIFxuICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgIFtjb2x1bW5JbmRleF09XCJjb2xJbmRleFwiXG4gICAgICAgICAgICAgIFtpc0ZpcnN0Q29sdW1uXT1cImlzRmlyc3RcIlxuICAgICAgICAgICAgICBbaXNMYXN0Q29sdW1uXT1cImlzTGFzdFwiXG4gICAgICAgICAgICAgIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gICAgICAgICAgICAgIFtlbmFibGVTb3J0aW5nXT1cIm1lcmdlZENvbmZpZy5zb3J0aW5nPy5lbmFibGVkID8/IGVuYWJsZVNvcnRpbmdcIlxuICAgICAgICAgICAgICBbZW5hYmxlRmlsdGVyaW5nXT1cIm1lcmdlZENvbmZpZy5maWx0ZXJpbmc/LmVuYWJsZWQgPz8gZW5hYmxlRmlsdGVyaW5nXCJcbiAgICAgICAgICAgICAgKGNvbHVtbk1vdmVkKT1cIm9uQ29sdW1uTW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChtZW51Q2xpY2spPVwib3BlbkNvbHVtbk1lbnUoJGV2ZW50LCBjb2x1bW4sIGNvbEluZGV4LCBpc0ZpcnN0LCBpc0xhc3QpXCI+XG4gICAgICAgICAgICA8L3N0LWhlYWRlcj5cblxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJyZXNpemUtaGFuZGxlXCIgXG4gICAgICAgICAgICAgIHN0Q29sdW1uUmVzaXplXG4gICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgKGNvbHVtblJlc2l6ZWQpPVwib25Db2x1bW5SZXNpemVkKCRldmVudClcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5yZXNpemFibGUgIT09IGZhbHNlXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gU2V0dGluZ3MgQ29sdW1uIEhlYWRlciAtLT5cbiAgICAgICAgICA8dGggXG4gICAgICAgICAgICBjbGFzcz1cInNldHRpbmdzLWNvbHVtbiBzdGlja3ktcmlnaHRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGVhZGVyLWNlbGwnOiBtb2RlID09PSAnc3RhbmRhcmQnIH1cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnei1pbmRleCc6IFpJbmRleC5TVElDS1lfSEVBREVSX0NFTEwgfVwiPlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdmbGV4LWNlbnRlcic6IG1vZGUgPT09ICd2aXJ0dWFsJywgJ2hlYWRlci1jb250ZW50JzogbW9kZSA9PT0gJ3N0YW5kYXJkJyB9XCI+XG4gICAgICAgICAgICAgIDxzdC10YWJsZS1hY3Rpb25zIFxuICAgICAgICAgICAgICAgIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gICAgICAgICAgICAgICAgW2FsbG93QWRkQ29sdW1uXT1cIm1lcmdlZENvbmZpZy5mZWF0dXJlcz8uY29sdW1uTWFuYWdlbWVudD8uYWxsb3dBZGQgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgIChhZGRDb2x1bW5DbGlja2VkKT1cIm9uQWRkQ29sdW1uQ2xpY2soKVwiPlxuICAgICAgICAgICAgICA8L3N0LXRhYmxlLWFjdGlvbnM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cblxuICAgICAgPCEtLSBUQUJMRSBCT0RZIC0tPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8IS0tIFZpcnR1YWwgU2Nyb2xsIFJvd3MgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtb2RlID09PSAndmlydHVhbCdcIj5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiB2aXNpYmxlUm93cyQgfCBhc3luYzsgbGV0IHJlbGF0aXZlSW5kZXggPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeVJvd0luZGV4XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtcm93LWluZGV4XT1cImdldEFic29sdXRlUm93SW5kZXgocmVsYXRpdmVJbmRleClcIj5cbiAgICAgICAgICAgIDwhLS0gUm93IE51bWJlciBDZWxsIC0tPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwibWVyZ2VkQ29uZmlnLnNob3dSb3dOdW1iZXJcIiBjbGFzcz1cInJvdy1udW1iZXItY2VsbFwiIFxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzdGlja3ktbGVmdCc6ICdsZWZ0JyB9XCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICd3aWR0aC5weCc6IDMwLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICAgICAgICAnbGVmdC5weCc6IDAsXG4gICAgICAgICAgICAgICAgJ3otaW5kZXgnOiBaSW5kZXguU1RJQ0tZX0JPRFlfQ0VMTCxcbiAgICAgICAgICAgICAgICAnaGVpZ2h0LnB4JzogbW9kZSA9PT0gJ3ZpcnR1YWwnID8gZ2V0VmlydHVhbFNjcm9sbEl0ZW1TaXplKCkgOiBudWxsXG4gICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAge3tnZXRBYnNvbHV0ZVJvd0luZGV4KHJlbGF0aXZlSW5kZXgpICsgMX19XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgXG4gICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICByb3dJbmRleDogZ2V0QWJzb2x1dGVSb3dJbmRleChyZWxhdGl2ZUluZGV4KSxcbiAgICAgICAgICAgICAgbW9kZTogJ3ZpcnR1YWwnLFxuICAgICAgICAgICAgICByZWxhdGl2ZUluZGV4OiByZWxhdGl2ZUluZGV4XG4gICAgICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTdGFuZGFyZCBSb3dzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ3N0YW5kYXJkJ1wiPlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHZpc2libGVDZWxsR3JpZDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIiBbYXR0ci5kYXRhLXJvdy1pbmRleF09XCJyb3dJbmRleFwiPlxuICAgICAgICAgICAgPCEtLSBSb3cgTnVtYmVyIENlbGwgLS0+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJtZXJnZWRDb25maWcuc2hvd1Jvd051bWJlclwiIGNsYXNzPVwicm93LW51bWJlci1jZWxsXCIgXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3N0aWNreS1sZWZ0JzogJ2xlZnQnIH1cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgJ3dpZHRoLnB4JzogMzAsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxuICAgICAgICAgICAgICAgICdsZWZ0LnB4JzogMCxcbiAgICAgICAgICAgICAgICAnei1pbmRleCc6IFpJbmRleC5TVElDS1lfQk9EWV9DRUxMLFxuICAgICAgICAgICAgICAgICdoZWlnaHQucHgnOiBtb2RlID09PSAndmlydHVhbCcgPyBnZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSA6IG51bGxcbiAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICB7e3Jvd0luZGV4ICsgMX19XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJvZHlDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgXG4gICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgICAgIG1vZGU6ICdzdGFuZGFyZCdcbiAgICAgICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPlxuICA8IS0tIFJFVVNBQkxFIEJPRFkgQ0VMTCBURU1QTEFURSAtLT5cbiAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+XG4gIDxuZy10ZW1wbGF0ZSAjYm9keUNlbGxUZW1wbGF0ZSBsZXQtcm93PVwicm93XCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIiBsZXQtbW9kZT1cIm1vZGVcIiBsZXQtcmVsYXRpdmVJbmRleD1cInJlbGF0aXZlSW5kZXhcIj5cbiAgICA8IS0tIERhdGEgQ2VsbHMgLS0+XG4gICAgPHRkIFxuICAgICAgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93OyBsZXQgY29sSW5kZXggPSBpbmRleFwiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdzdGlja3ktbGVmdCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID09PSAnbGVmdCcsXG4gICAgICAgICdzdGlja3ktcmlnaHQnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgJ3N0aWNreS1yaWdodC1maXJzdCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID09PSAncmlnaHQnICYmIHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8ua2V5ICYmIGlzRmlyc3RTdGlja3lSaWdodCh2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0ua2V5KSxcbiAgICAgICAgJ2FsaWduLWNlbnRlcic6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uYWxpZ25tZW50ID09PSAnY2VudGVyJyxcbiAgICAgICAgJ2FsaWduLXJpZ2h0JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5hbGlnbm1lbnQgPT09ICdyaWdodCcsXG4gICAgICAgICdjZWxsLWZvY3VzZWQnOiBjZWxsLmlzRm9jdXNlZCgpXG4gICAgICB9XCJcbiAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgcG9zaXRpb246IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID8gJ3N0aWNreScgOiBudWxsLFxuICAgICAgICAnbGVmdC5weCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8uc3RpY2t5ID09PSAnbGVmdCcgPyAodmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3lPZmZzZXQgfHwgMCkgOiBudWxsLFxuICAgICAgICAncmlnaHQucHgnOiB2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreSA9PT0gJ3JpZ2h0JyA/ICh2aXNpYmxlQ29sdW1uc1tjb2xJbmRleF0/LnN0aWNreU9mZnNldCB8fCAwKSA6IG51bGwsXG4gICAgICAgICd6LWluZGV4JzogdmlzaWJsZUNvbHVtbnNbY29sSW5kZXhdPy5zdGlja3kgPyBaSW5kZXguU1RJQ0tZX0JPRFlfQ0VMTCA6IG51bGwsXG4gICAgICAgICd3aWR0aC5weCc6IHZpc2libGVDb2x1bW5zW2NvbEluZGV4XT8ud2lkdGgsXG4gICAgICAgICdoZWlnaHQucHgnOiBtb2RlID09PSAndmlydHVhbCcgPyBnZXRWaXJ0dWFsU2Nyb2xsSXRlbVNpemUoKSA6IG51bGxcbiAgICAgIH1cIlxuICAgICAgKGNsaWNrKT1cImlzS2V5Ym9hcmROYXZpZ2F0aW9uRW5hYmxlZCgpID8gb25DZWxsQ2xpY2socm93SW5kZXgsIGNvbEluZGV4KSA6IG51bGxcIj5cbiAgICAgIFxuICAgICAgPCEtLSBWaXJ0dWFsIFNjcm9sbCBDZWxsIC0tPlxuICAgICAgPHN0LWNlbGwgXG4gICAgICAgICpuZ0lmPVwibW9kZSA9PT0gJ3ZpcnR1YWwnXCJcbiAgICAgICAgW2NlbGxdPVwiY2VsbFwiIFxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjZWxsLmlzRm9jdXNlZCgpID8gMCA6IC0xXCIgXG4gICAgICAgIFtlZGl0TW9kZV09XCJnZXRFZGl0TW9kZUZvckNlbGxzKClcIlxuICAgICAgICBbdGFibGVTdGF0ZV09XCJnZXRBY3RpdmVUYWJsZVN0YXRlKClcIlxuICAgICAgICBbdGFibGVDb25maWddPVwibWVyZ2VkQ29uZmlnXCJcbiAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbEluZGV4XCJcbiAgICAgICAgKGNlbGxFZGl0KT1cIm9uQ2VsbEVkaXQoJGV2ZW50KVwiIFxuICAgICAgICAoY2VsbFNhdmUpPVwib25DZWxsU2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgKGNlbGxTYXZlQW5kTmF2aWdhdGUpPVwib25DZWxsU2F2ZUFuZE5hdmlnYXRlKCRldmVudClcIiBcbiAgICAgICAgKGNlbGxDYW5jZWwpPVwib25DZWxsQ2FuY2VsKCRldmVudClcIlxuICAgICAgICAoY2VsbENoYW5nZSk9XCJjZWxsQ2hhbmdlLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9zdC1jZWxsPlxuXG4gICAgICA8IS0tIFN0YW5kYXJkIENlbGwgLS0+XG4gICAgICA8c3QtY2VsbCBcbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAnc3RhbmRhcmQnXCJcbiAgICAgICAgW2NlbGxdPVwiY2VsbFwiICBcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC5pc0ZvY3VzZWQoKSA/IDAgOiAtMVwiXG4gICAgICAgIFt0YWJsZVN0YXRlXT1cImdldEFjdGl2ZVRhYmxlU3RhdGUoKVwiXG4gICAgICAgIFt0YWJsZUNvbmZpZ109XCJtZXJnZWRDb25maWdcIlxuICAgICAgICBbY29sdW1uSW5kZXhdPVwiY29sSW5kZXhcIlxuICAgICAgICAoY2VsbFNhdmUpPVwib25DZWxsU2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgKGNlbGxDaGFuZ2UpPVwiY2VsbENoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICAgIDwvc3QtY2VsbD5cbiAgICA8L3RkPlxuICAgIFxuICAgIDwhLS0gUm93IEFjdGlvbnMgQ2VsbCAtLT5cbiAgICA8dGQgY2xhc3M9XCJzZXR0aW5ncy1jb2x1bW5cIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnaGFzLWFjdGlvbnMnOiBoYXNSb3dBY3Rpb25zKClcbiAgICAgIH1cIlxuICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICBwb3NpdGlvbjogaGFzUm93QWN0aW9ucygpID8gJ3N0aWNreScgOiBudWxsLFxuICAgICAgICAncmlnaHQucHgnOiBoYXNSb3dBY3Rpb25zKCkgPyAwIDogbnVsbCxcbiAgICAgICAgJ3otaW5kZXgnOiBoYXNSb3dBY3Rpb25zKCkgPyBaSW5kZXguU1RJQ0tZX0JPRFlfQ0VMTCA6IG51bGxcbiAgICAgIH1cIj5cbiAgICAgIDxidXR0b24gXG4gICAgICAgICpuZ0lmPVwiaGFzUm93QWN0aW9ucygpXCJcbiAgICAgICAgY2xhc3M9XCJzZXR0aW5ncy10cmlnZ2VyXCJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5Sb3dBY3Rpb25zRHJvcGRvd24oJGV2ZW50LCBnZXRSb3dEYXRhKHJvd0luZGV4KSwgcm93SW5kZXgpXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICBhcmlhLWxhYmVsPVwiUm93IGFjdGlvbnNcIj5cbiAgICAgICAg4ouvXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3RkPlxuICA8L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NrZWxldG9uTG9hZGVyPlxuICA8ZGl2IGNsYXNzPVwibGlzdC1yb3dcIiAqbmdJZj1cIihtZXJnZWRDb25maWcudGFibGVTa2VsZXRvbj8uZW5hYmxlZCB8IGFzeW5jKVwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGkgb2Ygc2tlbGV0b25Db2x1bW5zXCIgY2xhc3M9XCJsaXN0LWNvbnRlbnRcIj5cbiAgICAgIDxuaWxlLXNrZWxldG9uLWxvYWRlciB2YXJpYW50PVwidGV4dFwiIHdpZHRoPVwiOTAlXCIgaGVpZ2h0PVwiMThcIiAqbmdGb3I9XCJsZXQgaiBvZiBza2VsZXRvblJvd3NcIj48L25pbGUtc2tlbGV0b24tbG9hZGVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
|