@mediusinc/mng-commons 3.3.0-rc.0 → 3.4.0-rc.0

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.
@@ -660,7 +660,7 @@ export class MngTableComponent {
660
660
  this.layoutPreferences = {};
661
661
  }
662
662
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngTableComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.TranslateService }, { token: i3.MngCommonsService }, { token: i3.MngActionExecutorService }, { token: i3.MngViewContainerComponentService, optional: true }, { token: i3.MngLocalStorageService }], target: i0.ɵɵFactoryTarget.Component }); }
663
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: MngTableComponent, isStandalone: true, selector: "mng-table", inputs: { initialDescriptor: ["descriptor", "initialDescriptor"], items: "items", queryResult: "queryResult", loading: "loading", dataProvider: "dataProvider", useQueryParams: "useQueryParams", selectionMode: "selectionMode", selectionEnabled: "selectionEnabled", actions: "actions", isColumnClickable: "isColumnClickable", viewContainerInit: ["viewContainer", "viewContainerInit"], captionComponent: "captionComponent", columnActionComponent: "columnActionComponent", columnActionMinWidth: "columnActionMinWidth", globalFilterFieldsInit: ["globalFilterFields", "globalFilterFieldsInit"] }, outputs: { loadEventEmitter: "tableLoad", cellClickEventEmitter: "cellClick", selectionChangeEventEmitter: "selectionChange", captionCmpInstEventEmitter: "captionComponentInstance", columnActionCmpInstEventEmitter: "columnActionComponentInstance" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "primeTable", first: true, predicate: Table, descendants: true }, { propertyName: "components", predicate: MngComponentDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table\n *ngIf=\"!useQueryParams || (useQueryParamsInitialized$ | async)\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"descriptor?.dataKeyProperty\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"infiniteScroll ? 20 : rows\"\n [first]=\"infiniteScroll ? 0 : offset\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"infiniteScroll ? undefined : rowsPerPageOptions\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"multiSortMeta\"\n [filters]=\"filterMetadata\"\n [globalFilterFields]=\"globalFilterFields\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled ? selectionMode : null\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"rowHeight\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n [resizableColumns]=\"descriptor?.hasResizableColumns ?? false\"\n [columnResizeMode]=\"descriptor?.columnResizeMode ?? 'fit'\"\n [reorderableColumns]=\"areColumnsReorderable\"\n [columns]=\"visibleColumns\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n <ng-template *ngIf=\"captionTemplate || captionComponent || descriptor?.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else componentOrDefaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #componentOrDefaultCaption>\n <div *ngIf=\"captionComponent; else defaultCaption\" [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n <ng-template #defaultCaption>\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngIf=\"!descriptor?.hideHeader\" class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n <th *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.isVisible\">\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n </ng-template>\n <th\n *ngIf=\"col.descriptor.isReorderable\"\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n <th\n *ngIf=\"!col.descriptor.isReorderable\"\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n </ng-container>\n </ng-container>\n <th\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\"\n class=\"text-right\">\n <p-multiSelect\n #columnToggleMultiselect\n *ngIf=\"areColumnsToggleable || areColumnsReorderable || descriptor?.hasResizableColumns\"\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n optionDisabled=\"disabled\"\n [filter]=\"false\"\n [options]=\"columns\"\n [(ngModel)]=\"visibleColumns\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n tooltipPosition=\"left\"\n defaultLabel=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\" [ngClass]=\"{'p-checkbox-disabled': !areColumnsToggleable}\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allChecked\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.toggleAll($event)\"\n [disabled]=\"!areColumnsToggleable\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allChecked\"\n [ngClass]=\"{\n 'p-highlight': columnToggleMultiselect.allChecked,\n 'p-focus': columnToggleMultiselect.headerCheckboxFocus,\n 'p-disabled': !areColumnsToggleable\n }\"\n (click)=\"columnToggleMultiselect.toggleAll($event)\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': columnToggleMultiselect.allChecked}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n </ng-template>\n </p-multiSelect>\n </th>\n </tr>\n <tr *ngIf=\"descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters\" class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n <ng-container *ngFor=\"let col of columns\">\n <th\n *ngIf=\"col.isVisible\"\n [class]=\"\n (col.descriptor.filterDescriptor ? 'mng-column-filter-' + col.descriptor.filterDescriptor.filterType + ' ' : ' ') +\n col.descriptor.filterDescriptor?.columnClassName\n \"\n [style.width.%]=\"col.descriptor.filterDescriptor?.columnWidth ?? col.descriptor.width\"\n [style.min-width.px]=\"col.descriptor.filterDescriptor?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.descriptor.maxWidth\">\n <div class=\"flex\" *ngIf=\"col.descriptor.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor!.filterDisplay\" [descriptor]=\"col.descriptor.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n </ng-container>\n <th\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe : descriptor?.rowClassNameMapFn : item | mngLocaleDefaultRowClass : descriptor : item\">\n <td *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n <ng-container *ngFor=\"let col of columns\">\n <td\n *ngIf=\"col.isVisible\"\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n </ng-container>\n <td\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n <ng-container *ngIf=\"columnActionTemplate; else showColumnActionComponentOrDefault\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n </ng-container>\n <ng-template #showColumnActionComponentOrDefault>\n <span\n *ngIf=\"columnActionComponent; else defaultColumnActions\"\n [mngComponent]=\"columnActionComponent!\"\n (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n </ng-template>\n <ng-template #defaultColumnActions>\n <mng-action\n *ngFor=\"let action of rowInlineActions\"\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainer\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idPropertyName ? item[descriptor!.model!.idPropertyName!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor?.loadingIcon\" *ngIf=\"descriptor?.loadingIcon\"></i>\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor?.loadingIcon}\" *ngIf=\"descriptor?.loadingText\">\n {{ descriptor?.loadingText ?? '' | translate }}\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"footerTemplate\" pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n </p-table>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i4.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i4.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i4.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i4.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i4.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i4.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: MngComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "inputs", "attachToHost"], outputs: ["instanceCreated"] }, { kind: "pipe", type: MngI18nPropertyPipe, name: "i18nProperty" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MngTableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["descriptor", "display"] }, { kind: "pipe", type: MngClassMapPipe, name: "mngClassMapPipe" }, { kind: "pipe", type: MngLocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }, { kind: "component", type: MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "component", type: MngActionComponent, selector: "mng-action", inputs: ["action", "item", "itemId", "actionData", "queryParam", "dataProvider", "hostComponent", "route", "disabled", "loading", "viewContainer", "selectedItems"], outputs: ["finish"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i6.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectionLimit"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i8.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
663
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: MngTableComponent, isStandalone: true, selector: "mng-table", inputs: { initialDescriptor: ["descriptor", "initialDescriptor"], items: "items", queryResult: "queryResult", loading: "loading", dataProvider: "dataProvider", useQueryParams: "useQueryParams", selectionMode: "selectionMode", selectionEnabled: "selectionEnabled", actions: "actions", isColumnClickable: "isColumnClickable", viewContainerInit: ["viewContainer", "viewContainerInit"], captionComponent: "captionComponent", columnActionComponent: "columnActionComponent", columnActionMinWidth: "columnActionMinWidth", globalFilterFieldsInit: ["globalFilterFields", "globalFilterFieldsInit"] }, outputs: { loadEventEmitter: "tableLoad", cellClickEventEmitter: "cellClick", selectionChangeEventEmitter: "selectionChange", captionCmpInstEventEmitter: "captionComponentInstance", columnActionCmpInstEventEmitter: "columnActionComponentInstance" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "primeTable", first: true, predicate: Table, descendants: true }, { propertyName: "components", predicate: MngComponentDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table\n *ngIf=\"!useQueryParams || (useQueryParamsInitialized$ | async)\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"descriptor?.dataKeyProperty\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"infiniteScroll ? 20 : rows\"\n [first]=\"infiniteScroll ? 0 : offset\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"infiniteScroll ? undefined : rowsPerPageOptions\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"multiSortMeta\"\n [filters]=\"filterMetadata\"\n [globalFilterFields]=\"globalFilterFields\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled ? selectionMode : null\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"rowHeight\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n [resizableColumns]=\"descriptor?.hasResizableColumns ?? false\"\n [columnResizeMode]=\"descriptor?.columnResizeMode ?? 'fit'\"\n [reorderableColumns]=\"areColumnsReorderable\"\n [columns]=\"visibleColumns\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n <ng-template *ngIf=\"captionTemplate || captionComponent || descriptor?.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else componentOrDefaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #componentOrDefaultCaption>\n <div *ngIf=\"captionComponent; else defaultCaption\" [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n <ng-template #defaultCaption>\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngIf=\"!descriptor?.hideHeader\" class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n <th *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.isVisible\">\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n </ng-template>\n <th\n *ngIf=\"col.descriptor.isReorderable\"\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n <th\n *ngIf=\"!col.descriptor.isReorderable\"\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n </ng-container>\n </ng-container>\n <th\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\"\n class=\"text-right\">\n <p-multiSelect\n #columnToggleMultiselect\n *ngIf=\"areColumnsToggleable || areColumnsReorderable || descriptor?.hasResizableColumns\"\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n optionDisabled=\"disabled\"\n [filter]=\"false\"\n [options]=\"columns\"\n [(ngModel)]=\"visibleColumns\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n tooltipPosition=\"left\"\n defaultLabel=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\" [ngClass]=\"{'p-checkbox-disabled': !areColumnsToggleable}\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allChecked\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.toggleAll($event)\"\n [disabled]=\"!areColumnsToggleable\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allChecked\"\n [ngClass]=\"{\n 'p-highlight': columnToggleMultiselect.allChecked,\n 'p-focus': columnToggleMultiselect.headerCheckboxFocus,\n 'p-disabled': !areColumnsToggleable\n }\"\n (click)=\"columnToggleMultiselect.toggleAll($event)\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': columnToggleMultiselect.allChecked}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n </ng-template>\n </p-multiSelect>\n </th>\n </tr>\n <tr *ngIf=\"descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters\" class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n <ng-container *ngFor=\"let col of columns\">\n <th\n *ngIf=\"col.isVisible\"\n [class]=\"\n (col.descriptor.filterDescriptor ? 'mng-column-filter-' + col.descriptor.filterDescriptor.filterType + ' ' : ' ') +\n col.descriptor.filterDescriptor?.columnClassName\n \"\n [style.width.%]=\"col.descriptor.filterDescriptor?.columnWidth ?? col.descriptor.width\"\n [style.min-width.px]=\"col.descriptor.filterDescriptor?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.descriptor.maxWidth\">\n <div class=\"flex\" *ngIf=\"col.descriptor.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor!.filterDisplay\" [descriptor]=\"col.descriptor.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n </ng-container>\n <th\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe : descriptor?.rowClassNameMapFn : item | mngLocaleDefaultRowClass : descriptor : item\">\n <td *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n <ng-container *ngFor=\"let col of columns\">\n <td\n *ngIf=\"col.isVisible\"\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n (col.descriptor.className | mngClassMapPipe : col.descriptor.classNameMapFn : item) +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n </ng-container>\n <td\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n <ng-container *ngIf=\"columnActionTemplate; else showColumnActionComponentOrDefault\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n </ng-container>\n <ng-template #showColumnActionComponentOrDefault>\n <span\n *ngIf=\"columnActionComponent; else defaultColumnActions\"\n [mngComponent]=\"columnActionComponent!\"\n (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n </ng-template>\n <ng-template #defaultColumnActions>\n <mng-action\n *ngFor=\"let action of rowInlineActions\"\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainer\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idPropertyName ? item[descriptor!.model!.idPropertyName!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor?.loadingIcon\" *ngIf=\"descriptor?.loadingIcon\"></i>\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor?.loadingIcon}\" *ngIf=\"descriptor?.loadingText\">\n {{ descriptor?.loadingText ?? '' | translate }}\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"footerTemplate\" pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n </p-table>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i4.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i4.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i4.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i4.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i4.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i4.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: MngComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "inputs", "attachToHost"], outputs: ["instanceCreated"] }, { kind: "pipe", type: MngI18nPropertyPipe, name: "i18nProperty" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MngTableColumnFilterComponent, selector: "mng-table-column-filter", inputs: ["descriptor", "display"] }, { kind: "pipe", type: MngClassMapPipe, name: "mngClassMapPipe" }, { kind: "pipe", type: MngLocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }, { kind: "component", type: MngTableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "component", type: MngActionComponent, selector: "mng-action", inputs: ["action", "item", "itemId", "actionData", "queryParam", "dataProvider", "hostComponent", "route", "disabled", "loading", "viewContainer", "selectedItems"], outputs: ["finish"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i6.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectionLimit"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i8.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i9.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
664
664
  }
665
665
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: MngTableComponent, decorators: [{
666
666
  type: Component,
@@ -685,7 +685,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImpor
685
685
  ButtonModule,
686
686
  TooltipModule,
687
687
  FormsModule
688
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table\n *ngIf=\"!useQueryParams || (useQueryParamsInitialized$ | async)\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"descriptor?.dataKeyProperty\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"infiniteScroll ? 20 : rows\"\n [first]=\"infiniteScroll ? 0 : offset\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"infiniteScroll ? undefined : rowsPerPageOptions\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"multiSortMeta\"\n [filters]=\"filterMetadata\"\n [globalFilterFields]=\"globalFilterFields\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled ? selectionMode : null\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"rowHeight\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n [resizableColumns]=\"descriptor?.hasResizableColumns ?? false\"\n [columnResizeMode]=\"descriptor?.columnResizeMode ?? 'fit'\"\n [reorderableColumns]=\"areColumnsReorderable\"\n [columns]=\"visibleColumns\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n <ng-template *ngIf=\"captionTemplate || captionComponent || descriptor?.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else componentOrDefaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #componentOrDefaultCaption>\n <div *ngIf=\"captionComponent; else defaultCaption\" [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n <ng-template #defaultCaption>\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngIf=\"!descriptor?.hideHeader\" class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n <th *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.isVisible\">\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n </ng-template>\n <th\n *ngIf=\"col.descriptor.isReorderable\"\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n <th\n *ngIf=\"!col.descriptor.isReorderable\"\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n </ng-container>\n </ng-container>\n <th\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\"\n class=\"text-right\">\n <p-multiSelect\n #columnToggleMultiselect\n *ngIf=\"areColumnsToggleable || areColumnsReorderable || descriptor?.hasResizableColumns\"\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n optionDisabled=\"disabled\"\n [filter]=\"false\"\n [options]=\"columns\"\n [(ngModel)]=\"visibleColumns\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n tooltipPosition=\"left\"\n defaultLabel=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\" [ngClass]=\"{'p-checkbox-disabled': !areColumnsToggleable}\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allChecked\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.toggleAll($event)\"\n [disabled]=\"!areColumnsToggleable\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allChecked\"\n [ngClass]=\"{\n 'p-highlight': columnToggleMultiselect.allChecked,\n 'p-focus': columnToggleMultiselect.headerCheckboxFocus,\n 'p-disabled': !areColumnsToggleable\n }\"\n (click)=\"columnToggleMultiselect.toggleAll($event)\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': columnToggleMultiselect.allChecked}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n </ng-template>\n </p-multiSelect>\n </th>\n </tr>\n <tr *ngIf=\"descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters\" class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n <ng-container *ngFor=\"let col of columns\">\n <th\n *ngIf=\"col.isVisible\"\n [class]=\"\n (col.descriptor.filterDescriptor ? 'mng-column-filter-' + col.descriptor.filterDescriptor.filterType + ' ' : ' ') +\n col.descriptor.filterDescriptor?.columnClassName\n \"\n [style.width.%]=\"col.descriptor.filterDescriptor?.columnWidth ?? col.descriptor.width\"\n [style.min-width.px]=\"col.descriptor.filterDescriptor?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.descriptor.maxWidth\">\n <div class=\"flex\" *ngIf=\"col.descriptor.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor!.filterDisplay\" [descriptor]=\"col.descriptor.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n </ng-container>\n <th\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe : descriptor?.rowClassNameMapFn : item | mngLocaleDefaultRowClass : descriptor : item\">\n <td *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n <ng-container *ngFor=\"let col of columns\">\n <td\n *ngIf=\"col.isVisible\"\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n </ng-container>\n <td\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n <ng-container *ngIf=\"columnActionTemplate; else showColumnActionComponentOrDefault\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n </ng-container>\n <ng-template #showColumnActionComponentOrDefault>\n <span\n *ngIf=\"columnActionComponent; else defaultColumnActions\"\n [mngComponent]=\"columnActionComponent!\"\n (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n </ng-template>\n <ng-template #defaultColumnActions>\n <mng-action\n *ngFor=\"let action of rowInlineActions\"\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainer\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idPropertyName ? item[descriptor!.model!.idPropertyName!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor?.loadingIcon\" *ngIf=\"descriptor?.loadingIcon\"></i>\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor?.loadingIcon}\" *ngIf=\"descriptor?.loadingText\">\n {{ descriptor?.loadingText ?? '' | translate }}\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"footerTemplate\" pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n </p-table>\n</div>\n" }]
688
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.height]=\"tableFullHeightOffset ? 'calc(100vh - ' + tableFullHeightOffset + 'px)' : null\">\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n <p-table\n *ngIf=\"!useQueryParams || (useQueryParamsInitialized$ | async)\"\n [value]=\"infiniteScroll ? dataProviderInfiniteScrollItems : (queryResult$ | async)?.pageData ?? []\"\n [dataKey]=\"descriptor?.dataKeyProperty\"\n [lazy]=\"isLazy\"\n [loading]=\"(loading$ | async) ?? false\"\n [paginator]=\"isPagination && !infiniteScroll\"\n [rows]=\"infiniteScroll ? 20 : rows\"\n [first]=\"infiniteScroll ? 0 : offset\"\n [totalRecords]=\"$any(infiniteScroll ? null : (queryResult$ | async)?.allDataCount ?? 0)\"\n [rowsPerPageOptions]=\"infiniteScroll ? undefined : rowsPerPageOptions\"\n [showCurrentPageReport]=\"!infiniteScroll\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"multiSortMeta\"\n [filters]=\"filterMetadata\"\n [globalFilterFields]=\"globalFilterFields\"\n sortMode=\"multiple\"\n [(selection)]=\"selection\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled ? selectionMode : null\"\n [scrollable]=\"true\"\n [virtualScroll]=\"infiniteScroll\"\n [virtualScrollItemSize]=\"rowHeight\"\n scrollHeight=\"flex\"\n [rowHover]=\"descriptor?.hasHover ?? true\"\n [styleClass]=\"className\"\n [resizableColumns]=\"descriptor?.hasResizableColumns ?? false\"\n [columnResizeMode]=\"descriptor?.columnResizeMode ?? 'fit'\"\n [reorderableColumns]=\"areColumnsReorderable\"\n [columns]=\"visibleColumns\"\n (onColResize)=\"onTableColumnResize($event)\"\n (onColReorder)=\"onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onSort)=\"onTableSort($event)\"\n (onFilter)=\"onTableFilter($event)\">\n <ng-template *ngIf=\"captionTemplate || captionComponent || descriptor?.title\" pTemplate=\"caption\">\n <ng-container *ngIf=\"captionTemplate; else componentOrDefaultCaption\">\n <ng-container *ngTemplateOutlet=\"captionTemplate\"></ng-container>\n </ng-container>\n <ng-template #componentOrDefaultCaption>\n <div *ngIf=\"captionComponent; else defaultCaption\" [mngComponent]=\"captionComponent\" (instanceCreated)=\"onCaptionCmpInst($event)\"></div>\n <ng-template #defaultCaption>\n <h5 class=\"p-0 m-0\">{{ descriptor?.title }}</h5>\n </ng-template>\n </ng-template>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr *ngIf=\"!descriptor?.hideHeader\" class=\"mng-table-header\" [class]=\"descriptor?.headerClassName\">\n <th *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.isVisible\">\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-content-between align-items-center\">\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n <p-sortIcon [field]=\"col.descriptor.property\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n </ng-template>\n <th\n *ngIf=\"col.descriptor.isReorderable\"\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n <th\n *ngIf=\"!col.descriptor.isReorderable\"\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.descriptor.property\"\n [pSortableColumnDisabled]=\"!col.descriptor.isSortEnabled\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"\n col.descriptor.headerClassName +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \">\n <ng-container *ngTemplateOutlet=\"col.descriptor.isSortEnabled ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n </ng-container>\n </ng-container>\n <th\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\"\n class=\"text-right\">\n <p-multiSelect\n #columnToggleMultiselect\n *ngIf=\"areColumnsToggleable || areColumnsReorderable || descriptor?.hasResizableColumns\"\n styleClass=\"p-button-primary mng-table-columns-multiselect\"\n appendTo=\"body\"\n optionDisabled=\"disabled\"\n [filter]=\"false\"\n [options]=\"columns\"\n [(ngModel)]=\"visibleColumns\"\n [pTooltip]=\"'mngTable.adjustTable' | translate\"\n tooltipPosition=\"left\"\n defaultLabel=\"\"\n dropdownIcon=\"pi pi-sliders-h\"\n [displaySelectedLabel]=\"false\"\n (onChange)=\"onColumnToggle($event)\">\n <ng-template pTemplate=\"filter\">\n <div class=\"p-checkbox p-component ml-1\" [ngClass]=\"{'p-checkbox-disabled': !areColumnsToggleable}\">\n <div class=\"p-hidden-accessible\">\n <input\n type=\"checkbox\"\n readonly=\"readonly\"\n [checked]=\"columnToggleMultiselect.allChecked\"\n (focus)=\"columnToggleMultiselect.onHeaderCheckboxFocus()\"\n (blur)=\"columnToggleMultiselect.onHeaderCheckboxBlur()\"\n (keydown.space)=\"columnToggleMultiselect.toggleAll($event)\"\n [disabled]=\"!areColumnsToggleable\" />\n </div>\n <div\n class=\"p-checkbox-box\"\n role=\"checkbox\"\n [attr.aria-checked]=\"columnToggleMultiselect.allChecked\"\n [ngClass]=\"{\n 'p-highlight': columnToggleMultiselect.allChecked,\n 'p-focus': columnToggleMultiselect.headerCheckboxFocus,\n 'p-disabled': !areColumnsToggleable\n }\"\n (click)=\"columnToggleMultiselect.toggleAll($event)\">\n <span class=\"p-checkbox-icon\" [ngClass]=\"{'pi pi-check': columnToggleMultiselect.allChecked}\"></span>\n </div>\n </div>\n <p-button\n icon=\"pi pi-replay\"\n styleClass=\"p-button-secondary\"\n [pTooltip]=\"'mngTable.resetLayout' | translate\"\n tooltipPosition=\"left\"\n (click)=\"resetDefaultLayout()\"></p-button>\n </ng-template>\n <ng-template let-item pTemplate=\"item\">\n {{ item.descriptor.title ?? (item.descriptor.property | i18nProperty : descriptor!.model) | translate }}\n </ng-template>\n </p-multiSelect>\n </th>\n </tr>\n <tr *ngIf=\"descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters\" class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th *ngIf=\"selectionEnabled\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\"></th>\n <ng-container *ngFor=\"let col of columns\">\n <th\n *ngIf=\"col.isVisible\"\n [class]=\"\n (col.descriptor.filterDescriptor ? 'mng-column-filter-' + col.descriptor.filterDescriptor.filterType + ' ' : ' ') +\n col.descriptor.filterDescriptor?.columnClassName\n \"\n [style.width.%]=\"col.descriptor.filterDescriptor?.columnWidth ?? col.descriptor.width\"\n [style.min-width.px]=\"col.descriptor.filterDescriptor?.columnMinWidth ?? col.descriptor.minWidth\"\n [style.max-width.px]=\"col.descriptor.maxWidth\">\n <div class=\"flex\" *ngIf=\"col.descriptor.filterDescriptor\">\n <mng-table-column-filter [display]=\"descriptor!.filterDisplay\" [descriptor]=\"col.descriptor.filterDescriptor\"></mng-table-column-filter>\n </div>\n </th>\n </ng-container>\n <th\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\"></th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-item let-idx=\"rowIndex\">\n <tr\n [style.height.px]=\"rowHeight\"\n [ngClass]=\"descriptor?.rowClassName | mngClassMapPipe : descriptor?.rowClassNameMapFn : item | mngLocaleDefaultRowClass : descriptor : item\">\n <td *ngIf=\"selectionEnabled && selectionMode === 'multiple'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n <td *ngIf=\"selectionEnabled && selectionMode === 'single'\" style=\"min-width: 36px\" pFrozenColumn [frozen]=\"descriptor?.selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n <ng-container *ngFor=\"let col of columns\">\n <td\n *ngIf=\"col.isVisible\"\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n (col.descriptor.className | mngClassMapPipe : col.descriptor.classNameMapFn : item) +\n (descriptor?.filterDisplay === filterDisplayRow && hasColumnFilters && col.descriptor.filterDescriptor\n ? ' mng-column-filter-' + col.descriptor.filterDescriptor.filterType\n : '')\n \"\n [class.clickable]=\"isColumnClickable\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <span class=\"p-column-title\">{{ col.descriptor.title ?? (col.descriptor.property | i18nProperty : descriptor!.model) | translate }}</span>\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n </ng-container>\n <td\n *ngIf=\"showInlineActionsColumn || areColumnsToggleable || areColumnsReorderable\"\n class=\"column-action justify-content-end text-right\"\n [style.min-width.px]=\"columnActionMinWidth\"\n pFrozenColumn\n [frozen]=\"descriptor?.actionColumnFrozen ?? true\"\n alignFrozen=\"right\">\n <ng-container *ngIf=\"columnActionTemplate; else showColumnActionComponentOrDefault\">\n <ng-container *ngTemplateOutlet=\"columnActionTemplate; context: {rowItem: item, rowIndex: idx}\"></ng-container>\n </ng-container>\n <ng-template #showColumnActionComponentOrDefault>\n <span\n *ngIf=\"columnActionComponent; else defaultColumnActions\"\n [mngComponent]=\"columnActionComponent!\"\n (instanceCreated)=\"onColumnActionCmpInst($event)\"></span>\n </ng-template>\n <ng-template #defaultColumnActions>\n <mng-action\n *ngFor=\"let action of rowInlineActions\"\n [action]=\"action\"\n [item]=\"item\"\n [viewContainer]=\"viewContainer\"\n [hostComponent]=\"this\"\n [itemId]=\"descriptor?.model?.idPropertyName ? item[descriptor!.model!.idPropertyName!] : null\"\n [actionData]=\"{itemIndex: idx}\"\n (finish)=\"onActionFinish($event)\">\n </mng-action>\n </ng-template>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"loadingicon\">\n <div class=\"flex flex-column align-items-center\">\n <i [class]=\"'text-white text-4xl pi-spin ' + descriptor?.loadingIcon\" *ngIf=\"descriptor?.loadingIcon\"></i>\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': descriptor?.loadingIcon}\" *ngIf=\"descriptor?.loadingText\">\n {{ descriptor?.loadingText ?? '' | translate }}\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"loadingbody\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr [style.height.px]=\"rowHeight\">\n <td [attr.colspan]=\"(descriptor?.columns?.length ?? 0) + (showInlineActionsColumn ? 1 : 0) + (selectionEnabled ? 1 : 0)\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n\n <ng-template *ngIf=\"footerTemplate\" pTemplate=\"summary\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" [ngTemplateOutletContext]=\"{queryResult: queryResult}\"></ng-container>\n </ng-template>\n </p-table>\n</div>\n" }]
689
689
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.TranslateService }, { type: i3.MngCommonsService }, { type: i3.MngActionExecutorService }, { type: i3.MngViewContainerComponentService, decorators: [{
690
690
  type: Optional
691
691
  }] }, { type: i3.MngLocalStorageService }]; }, propDecorators: { initialDescriptor: [{
@@ -746,4 +746,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImpor
746
746
  type: ViewChild,
747
747
  args: [Table]
748
748
  }] } });
749
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxldmlldy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGFibGV2aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0YsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUdULElBQUksRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBVSxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVsSSxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVBQWUsRUFBMEMsTUFBTSxhQUFhLENBQUM7QUFDckYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsS0FBSyxFQUFzQixXQUFXLEVB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LEtBQUssRUFBRSxZQUFZLEVBQUM7Z0JBSTVCLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFHVSxhQUFhO3NCQUE1QixLQUFLO2dCQUNVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFHVSxPQUFPO3NCQUF0QixLQUFLO2dCQUdVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFHeUIsaUJBQWlCO3NCQUEvQyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ04sZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQzhCLHNCQUFzQjtzQkFBekQsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBR0MsZ0JBQWdCO3NCQUEzQyxNQUFNO3VCQUFDLFdBQVc7Z0JBQ1MscUJBQXFCO3NCQUFoRCxNQUFNO3VCQUFDLFdBQVc7Z0JBQ2UsMkJBQTJCO3NCQUE1RCxNQUFNO3VCQUFDLGlCQUFpQjtnQkFDa0IsMEJBQTBCO3NCQUFwRSxNQUFNO3VCQUFDLDBCQUEwQjtnQkFDYywrQkFBK0I7c0JBQTlFLE1BQU07dUJBQUMsK0JBQStCO2dCQUdPLFNBQVM7c0JBQXRELGVBQWU7dUJBQUMsb0JBQW9CO2dCQUNPLFVBQVU7c0JBQXJELFlBQVk7dUJBQUMscUJBQXFCO2dCQUNWLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0Zvck9mLCBOZ0lmLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBUeXBlLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkNhbmNlbCwgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvbkVycm9yLCBOYXZpZ2F0aW9uU3RhcnQsIFBhcmFtcywgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0ZpbHRlck1hdGNoTW9kZSwgRmlsdGVyTWV0YWRhdGEsIExhenlMb2FkRXZlbnQsIFNvcnRNZXRhfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHtNdWx0aVNlbGVjdE1vZHVsZX0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XG5pbXBvcnQge1NrZWxldG9uTW9kdWxlfSBmcm9tICdwcmltZW5nL3NrZWxldG9uJztcbmltcG9ydCB7VGFibGUsIFRhYmxlTGF6eUxvYWRFdmVudCwgVGFibGVNb2R1bGV9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHtUb29sdGlwTW9kdWxlfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLCBNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlciwgTWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uLy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtNZWRpdXNSZXN0VXRpbH0gZnJvbSAnLi4vLi4vLi4vYXBpL3V0aWxzJztcbmltcG9ydCB7SVRhYmxlRGF0YVByb3ZpZGVyfSBmcm9tICcuLi8uLi8uLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge0FjdGlvbkRlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL2FjdGlvbic7XG5pbXBvcnQge0ZpbHRlckRlc2NyaXB0b3IsIEZpbHRlckxvb2t1cERlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL2ZpbHRlcic7XG5pbXBvcnQge0NvbHVtbkRlc2NyaXB0b3IsIFRhYmxlRGVzY3JpcHRvciwgVGFibGVEeW5hbWljRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdGFibGUnO1xuaW1wb3J0IHtBY3Rpb25Qb3NpdGlvbkVudW0sIEZpbHRlclR5cGVFbnVtLCBUYWJsZUZpbHRlckRpc3BsYXlFbnVtLCBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSwgVGFibGVTaXplRW51bX0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdHlwZXMnO1xuaW1wb3J0IHtNbmdDb21wb25lbnREaXJlY3RpdmUsIE1uZ1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7SVZpZXdDb250YWluZXJ9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ0NsYXNzTWFwUGlwZSwgTW5nSTE4blByb3BlcnR5UGlwZSwgTW5nTG9jYWxlRGVmYXVsdFJvd0NsYXNzUGlwZX0gZnJvbSAnLi4vLi4vLi4vcGlwZXMnO1xuaW1wb3J0IHtNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2UsIE1uZ0NvbW1vbnNTZXJ2aWNlLCBNbmdMb2NhbFN0b3JhZ2VTZXJ2aWNlLCBNbmdMb2dnZXJTZXJ2aWNlLCBNbmdWaWV3Q29udGFpbmVyQ29tcG9uZW50U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtTdHlsZXNVdGlsfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMnO1xuaW1wb3J0IHtFcnJvclV0aWwsIE5vdGlmaWNhdGlvblV0aWx9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7VGFibGV2aWV3VXRpbH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdGFibGV2aWV3LnV0aWwnO1xuaW1wb3J0IHtNbmdBY3Rpb25Db21wb25lbnR9IGZyb20gJy4uLy4uL2FjdGlvbic7XG5pbXBvcnQge0FjdGlvbkluc3RhbmNlLCBBY3Rpb25QYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7TW5nVGFibGVDZWxsQ2xpY2tFdmVudCwgTW5nVGFibGVMb2FkRXZlbnR9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge01uZ1RhYmxlQ29sdW1uRmlsdGVyQ29tcG9uZW50fSBmcm9tICcuL2NvbHVtbi1maWx0ZXIvY29sdW1uLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHtNbmdUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50fSBmcm9tICcuL2NvbHVtbi12YWx1ZS9jb2x1bW4tdmFsdWUuY29tcG9uZW50JztcbmltcG9ydCB7Q29sdW1uV2l0aFByZWZlcmVuY2VzLCBUYWJsZUxheW91dFByZWZlcmVuY2VzfSBmcm9tICcuL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIFRhYmxlTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIE1uZ0NvbXBvbmVudERpcmVjdGl2ZSxcbiAgICAgICAgTW5nSTE4blByb3BlcnR5UGlwZSxcbiAgICAgICAgTmdGb3JPZixcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgTmdTdHlsZSxcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgTW5nVGFibGVDb2x1bW5GaWx0ZXJDb21wb25lbnQsXG4gICAgICAgIE1uZ0NsYXNzTWFwUGlwZSxcbiAgICAgICAgTW5nTG9jYWxlRGVmYXVsdFJvd0NsYXNzUGlwZSxcbiAgICAgICAgTW5nVGFibGVDb2x1bW5WYWx1ZUNvbXBvbmVudCxcbiAgICAgICAgTW5nQWN0aW9uQ29tcG9uZW50LFxuICAgICAgICBTa2VsZXRvbk1vZHVsZSxcbiAgICAgICAgTXVsdGlTZWxlY3RNb2R1bGUsXG4gICAgICAgIEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgVG9vbHRpcE1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGVcbiAgICBdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ1RhYmxlQ29tcG9uZW50PFQsIFM+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpbHRlckRpc3BsYXlSb3c6IFRhYmxlRmlsdGVyRGlzcGxheUVudW0gPSBUYWJsZUZpbHRlckRpc3BsYXlFbnVtLlJvdztcbiAgICBwdWJsaWMgcmVhZG9ubHkgY21wVHlwZU5hbWUgPSAnTW5nVGFibGVDb21wb25lbnQnO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoTW5nTG9nZ2VyU2VydmljZSkuY3JlYXRlKHRoaXMuY21wVHlwZU5hbWUpO1xuXG4gICAgLy8gbWV0YWRhdGEgaW5wdXRcbiAgICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlLCBhbGlhczogJ2Rlc2NyaXB0b3InfSkgcHVibGljIGluaXRpYWxEZXNjcmlwdG9yITogVGFibGVEZXNjcmlwdG9yPFQ+O1xuICAgIHB1YmxpYyBkZXNjcmlwdG9yPzogVGFibGVEZXNjcmlwdG9yPFQ+O1xuXG4gICAgLy8gZGF0YSBzb3VyY2UgaW5wdXRzXG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zPzogT2JzZXJ2YWJsZTxBcnJheTxUPj4gfCBBcnJheTxUPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgcXVlcnlSZXN1bHQ/OiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PiB8IE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nPzogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1c2VRdWVyeVBhcmFtcyA9IGZhbHNlO1xuXG4gICAgLy8gZXh0cmEgZmVhdHVyZXMgaW5wdXRcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScgfCAnbXVsdGlwbGUnID0gJ211bHRpcGxlJztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgLy8gYWN0aW9uc1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25zOiBBcnJheTxBY3Rpb25EZXNjcmlwdG9yPFQ+PiA9IFtdO1xuXG4gICAgLy8gdmlzdWFsXG4gICAgQElucHV0KCkgcHVibGljIGlzQ29sdW1uQ2xpY2thYmxlPzogYm9vbGVhbjtcblxuICAgIC8vIGNvbXBvbmVudCBpbnB1dHNcbiAgICBASW5wdXQoJ3ZpZXdDb250YWluZXInKSBwdWJsaWMgdmlld0NvbnRhaW5lckluaXQ/OiBJVmlld0NvbnRhaW5lcjxULCBTPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FwdGlvbkNvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY29sdW1uQWN0aW9uQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5BY3Rpb25NaW5XaWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCdnbG9iYWxGaWx0ZXJGaWVsZHMnKSBwdWJsaWMgZ2xvYmFsRmlsdGVyRmllbGRzSW5pdD86IHN0cmluZ1tdO1xuXG4gICAgLy8gZXZlbnQgb3V0cHV0c1xuICAgIEBPdXRwdXQoJ3RhYmxlTG9hZCcpIHB1YmxpYyBsb2FkRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdUYWJsZUxvYWRFdmVudD4oKTtcbiAgICBAT3V0cHV0KCdjZWxsQ2xpY2snKSBwdWJsaWMgY2VsbENsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdUYWJsZUNlbGxDbGlja0V2ZW50PFQ+PigpO1xuICAgIEBPdXRwdXQoJ3NlbGVjdGlvbkNoYW5nZScpIHB1YmxpYyBzZWxlY3Rpb25DaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFQ+PigpO1xuICAgIEBPdXRwdXQoJ2NhcHRpb25Db21wb25lbnRJbnN0YW5jZScpIHB1YmxpYyBjYXB0aW9uQ21wSW5zdEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoJ2NvbHVtbkFjdGlvbkNvbXBvbmVudEluc3RhbmNlJykgcHVibGljIGNvbHVtbkFjdGlvbkNtcEluc3RFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8vIGNvbnRlbnQgYW5kIHZpZXcgcXVlcmllc1xuICAgIEBDb250ZW50Q2hpbGRyZW4oTW5nVGVtcGxhdGVEaXJlY3RpdmUpIHB1YmxpYyB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8TW5nVGVtcGxhdGVEaXJlY3RpdmU+O1xuICAgIEBWaWV3Q2hpbGRyZW4oTW5nQ29tcG9uZW50RGlyZWN0aXZlKSBwdWJsaWMgY29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxNbmdDb21wb25lbnREaXJlY3RpdmU8YW55Pj47XG4gICAgQFZpZXdDaGlsZChUYWJsZSkgcHVibGljIHByaW1lVGFibGUhOiBUYWJsZTtcblxuICAgIC8vIHRlbXBsYXRlc1xuICAgIHB1YmxpYyBjYXB0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIHB1YmxpYyBjb2x1bW5BY3Rpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgcHVibGljIGZvb3RlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8vIGRhdGEgcHJvdmlkZXIgYW5kIGl0ZW1zXG4gICAgcHVibGljIGlzTGF6eSA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc1BhZ2luYXRpb24gPSBmYWxzZTtcbiAgICBwcml2YXRlIHVzZURhdGFQcm92aWRlciA9IGZhbHNlO1xuICAgIHByaXZhdGUgdXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZFN1YmVqY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBwdWJsaWMgdXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZCQgPSB0aGlzLnVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWRTdWJlamN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBxdWVyeVJlc3VsdCQ/OiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PjtcbiAgICBwdWJsaWMgbG9hZGluZyQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHB1YmxpYyBkYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zOiBBcnJheTxUPiA9IFtdO1xuICAgIHByaXZhdGUgaXRlbXNTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8QXJyYXk8VD4+KDEpO1xuXG4gICAgcHJpdmF0ZSBxdWVyeVJlc3VsdFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIC8vIHBhZ2luYXRpb24sIHNvcnQgYW5kIGZpbHRlcnNcbiAgICBwdWJsaWMgcm93c1BlclBhZ2VPcHRpb25zITogQXJyYXk8bnVtYmVyPjtcbiAgICBwdWJsaWMgcm93cyE6IG51bWJlcjtcbiAgICBwdWJsaWMgb2Zmc2V0ID0gMDtcbiAgICBwdWJsaWMgbXVsdGlTb3J0TWV0YTogU29ydE1ldGFbXSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBmaWx0ZXJNZXRhZGF0YToge1tzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YX0gPSB7fTtcbiAgICBwdWJsaWMgZ2xvYmFsRmlsdGVyRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gaW5maW5pdGUgc2Nyb2xsXG4gICAgcHVibGljIGluZmluaXRlU2Nyb2xsID0gZmFsc2U7XG5cbiAgICAvLyB2aXN1YWxcbiAgICBwdWJsaWMgY2xhc3NOYW1lITogc3RyaW5nO1xuICAgIHB1YmxpYyB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByb3dIZWlnaHQ/OiBudW1iZXI7XG5cbiAgICAvLyBzZWxlY3Rpb25cbiAgICBwdWJsaWMgc2VsZWN0aW9uOiBBcnJheTxUPiA9IFtdO1xuXG4gICAgLy8gZGF0YSBwcm92aWRlclxuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU2VydmljZTogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PigxKTtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50PzogVGFibGVMYXp5TG9hZEV2ZW50O1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24gPSAwO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbT86IE1lZGl1c1F1ZXJ5UGFyYW07XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtVmVyc2lvbiA9IDA7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgICAvLyBmaWx0ZXIsIHNvcnRcbiAgICBwdWJsaWMgaGFzQ29sdW1uRmlsdGVycyA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNGaWx0ZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc1NvcnRDaGFuZ2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBmaWx0ZXJEZXNjcmlwdG9yczogQXJyYXk8RmlsdGVyRGVzY3JpcHRvcjxhbnk+PiA9IFtdO1xuXG4gICAgLy8gYWN0aW9uc1xuICAgIHB1YmxpYyBzaG93SW5saW5lQWN0aW9uc0NvbHVtbiA9IGZhbHNlO1xuICAgIHB1YmxpYyByb3dDbGlja0FjdGlvbnM6IEFjdGlvbkRlc2NyaXB0b3I8VD5bXSA9IFtdO1xuICAgIHB1YmxpYyByb3dJbmxpbmVBY3Rpb25zOiBBY3Rpb25EZXNjcmlwdG9yPFQ+W10gPSBbXTtcblxuICAgIC8vIG90aGVyXG4gICAgcHJpdmF0ZSByb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3Q29udGFpbmVyPzogSVZpZXdDb250YWluZXI8VCwgUz47XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICAgIHB1YmxpYyBhcmVDb2x1bW5zUmVvcmRlcmFibGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgYXJlQ29sdW1uc1RvZ2dsZWFibGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgY29sdW1uczogQ29sdW1uV2l0aFByZWZlcmVuY2VzW10gPSBbXTtcbiAgICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IENvbHVtbldpdGhQcmVmZXJlbmNlc1tdID0gW107XG4gICAgcHJpdmF0ZSBsYXlvdXRQcmVmZXJlbmNlczogVGFibGVMYXlvdXRQcmVmZXJlbmNlcyA9IHtjb2x1bW5XaWR0aHM6IHt9fTtcbiAgICBwcml2YXRlIGxvY2Fsc3RvcmFnZUtleSA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW5nQ29tbW9uc1NlcnZpY2U6IE1uZ0NvbW1vbnNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFjdGlvbkV4ZWN1dG9yOiBNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdmlld0NvbnRhaW5lclNlcnZpY2U6IE1uZ1ZpZXdDb250YWluZXJDb21wb25lbnRTZXJ2aWNlPFQsIFM+IHwgbnVsbCxcbiAgICAgICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBNbmdMb2NhbFN0b3JhZ2VTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3Q29udGFpbmVyKCk7XG4gICAgICAgIC8vIFVzZWQgZm9yIGNvbmZpZ3Mgd2l0aGluIHRoaXMgbWV0aG9kIGFuZCBpcyBub3QgZHluYW1pY2FsbHkgc2V0IGJ5IFRhYmxlRHluYW1pY0Rlc2NyaXB0b3JcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZ0Rlc2NyaXB0b3IgPSB0aGlzLmluaXRpYWxEZXNjcmlwdG9yO1xuXG4gICAgICAgIGlmICghKHRoaXMuaW5pdGlhbERlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9yKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRNYWluQW5kUmVsYXRlZERlc2NyaXB0b3JzKHRoaXMuaW5pdGlhbERlc2NyaXB0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWFwIHJvdyBzZXR0aW5nc1xuICAgICAgICB0aGlzLnJvd3MgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8uZGVmYXVsdE51bVJvd3MgPz8gMjU7XG4gICAgICAgIHRoaXMucm93c1BlclBhZ2VPcHRpb25zID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnJvd3NQZXJQYWdlT3B0aW9ucyA/PyBbMjUsIDUwLCAxMDBdO1xuXG4gICAgICAgIC8vIHByb2Nlc3MgYWN0aW9uc1xuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmFjdGlvbnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25Qb3NpdGlvbkVudW0uUm93Q2xpY2s6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93Q2xpY2tBY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25Qb3NpdGlvbkVudW0uUm93SW5saW5lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0lubGluZUFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID0gdHlwZW9mIHRoaXMuY29sdW1uQWN0aW9uQ29tcG9uZW50ICE9PSAndW5kZWZpbmVkJyB8fCB0aGlzLnJvd0lubGluZUFjdGlvbnMubGVuZ3RoID4gMDtcblxuICAgICAgICAvLyBkZWZpbmUgYWxsIHN0eWxlc1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5jbGFzc05hbWUgPz8gJyc7XG4gICAgICAgIHRoaXMudGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnRhYmxlRnVsbEhlaWdodE9mZnNldCA/PyBudWxsO1xuICAgICAgICB0aGlzLnJvd0hlaWdodCA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5yb3dIZWlnaHQ7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0NvbHVtbkNsaWNrYWJsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZSBpZiBjZWxsIGNsaWNrIGlzIGJlaW5nIG9ic2VydmVkIHZpYSBvdXRwdXRcbiAgICAgICAgICAgIHRoaXMuaXNDb2x1bW5DbGlja2FibGUgPSB0aGlzLnJvd0NsaWNrQWN0aW9ucy5sZW5ndGggPiAwIHx8IHRoaXMuY2VsbENsaWNrRXZlbnRFbWl0dGVyLm9ic2VydmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnNpemUpIHtcbiAgICAgICAgICAgIGNhc2UgVGFibGVTaXplRW51bS5TbWFsbDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSArPSAnIHAtZGF0YXRhYmxlLXNtJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVGFibGVTaXplRW51bS5MYXJnZTpcbiAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSArPSAnIHAtZGF0YXRhYmxlLWxnJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/Lmhhc0dyaWRsaW5lcykge1xuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1ncmlkbGluZXMnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlQ29uZmlnRGVzY3JpcHRvciAmJiAhdGhpcy5jb2x1bW5BY3Rpb25NaW5XaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5BY3Rpb25NaW5XaWR0aCA9IFN0eWxlc1V0aWwuY2FsY3VsYXRlVGFibGVDb2x1bW5BY3Rpb25XaWR0aChcbiAgICAgICAgICAgICAgICBiYXNlQ29uZmlnRGVzY3JpcHRvciBhcyBUYWJsZURlc2NyaXB0b3I8dW5rbm93bj4sXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dJbmxpbmVBY3Rpb25zIGFzIEFycmF5PEFjdGlvbkRlc2NyaXB0b3I8dW5rbm93bj4+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaW5maW5pdGUgc2Nyb2xsXG4gICAgICAgIGxldCBwYWdpbmF0aW9uTW9kZSA9IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLk5vbmU7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnBhZ2luYXRpb25Nb2RlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gZGVzY3JpcHRvciBjaG9pY2UgaXMgdGhlIG1vc3Qgc3Ryb25nIC0gaWYgZGVmaW5lZCwgdXNlIHRoaXMgdmFsdWVcbiAgICAgICAgICAgIHBhZ2luYXRpb25Nb2RlID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3IucGFnaW5hdGlvbk1vZGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZGF0YVByb3ZpZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gd2hlbiBkYXRhIHByb3ZpZGVyIGlzIHVzZWQsIHVzZSBwYWdpbmF0aW9uXG4gICAgICAgICAgICBwYWdpbmF0aW9uTW9kZSA9IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLlBhZ2luYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnaW5hdGlvbk1vZGUgPT09IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLkluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLmluZmluaXRlU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnRhYmxlRnVsbEhlaWdodE9mZnNldCA/PyAzMTU7XG4gICAgICAgICAgICB0aGlzLnJvd0hlaWdodCA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5yb3dIZWlnaHQgPz8gNDU7XG4gICAgICAgICAgICB0aGlzLnVzZVF1ZXJ5UGFyYW1zID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAocGFnaW5hdGlvbk1vZGUgPT09IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLlBhZ2luYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaXNQYWdpbmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGRhdGEgcHJvdmlkZXIgaXMgc3VwcGxpZWQsIGlmIGlzLCB1c2UgaXQgcHJpbWFyaWx5XG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgLy8gbWFwIHN1YmplY3RzIHRvIG9ic2VydmFibGVzIGFuZCBpbml0aWF0ZSBkYXRhXG4gICAgICAgICAgICB0aGlzLnVzZURhdGFQcm92aWRlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzTGF6eSA9IHRoaXMuZGF0YVByb3ZpZGVyLmlzTGF6eTtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5UXVlcnlSZXN1bHQgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQucGFnZURhdGEgPSBbXTtcbiAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdC5uZXh0KGVtcHR5UXVlcnlSZXN1bHQpO1xuXG4gICAgICAgICAgICAvLyBpbmplY3Qgc2VydmljZVxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQ8YW55Pih0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbG9hZFN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVByb3ZpZGVyLmdldEFsbFJlbG9hZCQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChyZWxvYWRTdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcXVlcnkgcmVzdWx0IGlzIHByb3ZpZGVkLCB1c2UgaXQgYXMgc2Vjb25kYXJ5IHNvdXJjZSBvciBlbHNlIHRyeSB0byB1c2UgaXRlbXNcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJlc3VsdCQgPSB0aGlzLnF1ZXJ5UmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMucXVlcnlSZXN1bHQgOiBvZih0aGlzLnF1ZXJ5UmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJlc3VsdCQgPSAoaXNPYnNlcnZhYmxlKHRoaXMuaXRlbXMpID8gdGhpcy5pdGVtcyA6IHRoaXMuaXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAvLyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgodjEsIHYyKSA9PiB2MS5sZW5ndGggPT09IHYyLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdjEuZXZlcnkoKHYxaSwgaWR4KSA9PiB2MWlbdGhpcy5kZXNjcmlwdG9yLmRhdGFLZXlQcm9wZXJ0eV0gPT09IHYyW2lkeF1bdGhpcy5kZXNjcmlwdG9yLmRhdGFLZXlQcm9wZXJ0eV0pKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gbmV3IE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdC5wYWdlRGF0YSA9IGl0ZW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc09ic2VydmFibGUodGhpcy5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc1N1YmplY3QubmV4dCh0aGlzLml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMubG9hZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5sb2FkaW5nIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMubG9hZGluZyA6IG9mKHRoaXMubG9hZGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgY29uc3Qgcm93UGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgncm93cycpO1xuICAgICAgICAgICAgY29uc3Qgcm93cyA9IHJvd1BhcmFtcyA/IHBhcnNlSW50KHJvd1BhcmFtcykgOiB0aGlzLnJvd3M7XG5cbiAgICAgICAgICAgIGNvbnN0IG1lZGl1c1F1ZXJ5UGFyYW0gPSBNZWRpdXNSZXN0VXRpbC5nZXQoKS5mcm9tQW5ndWxhclF1ZXJ5UGFyYW1zVG9NZWRpdXNRdWVyeVBhcmFtcyh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLCB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLCB0aGlzLnJvd3MpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IExhenlMb2FkRXZlbnQgPSB7fTtcbiAgICAgICAgICAgIGV2ZW50Lm11bHRpU29ydE1ldGEgPSB0aGlzLmNyZWF0ZVNvcnRNZXRhKG1lZGl1c1F1ZXJ5UGFyYW0pID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGV2ZW50LmZpbHRlcnMgPSB0aGlzLmNyZWF0ZUZpbHRlck1ldGEobWVkaXVzUXVlcnlQYXJhbSk7XG4gICAgICAgICAgICBldmVudC5yb3dzID0gcm93cztcblxuICAgICAgICAgICAgLy8gZmlyc3QgbmF2aWdhdGUgdG8gY29ycmVjdCB1cmwgd2l0aCBkZWZhdWx0IGZpbHRlcnMvc29ydHNcbiAgICAgICAgICAgIHRoaXMucm91dGVyXG4gICAgICAgICAgICAgICAgLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBNZWRpdXNSZXN0VXRpbC5nZXQoKS5mcm9tUHJpbWVMYXp5TG9hZEV2ZW50VG9Bbmd1bGFyUXVlcnlQYXJhbXMoZXZlbnQpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMb2FkaW5nVHJpZ2dlcnMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMb2FkaW5nVHJpZ2dlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0U3Vic2NyaXB0aW9uID0gdGhpcy5xdWVyeVJlc3VsdCQuc3Vic2NyaWJlKGUgPT4gKHRoaXMucXVlcnlSZXN1bHQgPSBlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRlbXBsYXRlLmdldFR5cGUoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb25UZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjb2x1bW5BY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkFjdGlvblRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93SW5saW5lQWN0aW9uc0NvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93SW5saW5lQWN0aW9uc0NvbHVtbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb290ZXJUZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSAmJiAhY2hhbmdlc1snaXRlbXMnXS5maXJzdENoYW5nZSAmJiBBcnJheS5pc0FycmF5KGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1N1YmplY3QubmV4dChjaGFuZ2VzWydpdGVtcyddLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1sndmlld0NvbnRhaW5lckluaXQnXSAmJiAhY2hhbmdlc1sndmlld0NvbnRhaW5lckluaXQnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplVmlld0NvbnRhaW5lcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzSW5pdCkge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMgPSB0aGlzLmdsb2JhbEZpbHRlckZpZWxkc0luaXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcyA9ICh0aGlzLmRlc2NyaXB0b3IgfHwgdGhpcy5pbml0aWFsRGVzY3JpcHRvcikuY29sdW1ucy5tYXAoKGVsOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4pID0+IGVsLnByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMucXVlcnlSZXN1bHRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkKGVtaXRFdmVudCA9IGZhbHNlLCByZXNldFBhcmFtcyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zQnVpbGRlciA9IHJlc2V0UGFyYW1zXG4gICAgICAgICAgICA/IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSh0aGlzLnJvd3MsIDApXG4gICAgICAgICAgICA6IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZUZyb21FeGlzdGluZyh0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW0gPz8gbmV3IE1lZGl1c1F1ZXJ5UGFyYW0oKSlcbiAgICAgICAgICAgICAgICAgIC53aXRoSXRlbXNQZXJQYWdlKHRoaXMucm93cylcbiAgICAgICAgICAgICAgICAgIC53aXRoSXRlbXNPZmZzZXQodGhpcy5vZmZzZXQpO1xuXG4gICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihxdWVyeVBhcmFtc0J1aWxkZXIuYnVpbGQoKSwgZW1pdEV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UYWJsZUxhenlMb2FkKGV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24rKztcblxuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgaWYgKCFldmVudC5tdWx0aVNvcnRNZXRhIHx8IGV2ZW50Lm11bHRpU29ydE1ldGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGRlZmF1bHQgc29ydCBtZXRhIHRvIGV2ZW50IGlmIG5vdCBtdWx0aXNvcnQgbWV0YSBpcyBwcmVzZW50XG4gICAgICAgICAgICAgICAgZXZlbnQubXVsdGlTb3J0TWV0YSA9IHRoaXMuY3JlYXRlU29ydE1ldGEoKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWV2ZW50LmZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBldmVudC5maWx0ZXJzID0gdGhpcy5jcmVhdGVGaWx0ZXJNZXRhKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5yb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgaXMgbmVjZXNzYXJ5OiBmcm9tIHNvbWUgcmVhc29uLCBwcmltZU5HIGNvbW1pdHMgb25lIGxhc3QgbGF6eSBsb2FkIGV2ZW50IHdoZW5ldmVyIGFueSBhbmd1bGFyIHJvdXRlciBuYXZpZ2F0aW9uIG9jY3Vyc1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBNZWRpdXNSZXN0VXRpbC5nZXQoKS5mcm9tUHJpbWVMYXp5TG9hZEV2ZW50VG9Bbmd1bGFyUXVlcnlQYXJhbXMoZXZlbnQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpdXNRdWVyeVBhcmFtcyA9IGV2ZW50ID8gTWVkaXVzUmVzdFV0aWwuZ2V0KCkuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvTWVkaXVzUXVlcnlQYXJhbXMoZXZlbnQpIDogbmV3IE1lZGl1c1F1ZXJ5UGFyYW0oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihtZWRpdXNRdWVyeVBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uVGFibGVTb3J0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5pc1NvcnRDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uVGFibGVGaWx0ZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmlzRmlsdGVyQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2VsbENsaWNrKGV2ZW50OiBFdmVudCwgY29sOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4sIGl0ZW06IFQsIGlkeDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG1uZ0V2ZW50ID0gbmV3IE1uZ1RhYmxlQ2VsbENsaWNrRXZlbnQ8VD4oY29sLCBpdGVtLCBpZHgpO1xuICAgICAgICB0aGlzLmNlbGxDbGlja0V2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMucm93Q2xpY2tBY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5yb3dDbGlja0FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZFByb3AgPSB0aGlzLmRlc2NyaXB0b3I/LmRhdGFLZXlQcm9wZXJ0eSA/PyBhY3Rpb24/Lm1vZGVsPy5pZFByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IEFjdGlvblBhcmFtZXRlcnMoaWRQcm9wID8gaXRlbVtpZFByb3AgYXMga2V5b2Ygb2JqZWN0XSA6IHVuZGVmaW5lZCwgaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhSb3V0ZSh0aGlzLnJvdXRlKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFZpZXdDb250YWluZXIodGhpcy52aWV3Q29udGFpbmVyKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvdXJjZUNvbXBvbmVudCh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkV4ZWN1dG9yLnRyaWdnZXJBY3Rpb24oYWN0aW9uLCBwYXJhbWV0ZXJzLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblNlbGVjdGlvbkNoYW5nZShldmVudDogQXJyYXk8VD4pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudEVtaXR0ZXIuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2FwdGlvbkNtcEluc3Q8Qz4oaW5zdGFuY2U6IEMpIHtcbiAgICAgICAgdGhpcy5jYXB0aW9uQ21wSW5zdEV2ZW50RW1pdHRlci5uZXh0KGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Db2x1bW5BY3Rpb25DbXBJbnN0PEM+KGluc3RhbmNlOiBDKSB7XG4gICAgICAgIHRoaXMuY29sdW1uQWN0aW9uQ21wSW5zdEV2ZW50RW1pdHRlci5uZXh0KGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25BY3Rpb25GaW5pc2gocnVuUmVzdWx0OiBBY3Rpb25JbnN0YW5jZTxULCBTPikge1xuICAgICAgICBpZiAoIXJ1blJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBpcyBjYWxsZWQgb24gY29sdW1uIHJlc2l6ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IGV2ZW50J3MgZWxlbWVudFxuICAgICAqL1xuICAgIHB1YmxpYyBvblRhYmxlQ29sdW1uUmVzaXplKHtlbGVtZW50fTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWQ6IHN0cmluZyA9IGVsZW1lbnQuaWQ7XG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuXG4gICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sdW1ucy5maW5kKGVsID0+IGVsLmRlc2NyaXB0b3IucHJvcGVydHkgPT09IGZpZWxkSWQpO1xuICAgICAgICBpZiAoY29sKSBjb2wud2lkdGggPSB3aWR0aDtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbldpZHRocykgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMgPSB7fTtcblxuICAgICAgICB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbldpZHRoc1tmaWVsZElkXSA9IHdpZHRoO1xuICAgICAgICB0aGlzLnNhdmVMYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihxdWVyeVBhcmFtOiBNZWRpdXNRdWVyeVBhcmFtIHwgbnVsbCA9IG51bGwsIGVtaXRFdmVudCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZURhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcblxuICAgICAgICBpZiAoIXF1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW0gPSBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGUodGhpcy5yb3dzKS5idWlsZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb24rKztcblxuICAgICAgICBNZWRpdXNSZXN0VXRpbC5nZXQoKS5tb2RpZnlGaWx0ZXJQcm9wZXJ0aWVzKHF1ZXJ5UGFyYW0sIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMpO1xuICAgICAgICBNZWRpdXNSZXN0VXRpbC5nZXQoKS5tb2RpZnlTb3J0UHJvcGVydGllcyhxdWVyeVBhcmFtLCB0aGlzLmRlc2NyaXB0b3I/LmNvbHVtbnMpO1xuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhUHJvdmlkZXJcbiAgICAgICAgICAgID8uZ2V0QWxsKHF1ZXJ5UGFyYW0sIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSwgdGhpcy5kZXNjcmlwdG9yPy5pc0xvY2FsaXplZCA/IHRoaXMubW5nQ29tbW9uc1NlcnZpY2UuYXBwRGF0YUxhbmd1YWdlID8/IHVuZGVmaW5lZCA6IHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxEZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFibGVEeW5hbWljRGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNYWluQW5kUmVsYXRlZERlc2NyaXB0b3JzKHRoaXMuaW5pdGlhbERlc2NyaXB0b3IudG9UYWJsZURlc2NyaXB0b3JGcm9tRGF0YShyZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ZpbHRlckNoYW5nZWQgfHwgdGhpcy5pc1NvcnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXMuc3BsaWNlKHF1ZXJ5UGFyYW0hLml0ZW1zT2Zmc2V0ID8/IDAsIHF1ZXJ5UGFyYW0hLml0ZW1zUGVyUGFnZSA/PyB0aGlzLnJvd3MsIC4uLihyZXMucGFnZURhdGEgPz8gW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA9IFsuLi50aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXNdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTb3J0Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHdoYXQgaGFwcGVucyBvbiBlcnJvciB3aXRoIG5vIG1vZGVsIGluaXNpZGUgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25VdGlsLnRhYmxlTm90aWZpY2F0aW9uRXJyb3IodGhpcy50cmFuc2xhdGUsIHRoaXMuZGVzY3JpcHRvciEsIGVyciwgdGhpcy52aWV3Q29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1wdHlRdWVyeVJlc3VsdCA9IG5ldyBNZWRpdXNRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LnBhZ2VEYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChlbXB0eVF1ZXJ5UmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtbmdFcnJvciA9IEVycm9yVXRpbC5mcm9tU3Vic2NyaWJlRXJyb3IoZXJyLCAnTW5nVGFibGVDb21wb25lbnRFcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW06IHF1ZXJ5UGFyYW1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhtbmdFcnJvciwgRXJyb3JVdGlsLmdldEVycm9yTG9nTGV2ZWwobW5nRXJyb3IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtbmdFdmVudCA9IG5ldyBNbmdUYWJsZUxvYWRFdmVudCgpO1xuICAgICAgICAgICAgbW5nRXZlbnQub3JpZ2luYWxFdmVudCA9IHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudDtcbiAgICAgICAgICAgIG1uZ0V2ZW50LnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtO1xuICAgICAgICAgICAgdGhpcy5sb2FkRXZlbnRFbWl0dGVyLm5leHQobW5nRXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkVGFibGVGcm9tUm91dGVVcGRhdGUocGFyYW1zOiBQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgbWVkaXVzUXVlcnlQYXJhbSA9IE1lZGl1c1Jlc3RVdGlsLmdldCgpLmZyb21Bbmd1bGFyUXVlcnlQYXJhbXNUb01lZGl1c1F1ZXJ5UGFyYW1zKHBhcmFtcywgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycywgdGhpcy5yb3dzKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24gPCB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW1WZXJzaW9uICsgMSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIG9ubHkgaWYgbmV3IHZlcnNpb24gZnJvbSBxdWVyeSBwYXJhbXMgd2lsbCBiZSBoaWdoZXJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZFN1YmVqY3QubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TWFpbkFuZFJlbGF0ZWREZXNjcmlwdG9ycyhkZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycyA9IHRoaXMuZGVzY3JpcHRvcj8uY29sdW1ucy5maWx0ZXIoYyA9PiB0eXBlb2YgYy5maWx0ZXJEZXNjcmlwdG9yICE9PSAndW5kZWZpbmVkJykubWFwKGMgPT4gYy5maWx0ZXJEZXNjcmlwdG9yISkgPz8gW107XG4gICAgICAgIHRoaXMuaGFzQ29sdW1uRmlsdGVycyA9IHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMubGVuZ3RoID4gMDtcblxuICAgICAgICAvLyBnZXQgbGF5b3V0IHByZWZlcmVuY2VzIGlmIHRoZXkgZXhpc3RcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcj8ubW9kZWwudHlwZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxzdG9yYWdlS2V5ID0gVGFibGV2aWV3VXRpbC5nZW5lcmF0ZVRhYmxlTGF5b3V0UHJlZnNLZXkodGhpcy5kZXNjcmlwdG9yPy5tb2RlbC50eXBlTmFtZSwgdGhpcy5yb3V0ZXIudXJsLCB0aGlzLmRlc2NyaXB0b3I/LmRhdGFLZXkpO1xuICAgICAgICAgICAgY29uc3QgcHJlZmVyZW5jZXMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbTxUYWJsZUxheW91dFByZWZlcmVuY2VzPih0aGlzLmNtcFR5cGVOYW1lLCB0aGlzLmxvY2Fsc3RvcmFnZUtleSk7XG4gICAgICAgICAgICBpZiAocHJlZmVyZW5jZXMgJiYgdHlwZW9mIHByZWZlcmVuY2VzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMgPSBwcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VzLmNvbHVtbk9yZGVyICYmIEFycmF5LmlzQXJyYXkocHJlZmVyZW5jZXMuY29sdW1uT3JkZXIpICYmIHByZWZlcmVuY2VzLmNvbHVtbk9yZGVyLmV2ZXJ5KChlbDogYW55KSA9PiB0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbk9yZGVyID0gcHJlZmVyZW5jZXMuY29sdW1uT3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5ICYmIEFycmF5LmlzQXJyYXkocHJlZmVyZW5jZXMuY29sdW1uVmlzaWJpbGl0eSkgJiYgcHJlZmVyZW5jZXMuY29sdW1uVmlzaWJpbGl0eS5ldmVyeSgoZWw6IGFueSkgPT4gdHlwZW9mIGVsID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5ID0gcHJlZmVyZW5jZXMuY29sdW1uVmlzaWJpbGl0eTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbml0aWFsaXplIGNvbHVtbnMgd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcj8uY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcmVDb2x1bW5zUmVvcmRlcmFibGUgPSB0aGlzLmRlc2NyaXB0b3IuY29sdW1ucy5zb21lKHZhbHVlID0+IHZhbHVlLmlzUmVvcmRlcmFibGUpO1xuICAgICAgICAgICAgdGhpcy5hcmVDb2x1bW5zVG9nZ2xlYWJsZSA9IHRoaXMuZGVzY3JpcHRvci5jb2x1bW5zLnNvbWUodmFsdWUgPT4gdmFsdWUuaXNUb2dnbGVhYmxlKTtcblxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kZXNjcmlwdG9yLmNvbHVtbnMubWFwKGNvbCA9PiAoe1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3I6IGNvbCxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWNvbC5pc1RvZ2dsZWFibGUsXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlOiB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtblZpc2liaWxpdHkgPyB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtblZpc2liaWxpdHkuaW5jbHVkZXMoY29sLnByb3BlcnR5KSA6IGNvbC5pc1Zpc2libGUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMuY29sdW1uV2lkdGhzPy5bY29sLnByb3BlcnR5XVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5PcmRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbk9yZGVyOiBDb2x1bW5XaXRoUHJlZmVyZW5jZXNbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29sTmFtZSBvZiB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbk9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29sID0gdGhpcy5jb2x1bW5zLmZpbmQoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSA9PT0gY29sTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uT3JkZXIucHVzaChmb3VuZENvbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3Q29sdW1uT3JkZXIubGVuZ3RoID09PSB0aGlzLmNvbHVtbnMubGVuZ3RoKSB0aGlzLmNvbHVtbnMgPSBuZXdDb2x1bW5PcmRlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoZWwgPT4gZWwuaXNWaXNpYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKG1lZGl1c1F1ZXJ5UGFyYW06IE1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgdGhpcy5tdWx0aVNvcnRNZXRhID0gdGhpcy5jcmVhdGVTb3J0TWV0YShtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgdGhpcy5maWx0ZXJNZXRhZGF0YSA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YShtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgdGhpcy5yb3dzID0gbWVkaXVzUXVlcnlQYXJhbT8uaXRlbXNQZXJQYWdlID8/IHRoaXMucm93cztcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBtZWRpdXNRdWVyeVBhcmFtPy5pdGVtc09mZnNldCA/PyAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRmlsdGVyTWV0YShtZWRpdXNRdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbSkge1xuICAgICAgICBsZXQgcGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICBpZiAoIW1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBtZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWVGaWx0ZXJNZXRhOiB7W3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhfSA9IHt9O1xuICAgICAgICAvLyBpZiBhbnkgZmlsdGVyIGlzIHByZXNlbnQsIG5vIGRlZmF1bHQgZmlsdGVycyBzaG91bGQgYmUgYXBwbGllZCFcbiAgICAgICAgY29uc3QgYXBwbHlEZWZhdWx0RmlsdGVycyA9IChwYXJhbXMuZmlsdGVyUGFyYW1zPy5sZW5ndGggPz8gMCkgPT09IDA7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgbGV0IG1hdGNoTW9kZTtcbiAgICAgICAgICAgIHN3aXRjaCAoZi5maWx0ZXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5DT05UQUlOUztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5EYXRlOlxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuREFURV9JUztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5Mb29rdXA6XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvb2t1cEZpbHRlciA9IGYgYXMgRmlsdGVyTG9va3VwRGVzY3JpcHRvcjxhbnk+O1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9va3VwRmlsdGVyLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuSU47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuRVFVQUxTO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuRVFVQUxTO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGYuZGVmYXVsdEZpbHRlck1hdGNoTW9kZSkge1xuICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IGYuZGVmYXVsdEZpbHRlck1hdGNoTW9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGYubWF0Y2hNb2RlcyAmJiAhZi5tYXRjaE1vZGVzPy5pbmNsdWRlcyhtYXRjaE1vZGUpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gZi5tYXRjaE1vZGVzWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGFwcGx5RGVmYXVsdEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZi5kZWZhdWx0VmFsdWVUbyAmJiBmLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFtmLmRlZmF1bHRWYWx1ZSwgZi5kZWZhdWx0VmFsdWVUb107XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGYuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJpbWVGaWx0ZXJNZXRhW2YucHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IG1hdGNoTW9kZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFyYW1zLmZpbHRlclBhcmFtcz8uZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLmZpbmQoZmQgPT4gZmQuZmlsdGVyUHJvcGVydHkgPT09IGYucHJvcGVydHkgfHwgZmQucHJvcGVydHkgPT09IGYucHJvcGVydHkpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gZi5maWx0ZXJNYXRjaFR5cGUgJiYgZGVzY3JpcHRvciA/IE1lZGl1c1Jlc3RVdGlsLmdldCgpLmdldE1hcHBpbmcoZi5maWx0ZXJNYXRjaFR5cGUsIGRlc2NyaXB0b3IuZmlsdGVyVHlwZSwgMik/LlswXSA6IE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FcXVhbHM7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBtYXRjaE1vZGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyVmFsdWUgPSBmLmZpbHRlclZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkRhdGUgJiYgdHlwZW9mIGZpbHRlclZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbHRlclZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmlsdGVyVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IG5ldyBEYXRlKGZpbHRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiByYW5nZSBpcyBwcm92aWRlZCwgdGFrZSB0aGF0IGludG8gYWNjb3VudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGYuZmlsdGVyVmFsdWVUbyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGYuZmlsdGVyVmFsdWVUbyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlVG8gPSBuZXcgRGF0ZShmLmZpbHRlclZhbHVlVG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBbZmlsdGVyVmFsdWUsIGZpbHRlclZhbHVlVG9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtkZXNjcmlwdG9yLnByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IG1hdGNoTW9kZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJpbWVGaWx0ZXJNZXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU29ydE1ldGEobWVkaXVzUXVlcnlQYXJhbT86IE1lZGl1c1F1ZXJ5UGFyYW0pOiBTb3J0TWV0YVtdIHwgbnVsbCB7XG4gICAgICAgIGxldCBwYXJhbXM6IE1lZGl1c1F1ZXJ5UGFyYW07XG4gICAgICAgIGlmICghbWVkaXVzUXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgcGFyYW1zID0gbmV3IE1lZGl1c1F1ZXJ5UGFyYW0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG1lZGl1c1F1ZXJ5UGFyYW07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc29ydE1ldGE6IFNvcnRNZXRhW107XG4gICAgICAgIGNvbnN0IGFwcGx5RGVmYXVsdFNvcnRzID0gKHBhcmFtcy5zb3J0UHJvcGVydHk/Lmxlbmd0aCA/PyAwKSA9PT0gMDtcblxuICAgICAgICBpZiAoYXBwbHlEZWZhdWx0U29ydHMgJiYgdGhpcy5kZXNjcmlwdG9yPy5oYXNEZWZhdWx0U29ydCkge1xuICAgICAgICAgICAgc29ydE1ldGEgPSB0aGlzLmRlc2NyaXB0b3IuZGVmYXVsdFNvcnRQcm9wZXJ0eS5tYXAoXG4gICAgICAgICAgICAgICAgKHAsIGlkeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgPFNvcnRNZXRhPntcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXI6IHRoaXMuZGVzY3JpcHRvciEuZGVmYXVsdFNvcnRBc2NbaWR4XSA/IDEgOiAtMVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc29ydE1ldGEgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtcy5zb3J0UHJvcGVydHk/LmZvckVhY2goKHMsIGlkeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IHNvcnRNZXRhLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZS5maWVsZCA9PT0gcyk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgc29ydE1ldGFbZXhpc3RpbmdJbmRleF0ub3JkZXIgPSBwYXJhbXMuc29ydEFzYz8uW2lkeF0gPz8gdHJ1ZSA/IDEgOiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc29ydE1ldGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcjogcGFyYW1zLnNvcnRBc2M/LltpZHhdID8/IHRydWUgPyAxIDogLTFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNvcnRNZXRhLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBzb3J0TWV0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEYXRhTG9hZGluZ1RyaWdnZXJzKCkge1xuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgLy8gdHJpZ2dlciB0YWJsZSBsb2FkcyBmcm9tIHJvdXRlIHVwZGF0ZXNcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlUXBTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZShxcCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVGFibGVGcm9tUm91dGVVcGRhdGUocXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByb3V0ZXJFdlN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgJiYgZS51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdICE9PSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25DYW5jZWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcyA9IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHJvdXRlUXBTdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2gocm91dGVyRXZTdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbG9hZCBkYXRhIGltbWVkaWF0ZWx5IGJ5IGNyZWF0aW5nIGRlZmF1bHQgc29ydHMgYW5kIGZpbHRlcnMgKHByaW1lbmcgd2lsbCB0cmlnZ2VyIG9uTGF6eUxvYWQgZXZlbnQgb24gc29ydCZmaWx0ZXIgbWV0YWRhdGEgY2hhbmdlKVxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFNvcnQgPSB0aGlzLmNyZWF0ZVNvcnRNZXRhKCk7XG4gICAgICAgICAgICBpZiAoIWRlZmF1bHRTb3J0IHx8IGRlZmF1bHRTb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBkZWZhdWx0U29ydDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YSgpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlck1ldGFkYXRhID0gZGVmYXVsdEZpbHRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVZpZXdDb250YWluZXIoKSB7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA9IHRoaXMudmlld0NvbnRhaW5lckluaXQgPz8gdGhpcy52aWV3Q29udGFpbmVyU2VydmljZSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29sdW1uVG9nZ2xlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKGV2ZW50Lml0ZW1WYWx1ZSkge1xuICAgICAgICAgICAgZXZlbnQuaXRlbVZhbHVlLmlzVmlzaWJsZSA9ICFldmVudC5pdGVtVmFsdWUuaXNWaXNpYmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgY29sLmlzVmlzaWJsZSA9IGV2ZW50LnZhbHVlLmluY2x1ZGVzKGNvbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5tYXAoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuc2F2ZUxheW91dFByZWZlcmVuY2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGFnYXRlcyB0aGUgY29sdW1uIG1vdmUgZnJvbSB0aGUgdGhpcy52aXNpYmxlQ29sdW1ucyBhcnJheSB0byB0aGlzLmNvbHVtbnMgYXJyYXlcbiAgICAgKiBAcGFyYW0gZXZlbnQ6IE11bHRpU2VsZWN0Q2hhbmdlRXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db2x1bW5SZW9yZGVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy52aXNpYmxlQ29sdW1uc1tldmVudC5kcm9wSW5kZXhdO1xuICAgICAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoZWwgPT4gZWwgPT09IGNvbCk7XG5cbiAgICAgICAgaWYgKGNvbEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoY29sSW5kZXgsIDEpO1xuICAgICAgICAgICAgY29uc3QgZHJvcEluZGV4ID0gZXZlbnQuZHJvcEluZGV4ID4gMCA/IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoZWwgPT4gZWwgPT09IHRoaXMudmlzaWJsZUNvbHVtbnNbZXZlbnQuZHJvcEluZGV4IC0gMV0pICsgMSA6IDA7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zLnNsaWNlKDAsIGRyb3BJbmRleCksIGNvbCwgLi4udGhpcy5jb2x1bW5zLnNsaWNlKGRyb3BJbmRleCldO1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5PcmRlciA9IHRoaXMuY29sdW1ucy5tYXAoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB0aGlzLnNhdmVMYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlTGF5b3V0UHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3I/Lm1vZGVsLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSh0aGlzLmNtcFR5cGVOYW1lLCB0aGlzLmxvY2Fsc3RvcmFnZUtleSwgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBjb2x1bW4gb3JkZXIgYW5kIGNvbHVtbiB2aXNpYmlsaXR5IHRvIGRlZmF1bHQgc2V0dGluZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXREZWZhdWx0TGF5b3V0KCkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRlc2NyaXB0b3IgPyB0aGlzLmRlc2NyaXB0b3IuY29sdW1ucy5tYXAoY29sID0+ICh7ZGVzY3JpcHRvcjogY29sLCBkaXNhYmxlZDogIWNvbC5pc1RvZ2dsZWFibGUsIGlzVmlzaWJsZTogY29sLmlzVmlzaWJsZX0pKSA6IFtdO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihlbCA9PiBlbC5pc1Zpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yPy5tb2RlbC50eXBlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0odGhpcy5jbXBUeXBlTmFtZSwgdGhpcy5sb2NhbHN0b3JhZ2VLZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcyA9IHt9O1xuICAgIH1cbn1cbiIsIjxkaXYgW3N0eWxlLmhlaWdodF09XCJ0YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPyAnY2FsYygxMDB2aCAtICcgKyB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQgKyAncHgpJyA6IG51bGxcIj5cbiAgICA8IS0tIE1VU1QgTk9UIHVzZSBvYnNlcnZhYmxlIGZvciB2YWx1ZSB3aGVuIHVzaW5nIHZpcnR1YWwgc2Nyb2xsIC0gZG9lcyBub3Qgd29yayBmb3Igc29tZSByZWFzb24gLS0+XG4gICAgPHAtdGFibGVcbiAgICAgICAgKm5nSWY9XCIhdXNlUXVlcnlQYXJhbXMgfHwgKHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgW3ZhbHVlXT1cImluZmluaXRlU2Nyb2xsID8gZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA6IChxdWVyeVJlc3VsdCQgfCBhc3luYyk/LnBhZ2VEYXRhID8/IFtdXCJcbiAgICAgICAgW2RhdGFLZXldPVwiZGVzY3JpcHRvcj8uZGF0YUtleVByb3BlcnR5XCJcbiAgICAgICAgW2xhenldPVwiaXNMYXp5XCJcbiAgICAgICAgW2xvYWRpbmddPVwiKGxvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgW3BhZ2luYXRvcl09XCJpc1BhZ2luYXRpb24gJiYgIWluZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgW3Jvd3NdPVwiaW5maW5pdGVTY3JvbGwgPyAyMCA6IHJvd3NcIlxuICAgICAgICBbZmlyc3RdPVwiaW5maW5pdGVTY3JvbGwgPyAwIDogb2Zmc2V0XCJcbiAgICAgICAgW3RvdGFsUmVjb3Jkc109XCIkYW55KGluZmluaXRlU2Nyb2xsID8gbnVsbCA6IChxdWVyeVJlc3VsdCQgfCBhc3luYyk/LmFsbERhdGFDb3VudCA/PyAwKVwiXG4gICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiaW5maW5pdGVTY3JvbGwgPyB1bmRlZmluZWQgOiByb3dzUGVyUGFnZU9wdGlvbnNcIlxuICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cIiFpbmZpbml0ZVNjcm9sbFwiXG4gICAgICAgIFtjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlXT1cIidtbmdUYWJsZS5wYWdpbmF0aW9uTXNnJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFttdWx0aVNvcnRNZXRhXT1cIm11bHRpU29ydE1ldGFcIlxuICAgICAgICBbZmlsdGVyc109XCJmaWx0ZXJNZXRhZGF0YVwiXG4gICAgICAgIFtnbG9iYWxGaWx0ZXJGaWVsZHNdPVwiZ2xvYmFsRmlsdGVyRmllbGRzXCJcbiAgICAgICAgc29ydE1vZGU9XCJtdWx0aXBsZVwiXG4gICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25cIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25FbmFibGVkID8gc2VsZWN0aW9uTW9kZSA6IG51bGxcIlxuICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cInJvd0hlaWdodFwiXG4gICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICBbcm93SG92ZXJdPVwiZGVzY3JpcHRvcj8uaGFzSG92ZXIgPz8gdHJ1ZVwiXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cImNsYXNzTmFtZVwiXG4gICAgICAgIFtyZXNpemFibGVDb2x1bW5zXT1cImRlc2NyaXB0b3I/Lmhhc1Jlc2l6YWJsZUNvbHVtbnMgPz8gZmFsc2VcIlxuICAgICAgICBbY29sdW1uUmVzaXplTW9kZV09XCJkZXNjcmlwdG9yPy5jb2x1bW5SZXNpemVNb2RlID8/ICdmaXQnXCJcbiAgICAgICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJhcmVDb2x1bW5zUmVvcmRlcmFibGVcIlxuICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgIChvbkNvbFJlc2l6ZSk9XCJvblRhYmxlQ29sdW1uUmVzaXplKCRldmVudClcIlxuICAgICAgICAob25Db2xSZW9yZGVyKT1cIm9uQ29sdW1uUmVvcmRlcigkZXZlbnQpXCJcbiAgICAgICAgKG9uTGF6eUxvYWQpPVwib25UYWJsZUxhenlMb2FkKCRldmVudClcIlxuICAgICAgICAob25Tb3J0KT1cIm9uVGFibGVTb3J0KCRldmVudClcIlxuICAgICAgICAob25GaWx0ZXIpPVwib25UYWJsZUZpbHRlcigkZXZlbnQpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZSB8fCBjYXB0aW9uQ29tcG9uZW50IHx8IGRlc2NyaXB0b3I/LnRpdGxlXCIgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZTsgZWxzZSBjb21wb25lbnRPckRlZmF1bHRDYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcHRpb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbXBvbmVudE9yRGVmYXVsdENhcHRpb24+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhcHRpb25Db21wb25lbnQ7IGVsc2UgZGVmYXVsdENhcHRpb25cIiBbbW5nQ29tcG9uZW50XT1cImNhcHRpb25Db21wb25lbnRcIiAoaW5zdGFuY2VDcmVhdGVkKT1cIm9uQ2FwdGlvbkNtcEluc3QoJGV2ZW50KVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENhcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInAtMCBtLTBcIj57eyBkZXNjcmlwdG9yPy50aXRsZSB9fTwvaDU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPHRyICpuZ0lmPVwiIWRlc2NyaXB0b3I/LmhpZGVIZWFkZXJcIiBjbGFzcz1cIm1uZy10YWJsZS1oZWFkZXJcIiBbY2xhc3NdPVwiZGVzY3JpcHRvcj8uaGVhZGVyQ2xhc3NOYW1lXCI+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2VsZWN0aW9uRW5hYmxlZCAmJiBzZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj48L3RoPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNWaXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLmRlc2NyaXB0b3IudGl0bGUgPz8gKGNvbC5kZXNjcmlwdG9yLnByb3BlcnR5IHwgaTE4blByb3BlcnR5IDogZGVzY3JpcHRvciEubW9kZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2wuZGVzY3JpcHRvci50aXRsZSA/PyAoY29sLmRlc2NyaXB0b3IucHJvcGVydHkgfCBpMThuUHJvcGVydHkgOiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5kZXNjcmlwdG9yLmlzUmVvcmRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVvcmRlcmFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCIhY29sLmRlc2NyaXB0b3IuaXNTb3J0RW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/IGNvbC53aWR0aCArICdweCcgOiBjb2wuZGVzY3JpcHRvci53aWR0aCArICclJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlc2NyaXB0b3IuaGVhZGVyQ2xhc3NOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sLmRlc2NyaXB0b3IuaXNTb3J0RW5hYmxlZCA/IHNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZSA6IG5vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5kZXNjcmlwdG9yLmlzUmVvcmRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCIhY29sLmRlc2NyaXB0b3IuaXNTb3J0RW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/IGNvbC53aWR0aCArICdweCcgOiBjb2wuZGVzY3JpcHRvci53aWR0aCArICclJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlc2NyaXB0b3IuaGVhZGVyQ2xhc3NOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sLmRlc2NyaXB0b3IuaXNTb3J0RW5hYmxlZCA/IHNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZSA6IG5vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0lubGluZUFjdGlvbnNDb2x1bW4gfHwgYXJlQ29sdW1uc1RvZ2dsZWFibGUgfHwgYXJlQ29sdW1uc1Jlb3JkZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5BY3Rpb25NaW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJkZXNjcmlwdG9yPy5hY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGFsaWduRnJvemVuPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICNjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhcmVDb2x1bW5zVG9nZ2xlYWJsZSB8fCBhcmVDb2x1bW5zUmVvcmRlcmFibGUgfHwgZGVzY3JpcHRvcj8uaGFzUmVzaXphYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBtbmctdGFibGUtY29sdW1ucy1tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ21uZ1RhYmxlLmFkanVzdFRhYmxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRMYWJlbD1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkljb249XCJwaSBwaS1zbGlkZXJzLWhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlTZWxlY3RlZExhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNvbHVtblRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY2hlY2tib3ggcC1jb21wb25lbnQgbWwtMVwiIFtuZ0NsYXNzXT1cInsncC1jaGVja2JveC1kaXNhYmxlZCc6ICFhcmVDb2x1bW5zVG9nZ2xlYWJsZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaGlkZGVuLWFjY2Vzc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsQ2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0Lm9uSGVhZGVyQ2hlY2tib3hGb2N1cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5vbkhlYWRlckNoZWNrYm94Qmx1cigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC50b2dnbGVBbGwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhcmVDb2x1bW5zVG9nZ2xlYWJsZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtY2hlY2tib3gtYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsQ2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AtaGlnaGxpZ2h0JzogY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsQ2hlY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncC1mb2N1cyc6IGNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LmhlYWRlckNoZWNrYm94Rm9jdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AtZGlzYWJsZWQnOiAhYXJlQ29sdW1uc1RvZ2dsZWFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LnRvZ2dsZUFsbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY2hlY2tib3gtaWNvblwiIFtuZ0NsYXNzXT1cInsncGkgcGktY2hlY2snOiBjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5hbGxDaGVja2VkfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1yZXBsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidtbmdUYWJsZS5yZXNldExheW91dCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RGVmYXVsdExheW91dCgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGVzY3JpcHRvci50aXRsZSA/PyAoaXRlbS5kZXNjcmlwdG9yLnByb3BlcnR5IHwgaTE4blByb3BlcnR5IDogZGVzY3JpcHRvciEubW9kZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJkZXNjcmlwdG9yPy5maWx0ZXJEaXNwbGF5ID09PSBmaWx0ZXJEaXNwbGF5Um93ICYmIGhhc0NvbHVtbkZpbHRlcnNcIiBjbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj48L3RoPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaXNWaXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvciA/ICdtbmctY29sdW1uLWZpbHRlci0nICsgY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvci5maWx0ZXJUeXBlICsgJyAnIDogJyAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvcj8uY29sdW1uQ2xhc3NOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvcj8uY29sdW1uV2lkdGggPz8gY29sLmRlc2NyaXB0b3Iud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yPy5jb2x1bW5NaW5XaWR0aCA/PyBjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC5kZXNjcmlwdG9yLm1heFdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiICpuZ0lmPVwiY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLWZpbHRlciBbZGlzcGxheV09XCJkZXNjcmlwdG9yIS5maWx0ZXJEaXNwbGF5XCIgW2Rlc2NyaXB0b3JdPVwiY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvclwiPjwvbW5nLXRhYmxlLWNvbHVtbi1maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93SW5saW5lQWN0aW9uc0NvbHVtbiB8fCBhcmVDb2x1bW5zVG9nZ2xlYWJsZSB8fCBhcmVDb2x1bW5zUmVvcmRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImRlc2NyaXB0b3I/LmFjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25Gcm96ZW49XCJyaWdodFwiPjwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWlkeD1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInJvd0hlaWdodFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZGVzY3JpcHRvcj8ucm93Q2xhc3NOYW1lIHwgbW5nQ2xhc3NNYXBQaXBlIDogZGVzY3JpcHRvcj8ucm93Q2xhc3NOYW1lTWFwRm4gOiBpdGVtIHwgbW5nTG9jYWxlRGVmYXVsdFJvd0NsYXNzIDogZGVzY3JpcHRvciA6IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZSdcIiBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJkZXNjcmlwdG9yPy5zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVSYWRpb0J1dHRvbiBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZVJhZGlvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5pc1Zpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKCRldmVudCwgY29sLmRlc2NyaXB0b3IsIGl0ZW0sIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5kZXNjcmlwdG9yLmNsYXNzTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJyBtbmctY29sdW1uLWZpbHRlci0nICsgY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvci5maWx0ZXJUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJycpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmNsaWNrYWJsZV09XCJpc0NvbHVtbkNsaWNrYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoID8gY29sLndpZHRoICsgJ3B4JyA6IGNvbC5kZXNjcmlwdG9yLndpZHRoICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLmRlc2NyaXB0b3IubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wuZGVzY3JpcHRvci50aXRsZSA/PyAoY29sLmRlc2NyaXB0b3IucHJvcGVydHkgfCBpMThuUHJvcGVydHkgOiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bW5nLXRhYmxlLWNvbHVtbi12YWx1ZSBbZGVzY3JpcHRvcl09XCJjb2wuZGVzY3JpcHRvclwiIFtpdGVtXT1cIml0ZW1cIj48L21uZy10YWJsZS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0lubGluZUFjdGlvbnNDb2x1bW4gfHwgYXJlQ29sdW1uc1RvZ2dsZWFibGUgfHwgYXJlQ29sdW1uc1Jlb3JkZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2x1bW4tYWN0aW9uIGp1c3RpZnktY29udGVudC1lbmQgdGV4dC1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sdW1uQWN0aW9uTWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uYWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICBhbGlnbkZyb3plbj1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZTsgZWxzZSBzaG93Q29sdW1uQWN0aW9uQ29tcG9uZW50T3JEZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uQWN0aW9uVGVtcGxhdGU7IGNvbnRleHQ6IHtyb3dJdGVtOiBpdGVtLCByb3dJbmRleDogaWR4fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93Q29sdW1uQWN0aW9uQ29tcG9uZW50T3JEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbkFjdGlvbkNvbXBvbmVudDsgZWxzZSBkZWZhdWx0Q29sdW1uQWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21uZ0NvbXBvbmVudF09XCJjb2x1bW5BY3Rpb25Db21wb25lbnQhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zdGFuY2VDcmVhdGVkKT1cIm9uQ29sdW1uQWN0aW9uQ21wSW5zdCgkZXZlbnQpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb2x1bW5BY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHJvd0lubGluZUFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25dPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld0NvbnRhaW5lcl09XCJ2aWV3Q29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaG9zdENvbXBvbmVudF09XCJ0aGlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbUlkXT1cImRlc2NyaXB0b3I/Lm1vZGVsPy5pZFByb3BlcnR5TmFtZSA/IGl0ZW1bZGVzY3JpcHRvciEubW9kZWwhLmlkUHJvcGVydHlOYW1lIV0gOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7aXRlbUluZGV4OiBpZHh9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoKT1cIm9uQWN0aW9uRmluaXNoKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbW5nLWFjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2ljb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCIndGV4dC13aGl0ZSB0ZXh0LTR4bCBwaS1zcGluICcgKyBkZXNjcmlwdG9yPy5sb2FkaW5nSWNvblwiICpuZ0lmPVwiZGVzY3JpcHRvcj8ubG9hZGluZ0ljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgdGV4dC13aGl0ZSB0ZXh0LWxnIGZvbnQtc2VtaWJvbGRcIiBbbmdDbGFzc109XCJ7J210LTMnOiBkZXNjcmlwdG9yPy5sb2FkaW5nSWNvbn1cIiAqbmdJZj1cImRlc2NyaXB0b3I/LmxvYWRpbmdUZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGRlc2NyaXB0b3I/LmxvYWRpbmdUZXh0ID8/ICcnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2JvZHlcIj5cbiAgICAgICAgICAgIDx0ciBbc3R5bGUuaGVpZ2h0LnB4XT1cInJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cIihkZXNjcmlwdG9yPy5jb2x1bW5zPy5sZW5ndGggPz8gMCkgKyAoc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gPyAxIDogMCkgKyAoc2VsZWN0aW9uRW5hYmxlZCA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIFtuZ1N0eWxlXT1cInt3aWR0aDogJzEwMCUnfVwiPjwvcC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgICAgICAgICA8dHIgW3N0eWxlLmhlaWdodC5weF09XCJyb3dIZWlnaHRcIj5cbiAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCIoZGVzY3JpcHRvcj8uY29sdW1ucz8ubGVuZ3RoID8/IDApICsgKHNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID8gMSA6IDApICsgKHNlbGVjdGlvbkVuYWJsZWQgPyAxIDogMClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21uZ1RhYmxlLm5vSXRlbXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiZm9vdGVyVGVtcGxhdGVcIiBwVGVtcGxhdGU9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZvb3RlclRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntxdWVyeVJlc3VsdDogcXVlcnlSZXN1bHR9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9wLXRhYmxlPlxuPC9kaXY+XG4iXX0=
749
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3RhYmxldmlldy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGFibGV2aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0YsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUdULElBQUksRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBVSxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVsSSxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVBQWUsRUFBMEMsTUFBTSxhQUFhLENBQUM7QUFDckYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsS0FBSyxFQUFzQixXQUFXLEVB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LEtBQUssRUFBRSxZQUFZLEVBQUM7Z0JBSTVCLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFHVSxhQUFhO3NCQUE1QixLQUFLO2dCQUNVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFHVSxPQUFPO3NCQUF0QixLQUFLO2dCQUdVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFHeUIsaUJBQWlCO3NCQUEvQyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ04sZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQzhCLHNCQUFzQjtzQkFBekQsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBR0MsZ0JBQWdCO3NCQUEzQyxNQUFNO3VCQUFDLFdBQVc7Z0JBQ1MscUJBQXFCO3NCQUFoRCxNQUFNO3VCQUFDLFdBQVc7Z0JBQ2UsMkJBQTJCO3NCQUE1RCxNQUFNO3VCQUFDLGlCQUFpQjtnQkFDa0IsMEJBQTBCO3NCQUFwRSxNQUFNO3VCQUFDLDBCQUEwQjtnQkFDYywrQkFBK0I7c0JBQTlFLE1BQU07dUJBQUMsK0JBQStCO2dCQUdPLFNBQVM7c0JBQXRELGVBQWU7dUJBQUMsb0JBQW9CO2dCQUNPLFVBQVU7c0JBQXJELFlBQVk7dUJBQUMscUJBQXFCO2dCQUNWLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0Zvck9mLCBOZ0lmLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBUeXBlLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkNhbmNlbCwgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvbkVycm9yLCBOYXZpZ2F0aW9uU3RhcnQsIFBhcmFtcywgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0ZpbHRlck1hdGNoTW9kZSwgRmlsdGVyTWV0YWRhdGEsIExhenlMb2FkRXZlbnQsIFNvcnRNZXRhfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHtNdWx0aVNlbGVjdE1vZHVsZX0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XG5pbXBvcnQge1NrZWxldG9uTW9kdWxlfSBmcm9tICdwcmltZW5nL3NrZWxldG9uJztcbmltcG9ydCB7VGFibGUsIFRhYmxlTGF6eUxvYWRFdmVudCwgVGFibGVNb2R1bGV9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHtUb29sdGlwTW9kdWxlfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLCBNZWRpdXNRdWVyeVBhcmFtLCBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlciwgTWVkaXVzUXVlcnlSZXN1bHR9IGZyb20gJy4uLy4uLy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtNZWRpdXNSZXN0VXRpbH0gZnJvbSAnLi4vLi4vLi4vYXBpL3V0aWxzJztcbmltcG9ydCB7SVRhYmxlRGF0YVByb3ZpZGVyfSBmcm9tICcuLi8uLi8uLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge0FjdGlvbkRlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL2FjdGlvbic7XG5pbXBvcnQge0ZpbHRlckRlc2NyaXB0b3IsIEZpbHRlckxvb2t1cERlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL2ZpbHRlcic7XG5pbXBvcnQge0NvbHVtbkRlc2NyaXB0b3IsIFRhYmxlRGVzY3JpcHRvciwgVGFibGVEeW5hbWljRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdGFibGUnO1xuaW1wb3J0IHtBY3Rpb25Qb3NpdGlvbkVudW0sIEZpbHRlclR5cGVFbnVtLCBUYWJsZUZpbHRlckRpc3BsYXlFbnVtLCBUYWJsZVBhZ2luYXRpb25Nb2RlRW51bSwgVGFibGVTaXplRW51bX0gZnJvbSAnLi4vLi4vLi4vZGVzY3JpcHRvcnMvdHlwZXMnO1xuaW1wb3J0IHtNbmdDb21wb25lbnREaXJlY3RpdmUsIE1uZ1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7SVZpZXdDb250YWluZXJ9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ0NsYXNzTWFwUGlwZSwgTW5nSTE4blByb3BlcnR5UGlwZSwgTW5nTG9jYWxlRGVmYXVsdFJvd0NsYXNzUGlwZX0gZnJvbSAnLi4vLi4vLi4vcGlwZXMnO1xuaW1wb3J0IHtNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2UsIE1uZ0NvbW1vbnNTZXJ2aWNlLCBNbmdMb2NhbFN0b3JhZ2VTZXJ2aWNlLCBNbmdMb2dnZXJTZXJ2aWNlLCBNbmdWaWV3Q29udGFpbmVyQ29tcG9uZW50U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtTdHlsZXNVdGlsfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMnO1xuaW1wb3J0IHtFcnJvclV0aWwsIE5vdGlmaWNhdGlvblV0aWx9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7VGFibGV2aWV3VXRpbH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdGFibGV2aWV3LnV0aWwnO1xuaW1wb3J0IHtNbmdBY3Rpb25Db21wb25lbnR9IGZyb20gJy4uLy4uL2FjdGlvbic7XG5pbXBvcnQge0FjdGlvbkluc3RhbmNlLCBBY3Rpb25QYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9hY3Rpb24vbW9kZWxzJztcbmltcG9ydCB7TW5nVGFibGVDZWxsQ2xpY2tFdmVudCwgTW5nVGFibGVMb2FkRXZlbnR9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge01uZ1RhYmxlQ29sdW1uRmlsdGVyQ29tcG9uZW50fSBmcm9tICcuL2NvbHVtbi1maWx0ZXIvY29sdW1uLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHtNbmdUYWJsZUNvbHVtblZhbHVlQ29tcG9uZW50fSBmcm9tICcuL2NvbHVtbi12YWx1ZS9jb2x1bW4tdmFsdWUuY29tcG9uZW50JztcbmltcG9ydCB7Q29sdW1uV2l0aFByZWZlcmVuY2VzLCBUYWJsZUxheW91dFByZWZlcmVuY2VzfSBmcm9tICcuL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIFRhYmxlTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIE1uZ0NvbXBvbmVudERpcmVjdGl2ZSxcbiAgICAgICAgTW5nSTE4blByb3BlcnR5UGlwZSxcbiAgICAgICAgTmdGb3JPZixcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgTmdTdHlsZSxcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgTW5nVGFibGVDb2x1bW5GaWx0ZXJDb21wb25lbnQsXG4gICAgICAgIE1uZ0NsYXNzTWFwUGlwZSxcbiAgICAgICAgTW5nTG9jYWxlRGVmYXVsdFJvd0NsYXNzUGlwZSxcbiAgICAgICAgTW5nVGFibGVDb2x1bW5WYWx1ZUNvbXBvbmVudCxcbiAgICAgICAgTW5nQWN0aW9uQ29tcG9uZW50LFxuICAgICAgICBTa2VsZXRvbk1vZHVsZSxcbiAgICAgICAgTXVsdGlTZWxlY3RNb2R1bGUsXG4gICAgICAgIEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgVG9vbHRpcE1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGVcbiAgICBdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ1RhYmxlQ29tcG9uZW50PFQsIFM+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpbHRlckRpc3BsYXlSb3c6IFRhYmxlRmlsdGVyRGlzcGxheUVudW0gPSBUYWJsZUZpbHRlckRpc3BsYXlFbnVtLlJvdztcbiAgICBwdWJsaWMgcmVhZG9ubHkgY21wVHlwZU5hbWUgPSAnTW5nVGFibGVDb21wb25lbnQnO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoTW5nTG9nZ2VyU2VydmljZSkuY3JlYXRlKHRoaXMuY21wVHlwZU5hbWUpO1xuXG4gICAgLy8gbWV0YWRhdGEgaW5wdXRcbiAgICBASW5wdXQoe3JlcXVpcmVkOiB0cnVlLCBhbGlhczogJ2Rlc2NyaXB0b3InfSkgcHVibGljIGluaXRpYWxEZXNjcmlwdG9yITogVGFibGVEZXNjcmlwdG9yPFQ+O1xuICAgIHB1YmxpYyBkZXNjcmlwdG9yPzogVGFibGVEZXNjcmlwdG9yPFQ+O1xuXG4gICAgLy8gZGF0YSBzb3VyY2UgaW5wdXRzXG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zPzogT2JzZXJ2YWJsZTxBcnJheTxUPj4gfCBBcnJheTxUPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgcXVlcnlSZXN1bHQ/OiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PiB8IE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nPzogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFQcm92aWRlcj86IElUYWJsZURhdGFQcm92aWRlcjxULCBhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1c2VRdWVyeVBhcmFtcyA9IGZhbHNlO1xuXG4gICAgLy8gZXh0cmEgZmVhdHVyZXMgaW5wdXRcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScgfCAnbXVsdGlwbGUnID0gJ211bHRpcGxlJztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgLy8gYWN0aW9uc1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25zOiBBcnJheTxBY3Rpb25EZXNjcmlwdG9yPFQ+PiA9IFtdO1xuXG4gICAgLy8gdmlzdWFsXG4gICAgQElucHV0KCkgcHVibGljIGlzQ29sdW1uQ2xpY2thYmxlPzogYm9vbGVhbjtcblxuICAgIC8vIGNvbXBvbmVudCBpbnB1dHNcbiAgICBASW5wdXQoJ3ZpZXdDb250YWluZXInKSBwdWJsaWMgdmlld0NvbnRhaW5lckluaXQ/OiBJVmlld0NvbnRhaW5lcjxULCBTPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FwdGlvbkNvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY29sdW1uQWN0aW9uQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5BY3Rpb25NaW5XaWR0aDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCdnbG9iYWxGaWx0ZXJGaWVsZHMnKSBwdWJsaWMgZ2xvYmFsRmlsdGVyRmllbGRzSW5pdD86IHN0cmluZ1tdO1xuXG4gICAgLy8gZXZlbnQgb3V0cHV0c1xuICAgIEBPdXRwdXQoJ3RhYmxlTG9hZCcpIHB1YmxpYyBsb2FkRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdUYWJsZUxvYWRFdmVudD4oKTtcbiAgICBAT3V0cHV0KCdjZWxsQ2xpY2snKSBwdWJsaWMgY2VsbENsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdUYWJsZUNlbGxDbGlja0V2ZW50PFQ+PigpO1xuICAgIEBPdXRwdXQoJ3NlbGVjdGlvbkNoYW5nZScpIHB1YmxpYyBzZWxlY3Rpb25DaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFQ+PigpO1xuICAgIEBPdXRwdXQoJ2NhcHRpb25Db21wb25lbnRJbnN0YW5jZScpIHB1YmxpYyBjYXB0aW9uQ21wSW5zdEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoJ2NvbHVtbkFjdGlvbkNvbXBvbmVudEluc3RhbmNlJykgcHVibGljIGNvbHVtbkFjdGlvbkNtcEluc3RFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8vIGNvbnRlbnQgYW5kIHZpZXcgcXVlcmllc1xuICAgIEBDb250ZW50Q2hpbGRyZW4oTW5nVGVtcGxhdGVEaXJlY3RpdmUpIHB1YmxpYyB0ZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8TW5nVGVtcGxhdGVEaXJlY3RpdmU+O1xuICAgIEBWaWV3Q2hpbGRyZW4oTW5nQ29tcG9uZW50RGlyZWN0aXZlKSBwdWJsaWMgY29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxNbmdDb21wb25lbnREaXJlY3RpdmU8YW55Pj47XG4gICAgQFZpZXdDaGlsZChUYWJsZSkgcHVibGljIHByaW1lVGFibGUhOiBUYWJsZTtcblxuICAgIC8vIHRlbXBsYXRlc1xuICAgIHB1YmxpYyBjYXB0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIHB1YmxpYyBjb2x1bW5BY3Rpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgcHVibGljIGZvb3RlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8vIGRhdGEgcHJvdmlkZXIgYW5kIGl0ZW1zXG4gICAgcHVibGljIGlzTGF6eSA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc1BhZ2luYXRpb24gPSBmYWxzZTtcbiAgICBwcml2YXRlIHVzZURhdGFQcm92aWRlciA9IGZhbHNlO1xuICAgIHByaXZhdGUgdXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZFN1YmVqY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBwdWJsaWMgdXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZCQgPSB0aGlzLnVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWRTdWJlamN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBxdWVyeVJlc3VsdCQ/OiBPYnNlcnZhYmxlPE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PjtcbiAgICBwdWJsaWMgbG9hZGluZyQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHB1YmxpYyBkYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zOiBBcnJheTxUPiA9IFtdO1xuICAgIHByaXZhdGUgaXRlbXNTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8QXJyYXk8VD4+KDEpO1xuXG4gICAgcHJpdmF0ZSBxdWVyeVJlc3VsdFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICAgIC8vIHBhZ2luYXRpb24sIHNvcnQgYW5kIGZpbHRlcnNcbiAgICBwdWJsaWMgcm93c1BlclBhZ2VPcHRpb25zITogQXJyYXk8bnVtYmVyPjtcbiAgICBwdWJsaWMgcm93cyE6IG51bWJlcjtcbiAgICBwdWJsaWMgb2Zmc2V0ID0gMDtcbiAgICBwdWJsaWMgbXVsdGlTb3J0TWV0YTogU29ydE1ldGFbXSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBmaWx0ZXJNZXRhZGF0YToge1tzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YX0gPSB7fTtcbiAgICBwdWJsaWMgZ2xvYmFsRmlsdGVyRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gaW5maW5pdGUgc2Nyb2xsXG4gICAgcHVibGljIGluZmluaXRlU2Nyb2xsID0gZmFsc2U7XG5cbiAgICAvLyB2aXN1YWxcbiAgICBwdWJsaWMgY2xhc3NOYW1lITogc3RyaW5nO1xuICAgIHB1YmxpYyB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyByb3dIZWlnaHQ/OiBudW1iZXI7XG5cbiAgICAvLyBzZWxlY3Rpb25cbiAgICBwdWJsaWMgc2VsZWN0aW9uOiBBcnJheTxUPiA9IFtdO1xuXG4gICAgLy8gZGF0YSBwcm92aWRlclxuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyU2VydmljZTogYW55ID0gbnVsbDtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+PigxKTtcbiAgICBwcml2YXRlIGRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50PzogVGFibGVMYXp5TG9hZEV2ZW50O1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24gPSAwO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbT86IE1lZGl1c1F1ZXJ5UGFyYW07XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJMYXRlc3RRdWVyeVBhcmFtVmVyc2lvbiA9IDA7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgICAvLyBmaWx0ZXIsIHNvcnRcbiAgICBwdWJsaWMgaGFzQ29sdW1uRmlsdGVycyA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNGaWx0ZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc1NvcnRDaGFuZ2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBmaWx0ZXJEZXNjcmlwdG9yczogQXJyYXk8RmlsdGVyRGVzY3JpcHRvcjxhbnk+PiA9IFtdO1xuXG4gICAgLy8gYWN0aW9uc1xuICAgIHB1YmxpYyBzaG93SW5saW5lQWN0aW9uc0NvbHVtbiA9IGZhbHNlO1xuICAgIHB1YmxpYyByb3dDbGlja0FjdGlvbnM6IEFjdGlvbkRlc2NyaXB0b3I8VD5bXSA9IFtdO1xuICAgIHB1YmxpYyByb3dJbmxpbmVBY3Rpb25zOiBBY3Rpb25EZXNjcmlwdG9yPFQ+W10gPSBbXTtcblxuICAgIC8vIG90aGVyXG4gICAgcHJpdmF0ZSByb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3Q29udGFpbmVyPzogSVZpZXdDb250YWluZXI8VCwgUz47XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICAgIHB1YmxpYyBhcmVDb2x1bW5zUmVvcmRlcmFibGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgYXJlQ29sdW1uc1RvZ2dsZWFibGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgY29sdW1uczogQ29sdW1uV2l0aFByZWZlcmVuY2VzW10gPSBbXTtcbiAgICBwdWJsaWMgdmlzaWJsZUNvbHVtbnM6IENvbHVtbldpdGhQcmVmZXJlbmNlc1tdID0gW107XG4gICAgcHJpdmF0ZSBsYXlvdXRQcmVmZXJlbmNlczogVGFibGVMYXlvdXRQcmVmZXJlbmNlcyA9IHtjb2x1bW5XaWR0aHM6IHt9fTtcbiAgICBwcml2YXRlIGxvY2Fsc3RvcmFnZUtleSA9ICcnO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW5nQ29tbW9uc1NlcnZpY2U6IE1uZ0NvbW1vbnNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGFjdGlvbkV4ZWN1dG9yOiBNbmdBY3Rpb25FeGVjdXRvclNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgdmlld0NvbnRhaW5lclNlcnZpY2U6IE1uZ1ZpZXdDb250YWluZXJDb21wb25lbnRTZXJ2aWNlPFQsIFM+IHwgbnVsbCxcbiAgICAgICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBNbmdMb2NhbFN0b3JhZ2VTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVWaWV3Q29udGFpbmVyKCk7XG4gICAgICAgIC8vIFVzZWQgZm9yIGNvbmZpZ3Mgd2l0aGluIHRoaXMgbWV0aG9kIGFuZCBpcyBub3QgZHluYW1pY2FsbHkgc2V0IGJ5IFRhYmxlRHluYW1pY0Rlc2NyaXB0b3JcbiAgICAgICAgY29uc3QgYmFzZUNvbmZpZ0Rlc2NyaXB0b3IgPSB0aGlzLmluaXRpYWxEZXNjcmlwdG9yO1xuXG4gICAgICAgIGlmICghKHRoaXMuaW5pdGlhbERlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYWJsZUR5bmFtaWNEZXNjcmlwdG9yKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRNYWluQW5kUmVsYXRlZERlc2NyaXB0b3JzKHRoaXMuaW5pdGlhbERlc2NyaXB0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWFwIHJvdyBzZXR0aW5nc1xuICAgICAgICB0aGlzLnJvd3MgPSBiYXNlQ29uZmlnRGVzY3JpcHRvcj8uZGVmYXVsdE51bVJvd3MgPz8gMjU7XG4gICAgICAgIHRoaXMucm93c1BlclBhZ2VPcHRpb25zID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnJvd3NQZXJQYWdlT3B0aW9ucyA/PyBbMjUsIDUwLCAxMDBdO1xuXG4gICAgICAgIC8vIHByb2Nlc3MgYWN0aW9uc1xuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmFjdGlvbnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25Qb3NpdGlvbkVudW0uUm93Q2xpY2s6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93Q2xpY2tBY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25Qb3NpdGlvbkVudW0uUm93SW5saW5lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0lubGluZUFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dJbmxpbmVBY3Rpb25zQ29sdW1uID0gdHlwZW9mIHRoaXMuY29sdW1uQWN0aW9uQ29tcG9uZW50ICE9PSAndW5kZWZpbmVkJyB8fCB0aGlzLnJvd0lubGluZUFjdGlvbnMubGVuZ3RoID4gMDtcblxuICAgICAgICAvLyBkZWZpbmUgYWxsIHN0eWxlc1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5jbGFzc05hbWUgPz8gJyc7XG4gICAgICAgIHRoaXMudGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnRhYmxlRnVsbEhlaWdodE9mZnNldCA/PyBudWxsO1xuICAgICAgICB0aGlzLnJvd0hlaWdodCA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5yb3dIZWlnaHQ7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0NvbHVtbkNsaWNrYWJsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZSBpZiBjZWxsIGNsaWNrIGlzIGJlaW5nIG9ic2VydmVkIHZpYSBvdXRwdXRcbiAgICAgICAgICAgIHRoaXMuaXNDb2x1bW5DbGlja2FibGUgPSB0aGlzLnJvd0NsaWNrQWN0aW9ucy5sZW5ndGggPiAwIHx8IHRoaXMuY2VsbENsaWNrRXZlbnRFbWl0dGVyLm9ic2VydmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnNpemUpIHtcbiAgICAgICAgICAgIGNhc2UgVGFibGVTaXplRW51bS5TbWFsbDpcbiAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSArPSAnIHAtZGF0YXRhYmxlLXNtJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVGFibGVTaXplRW51bS5MYXJnZTpcbiAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSArPSAnIHAtZGF0YXRhYmxlLWxnJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/Lmhhc0dyaWRsaW5lcykge1xuICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgKz0gJyBwLWRhdGF0YWJsZS1ncmlkbGluZXMnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlQ29uZmlnRGVzY3JpcHRvciAmJiAhdGhpcy5jb2x1bW5BY3Rpb25NaW5XaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5BY3Rpb25NaW5XaWR0aCA9IFN0eWxlc1V0aWwuY2FsY3VsYXRlVGFibGVDb2x1bW5BY3Rpb25XaWR0aChcbiAgICAgICAgICAgICAgICBiYXNlQ29uZmlnRGVzY3JpcHRvciBhcyBUYWJsZURlc2NyaXB0b3I8dW5rbm93bj4sXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dJbmxpbmVBY3Rpb25zIGFzIEFycmF5PEFjdGlvbkRlc2NyaXB0b3I8dW5rbm93bj4+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaW5maW5pdGUgc2Nyb2xsXG4gICAgICAgIGxldCBwYWdpbmF0aW9uTW9kZSA9IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLk5vbmU7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnBhZ2luYXRpb25Nb2RlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gZGVzY3JpcHRvciBjaG9pY2UgaXMgdGhlIG1vc3Qgc3Ryb25nIC0gaWYgZGVmaW5lZCwgdXNlIHRoaXMgdmFsdWVcbiAgICAgICAgICAgIHBhZ2luYXRpb25Nb2RlID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3IucGFnaW5hdGlvbk1vZGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZGF0YVByb3ZpZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gd2hlbiBkYXRhIHByb3ZpZGVyIGlzIHVzZWQsIHVzZSBwYWdpbmF0aW9uXG4gICAgICAgICAgICBwYWdpbmF0aW9uTW9kZSA9IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLlBhZ2luYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnaW5hdGlvbk1vZGUgPT09IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLkluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLmluZmluaXRlU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudGFibGVGdWxsSGVpZ2h0T2Zmc2V0ID0gYmFzZUNvbmZpZ0Rlc2NyaXB0b3I/LnRhYmxlRnVsbEhlaWdodE9mZnNldCA/PyAzMTU7XG4gICAgICAgICAgICB0aGlzLnJvd0hlaWdodCA9IGJhc2VDb25maWdEZXNjcmlwdG9yPy5yb3dIZWlnaHQgPz8gNDU7XG4gICAgICAgICAgICB0aGlzLnVzZVF1ZXJ5UGFyYW1zID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAocGFnaW5hdGlvbk1vZGUgPT09IFRhYmxlUGFnaW5hdGlvbk1vZGVFbnVtLlBhZ2luYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuaXNQYWdpbmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGRhdGEgcHJvdmlkZXIgaXMgc3VwcGxpZWQsIGlmIGlzLCB1c2UgaXQgcHJpbWFyaWx5XG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgLy8gbWFwIHN1YmplY3RzIHRvIG9ic2VydmFibGVzIGFuZCBpbml0aWF0ZSBkYXRhXG4gICAgICAgICAgICB0aGlzLnVzZURhdGFQcm92aWRlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzTGF6eSA9IHRoaXMuZGF0YVByb3ZpZGVyLmlzTGF6eTtcbiAgICAgICAgICAgIHRoaXMucXVlcnlSZXN1bHQkID0gdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5UXVlcnlSZXN1bHQgPSBuZXcgTWVkaXVzUXVlcnlSZXN1bHQ8VD4oKTtcbiAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQucGFnZURhdGEgPSBbXTtcbiAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlclF1ZXJ5UmVzdWx0U3ViamVjdC5uZXh0KGVtcHR5UXVlcnlSZXN1bHQpO1xuXG4gICAgICAgICAgICAvLyBpbmplY3Qgc2VydmljZVxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQ8YW55Pih0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlbG9hZFN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVByb3ZpZGVyLmdldEFsbFJlbG9hZCQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChyZWxvYWRTdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcXVlcnkgcmVzdWx0IGlzIHByb3ZpZGVkLCB1c2UgaXQgYXMgc2Vjb25kYXJ5IHNvdXJjZSBvciBlbHNlIHRyeSB0byB1c2UgaXRlbXNcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJlc3VsdCQgPSB0aGlzLnF1ZXJ5UmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMucXVlcnlSZXN1bHQgOiBvZih0aGlzLnF1ZXJ5UmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVJlc3VsdCQgPSAoaXNPYnNlcnZhYmxlKHRoaXMuaXRlbXMpID8gdGhpcy5pdGVtcyA6IHRoaXMuaXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAvLyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgodjEsIHYyKSA9PiB2MS5sZW5ndGggPT09IHYyLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdjEuZXZlcnkoKHYxaSwgaWR4KSA9PiB2MWlbdGhpcy5kZXNjcmlwdG9yLmRhdGFLZXlQcm9wZXJ0eV0gPT09IHYyW2lkeF1bdGhpcy5kZXNjcmlwdG9yLmRhdGFLZXlQcm9wZXJ0eV0pKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UmVzdWx0ID0gbmV3IE1lZGl1c1F1ZXJ5UmVzdWx0PFQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVJlc3VsdC5wYWdlRGF0YSA9IGl0ZW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc09ic2VydmFibGUodGhpcy5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc1N1YmplY3QubmV4dCh0aGlzLml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMubG9hZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5sb2FkaW5nIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMubG9hZGluZyA6IG9mKHRoaXMubG9hZGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgY29uc3Qgcm93UGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgncm93cycpO1xuICAgICAgICAgICAgY29uc3Qgcm93cyA9IHJvd1BhcmFtcyA/IHBhcnNlSW50KHJvd1BhcmFtcykgOiB0aGlzLnJvd3M7XG5cbiAgICAgICAgICAgIGNvbnN0IG1lZGl1c1F1ZXJ5UGFyYW0gPSBNZWRpdXNSZXN0VXRpbC5nZXQoKS5mcm9tQW5ndWxhclF1ZXJ5UGFyYW1zVG9NZWRpdXNRdWVyeVBhcmFtcyh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLCB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLCB0aGlzLnJvd3MpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IExhenlMb2FkRXZlbnQgPSB7fTtcbiAgICAgICAgICAgIGV2ZW50Lm11bHRpU29ydE1ldGEgPSB0aGlzLmNyZWF0ZVNvcnRNZXRhKG1lZGl1c1F1ZXJ5UGFyYW0pID8/IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGV2ZW50LmZpbHRlcnMgPSB0aGlzLmNyZWF0ZUZpbHRlck1ldGEobWVkaXVzUXVlcnlQYXJhbSk7XG4gICAgICAgICAgICBldmVudC5yb3dzID0gcm93cztcblxuICAgICAgICAgICAgLy8gZmlyc3QgbmF2aWdhdGUgdG8gY29ycmVjdCB1cmwgd2l0aCBkZWZhdWx0IGZpbHRlcnMvc29ydHNcbiAgICAgICAgICAgIHRoaXMucm91dGVyXG4gICAgICAgICAgICAgICAgLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBNZWRpdXNSZXN0VXRpbC5nZXQoKS5mcm9tUHJpbWVMYXp5TG9hZEV2ZW50VG9Bbmd1bGFyUXVlcnlQYXJhbXMoZXZlbnQpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMb2FkaW5nVHJpZ2dlcnMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGFMb2FkaW5nVHJpZ2dlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXJ5UmVzdWx0U3Vic2NyaXB0aW9uID0gdGhpcy5xdWVyeVJlc3VsdCQuc3Vic2NyaWJlKGUgPT4gKHRoaXMucXVlcnlSZXN1bHQgPSBlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRlbXBsYXRlLmdldFR5cGUoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcHRpb25UZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjb2x1bW5BY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkFjdGlvblRlbXBsYXRlID0gdGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93SW5saW5lQWN0aW9uc0NvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93SW5saW5lQWN0aW9uc0NvbHVtbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb290ZXJUZW1wbGF0ZSA9IHRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSAmJiAhY2hhbmdlc1snaXRlbXMnXS5maXJzdENoYW5nZSAmJiBBcnJheS5pc0FycmF5KGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1N1YmplY3QubmV4dChjaGFuZ2VzWydpdGVtcyddLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlc1sndmlld0NvbnRhaW5lckluaXQnXSAmJiAhY2hhbmdlc1sndmlld0NvbnRhaW5lckluaXQnXS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplVmlld0NvbnRhaW5lcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzSW5pdCkge1xuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMgPSB0aGlzLmdsb2JhbEZpbHRlckZpZWxkc0luaXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcyA9ICh0aGlzLmRlc2NyaXB0b3IgfHwgdGhpcy5pbml0aWFsRGVzY3JpcHRvcikuY29sdW1ucy5tYXAoKGVsOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4pID0+IGVsLnByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMucXVlcnlSZXN1bHRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkKGVtaXRFdmVudCA9IGZhbHNlLCByZXNldFBhcmFtcyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zQnVpbGRlciA9IHJlc2V0UGFyYW1zXG4gICAgICAgICAgICA/IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZSh0aGlzLnJvd3MsIDApXG4gICAgICAgICAgICA6IE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyLmNyZWF0ZUZyb21FeGlzdGluZyh0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW0gPz8gbmV3IE1lZGl1c1F1ZXJ5UGFyYW0oKSlcbiAgICAgICAgICAgICAgICAgIC53aXRoSXRlbXNQZXJQYWdlKHRoaXMucm93cylcbiAgICAgICAgICAgICAgICAgIC53aXRoSXRlbXNPZmZzZXQodGhpcy5vZmZzZXQpO1xuXG4gICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihxdWVyeVBhcmFtc0J1aWxkZXIuYnVpbGQoKSwgZW1pdEV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UYWJsZUxhenlMb2FkKGV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMYXRlc3RMYXp5TG9hZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24rKztcblxuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgaWYgKCFldmVudC5tdWx0aVNvcnRNZXRhIHx8IGV2ZW50Lm11bHRpU29ydE1ldGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGRlZmF1bHQgc29ydCBtZXRhIHRvIGV2ZW50IGlmIG5vdCBtdWx0aXNvcnQgbWV0YSBpcyBwcmVzZW50XG4gICAgICAgICAgICAgICAgZXZlbnQubXVsdGlTb3J0TWV0YSA9IHRoaXMuY3JlYXRlU29ydE1ldGEoKSA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWV2ZW50LmZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBldmVudC5maWx0ZXJzID0gdGhpcy5jcmVhdGVGaWx0ZXJNZXRhKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5yb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgaXMgbmVjZXNzYXJ5OiBmcm9tIHNvbWUgcmVhc29uLCBwcmltZU5HIGNvbW1pdHMgb25lIGxhc3QgbGF6eSBsb2FkIGV2ZW50IHdoZW5ldmVyIGFueSBhbmd1bGFyIHJvdXRlciBuYXZpZ2F0aW9uIG9jY3Vyc1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBNZWRpdXNSZXN0VXRpbC5nZXQoKS5mcm9tUHJpbWVMYXp5TG9hZEV2ZW50VG9Bbmd1bGFyUXVlcnlQYXJhbXMoZXZlbnQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpdXNRdWVyeVBhcmFtcyA9IGV2ZW50ID8gTWVkaXVzUmVzdFV0aWwuZ2V0KCkuZnJvbVByaW1lTGF6eUxvYWRFdmVudFRvTWVkaXVzUXVlcnlQYXJhbXMoZXZlbnQpIDogbmV3IE1lZGl1c1F1ZXJ5UGFyYW0oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihtZWRpdXNRdWVyeVBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uVGFibGVTb3J0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5pc1NvcnRDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uVGFibGVGaWx0ZXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmlzRmlsdGVyQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2VsbENsaWNrKGV2ZW50OiBFdmVudCwgY29sOiBDb2x1bW5EZXNjcmlwdG9yPGFueSwgVD4sIGl0ZW06IFQsIGlkeDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG1uZ0V2ZW50ID0gbmV3IE1uZ1RhYmxlQ2VsbENsaWNrRXZlbnQ8VD4oY29sLCBpdGVtLCBpZHgpO1xuICAgICAgICB0aGlzLmNlbGxDbGlja0V2ZW50RW1pdHRlci5uZXh0KG1uZ0V2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMucm93Q2xpY2tBY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5yb3dDbGlja0FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZFByb3AgPSB0aGlzLmRlc2NyaXB0b3I/LmRhdGFLZXlQcm9wZXJ0eSA/PyBhY3Rpb24/Lm1vZGVsPy5pZFByb3BlcnR5TmFtZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IEFjdGlvblBhcmFtZXRlcnMoaWRQcm9wID8gaXRlbVtpZFByb3AgYXMga2V5b2Ygb2JqZWN0XSA6IHVuZGVmaW5lZCwgaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhSb3V0ZSh0aGlzLnJvdXRlKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFZpZXdDb250YWluZXIodGhpcy52aWV3Q29udGFpbmVyKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvdXJjZUNvbXBvbmVudCh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkV4ZWN1dG9yLnRyaWdnZXJBY3Rpb24oYWN0aW9uLCBwYXJhbWV0ZXJzLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblNlbGVjdGlvbkNoYW5nZShldmVudDogQXJyYXk8VD4pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudEVtaXR0ZXIuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ2FwdGlvbkNtcEluc3Q8Qz4oaW5zdGFuY2U6IEMpIHtcbiAgICAgICAgdGhpcy5jYXB0aW9uQ21wSW5zdEV2ZW50RW1pdHRlci5uZXh0KGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Db2x1bW5BY3Rpb25DbXBJbnN0PEM+KGluc3RhbmNlOiBDKSB7XG4gICAgICAgIHRoaXMuY29sdW1uQWN0aW9uQ21wSW5zdEV2ZW50RW1pdHRlci5uZXh0KGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25BY3Rpb25GaW5pc2gocnVuUmVzdWx0OiBBY3Rpb25JbnN0YW5jZTxULCBTPikge1xuICAgICAgICBpZiAoIXJ1blJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBpcyBjYWxsZWQgb24gY29sdW1uIHJlc2l6ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IGV2ZW50J3MgZWxlbWVudFxuICAgICAqL1xuICAgIHB1YmxpYyBvblRhYmxlQ29sdW1uUmVzaXplKHtlbGVtZW50fTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpZWxkSWQ6IHN0cmluZyA9IGVsZW1lbnQuaWQ7XG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuXG4gICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY29sdW1ucy5maW5kKGVsID0+IGVsLmRlc2NyaXB0b3IucHJvcGVydHkgPT09IGZpZWxkSWQpO1xuICAgICAgICBpZiAoY29sKSBjb2wud2lkdGggPSB3aWR0aDtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbldpZHRocykgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMgPSB7fTtcblxuICAgICAgICB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbldpZHRoc1tmaWVsZElkXSA9IHdpZHRoO1xuICAgICAgICB0aGlzLnNhdmVMYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZFRhYmxlV2l0aERhdGFQcm92aWRlcihxdWVyeVBhcmFtOiBNZWRpdXNRdWVyeVBhcmFtIHwgbnVsbCA9IG51bGwsIGVtaXRFdmVudCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZURhdGFQcm92aWRlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcblxuICAgICAgICBpZiAoIXF1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW0gPSBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGUodGhpcy5yb3dzKS5idWlsZCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0UXVlcnlQYXJhbVZlcnNpb24rKztcblxuICAgICAgICBNZWRpdXNSZXN0VXRpbC5nZXQoKS5tb2RpZnlGaWx0ZXJQcm9wZXJ0aWVzKHF1ZXJ5UGFyYW0sIHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMpO1xuICAgICAgICBNZWRpdXNSZXN0VXRpbC5nZXQoKS5tb2RpZnlTb3J0UHJvcGVydGllcyhxdWVyeVBhcmFtLCB0aGlzLmRlc2NyaXB0b3I/LmNvbHVtbnMpO1xuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5kYXRhUHJvdmlkZXJcbiAgICAgICAgICAgID8uZ2V0QWxsKHF1ZXJ5UGFyYW0sIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSwgdGhpcy5kZXNjcmlwdG9yPy5pc0xvY2FsaXplZCA/IHRoaXMubW5nQ29tbW9uc1NlcnZpY2UuYXBwRGF0YUxhbmd1YWdlID8/IHVuZGVmaW5lZCA6IHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxEZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFibGVEeW5hbWljRGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNYWluQW5kUmVsYXRlZERlc2NyaXB0b3JzKHRoaXMuaW5pdGlhbERlc2NyaXB0b3IudG9UYWJsZURlc2NyaXB0b3JGcm9tRGF0YShyZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZmluaXRlU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ZpbHRlckNoYW5nZWQgfHwgdGhpcy5pc1NvcnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJJbmZpbml0ZVNjcm9sbEl0ZW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXMuc3BsaWNlKHF1ZXJ5UGFyYW0hLml0ZW1zT2Zmc2V0ID8/IDAsIHF1ZXJ5UGFyYW0hLml0ZW1zUGVyUGFnZSA/PyB0aGlzLnJvd3MsIC4uLihyZXMucGFnZURhdGEgPz8gW10pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA9IFsuLi50aGlzLmRhdGFQcm92aWRlckluZmluaXRlU2Nyb2xsSXRlbXNdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGaWx0ZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTb3J0Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlckxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIHdoYXQgaGFwcGVucyBvbiBlcnJvciB3aXRoIG5vIG1vZGVsIGluaXNpZGUgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25VdGlsLnRhYmxlTm90aWZpY2F0aW9uRXJyb3IodGhpcy50cmFuc2xhdGUsIHRoaXMuZGVzY3JpcHRvciEsIGVyciwgdGhpcy52aWV3Q29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1wdHlRdWVyeVJlc3VsdCA9IG5ldyBNZWRpdXNRdWVyeVJlc3VsdDxUPigpO1xuICAgICAgICAgICAgICAgICAgICBlbXB0eVF1ZXJ5UmVzdWx0LnBhZ2VEYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIGVtcHR5UXVlcnlSZXN1bHQuYWxsRGF0YUNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJRdWVyeVJlc3VsdFN1YmplY3QubmV4dChlbXB0eVF1ZXJ5UmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXJMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtbmdFcnJvciA9IEVycm9yVXRpbC5mcm9tU3Vic2NyaWJlRXJyb3IoZXJyLCAnTW5nVGFibGVDb21wb25lbnRFcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW06IHF1ZXJ5UGFyYW1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhtbmdFcnJvciwgRXJyb3JVdGlsLmdldEVycm9yTG9nTGV2ZWwobW5nRXJyb3IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtbmdFdmVudCA9IG5ldyBNbmdUYWJsZUxvYWRFdmVudCgpO1xuICAgICAgICAgICAgbW5nRXZlbnQub3JpZ2luYWxFdmVudCA9IHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudDtcbiAgICAgICAgICAgIG1uZ0V2ZW50LnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtO1xuICAgICAgICAgICAgdGhpcy5sb2FkRXZlbnRFbWl0dGVyLm5leHQobW5nRXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkVGFibGVGcm9tUm91dGVVcGRhdGUocGFyYW1zOiBQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgbWVkaXVzUXVlcnlQYXJhbSA9IE1lZGl1c1Jlc3RVdGlsLmdldCgpLmZyb21Bbmd1bGFyUXVlcnlQYXJhbXNUb01lZGl1c1F1ZXJ5UGFyYW1zKHBhcmFtcywgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycywgdGhpcy5yb3dzKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyTGF0ZXN0TGF6eUxvYWRFdmVudFZlcnNpb24gPCB0aGlzLmRhdGFQcm92aWRlckxhdGVzdFF1ZXJ5UGFyYW1WZXJzaW9uICsgMSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIG9ubHkgaWYgbmV3IHZlcnNpb24gZnJvbSBxdWVyeSBwYXJhbXMgd2lsbCBiZSBoaWdoZXJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlUXVlcnlQYXJhbXNJbml0aWFsaXplZFN1YmVqY3QubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVXaXRoRGF0YVByb3ZpZGVyKG1lZGl1c1F1ZXJ5UGFyYW0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TWFpbkFuZFJlbGF0ZWREZXNjcmlwdG9ycyhkZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8VD4pIHtcbiAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcbiAgICAgICAgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycyA9IHRoaXMuZGVzY3JpcHRvcj8uY29sdW1ucy5maWx0ZXIoYyA9PiB0eXBlb2YgYy5maWx0ZXJEZXNjcmlwdG9yICE9PSAndW5kZWZpbmVkJykubWFwKGMgPT4gYy5maWx0ZXJEZXNjcmlwdG9yISkgPz8gW107XG4gICAgICAgIHRoaXMuaGFzQ29sdW1uRmlsdGVycyA9IHRoaXMuZmlsdGVyRGVzY3JpcHRvcnMubGVuZ3RoID4gMDtcblxuICAgICAgICAvLyBnZXQgbGF5b3V0IHByZWZlcmVuY2VzIGlmIHRoZXkgZXhpc3RcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcj8ubW9kZWwudHlwZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxzdG9yYWdlS2V5ID0gVGFibGV2aWV3VXRpbC5nZW5lcmF0ZVRhYmxlTGF5b3V0UHJlZnNLZXkodGhpcy5kZXNjcmlwdG9yPy5tb2RlbC50eXBlTmFtZSwgdGhpcy5yb3V0ZXIudXJsLCB0aGlzLmRlc2NyaXB0b3I/LmRhdGFLZXkpO1xuICAgICAgICAgICAgY29uc3QgcHJlZmVyZW5jZXMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbTxUYWJsZUxheW91dFByZWZlcmVuY2VzPih0aGlzLmNtcFR5cGVOYW1lLCB0aGlzLmxvY2Fsc3RvcmFnZUtleSk7XG4gICAgICAgICAgICBpZiAocHJlZmVyZW5jZXMgJiYgdHlwZW9mIHByZWZlcmVuY2VzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMgPSBwcmVmZXJlbmNlcy5jb2x1bW5XaWR0aHMgYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VzLmNvbHVtbk9yZGVyICYmIEFycmF5LmlzQXJyYXkocHJlZmVyZW5jZXMuY29sdW1uT3JkZXIpICYmIHByZWZlcmVuY2VzLmNvbHVtbk9yZGVyLmV2ZXJ5KChlbDogYW55KSA9PiB0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbk9yZGVyID0gcHJlZmVyZW5jZXMuY29sdW1uT3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5ICYmIEFycmF5LmlzQXJyYXkocHJlZmVyZW5jZXMuY29sdW1uVmlzaWJpbGl0eSkgJiYgcHJlZmVyZW5jZXMuY29sdW1uVmlzaWJpbGl0eS5ldmVyeSgoZWw6IGFueSkgPT4gdHlwZW9mIGVsID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5ID0gcHJlZmVyZW5jZXMuY29sdW1uVmlzaWJpbGl0eTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbml0aWFsaXplIGNvbHVtbnMgd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcj8uY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcmVDb2x1bW5zUmVvcmRlcmFibGUgPSB0aGlzLmRlc2NyaXB0b3IuY29sdW1ucy5zb21lKHZhbHVlID0+IHZhbHVlLmlzUmVvcmRlcmFibGUpO1xuICAgICAgICAgICAgdGhpcy5hcmVDb2x1bW5zVG9nZ2xlYWJsZSA9IHRoaXMuZGVzY3JpcHRvci5jb2x1bW5zLnNvbWUodmFsdWUgPT4gdmFsdWUuaXNUb2dnbGVhYmxlKTtcblxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kZXNjcmlwdG9yLmNvbHVtbnMubWFwKGNvbCA9PiAoe1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3I6IGNvbCxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWNvbC5pc1RvZ2dsZWFibGUsXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlOiB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtblZpc2liaWxpdHkgPyB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtblZpc2liaWxpdHkuaW5jbHVkZXMoY29sLnByb3BlcnR5KSA6IGNvbC5pc1Zpc2libGUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMuY29sdW1uV2lkdGhzPy5bY29sLnByb3BlcnR5XVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5PcmRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbHVtbk9yZGVyOiBDb2x1bW5XaXRoUHJlZmVyZW5jZXNbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29sTmFtZSBvZiB0aGlzLmxheW91dFByZWZlcmVuY2VzLmNvbHVtbk9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29sID0gdGhpcy5jb2x1bW5zLmZpbmQoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSA9PT0gY29sTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29sdW1uT3JkZXIucHVzaChmb3VuZENvbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3Q29sdW1uT3JkZXIubGVuZ3RoID09PSB0aGlzLmNvbHVtbnMubGVuZ3RoKSB0aGlzLmNvbHVtbnMgPSBuZXdDb2x1bW5PcmRlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoZWwgPT4gZWwuaXNWaXNpYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUHJpbWVTb3J0QW5kRmlsdGVyKG1lZGl1c1F1ZXJ5UGFyYW06IE1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgdGhpcy5tdWx0aVNvcnRNZXRhID0gdGhpcy5jcmVhdGVTb3J0TWV0YShtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgdGhpcy5maWx0ZXJNZXRhZGF0YSA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YShtZWRpdXNRdWVyeVBhcmFtKTtcbiAgICAgICAgdGhpcy5yb3dzID0gbWVkaXVzUXVlcnlQYXJhbT8uaXRlbXNQZXJQYWdlID8/IHRoaXMucm93cztcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBtZWRpdXNRdWVyeVBhcmFtPy5pdGVtc09mZnNldCA/PyAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRmlsdGVyTWV0YShtZWRpdXNRdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbSkge1xuICAgICAgICBsZXQgcGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICBpZiAoIW1lZGl1c1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBNZWRpdXNRdWVyeVBhcmFtKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBtZWRpdXNRdWVyeVBhcmFtO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWVGaWx0ZXJNZXRhOiB7W3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhfSA9IHt9O1xuICAgICAgICAvLyBpZiBhbnkgZmlsdGVyIGlzIHByZXNlbnQsIG5vIGRlZmF1bHQgZmlsdGVycyBzaG91bGQgYmUgYXBwbGllZCFcbiAgICAgICAgY29uc3QgYXBwbHlEZWZhdWx0RmlsdGVycyA9IChwYXJhbXMuZmlsdGVyUGFyYW1zPy5sZW5ndGggPz8gMCkgPT09IDA7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJEZXNjcmlwdG9ycy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgbGV0IG1hdGNoTW9kZTtcbiAgICAgICAgICAgIHN3aXRjaCAoZi5maWx0ZXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZS5DT05UQUlOUztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5EYXRlOlxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuREFURV9JUztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5Mb29rdXA6XG4gICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvb2t1cEZpbHRlciA9IGYgYXMgRmlsdGVyTG9va3VwRGVzY3JpcHRvcjxhbnk+O1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9va3VwRmlsdGVyLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuSU47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuRVFVQUxTO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGUuRVFVQUxTO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGYuZGVmYXVsdEZpbHRlck1hdGNoTW9kZSkge1xuICAgICAgICAgICAgICAgIG1hdGNoTW9kZSA9IGYuZGVmYXVsdEZpbHRlck1hdGNoTW9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGYubWF0Y2hNb2RlcyAmJiAhZi5tYXRjaE1vZGVzPy5pbmNsdWRlcyhtYXRjaE1vZGUpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hNb2RlID0gZi5tYXRjaE1vZGVzWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGFwcGx5RGVmYXVsdEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZi5kZWZhdWx0VmFsdWVUbyAmJiBmLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFtmLmRlZmF1bHRWYWx1ZSwgZi5kZWZhdWx0VmFsdWVUb107XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGYuZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJpbWVGaWx0ZXJNZXRhW2YucHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IG1hdGNoTW9kZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFyYW1zLmZpbHRlclBhcmFtcz8uZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmZpbHRlckRlc2NyaXB0b3JzLmZpbmQoZmQgPT4gZmQuZmlsdGVyUHJvcGVydHkgPT09IGYucHJvcGVydHkgfHwgZmQucHJvcGVydHkgPT09IGYucHJvcGVydHkpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gZi5maWx0ZXJNYXRjaFR5cGUgJiYgZGVzY3JpcHRvciA/IE1lZGl1c1Jlc3RVdGlsLmdldCgpLmdldE1hcHBpbmcoZi5maWx0ZXJNYXRjaFR5cGUsIGRlc2NyaXB0b3IuZmlsdGVyVHlwZSwgMik/LlswXSA6IE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5FcXVhbHM7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBtYXRjaE1vZGUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyVmFsdWUgPSBmLmZpbHRlclZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkRhdGUgJiYgdHlwZW9mIGZpbHRlclZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbHRlclZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmlsdGVyVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IG5ldyBEYXRlKGZpbHRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiByYW5nZSBpcyBwcm92aWRlZCwgdGFrZSB0aGF0IGludG8gYWNjb3VudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGYuZmlsdGVyVmFsdWVUbyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGYuZmlsdGVyVmFsdWVUbyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlVG8gPSBuZXcgRGF0ZShmLmZpbHRlclZhbHVlVG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBbZmlsdGVyVmFsdWUsIGZpbHRlclZhbHVlVG9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByaW1lRmlsdGVyTWV0YVtkZXNjcmlwdG9yLnByb3BlcnR5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IG1hdGNoTW9kZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJpbWVGaWx0ZXJNZXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU29ydE1ldGEobWVkaXVzUXVlcnlQYXJhbT86IE1lZGl1c1F1ZXJ5UGFyYW0pOiBTb3J0TWV0YVtdIHwgbnVsbCB7XG4gICAgICAgIGxldCBwYXJhbXM6IE1lZGl1c1F1ZXJ5UGFyYW07XG4gICAgICAgIGlmICghbWVkaXVzUXVlcnlQYXJhbSkge1xuICAgICAgICAgICAgcGFyYW1zID0gbmV3IE1lZGl1c1F1ZXJ5UGFyYW0oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IG1lZGl1c1F1ZXJ5UGFyYW07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc29ydE1ldGE6IFNvcnRNZXRhW107XG4gICAgICAgIGNvbnN0IGFwcGx5RGVmYXVsdFNvcnRzID0gKHBhcmFtcy5zb3J0UHJvcGVydHk/Lmxlbmd0aCA/PyAwKSA9PT0gMDtcblxuICAgICAgICBpZiAoYXBwbHlEZWZhdWx0U29ydHMgJiYgdGhpcy5kZXNjcmlwdG9yPy5oYXNEZWZhdWx0U29ydCkge1xuICAgICAgICAgICAgc29ydE1ldGEgPSB0aGlzLmRlc2NyaXB0b3IuZGVmYXVsdFNvcnRQcm9wZXJ0eS5tYXAoXG4gICAgICAgICAgICAgICAgKHAsIGlkeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgPFNvcnRNZXRhPntcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXI6IHRoaXMuZGVzY3JpcHRvciEuZGVmYXVsdFNvcnRBc2NbaWR4XSA/IDEgOiAtMVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc29ydE1ldGEgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtcy5zb3J0UHJvcGVydHk/LmZvckVhY2goKHMsIGlkeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IHNvcnRNZXRhLmZpbmRJbmRleCh2YWx1ZSA9PiB2YWx1ZS5maWVsZCA9PT0gcyk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgc29ydE1ldGFbZXhpc3RpbmdJbmRleF0ub3JkZXIgPSBwYXJhbXMuc29ydEFzYz8uW2lkeF0gPz8gdHJ1ZSA/IDEgOiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc29ydE1ldGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcjogcGFyYW1zLnNvcnRBc2M/LltpZHhdID8/IHRydWUgPyAxIDogLTFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNvcnRNZXRhLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBzb3J0TWV0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEYXRhTG9hZGluZ1RyaWdnZXJzKCkge1xuICAgICAgICBpZiAodGhpcy51c2VRdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgLy8gdHJpZ2dlciB0YWJsZSBsb2FkcyBmcm9tIHJvdXRlIHVwZGF0ZXNcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlUXBTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZShxcCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVGFibGVGcm9tUm91dGVVcGRhdGUocXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByb3V0ZXJFdlN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgJiYgZS51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdICE9PSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25DYW5jZWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJJc05hdmlnYXRpb25PdXRzaWRlSW5Qcm9ncmVzcyA9IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHJvdXRlUXBTdWJzY3JpcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2gocm91dGVyRXZTdWJzY3JpcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbG9hZCBkYXRhIGltbWVkaWF0ZWx5IGJ5IGNyZWF0aW5nIGRlZmF1bHQgc29ydHMgYW5kIGZpbHRlcnMgKHByaW1lbmcgd2lsbCB0cmlnZ2VyIG9uTGF6eUxvYWQgZXZlbnQgb24gc29ydCZmaWx0ZXIgbWV0YWRhdGEgY2hhbmdlKVxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFNvcnQgPSB0aGlzLmNyZWF0ZVNvcnRNZXRhKCk7XG4gICAgICAgICAgICBpZiAoIWRlZmF1bHRTb3J0IHx8IGRlZmF1bHRTb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBkZWZhdWx0U29ydDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IHRoaXMuY3JlYXRlRmlsdGVyTWV0YSgpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlck1ldGFkYXRhID0gZGVmYXVsdEZpbHRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZVZpZXdDb250YWluZXIoKSB7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA9IHRoaXMudmlld0NvbnRhaW5lckluaXQgPz8gdGhpcy52aWV3Q29udGFpbmVyU2VydmljZSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ29sdW1uVG9nZ2xlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKGV2ZW50Lml0ZW1WYWx1ZSkge1xuICAgICAgICAgICAgZXZlbnQuaXRlbVZhbHVlLmlzVmlzaWJsZSA9ICFldmVudC5pdGVtVmFsdWUuaXNWaXNpYmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgY29sLmlzVmlzaWJsZSA9IGV2ZW50LnZhbHVlLmluY2x1ZGVzKGNvbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5WaXNpYmlsaXR5ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5tYXAoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuc2F2ZUxheW91dFByZWZlcmVuY2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGFnYXRlcyB0aGUgY29sdW1uIG1vdmUgZnJvbSB0aGUgdGhpcy52aXNpYmxlQ29sdW1ucyBhcnJheSB0byB0aGlzLmNvbHVtbnMgYXJyYXlcbiAgICAgKiBAcGFyYW0gZXZlbnQ6IE11bHRpU2VsZWN0Q2hhbmdlRXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgb25Db2x1bW5SZW9yZGVyKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy52aXNpYmxlQ29sdW1uc1tldmVudC5kcm9wSW5kZXhdO1xuICAgICAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoZWwgPT4gZWwgPT09IGNvbCk7XG5cbiAgICAgICAgaWYgKGNvbEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoY29sSW5kZXgsIDEpO1xuICAgICAgICAgICAgY29uc3QgZHJvcEluZGV4ID0gZXZlbnQuZHJvcEluZGV4ID4gMCA/IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoZWwgPT4gZWwgPT09IHRoaXMudmlzaWJsZUNvbHVtbnNbZXZlbnQuZHJvcEluZGV4IC0gMV0pICsgMSA6IDA7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zLnNsaWNlKDAsIGRyb3BJbmRleCksIGNvbCwgLi4udGhpcy5jb2x1bW5zLnNsaWNlKGRyb3BJbmRleCldO1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcy5jb2x1bW5PcmRlciA9IHRoaXMuY29sdW1ucy5tYXAoZWwgPT4gZWwuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB0aGlzLnNhdmVMYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlTGF5b3V0UHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmRlc2NyaXB0b3I/Lm1vZGVsLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSh0aGlzLmNtcFR5cGVOYW1lLCB0aGlzLmxvY2Fsc3RvcmFnZUtleSwgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBjb2x1bW4gb3JkZXIgYW5kIGNvbHVtbiB2aXNpYmlsaXR5IHRvIGRlZmF1bHQgc2V0dGluZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXREZWZhdWx0TGF5b3V0KCkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRlc2NyaXB0b3IgPyB0aGlzLmRlc2NyaXB0b3IuY29sdW1ucy5tYXAoY29sID0+ICh7ZGVzY3JpcHRvcjogY29sLCBkaXNhYmxlZDogIWNvbC5pc1RvZ2dsZWFibGUsIGlzVmlzaWJsZTogY29sLmlzVmlzaWJsZX0pKSA6IFtdO1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihlbCA9PiBlbC5pc1Zpc2libGUpO1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yPy5tb2RlbC50eXBlTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0odGhpcy5jbXBUeXBlTmFtZSwgdGhpcy5sb2NhbHN0b3JhZ2VLZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXlvdXRQcmVmZXJlbmNlcyA9IHt9O1xuICAgIH1cbn1cbiIsIjxkaXYgW3N0eWxlLmhlaWdodF09XCJ0YWJsZUZ1bGxIZWlnaHRPZmZzZXQgPyAnY2FsYygxMDB2aCAtICcgKyB0YWJsZUZ1bGxIZWlnaHRPZmZzZXQgKyAncHgpJyA6IG51bGxcIj5cbiAgICA8IS0tIE1VU1QgTk9UIHVzZSBvYnNlcnZhYmxlIGZvciB2YWx1ZSB3aGVuIHVzaW5nIHZpcnR1YWwgc2Nyb2xsIC0gZG9lcyBub3Qgd29yayBmb3Igc29tZSByZWFzb24gLS0+XG4gICAgPHAtdGFibGVcbiAgICAgICAgKm5nSWY9XCIhdXNlUXVlcnlQYXJhbXMgfHwgKHVzZVF1ZXJ5UGFyYW1zSW5pdGlhbGl6ZWQkIHwgYXN5bmMpXCJcbiAgICAgICAgW3ZhbHVlXT1cImluZmluaXRlU2Nyb2xsID8gZGF0YVByb3ZpZGVySW5maW5pdGVTY3JvbGxJdGVtcyA6IChxdWVyeVJlc3VsdCQgfCBhc3luYyk/LnBhZ2VEYXRhID8/IFtdXCJcbiAgICAgICAgW2RhdGFLZXldPVwiZGVzY3JpcHRvcj8uZGF0YUtleVByb3BlcnR5XCJcbiAgICAgICAgW2xhenldPVwiaXNMYXp5XCJcbiAgICAgICAgW2xvYWRpbmddPVwiKGxvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgW3BhZ2luYXRvcl09XCJpc1BhZ2luYXRpb24gJiYgIWluZmluaXRlU2Nyb2xsXCJcbiAgICAgICAgW3Jvd3NdPVwiaW5maW5pdGVTY3JvbGwgPyAyMCA6IHJvd3NcIlxuICAgICAgICBbZmlyc3RdPVwiaW5maW5pdGVTY3JvbGwgPyAwIDogb2Zmc2V0XCJcbiAgICAgICAgW3RvdGFsUmVjb3Jkc109XCIkYW55KGluZmluaXRlU2Nyb2xsID8gbnVsbCA6IChxdWVyeVJlc3VsdCQgfCBhc3luYyk/LmFsbERhdGFDb3VudCA/PyAwKVwiXG4gICAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiaW5maW5pdGVTY3JvbGwgPyB1bmRlZmluZWQgOiByb3dzUGVyUGFnZU9wdGlvbnNcIlxuICAgICAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cIiFpbmZpbml0ZVNjcm9sbFwiXG4gICAgICAgIFtjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlXT1cIidtbmdUYWJsZS5wYWdpbmF0aW9uTXNnJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFttdWx0aVNvcnRNZXRhXT1cIm11bHRpU29ydE1ldGFcIlxuICAgICAgICBbZmlsdGVyc109XCJmaWx0ZXJNZXRhZGF0YVwiXG4gICAgICAgIFtnbG9iYWxGaWx0ZXJGaWVsZHNdPVwiZ2xvYmFsRmlsdGVyRmllbGRzXCJcbiAgICAgICAgc29ydE1vZGU9XCJtdWx0aXBsZVwiXG4gICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3Rpb25cIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25FbmFibGVkID8gc2VsZWN0aW9uTW9kZSA6IG51bGxcIlxuICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiaW5maW5pdGVTY3JvbGxcIlxuICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cInJvd0hlaWdodFwiXG4gICAgICAgIHNjcm9sbEhlaWdodD1cImZsZXhcIlxuICAgICAgICBbcm93SG92ZXJdPVwiZGVzY3JpcHRvcj8uaGFzSG92ZXIgPz8gdHJ1ZVwiXG4gICAgICAgIFtzdHlsZUNsYXNzXT1cImNsYXNzTmFtZVwiXG4gICAgICAgIFtyZXNpemFibGVDb2x1bW5zXT1cImRlc2NyaXB0b3I/Lmhhc1Jlc2l6YWJsZUNvbHVtbnMgPz8gZmFsc2VcIlxuICAgICAgICBbY29sdW1uUmVzaXplTW9kZV09XCJkZXNjcmlwdG9yPy5jb2x1bW5SZXNpemVNb2RlID8/ICdmaXQnXCJcbiAgICAgICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJhcmVDb2x1bW5zUmVvcmRlcmFibGVcIlxuICAgICAgICBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgIChvbkNvbFJlc2l6ZSk9XCJvblRhYmxlQ29sdW1uUmVzaXplKCRldmVudClcIlxuICAgICAgICAob25Db2xSZW9yZGVyKT1cIm9uQ29sdW1uUmVvcmRlcigkZXZlbnQpXCJcbiAgICAgICAgKG9uTGF6eUxvYWQpPVwib25UYWJsZUxhenlMb2FkKCRldmVudClcIlxuICAgICAgICAob25Tb3J0KT1cIm9uVGFibGVTb3J0KCRldmVudClcIlxuICAgICAgICAob25GaWx0ZXIpPVwib25UYWJsZUZpbHRlcigkZXZlbnQpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZSB8fCBjYXB0aW9uQ29tcG9uZW50IHx8IGRlc2NyaXB0b3I/LnRpdGxlXCIgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcHRpb25UZW1wbGF0ZTsgZWxzZSBjb21wb25lbnRPckRlZmF1bHRDYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcHRpb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbXBvbmVudE9yRGVmYXVsdENhcHRpb24+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNhcHRpb25Db21wb25lbnQ7IGVsc2UgZGVmYXVsdENhcHRpb25cIiBbbW5nQ29tcG9uZW50XT1cImNhcHRpb25Db21wb25lbnRcIiAoaW5zdGFuY2VDcmVhdGVkKT1cIm9uQ2FwdGlvbkNtcEluc3QoJGV2ZW50KVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENhcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cInAtMCBtLTBcIj57eyBkZXNjcmlwdG9yPy50aXRsZSB9fTwvaDU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICAgICAgPHRyICpuZ0lmPVwiIWRlc2NyaXB0b3I/LmhpZGVIZWFkZXJcIiBjbGFzcz1cIm1uZy10YWJsZS1oZWFkZXJcIiBbY2xhc3NdPVwiZGVzY3JpcHRvcj8uaGVhZGVyQ2xhc3NOYW1lXCI+XG4gICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwic2VsZWN0aW9uRW5hYmxlZCAmJiBzZWxlY3Rpb25Nb2RlID09PSAnbXVsdGlwbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj48L3RoPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNWaXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLmRlc2NyaXB0b3IudGl0bGUgPz8gKGNvbC5kZXNjcmlwdG9yLnByb3BlcnR5IHwgaTE4blByb3BlcnR5IDogZGVzY3JpcHRvciEubW9kZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eVwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2wuZGVzY3JpcHRvci50aXRsZSA/PyAoY29sLmRlc2NyaXB0b3IucHJvcGVydHkgfCBpMThuUHJvcGVydHkgOiBkZXNjcmlwdG9yIS5tb2RlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5kZXNjcmlwdG9yLmlzUmVvcmRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVvcmRlcmFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCIhY29sLmRlc2NyaXB0b3IuaXNTb3J0RW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/IGNvbC53aWR0aCArICdweCcgOiBjb2wuZGVzY3JpcHRvci53aWR0aCArICclJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlc2NyaXB0b3IuaGVhZGVyQ2xhc3NOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sLmRlc2NyaXB0b3IuaXNTb3J0RW5hYmxlZCA/IHNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZSA6IG5vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5kZXNjcmlwdG9yLmlzUmVvcmRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmRlc2NyaXB0b3IucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCIhY29sLmRlc2NyaXB0b3IuaXNTb3J0RW5hYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aCA/IGNvbC53aWR0aCArICdweCcgOiBjb2wuZGVzY3JpcHRvci53aWR0aCArICclJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wud2lkdGggPz8gY29sLmRlc2NyaXB0b3IubWF4V2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlc2NyaXB0b3IuaGVhZGVyQ2xhc3NOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlckRpc3BsYXkgPT09IGZpbHRlckRpc3BsYXlSb3cgJiYgaGFzQ29sdW1uRmlsdGVycyAmJiBjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcgbW5nLWNvbHVtbi1maWx0ZXItJyArIGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3IuZmlsdGVyVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sLmRlc2NyaXB0b3IuaXNTb3J0RW5hYmxlZCA/IHNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZSA6IG5vblNvcnRhYmxlQ29sdW1uVEhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0lubGluZUFjdGlvbnNDb2x1bW4gfHwgYXJlQ29sdW1uc1RvZ2dsZWFibGUgfHwgYXJlQ29sdW1uc1Jlb3JkZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5BY3Rpb25NaW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJkZXNjcmlwdG9yPy5hY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGFsaWduRnJvemVuPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICNjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhcmVDb2x1bW5zVG9nZ2xlYWJsZSB8fCBhcmVDb2x1bW5zUmVvcmRlcmFibGUgfHwgZGVzY3JpcHRvcj8uaGFzUmVzaXphYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBtbmctdGFibGUtY29sdW1ucy1tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uRGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2aXNpYmxlQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ21uZ1RhYmxlLmFkanVzdFRhYmxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRMYWJlbD1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkljb249XCJwaSBwaS1zbGlkZXJzLWhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlTZWxlY3RlZExhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNvbHVtblRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY2hlY2tib3ggcC1jb21wb25lbnQgbWwtMVwiIFtuZ0NsYXNzXT1cInsncC1jaGVja2JveC1kaXNhYmxlZCc6ICFhcmVDb2x1bW5zVG9nZ2xlYWJsZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaGlkZGVuLWFjY2Vzc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsQ2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0Lm9uSGVhZGVyQ2hlY2tib3hGb2N1cygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5vbkhlYWRlckNoZWNrYm94Qmx1cigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC50b2dnbGVBbGwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhcmVDb2x1bW5zVG9nZ2xlYWJsZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtY2hlY2tib3gtYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsQ2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AtaGlnaGxpZ2h0JzogY29sdW1uVG9nZ2xlTXVsdGlzZWxlY3QuYWxsQ2hlY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncC1mb2N1cyc6IGNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LmhlYWRlckNoZWNrYm94Rm9jdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AtZGlzYWJsZWQnOiAhYXJlQ29sdW1uc1RvZ2dsZWFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbHVtblRvZ2dsZU11bHRpc2VsZWN0LnRvZ2dsZUFsbCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtY2hlY2tib3gtaWNvblwiIFtuZ0NsYXNzXT1cInsncGkgcGktY2hlY2snOiBjb2x1bW5Ub2dnbGVNdWx0aXNlbGVjdC5hbGxDaGVja2VkfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1yZXBsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidtbmdUYWJsZS5yZXNldExheW91dCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RGVmYXVsdExheW91dCgpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwiaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGVzY3JpcHRvci50aXRsZSA/PyAoaXRlbS5kZXNjcmlwdG9yLnByb3BlcnR5IHwgaTE4blByb3BlcnR5IDogZGVzY3JpcHRvciEubW9kZWwpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJkZXNjcmlwdG9yPy5maWx0ZXJEaXNwbGF5ID09PSBmaWx0ZXJEaXNwbGF5Um93ICYmIGhhc0NvbHVtbkZpbHRlcnNcIiBjbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gV2UgbmVlZCB0aGUgbGluZSBiZWxvdywgYmVjYXVzZSBvdGhlcndpc2UgcC10YWJsZVJhZGlvQnV0dG9uIHNoaWZ0cyB0aGUgcmVzdCBvZiB0aGUgY29sdW1ucyBpbiB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj48L3RoPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaXNWaXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvciA/ICdtbmctY29sdW1uLWZpbHRlci0nICsgY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvci5maWx0ZXJUeXBlICsgJyAnIDogJyAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvcj8uY29sdW1uQ2xhc3NOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvcj8uY29sdW1uV2lkdGggPz8gY29sLmRlc2NyaXB0b3Iud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yPy5jb2x1bW5NaW5XaWR0aCA/PyBjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC5kZXNjcmlwdG9yLm1heFdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiICpuZ0lmPVwiY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLWZpbHRlciBbZGlzcGxheV09XCJkZXNjcmlwdG9yIS5maWx0ZXJEaXNwbGF5XCIgW2Rlc2NyaXB0b3JdPVwiY29sLmRlc2NyaXB0b3IuZmlsdGVyRGVzY3JpcHRvclwiPjwvbW5nLXRhYmxlLWNvbHVtbi1maWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93SW5saW5lQWN0aW9uc0NvbHVtbiB8fCBhcmVDb2x1bW5zVG9nZ2xlYWJsZSB8fCBhcmVDb2x1bW5zUmVvcmRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbkFjdGlvbk1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxuICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImRlc2NyaXB0b3I/LmFjdGlvbkNvbHVtbkZyb3plbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25Gcm96ZW49XCJyaWdodFwiPjwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWlkeD1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInJvd0hlaWdodFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZGVzY3JpcHRvcj8ucm93Q2xhc3NOYW1lIHwgbW5nQ2xhc3NNYXBQaXBlIDogZGVzY3JpcHRvcj8ucm93Q2xhc3NOYW1lTWFwRm4gOiBpdGVtIHwgbW5nTG9jYWxlRGVmYXVsdFJvd0NsYXNzIDogZGVzY3JpcHRvciA6IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZSdcIiBzdHlsZT1cIm1pbi13aWR0aDogMzZweFwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJkZXNjcmlwdG9yPy5zZWxlY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCI+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25FbmFibGVkICYmIHNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnXCIgc3R5bGU9XCJtaW4td2lkdGg6IDM2cHhcIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiZGVzY3JpcHRvcj8uc2VsZWN0aW9uQ29sdW1uRnJvemVuID8/IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGVSYWRpb0J1dHRvbiBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZVJhZGlvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5pc1Zpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2VsbENsaWNrKCRldmVudCwgY29sLmRlc2NyaXB0b3IsIGl0ZW0sIGlkeClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2wuZGVzY3JpcHRvci5jbGFzc05hbWUgfCBtbmdDbGFzc01hcFBpcGUgOiBjb2wuZGVzY3JpcHRvci5jbGFzc05hbWVNYXBGbiA6IGl0ZW0pICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3JpcHRvcj8uZmlsdGVyRGlzcGxheSA9PT0gZmlsdGVyRGlzcGxheVJvdyAmJiBoYXNDb2x1bW5GaWx0ZXJzICYmIGNvbC5kZXNjcmlwdG9yLmZpbHRlckRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnIG1uZy1jb2x1bW4tZmlsdGVyLScgKyBjb2wuZGVzY3JpcHRvci5maWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpY2thYmxlXT1cImlzQ29sdW1uQ2xpY2thYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGggPyBjb2wud2lkdGggKyAncHgnIDogY29sLmRlc2NyaXB0b3Iud2lkdGggKyAnJSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wuZGVzY3JpcHRvci5taW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbC53aWR0aCA/PyBjb2wuZGVzY3JpcHRvci5tYXhXaWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5kZXNjcmlwdG9yLnRpdGxlID8/IChjb2wuZGVzY3JpcHRvci5wcm9wZXJ0eSB8IGkxOG5Qcm9wZXJ0eSA6IGRlc2NyaXB0b3IhLm1vZGVsKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctdGFibGUtY29sdW1uLXZhbHVlIFtkZXNjcmlwdG9yXT1cImNvbC5kZXNjcmlwdG9yXCIgW2l0ZW1dPVwiaXRlbVwiPjwvbW5nLXRhYmxlLWNvbHVtbi12YWx1ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93SW5saW5lQWN0aW9uc0NvbHVtbiB8fCBhcmVDb2x1bW5zVG9nZ2xlYWJsZSB8fCBhcmVDb2x1bW5zUmVvcmRlcmFibGVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi1hY3Rpb24ganVzdGlmeS1jb250ZW50LWVuZCB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW5BY3Rpb25NaW5XaWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJkZXNjcmlwdG9yPy5hY3Rpb25Db2x1bW5Gcm96ZW4gPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGFsaWduRnJvemVuPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbkFjdGlvblRlbXBsYXRlOyBlbHNlIHNob3dDb2x1bW5BY3Rpb25Db21wb25lbnRPckRlZmF1bHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW5BY3Rpb25UZW1wbGF0ZTsgY29udGV4dDoge3Jvd0l0ZW06IGl0ZW0sIHJvd0luZGV4OiBpZHh9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dDb2x1bW5BY3Rpb25Db21wb25lbnRPckRlZmF1bHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uQWN0aW9uQ29tcG9uZW50OyBlbHNlIGRlZmF1bHRDb2x1bW5BY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW5nQ29tcG9uZW50XT1cImNvbHVtbkFjdGlvbkNvbXBvbmVudCFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZUNyZWF0ZWQpPVwib25Db2x1bW5BY3Rpb25DbXBJbnN0KCRldmVudClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbHVtbkFjdGlvbnM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2Ygcm93SW5saW5lQWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbl09XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aWV3Q29udGFpbmVyXT1cInZpZXdDb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtob3N0Q29tcG9uZW50XT1cInRoaXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtSWRdPVwiZGVzY3JpcHRvcj8ubW9kZWw/LmlkUHJvcGVydHlOYW1lID8gaXRlbVtkZXNjcmlwdG9yIS5tb2RlbCEuaWRQcm9wZXJ0eU5hbWUhXSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntpdGVtSW5kZXg6IGlkeH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2gpPVwib25BY3Rpb25GaW5pc2goJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctYWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJsb2FkaW5naWNvblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIid0ZXh0LXdoaXRlIHRleHQtNHhsIHBpLXNwaW4gJyArIGRlc2NyaXB0b3I/LmxvYWRpbmdJY29uXCIgKm5nSWY9XCJkZXNjcmlwdG9yPy5sb2FkaW5nSWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCB0ZXh0LXdoaXRlIHRleHQtbGcgZm9udC1zZW1pYm9sZFwiIFtuZ0NsYXNzXT1cInsnbXQtMyc6IGRlc2NyaXB0b3I/LmxvYWRpbmdJY29ufVwiICpuZ0lmPVwiZGVzY3JpcHRvcj8ubG9hZGluZ1RleHRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGVzY3JpcHRvcj8ubG9hZGluZ1RleHQgPz8gJycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJsb2FkaW5nYm9keVwiPlxuICAgICAgICAgICAgPHRyIFtzdHlsZS5oZWlnaHQucHhdPVwicm93SGVpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiKGRlc2NyaXB0b3I/LmNvbHVtbnM/Lmxlbmd0aCA/PyAwKSArIChzaG93SW5saW5lQWN0aW9uc0NvbHVtbiA/IDEgOiAwKSArIChzZWxlY3Rpb25FbmFibGVkID8gMSA6IDApXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gW25nU3R5bGVdPVwie3dpZHRoOiAnMTAwJSd9XCI+PC9wLXNrZWxldG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICAgICAgICAgIDx0ciBbc3R5bGUuaGVpZ2h0LnB4XT1cInJvd0hlaWdodFwiPlxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cIihkZXNjcmlwdG9yPy5jb2x1bW5zPy5sZW5ndGggPz8gMCkgKyAoc2hvd0lubGluZUFjdGlvbnNDb2x1bW4gPyAxIDogMCkgKyAoc2VsZWN0aW9uRW5hYmxlZCA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnbW5nVGFibGUubm9JdGVtcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJmb290ZXJUZW1wbGF0ZVwiIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9vdGVyVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3F1ZXJ5UmVzdWx0OiBxdWVyeVJlc3VsdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3AtdGFibGU+XG48L2Rpdj5cbiJdfQ==