@ohioepa/oepa-ui-lib 1.4.9 → 1.4.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/oepa-user-account/oepa-user-account.service.mjs +2 -2
- package/esm2022/lib/table/p-table/p-table.component.mjs +3 -3
- package/fesm2022/ohioepa-oepa-ui-lib.mjs +3 -3
- package/fesm2022/ohioepa-oepa-ui-lib.mjs.map +1 -1
- package/ohioepa-oepa-ui-lib-1.4.11.tgz +0 -0
- package/package.json +1 -1
- package/ohioepa-oepa-ui-lib-1.4.9.tgz +0 -0
|
@@ -810,11 +810,11 @@ export class PTableComponent {
|
|
|
810
810
|
this.customBtn2Clicked.emit();
|
|
811
811
|
}
|
|
812
812
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PTableComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.TableService }, { token: i3.TableExportService }, { token: i4.OepaFileUtilService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
813
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PTableComponent, selector: "oepa-p-table", inputs: { tableId: "tableId", allowEdit: "allowEdit", config: "config", complexHeader: "complexHeader", header: "header", customBtnLabel: "customBtnLabel", customBtnVisible: "customBtnVisible", customBtnEnabled: "customBtnEnabled", customBtnLabel2: "customBtnLabel2", customBtnVisible2: "customBtnVisible2", customBtnEnabled2: "customBtnEnabled2", small: "small", data: "data", totalRow: "totalRow" }, outputs: { cellClicked: "cellClicked", actionClicked: "actionClicked", rowSelected: "rowSelected", customBtnClicked: "customBtnClicked", customBtn2Clicked: "customBtn2Clicked" }, ngImport: i0, template: "<div *ngIf=\"!config.hideTable\">\n <form *ngIf=\"hiddenColumns.length > 0\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\"\n [id]=\"tableId+'_UnhideColumnSelect'\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n </form>\n\n <div ngClass=\"{{config.divClassName || ''}}\">\n <p-table [columns]=\"visibleColumns\" [value]=\"rows\" \n [scrollable]=\"config.verticalScroll\" [scrollHeight]=\"config.scrollHeight\"\n [tableStyle]=\"{'min-width': '50rem'}\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\">\n <span>\n <i (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\"\n [tooltip]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\" placement=\"right\">\n </i>\n </span>\n </th>\n <ng-template ngFor let-col [ngForOf]=\"hdr.columns\" let-i=\"index\">\n <th *ngIf=\"!col.hidden && col.frozenColumn\" pFrozenColumn ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n <th *ngIf=\"!col.hidden && !col.frozenColumn\" ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n </ng-template>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-r=\"rowIndex\" let-columns=\"columns\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\"></i>\n <i (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\"\n [tooltip]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\" placement=\"right\">\n </i>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\"\n [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\"> </td>\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&!col.frozenColumn\"\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&col.frozenColumn\" pFrozenColumn\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <!-- Table footer -->\n <form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n <div class=\"form-group row\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\"\n [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\"\n (tableChanged)=\"onFilterChanged($event)\" [id]=\"tableId+'_FilterAllColumnsInput'\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n <span class=\"badge bg-secondary\">{{_data.length}}</span> total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-2 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\" *ngIf=\"allowEdit\">\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"btn-group\" dropdown>\n <button id=\"exportBtn\" dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\"\n aria-controls=\"dropdown-basic\">\n Export <span class=\"caret\"></span>\n <ul id=\"export-dropdown\" *dropdownMenu class=\"dropdown-menu\">\n <li *ngIf=\"config.exportToExcel\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToExcel()\">Export to Excel</a></li>\n <li *ngIf=\"config.exportToHTML\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToHTML()\">Export\n to HTML</a></li>\n </ul>\n </button>\n </div>\n <button *ngIf=\"customBtnVisible\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtnClick()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\">{{customBtnLabel}}</button>\n <button *ngIf=\"customBtnVisible2\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtn2Click()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled2\">{{customBtnLabel2}}</button>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-9\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\"\n [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\" [(ngModel)]=\"currentPage\"\n name=\"currentTablePage\" [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\"\n (numPages)=\"pageInfo.numPages = $event\">\n </pagination>\n </div>\n <div class=\"col-sm-3\">\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm me-1\">{{ paginationOn ?\n 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data: \n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\"\n id=\"exportVisibleOnlyCheckbox\" />\n \n </span>\n <span *ngIf=\"hasSelectableColumn()\">Include unselected rows in export: \n <input type=\"checkbox\" [checked]=\"exportUnselectedRows\" (click)=\"toggleExportUnselectedRows()\"\n id=\"exportUnselectedRowsCheckbox\" />\n </span>\n </div>\n </div>\n </form>\n</div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i9.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i9.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i9.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "component", type: i10.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: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i10.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i4.OepaTemplateComponent, selector: "cml-template", inputs: ["templateInfo"] }, { kind: "component", type: i12.TableDataCellComponent, selector: "oepa-table-data-cell", inputs: ["col", "row", "i", "r", "tableId"], outputs: ["onCellClick", "onToggleRowSelection", "onSingleRowSelection", "onActionClick"] }, { kind: "component", type: i13.TableHeaderCellComponent, selector: "oepa-table-header-cell", inputs: ["column", "tableId", "allRowsSelected", "rowCount", "noFiltersSubject"], outputs: ["onToggleAllRowsSelection", "onSortChanged", "onHideColumn", "onFilterChanged"] }, { kind: "directive", type: i14.OepaTableFilteringDirective, selector: "[oepaTableFiltering]", inputs: ["oepaTableFiltering", "tableId"], outputs: ["tableChanged"] }, { kind: "pipe", type: i15.OepaTableCellColSpanPipe, name: "cellColspan" }, { kind: "pipe", type: i16.OepaTableCellClassnamePipe, name: "cellClassname" }] });
|
|
813
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PTableComponent, selector: "oepa-p-table", inputs: { tableId: "tableId", allowEdit: "allowEdit", config: "config", complexHeader: "complexHeader", header: "header", customBtnLabel: "customBtnLabel", customBtnVisible: "customBtnVisible", customBtnEnabled: "customBtnEnabled", customBtnLabel2: "customBtnLabel2", customBtnVisible2: "customBtnVisible2", customBtnEnabled2: "customBtnEnabled2", small: "small", data: "data", totalRow: "totalRow" }, outputs: { cellClicked: "cellClicked", actionClicked: "actionClicked", rowSelected: "rowSelected", customBtnClicked: "customBtnClicked", customBtn2Clicked: "customBtn2Clicked" }, ngImport: i0, template: "<div *ngIf=\"!config.hideTable\">\n <form *ngIf=\"hiddenColumns.length > 0\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\"\n [id]=\"tableId+'_UnhideColumnSelect'\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n </form>\n\n <div ngClass=\"{{config.divClassName || ''}}\">\n <p-table [columns]=\"visibleColumns\" [value]=\"rows\" \n [scrollable]=\"config.verticalScroll\" [scrollHeight]=\"config.scrollHeight\"\n [tableStyle]=\"{'min-width': '50rem'}\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\">\n <span>\n <i (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\"\n [tooltip]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\" placement=\"right\">\n </i>\n </span>\n </th>\n <ng-template ngFor let-col [ngForOf]=\"hdr.columns\" let-i=\"index\">\n <th *ngIf=\"!col.hidden && col.frozenColumn\" pFrozenColumn ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n <th *ngIf=\"!col.hidden && !col.frozenColumn\" ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n </ng-template>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-r=\"rowIndex\" let-columns=\"columns\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\"></i>\n <i (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\"\n [tooltip]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\" placement=\"right\">\n </i>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\"\n [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\"> </td>\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&!col.frozenColumn\"\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&col.frozenColumn\" pFrozenColumn\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <!-- Table footer -->\n <form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n <div class=\"form-group row\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\"\n [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\"\n (tableChanged)=\"onFilterChanged($event)\" [id]=\"tableId+'_FilterAllColumnsInput'\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n <span class=\"badge bg-secondary\">{{_data.length}}</span> total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-2 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\" *ngIf=\"allowEdit\">\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"btn-group\" dropdown>\n <button id=\"exportBtn\" dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\"\n aria-controls=\"dropdown-basic\">\n Export <span class=\"caret\"></span>\n <ul id=\"export-dropdown\" *dropdownMenu class=\"dropdown-menu\">\n <li *ngIf=\"config.exportToExcel\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToExcel()\">Export to Excel</a></li>\n <li *ngIf=\"config.exportToHTML\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToHTML()\">Export\n to HTML</a></li>\n </ul>\n </button>\n </div>\n <button *ngIf=\"customBtnVisible\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtnClick()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\">{{customBtnLabel}}</button>\n <button *ngIf=\"customBtnVisible2\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtn2Click()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled2\">{{customBtnLabel2}}</button>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-9\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\"\n [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\" [(ngModel)]=\"currentPage\"\n name=\"currentTablePage\" [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\"\n (numPages)=\"pageInfo.numPages = $event\">\n </pagination>\n </div>\n <div class=\"col-sm-3\">\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm me-1\">{{ paginationOn ?\n 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"allowEdit && (config.exportToExcel || config.exportToHTML)\" class=\"col-sm-12 text-center\">\n <span>Export only visible data: \n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\"\n id=\"exportVisibleOnlyCheckbox\" />\n \n </span>\n <span *ngIf=\"hasSelectableColumn()\">Include unselected rows in export: \n <input type=\"checkbox\" [checked]=\"exportUnselectedRows\" (click)=\"toggleExportUnselectedRows()\"\n id=\"exportUnselectedRowsCheckbox\" />\n </span>\n </div>\n </div>\n </form>\n</div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i9.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i9.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i9.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "component", type: i10.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: i11.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i10.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i4.OepaTemplateComponent, selector: "cml-template", inputs: ["templateInfo"] }, { kind: "component", type: i12.TableDataCellComponent, selector: "oepa-table-data-cell", inputs: ["col", "row", "i", "r", "tableId"], outputs: ["onCellClick", "onToggleRowSelection", "onSingleRowSelection", "onActionClick"] }, { kind: "component", type: i13.TableHeaderCellComponent, selector: "oepa-table-header-cell", inputs: ["column", "tableId", "allRowsSelected", "rowCount", "noFiltersSubject"], outputs: ["onToggleAllRowsSelection", "onSortChanged", "onHideColumn", "onFilterChanged"] }, { kind: "directive", type: i14.OepaTableFilteringDirective, selector: "[oepaTableFiltering]", inputs: ["oepaTableFiltering", "tableId"], outputs: ["tableChanged"] }, { kind: "pipe", type: i15.OepaTableCellColSpanPipe, name: "cellColspan" }, { kind: "pipe", type: i16.OepaTableCellClassnamePipe, name: "cellClassname" }] });
|
|
814
814
|
}
|
|
815
815
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PTableComponent, decorators: [{
|
|
816
816
|
type: Component,
|
|
817
|
-
args: [{ selector: 'oepa-p-table', template: "<div *ngIf=\"!config.hideTable\">\n <form *ngIf=\"hiddenColumns.length > 0\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\"\n [id]=\"tableId+'_UnhideColumnSelect'\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n </form>\n\n <div ngClass=\"{{config.divClassName || ''}}\">\n <p-table [columns]=\"visibleColumns\" [value]=\"rows\" \n [scrollable]=\"config.verticalScroll\" [scrollHeight]=\"config.scrollHeight\"\n [tableStyle]=\"{'min-width': '50rem'}\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\">\n <span>\n <i (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\"\n [tooltip]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\" placement=\"right\">\n </i>\n </span>\n </th>\n <ng-template ngFor let-col [ngForOf]=\"hdr.columns\" let-i=\"index\">\n <th *ngIf=\"!col.hidden && col.frozenColumn\" pFrozenColumn ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n <th *ngIf=\"!col.hidden && !col.frozenColumn\" ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n </ng-template>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-r=\"rowIndex\" let-columns=\"columns\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\"></i>\n <i (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\"\n [tooltip]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\" placement=\"right\">\n </i>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\"\n [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\"> </td>\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&!col.frozenColumn\"\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&col.frozenColumn\" pFrozenColumn\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <!-- Table footer -->\n <form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n <div class=\"form-group row\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\"\n [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\"\n (tableChanged)=\"onFilterChanged($event)\" [id]=\"tableId+'_FilterAllColumnsInput'\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n <span class=\"badge bg-secondary\">{{_data.length}}</span> total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-2 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\" *ngIf=\"allowEdit\">\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"btn-group\" dropdown>\n <button id=\"exportBtn\" dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\"\n aria-controls=\"dropdown-basic\">\n Export <span class=\"caret\"></span>\n <ul id=\"export-dropdown\" *dropdownMenu class=\"dropdown-menu\">\n <li *ngIf=\"config.exportToExcel\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToExcel()\">Export to Excel</a></li>\n <li *ngIf=\"config.exportToHTML\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToHTML()\">Export\n to HTML</a></li>\n </ul>\n </button>\n </div>\n <button *ngIf=\"customBtnVisible\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtnClick()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\">{{customBtnLabel}}</button>\n <button *ngIf=\"customBtnVisible2\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtn2Click()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled2\">{{customBtnLabel2}}</button>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-9\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\"\n [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\" [(ngModel)]=\"currentPage\"\n name=\"currentTablePage\" [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\"\n (numPages)=\"pageInfo.numPages = $event\">\n </pagination>\n </div>\n <div class=\"col-sm-3\">\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm me-1\">{{ paginationOn ?\n 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"col-sm-12 text-center\">\n <span>Export only visible data: \n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\"\n id=\"exportVisibleOnlyCheckbox\" />\n \n </span>\n <span *ngIf=\"hasSelectableColumn()\">Include unselected rows in export: \n <input type=\"checkbox\" [checked]=\"exportUnselectedRows\" (click)=\"toggleExportUnselectedRows()\"\n id=\"exportUnselectedRowsCheckbox\" />\n </span>\n </div>\n </div>\n </form>\n</div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"] }]
|
|
817
|
+
args: [{ selector: 'oepa-p-table', template: "<div *ngIf=\"!config.hideTable\">\n <form *ngIf=\"hiddenColumns.length > 0\">\n <div class=\"row mb-2\">\n <label class=\"col-sm-2 col-form-label\">Show Hidden Columns:</label>\n <div class=\"col-sm-4\">\n <select class=\"form-select\" (change)=\"unhideColumn($any($event).target.value)\"\n [id]=\"tableId+'_UnhideColumnSelect'\">\n <option value=\"\">Choose a column</option>\n <option *ngFor=\"let col of hiddenColumns\" [value]=\"col.id\">{{col.title}}</option>\n </select>\n </div>\n </div>\n </form>\n\n <div ngClass=\"{{config.divClassName || ''}}\">\n <p-table [columns]=\"visibleColumns\" [value]=\"rows\" \n [scrollable]=\"config.verticalScroll\" [scrollHeight]=\"config.scrollHeight\"\n [tableStyle]=\"{'min-width': '50rem'}\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr *ngFor=\"let hdr of headerRows; let hr=index;\" role=\"row\">\n <th *ngIf=\"dataHasDetails && hr === 0\" [rowSpan]=\"headerRows.length\" class=\"detail-indicator-col\">\n <span>\n <i (click)=\"toggleAllDetails()\" [id]=\"tableId+'_ShowAllDetailsLink'\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': showAllDetails, 'bi-chevron-right': !showAllDetails}\"\n [tooltip]=\"(showAllDetails ? 'Hide' : 'Show') + ' details for all rows'\" placement=\"right\">\n </i>\n </span>\n </th>\n <ng-template ngFor let-col [ngForOf]=\"hdr.columns\" let-i=\"index\">\n <th *ngIf=\"!col.hidden && col.frozenColumn\" pFrozenColumn ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n <th *ngIf=\"!col.hidden && !col.frozenColumn\" ngClass=\"{{col.className || ''}}\"\n [colSpan]=\"col.colspan || 1\" [rowSpan]=\"col.rowspan || 1\">\n <oepa-table-header-cell [column]=\"col\" [tableId]=\"tableId\" [allRowsSelected]=\"allRowsSelected\"\n [rowCount]=\"rows.length\" [noFiltersSubject]=\"noFiltersSubject\"\n (onToggleAllRowsSelection)=\"toggleAllRowsSelection()\" (onSortChanged)=\"onSortChanged($event)\"\n (onHideColumn)=\"hideColumn($event)\" (onFilterChanged)=\"onFilterChanged($event)\">\n </oepa-table-header-cell>\n </th>\n </ng-template>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-row let-r=\"rowIndex\" let-columns=\"columns\">\n <!-- Data Row -->\n <tr>\n <td *ngIf=\"dataHasDetails\">\n <!-- Detail icon (if specified) -->\n <span *ngIf=\"row.showDetail === true || row.showDetail === false\">\n <i *ngIf=\"row.detailIconClassName\" [ngClass]=\"row.detailIconClassName\"></i>\n <i (click)=\"toggleRowDetail(row)\" [id]=\"tableId+'_ShowDetailLink_'+r\" class=\"bi\"\n [ngClass]=\"{'bi-chevron-down': row.showDetail, 'bi-chevron-right': !row.showDetail}\"\n [tooltip]=\"(row.showDetail ? 'Hide' : 'Show') + ' details for this row'\" placement=\"right\">\n </i>\n </span>\n </td>\n <!-- If row is a divider, it spans the whole table -->\n <td *ngIf=\"row.isDivider\" [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\"\n [ngClass]=\"row.dividerClassName || 'oepa-table-gray'\"> </td>\n <!-- Data Rows -->\n <ng-template *ngIf=\"!row.isDivider\" ngFor let-col [ngForOf]=\"dataColumns\" let-i=\"index\">\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&!col.frozenColumn\"\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n <td *ngIf=\"!col.hidden && (row|cellColspan:col) > 0 &&col.frozenColumn\" pFrozenColumn\n ngClass=\"{{row|cellClassname:col || ''}}\" [colSpan]=\"row|cellColspan:col\">\n <oepa-table-data-cell [col]=\"col\" [i]=\"i\" [row]=\"row\" [r]=\"r\" [tableId]=\"tableId\"\n (onActionClick)=\"onActionClick($event)\" (onCellClick)=\"cellClick($event)\"\n (onToggleRowSelection)=\"toggleRowSelection($event)\"\n (onSingleRowSelection)=\"singleRowSelection($event)\"></oepa-table-data-cell>\n </td>\n </ng-template>\n </tr>\n\n <!-- Detail Row -->\n <tr *ngIf=\"row.showDetail\" class=\"table-info\">\n <td [colSpan]=\"visibleColumnCount + (dataHasDetails ? 1 : 0)\">\n <cml-template [templateInfo]=\"row.detail\"></cml-template>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n <!-- Table footer -->\n <form *ngIf=\"!config.hideFooter || (data && pageInfo.itemsPerPage < data.length)\" class=\"form-horizontal\">\n <div class=\"form-group row\">\n <!-- Table-wide filter -->\n <div class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <input *ngIf=\"!config.hideGlobalFilter\" placeholder=\"Filter all columns\"\n [oepaTableFiltering]=\"{ filterString: '' }\" [tableId]=\"tableId\" class=\"form-control input-sm\"\n (tableChanged)=\"onFilterChanged($event)\" [id]=\"tableId+'_FilterAllColumnsInput'\" />\n </div>\n <div class=\"col-sm-6\">\n <span *ngIf=\"config.showRowCountInFooter && _data && _data.length > 0\">\n <span class=\"badge bg-secondary\">{{_data.length}}</span> total rows\n </span>\n </div>\n </div>\n </div>\n <!-- Export Buttons -->\n <div class=\"col-sm-2 d-flex justify-content-center\">\n <div class=\"row\">\n <div class=\"col-sm-12 text-center\" *ngIf=\"allowEdit\">\n <div *ngIf=\"config.exportToExcel || config.exportToHTML\" class=\"btn-group\" dropdown>\n <button id=\"exportBtn\" dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\"\n aria-controls=\"dropdown-basic\">\n Export <span class=\"caret\"></span>\n <ul id=\"export-dropdown\" *dropdownMenu class=\"dropdown-menu\">\n <li *ngIf=\"config.exportToExcel\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToExcel()\">Export to Excel</a></li>\n <li *ngIf=\"config.exportToHTML\" role=\"menuitem\"><a class=\"dropdown-item\"\n (click)=\"exportToHTML()\">Export\n to HTML</a></li>\n </ul>\n </button>\n </div>\n <button *ngIf=\"customBtnVisible\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtnClick()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled\">{{customBtnLabel}}</button>\n <button *ngIf=\"customBtnVisible2\" type=\"button\"\n ngClass=\"{{'btn btn-primary me-1' + (small ? ' btn-sm' : '')}}\" (click)=\"onCustomBtn2Click()\"\n [id]=\"tableId+'_CustomBtn'\" [disabled]=\"!customBtnEnabled2\">{{customBtnLabel2}}</button>\n </div>\n </div>\n </div>\n <!-- Pagination -->\n <div *ngIf=\"!config.disablePagination\" class=\"col-sm-5\">\n <div class=\"row\">\n <div class=\"col-sm-9\">\n <pagination *ngIf=\"paginationOn\" class=\"pagination-sm\" [totalItems]=\"pageInfo.length\"\n [itemsPerPage]=\"pageInfo.itemsPerPage\" [maxSize]=\"pageInfo.maxSize\" [(ngModel)]=\"currentPage\"\n name=\"currentTablePage\" [boundaryLinks]=\"true\" [rotate]=\"false\" (pageChanged)=\"onPageChanged($event)\"\n (numPages)=\"pageInfo.numPages = $event\">\n </pagination>\n </div>\n <div class=\"col-sm-3\">\n <button (click)=\"togglePagingation()\" type=\"button\" class=\"btn btn-default btn-sm me-1\">{{ paginationOn ?\n 'Show All Rows' : 'Restore Pagination'}}</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"allowEdit && (config.exportToExcel || config.exportToHTML)\" class=\"col-sm-12 text-center\">\n <span>Export only visible data: \n <input type=\"checkbox\" [checked]=\"exportVisibleOnly\" (click)=\"toggleExportVisibleOnly()\"\n id=\"exportVisibleOnlyCheckbox\" />\n \n </span>\n <span *ngIf=\"hasSelectableColumn()\">Include unselected rows in export: \n <input type=\"checkbox\" [checked]=\"exportUnselectedRows\" (click)=\"toggleExportUnselectedRows()\"\n id=\"exportUnselectedRowsCheckbox\" />\n </span>\n </div>\n </div>\n </form>\n</div>", styles: [".pagination{margin:0}th.oepa-table-header-center{text-align:center}.oepa-table-bold{font-weight:700}.oepa-table-italic{font-style:italic}.oepa-table-line-through{text-decoration:line-through}.oepa-table-gray{background-color:#ddd}td.oepa-undeline-cell{border-bottom:1pt solid black}.detail-indicator-col{width:30px}.action-btn-col{width:90px}.select-col{width:20px}\n"] }]
|
|
818
818
|
}], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: i2.TableService }, { type: i3.TableExportService }, { type: i4.OepaFileUtilService }, { type: i0.ElementRef }], propDecorators: { tableId: [{
|
|
819
819
|
type: Input
|
|
820
820
|
}], allowEdit: [{
|
|
@@ -854,4 +854,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
854
854
|
}], totalRow: [{
|
|
855
855
|
type: Input
|
|
856
856
|
}] } });
|
|
857
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3AtdGFibGUvcC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3AtdGFibGUvcC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QyxNQUFNLGVBQWUsQ0FBQztBQXFCN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUy9CLE1BQU0sT0FBTyxlQUFlO0lBNkpDO0lBQ2pCO0lBQ0E7SUFDQTtJQUNBO0lBaEtILGFBQWEsR0FBWSxLQUFLLENBQUM7SUFDL0IsVUFBVSxHQUEyQixFQUFFLENBQUM7SUFDeEMsSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDL0Isa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbkIsaUJBQWlCLEdBQXdCLEtBQUssQ0FBQztJQUMvQyxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEMsZ0JBQWdCLEdBQXFCLElBQUksT0FBTyxFQUFXLENBQUM7SUFFNUQsV0FBVyxHQUEyQixFQUFFLENBQUM7SUFDekMsY0FBYyxHQUEyQixFQUFFLENBQUM7SUFDNUMsYUFBYSxHQUEyQixFQUFFLENBQUM7SUFDM0MsYUFBYSxHQUFrQixFQUFFLENBQUM7SUFDbEMsS0FBSyxHQUF3QixFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFvQixFQUFFLENBQUM7SUFDOUIsY0FBYyxHQUEyQixDQUFDO1lBQ2hELFlBQVksRUFBRSxFQUFFO1lBQ2hCLFFBQVEsRUFBRSxTQUFTO1NB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RyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR1csV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLFdBQVc7c0JBQTNCLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNVLGlCQUFpQjtzQkFBakMsTUFBTTtnQkFvQ0ksSUFBSTtzQkFEZCxLQUFLO2dCQXVCRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3Q2hlY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5pbXBvcnQgeyBPZXBhVGFibGUgfSBmcm9tICcuLi9vZXBhLXRhYmxlJztcbmltcG9ydCB7IE9lcGFUYWJsZUNvbmZpZyB9IGZyb20gJy4uL29lcGEtdGFibGUtY29uZmlnJztcbmltcG9ydCB7IE9lcGFUYWJsZUhlYWRlciB9IGZyb20gJy4uL29lcGEtdGFibGUtaGVhZGVyJztcbmltcG9ydCB7IE9lcGFUYWJsZUNvbHVtbiB9IGZyb20gJy4uL29lcGEtdGFibGUtY29sdW1uJztcbmltcG9ydCB7IE9lcGFUYWJsZVJvdyB9IGZyb20gJy4uL29lcGEtdGFibGUtcm93JztcbmltcG9ydCB7IE9lcGFUYWJsZUNlbGwgfSBmcm9tICcuLi9vZXBhLXRhYmxlLWNlbGwnO1xuaW1wb3J0IHsgT2VwYVRhYmxlUGFnZUluZm8gfSBmcm9tICcuLi9vZXBhLXRhYmxlLXBhZ2UtaW5mbyc7XG5pbXBvcnQgeyBPZXBhVGFibGVDZWxsQ2xpY2tFdmVudCB9IGZyb20gJy4uL29lcGEtdGFibGUtY2VsbC1jbGljay1ldmVudCc7XG5cbmltcG9ydCB7IE9lcGFBY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uL2FjdGlvbi1idG4vb2VwYS1hY3Rpb24tZXZlbnQnO1xuXG5pbXBvcnQgeyBUYWJsZUV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi90YWJsZS1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBPZXBhVGVtcGxhdGVJbmZvIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4uL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2VwYVRhYmxlU29ydENyaXRlcmlvbiB9IGZyb20gJy4uL29lcGEtdGFibGUtc29ydC1jcml0ZXJpb24nO1xuaW1wb3J0IHsgUGFnZUNoYW5nZWRFdmVudCB9IGZyb20gJ25neC1ib290c3RyYXAvcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBPZXBhUENvbHVtbiB9IGZyb20gJy4uL29lcGEtcC1jb2x1bW4nO1xuaW1wb3J0IHsgVGFibGVEYXRhQ2VsbENsaWNrRXZlbnQgfSBmcm9tICcuLi90YWJsZS1kYXRhLWNlbGwvdGFibGUtZGF0YS1jZWxsLWNsaWNrLWV2ZW50JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9lcGFUYWJsZUZpbHRlciB9IGZyb20gJy4uL29lcGEtdGFibGUtZmlsdGVyJztcbmltcG9ydCB7IE9lcGFGaWxlVXRpbFNlcnZpY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLXAtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcC10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3AtdGFibGUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG4gIHB1YmxpYyBzaG93RmlsdGVyUm93OiBCb29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBoZWFkZXJSb3dzOiBBcnJheTxPZXBhVGFibGVIZWFkZXI+ID0gW107XG4gIHB1YmxpYyByb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gIHB1YmxpYyB2aXNpYmxlQ29sdW1uQ291bnQgPSAwO1xuICBwdWJsaWMgYWxsQ29sdW1uQ291bnQgPSAwO1xuICBwdWJsaWMgZXhwb3J0VmlzaWJsZU9ubHk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcbiAgcHVibGljIGV4cG9ydFVuc2VsZWN0ZWRSb3dzOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBub0ZpbHRlcnNTdWJqZWN0OiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBwdWJsaWMgZGF0YUNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgcHVibGljIHZpc2libGVDb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gIHB1YmxpYyBoaWRkZW5Db2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gIHB1YmxpYyBjb2x1bW5IZWFkZXJzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIHB1YmxpYyBfZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICBwcml2YXRlIF9jb25maWc6IE9lcGFUYWJsZUNvbmZpZyA9IHt9O1xuICBwcml2YXRlIGN1cnJlbnRGaWx0ZXJzOiBBcnJheTxPZXBhVGFibGVGaWx0ZXI+ID0gW3tcbiAgICBmaWx0ZXJTdHJpbmc6ICcnLFxuICAgIGNvbHVtbklkOiB1bmRlZmluZWRcbiAgfV07XG5cbiAgcHVibGljIGRhdGFIYXNEZXRhaWxzID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93QWxsRGV0YWlscyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBhbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgcGFnZUluZm86IE9lcGFUYWJsZVBhZ2VJbmZvID0ge1xuICAgIHBhZ2U6IDEsXG4gICAgaXRlbXNQZXJQYWdlOiAxMCxcbiAgICBtYXhTaXplOiA1LFxuICAgIG51bVBhZ2VzOiAxLFxuICAgIGxlbmd0aDogMFxuICB9O1xuICBwdWJsaWMgY3VycmVudFBhZ2UgPSAxO1xuICBwdWJsaWMgcGFnaW5hdGlvbk9uID0gdHJ1ZTtcblxuICBASW5wdXQoKSB0YWJsZUlkID0gJyc7XG4gIEBJbnB1dCgpIGFsbG93RWRpdCA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKGNvbmY6IE9lcGFUYWJsZUNvbmZpZykge1xuICAgIGlmICghY29uZi5jbGFzc05hbWUpIHtcbiAgICAgIGNvbmYuY2xhc3NOYW1lID0gJ3RhYmxlLXN0cmlwZWQgdGFibGUtYm9yZGVyZWQnO1xuICAgIH1cbiAgICBpZiAoY29uZi5jbGFzc05hbWVzKSB7XG4gICAgICBjb25mLmNsYXNzTmFtZSA9IGNvbmYuY2xhc3NOYW1lcy5qb2luKCcgJyk7XG4gICAgfVxuICAgIGlmIChjb25mLnJvd3NQZXJQYWdlKSB7XG4gICAgICB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZSA9IGNvbmYucm93c1BlclBhZ2U7XG4gICAgfVxuICAgIHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPSBjb25mLmV4cG9ydFZpc2libGVPbmx5O1xuICAgIHRoaXMuZXhwb3J0VW5zZWxlY3RlZFJvd3MgPSBjb25mLmV4cG9ydFVuc2VsZWN0ZWRSb3dzIHx8IGZhbHNlO1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmY7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBPZXBhVGFibGVDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbXBsZXhIZWFkZXIoaGRyczogQXJyYXk8T2VwYVRhYmxlSGVhZGVyPikge1xuICAgIHRoaXMucmVzZXRIZWFkZXJzKCk7XG4gICAgaWYgKGhkcnMgJiYgaGRycy5sZW5ndGgpIHtcbiAgICAgIGhkcnMuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgICAgdGhpcy5oZWFkZXJSb3dzLnB1c2godGhpcy5leHRyYWN0SW5uZXJDb2x1bW5zKGhkci5jb2x1bW5zKSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29sdW1uSGVhZGVycyA9IHRoaXMuZXh0cmFjdENvbHVtbkhlYWRlcnModGhpcy5oZWFkZXJSb3dzKTtcbiAgICAgIHRoaXMuZGF0YUNvbHVtbnMgPSB0aGlzLmV4dHJhY3REYXRhQ29sdW1ucyh0aGlzLmhlYWRlclJvd3MpO1xuICAgICAgdGhpcy5pbml0aWFsaXplSGlkZGVuQ29sdW1ucyh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGhlYWRlcihoZHI6IE9lcGFUYWJsZUhlYWRlcikge1xuICAgIHRoaXMucmVzZXRIZWFkZXJzKCk7XG4gICAgaWYgKGhkci5jb2x1bW5zICYmIGhkci5jb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93cy5wdXNoKHRoaXMuZXh0cmFjdElubmVyQ29sdW1ucyhoZHIuY29sdW1ucykpO1xuICAgIH1cbiAgICB0aGlzLmNvbHVtbkhlYWRlcnMgPSB0aGlzLmV4dHJhY3RDb2x1bW5IZWFkZXJzKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IHRoaXMuZXh0cmFjdERhdGFDb2x1bW5zKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgdGhpcy5pbml0aWFsaXplSGlkZGVuQ29sdW1ucyhmYWxzZSk7XG4gIH1cblxuICBASW5wdXQoKSBjdXN0b21CdG5MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjdXN0b21CdG5WaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGN1c3RvbUJ0bkVuYWJsZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBjdXN0b21CdG5MYWJlbDI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgY3VzdG9tQnRuVmlzaWJsZTIgPSBmYWxzZTtcbiAgQElucHV0KCkgY3VzdG9tQnRuRW5hYmxlZDIgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzbWFsbCA9IGZhbHNlO1xuXG4gIC8vIE91dHB1dHMgKEV2ZW50cylcbiAgQE91dHB1dCgpIHB1YmxpYyBjZWxsQ2xpY2tlZDogRXZlbnRFbWl0dGVyPE9lcGFUYWJsZUNlbGxDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBhY3Rpb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8T2VwYUFjdGlvbkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPEFycmF5PE9lcGFUYWJsZVJvdz4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGN1c3RvbUJ0bkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjdXN0b21CdG4yQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBwQ29sdW1uczogT2VwYVBDb2x1bW5bXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVzZXRIZWFkZXJzKCkge1xuICAgIHRoaXMuaGVhZGVyUm93cyA9IFtdO1xuICAgIHRoaXMuY29sdW1uSGVhZGVycyA9IFtdO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gW107XG4gICAgdGhpcy5wQ29sdW1ucyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplSGlkZGVuQ29sdW1ucyhjb21wbGV4SGVhZGVyOiBib29sZWFuKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQgPSAwO1xuICAgIHRoaXMuYWxsQ29sdW1uQ291bnQgPSAwO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb2x1bW4uZmllbGQgPSBjb2x1bW4uaWQ7XG4gICAgICBjb2x1bW4uaGVhZGVyID0gY29sdW1uLnRpdGxlO1xuICAgICAgaWYgKGNvbXBsZXhIZWFkZXIgJiYgKGNvbHVtbj8uaGlkZGVuID09PSB0cnVlIHx8IGNvbHVtbj8uaGlkZGVuID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignZGlzYWJsaW5nIGhpZGRlbiBhdHRyaWJ1dGUgZm9yIGNvbHVtbjogJyArIGNvbHVtbi5pZCArXG4gICAgICAgICAgJy4gSGlkZGVuIGNvbHVtbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbXBsZXggaGVhZGVycyAoeWV0KS4nKTtcbiAgICAgICAgY29sdW1uLmhpZGRlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICB9IGVsc2UgaWYgKGNvbHVtbj8uaGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuaGlkZGVuQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgICAgIH1cbiAgICAgIHRoaXMuYWxsQ29sdW1uQ291bnQrKztcbiAgICB9KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZXM6IEFycmF5PE9lcGFUYWJsZVJvdz4pIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgdGhpcy5fZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLnRhYmxlU2VydmljZS5nZXREYXRhKHRoaXMudGFibGVJZCkgfHwgW107XG4gICAgfVxuICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlc1tpXS5wcml2YXRlSWQgPSBpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuY2xlYXJQYWdlSW5mbyh0aGlzLnRhYmxlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2RhdGEgPSB2YWx1ZXM7XG4gICAgdGhpcy50YWJsZVNlcnZpY2Uuc2V0RGF0YSh0aGlzLnRhYmxlSWQsIHRoaXMuX2RhdGEpO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5tYXAoeCA9PiBPYmplY3QuYXNzaWduKHt9LCB4KSk7XG4gIH1cblxuICBASW5wdXQoKSB0b3RhbFJvdzogT2VwYVRhYmxlUm93IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YWJsZUV4cG9ydFNlcnZpY2U6IFRhYmxlRXhwb3J0U2VydmljZSxcbiAgICBwcml2YXRlIGZpbGVVdGlsU2VydmljZTogT2VwYUZpbGVVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25PbiA9ICF0aGlzLl9jb25maWcuZGlzYWJsZVBhZ2luYXRpb247XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmNsYXNzTmFtZSAhPT0gJycpIHtcbiAgICAgICQoJ3RhYmxlJykuYWRkQ2xhc3MoJ3RhYmxlICcgKyB0aGlzLmNvbmZpZy5jbGFzc05hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdElubmVyQ29sdW1ucyhpbm5lcjogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPik6IE9lcGFUYWJsZUhlYWRlciB7XG4gICAgY29uc3QgaGVhZGVyOiBPZXBhVGFibGVIZWFkZXIgPSB7IGNvbHVtbnM6IFtdIH07XG4gICAgaW5uZXIuZm9yRWFjaCgodmFsdWU6IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sdW1uID0gaGVhZGVyLmNvbHVtbnMuZmluZCgoY29sOiBPZXBhVGFibGVDb2x1bW4pID0+IGNvbC5pZCA9PT0gdmFsdWUuaWQpO1xuICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAvLyBvdmVyd3JpdGUgcmVwZWF0ZWQgY29sdW1uXG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICBoZWFkZXIuY29sdW1ucy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0Q29sdW1uSGVhZGVycyhoZWFkZXJSb3dzOiBBcnJheTxPZXBhVGFibGVIZWFkZXI+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgaGVhZGVyczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGxldCByb3dJbmRleCA9IDA7XG4gICAgY29uc3QgY2hpbGRDb2x1bW5zOiBhbnkgPSB7fTtcbiAgICBoZWFkZXJSb3dzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICBsZXQgY29sSW5kZXggPSAwO1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKHJvd0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgaGVhZGVycy5wdXNoKGNvbHVtbi50aXRsZSk7XG4gICAgICAgICAgaWYgKGNvbHVtbi5jb2xzcGFuKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb3VudCA9IDE7IGNvdW50IDwgY29sdW1uLmNvbHNwYW47IGNvdW50KyspIHtcbiAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbHVtbi5yb3dzcGFuKSB7XG4gICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdID0gY29sdW1uLnJvd3NwYW4gLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aGlsZSAoY2hpbGRDb2x1bW5zW2NvbEluZGV4XSAmJiBjaGlsZENvbHVtbnNbY29sSW5kZXhdID4gMCkge1xuICAgICAgICAgICAgY2hpbGRDb2x1bW5zW2NvbEluZGV4XS0tO1xuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaGVhZGVyc1tjb2xJbmRleF0gKz0gJyAnICsgY29sdW1uLnRpdGxlO1xuICAgICAgICAgIGlmIChjb2x1bW4uY29sc3Bhbikge1xuICAgICAgICAgICAgZm9yIChsZXQgY291bnQgPSAxOyBjb3VudCA8IGNvbHVtbi5jb2xzcGFuOyBjb3VudCsrKSB7XG4gICAgICAgICAgICAgIGNvbEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbEluZGV4Kys7XG4gICAgICB9KTtcbiAgICAgIHJvd0luZGV4Kys7XG4gICAgfSk7XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuXG4gIHByaXZhdGUgZXh0cmFjdERhdGFDb2x1bW5zKGhlYWRlclJvd3M6IEFycmF5PE9lcGFUYWJsZUhlYWRlcj4pOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+IHtcbiAgICBjb25zdCBkYXRhQ29sdW1uczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIGxldCByb3dJbmRleCA9IDA7XG4gICAgY29uc3QgY2hpbGRDb2x1bW5zOmFueSA9IHt9O1xuICAgIGhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGxldCBjb2xJbmRleCA9IDA7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAocm93SW5kZXggPT09IDApIHtcbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4gJiYgY29sdW1uLmNvbHNwYW4gPiAxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb3VudCA9IDA7IGNvdW50IDwgY29sdW1uLmNvbHNwYW47IGNvdW50KyspIHtcbiAgICAgICAgICAgICAgZGF0YUNvbHVtbnMucHVzaCh7aWQ6ICcnLHRpdGxlOiAnJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sSW5kZXggKz0gKGNvbHVtbi5jb2xzcGFuIC0gMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4ucm93c3Bhbikge1xuICAgICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdID0gY29sdW1uLnJvd3NwYW4gLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aGlsZSAoY2hpbGRDb2x1bW5zW2NvbEluZGV4XSAmJiBjaGlsZENvbHVtbnNbY29sSW5kZXhdID4gMCkge1xuICAgICAgICAgICAgY2hpbGRDb2x1bW5zW2NvbEluZGV4XS0tO1xuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbHVtbi5jb2xzcGFuICYmIGNvbHVtbi5jb2xzcGFuID4gMSkge1xuICAgICAgICAgICAgY29sSW5kZXggKz0gKGNvbHVtbi5jb2xzcGFuIC0gMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFDb2x1bW5zW2NvbEluZGV4XSA9IGNvbHVtbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sSW5kZXgrKztcbiAgICAgIH0pO1xuICAgICAgcm93SW5kZXgrKztcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YUNvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpemUoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChodG1sKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgYW55IGZpbHRlcnMgYXJlIHNldFxuICAgKi9cbiAgcHVibGljIG5vRmlsdGVycygpOiBib29sZWFuIHtcbiAgICBsZXQgbm9GaWx0ZXJzID0gdHJ1ZTtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyU3RyaW5nICYmIGZpbHRlci5maWx0ZXJTdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBub0ZpbHRlcnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5vRmlsdGVyc1N1YmplY3QubmV4dChub0ZpbHRlcnMpO1xuICAgIHJldHVybiBub0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGdsb2JhbCBmaWx0ZXIgc3RyaW5nIChpZiBhbnkpIGFzIGEgUmVnRXhwXG4gICAqL1xuICBwcml2YXRlIGdldEdsb2JhbEZpbHRlcigpOiBSZWdFeHAgfCB1bmRlZmluZWQge1xuICAgIGxldCByZWdFeHA6IFJlZ0V4cCB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGlmICghZmlsdGVyLmNvbHVtbklkICYmIGZpbHRlci5maWx0ZXJTdHJpbmcgJiYgZmlsdGVyLmZpbHRlclN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlZ0V4cCA9IG5ldyBSZWdFeHAoZmlsdGVyLmZpbHRlclN0cmluZywgJ2knKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVnRXhwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBmaWx0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uIChpZiBhbnkpIGFzIGEgUmVnRXhwLlxuICAgKiBAcGFyYW0gY29sdW1uSWRcbiAgICovXG4gIHByaXZhdGUgZ2V0RmlsdGVyRm9yQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBSZWdFeHAgfCB1bmRlZmluZWQge1xuICAgIGxldCByZWdFeHA6IFJlZ0V4cCB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGlmIChmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkICYmIGZpbHRlci5maWx0ZXJTdHJpbmcgJiYgZmlsdGVyLmZpbHRlclN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlZ0V4cCA9IG5ldyBSZWdFeHAoZmlsdGVyLmZpbHRlclN0cmluZywgJ2knKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVnRXhwO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciB0aGUgdGFibGUgZGF0YSBwcm92aWRlZCBieSB0aGUgZ2xvYmFsIG9yIGNvbHVtbi1zcGVjaWZpY1xuICAgKiBmaWx0ZXJzIHNldCBpbiB0aGUgVUkuXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBwcml2YXRlIGZpbHRlckRhdGEoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93Pik6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIC8vIGRvbid0IGF0dGVtcHQgZmlsdGVyaW5nIGlmIHRoZXJlIGFyZSBubyBmaWx0ZXJzIHNldFxuICAgIGlmICh0aGlzLm5vRmlsdGVycygpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgbGV0IGZpbHRlcmVkRGF0YTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IGRhdGE7XG4gICAgY29uc3QgdGVtcEFycmF5OiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gICAgZmlsdGVyZWREYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBsZXQgZmxhZyA9IHRoaXMuZmlsdGVyQnlDb2x1bW5GaWx0ZXJzKHJvdyk7XG4gICAgICBpZiAoZmxhZykge1xuICAgICAgICBmbGFnID0gdGhpcy5maWx0ZXJCeUdsb2JhbEZpbHRlcihyb3cpO1xuICAgICAgfVxuICAgICAgaWYgKGZsYWcgfHwgcm93LmlzRGl2aWRlcikge1xuICAgICAgICB0ZW1wQXJyYXkucHVzaChyb3cpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZpbHRlcmVkRGF0YSA9IHRlbXBBcnJheTtcbiAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3QgaWYgcm93IG1hdGNoZXMgYW55IG9mIHRoZSBjb2x1bW5uIGZpbHRlcnMgdGhhdCBtYXkgYmUgc2V0LlxuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBwcml2YXRlIGZpbHRlckJ5Q29sdW1uRmlsdGVycyhyb3c6IE9lcGFUYWJsZVJvdyk6IGJvb2xlYW4ge1xuICAgIGxldCBmbGFnID0gdHJ1ZTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgY29uc3QgcmVnRXhwID0gdGhpcy5nZXRGaWx0ZXJGb3JDb2x1bW4oY2VsbC5pZCk7XG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGNlbGwuZmlsdGVyVmFsdWUgfHwgY2VsbC52YWx1ZSB8fCAnJztcbiAgICAgIGlmIChyZWdFeHAgJiYgZmlsdGVyVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmaWx0ZXJWYWx1ZS50b1N0cmluZygpLm1hdGNoKHJlZ0V4cCk7XG4gICAgICAgIGZsYWcgPSBmbGFnICYmIChyZXN1bHQgIT09IG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmbGFnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3QgaWYgcm93IG1hdGNoZXMgdGhlIGdsb2JhbCBmaWx0ZXJcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJCeUdsb2JhbEZpbHRlcihyb3c6IE9lcGFUYWJsZVJvdyk6IGJvb2xlYW4ge1xuICAgIGxldCBmbGFnID0gdHJ1ZTtcbiAgICBjb25zdCByZWdFeHAgPSB0aGlzLmdldEdsb2JhbEZpbHRlcigpO1xuICAgIGlmIChyZWdFeHApIHtcbiAgICAgIGZsYWcgPSBmYWxzZTtcbiAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gY2VsbC5maWx0ZXJWYWx1ZSB8fCBjZWxsLnZhbHVlO1xuICAgICAgICBpZiAoZmlsdGVyVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbHRlclZhbHVlLnRvU3RyaW5nKCkubWF0Y2gocmVnRXhwKTtcbiAgICAgICAgICBmbGFnID0gZmxhZyB8fCAocmVzdWx0ICE9PSBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmbGFnO1xuICB9XG5cbiAgcHVibGljIGhpZGVDb2x1bW4oY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pIHtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihtYXRjaCA9PiB7XG4gICAgICByZXR1cm4gbWF0Y2guaWQgIT09IGNvbHVtbi5pZDtcbiAgICB9KTtcbiAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudC0tO1xuICB9XG5cbiAgcHVibGljIHVuaGlkZUNvbHVtbihjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaGlkZGVuQ29sczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wuaWQgIT09IGNvbHVtbklkKSB7XG4gICAgICAgIGhpZGRlbkNvbHMucHVzaChjb2wpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB2aXNpYmxlQ29sczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMuZm9yRWFjaChkYXRhQ29sdW1uID0+IHtcbiAgICAgIGxldCBrZWVwID0gdHJ1ZTtcbiAgICAgIGhpZGRlbkNvbHMuZm9yRWFjaChoaWRkZW5Db2x1bW4gPT4ge1xuICAgICAgICBpZiAoZGF0YUNvbHVtbi5pZCA9PT0gaGlkZGVuQ29sdW1uLmlkKSB7XG4gICAgICAgICAga2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChrZWVwKSB7XG4gICAgICAgIHZpc2libGVDb2xzLnB1c2goZGF0YUNvbHVtbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5oaWRkZW5Db2x1bW5zID0gaGlkZGVuQ29scztcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdmlzaWJsZUNvbHM7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgfVxuXG4gIHByaXZhdGUgc29ydERhdGEoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93Pik6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIGxldCBzb3J0Q3JpdGVyaWE6IGFueSA9IHRoaXMudGFibGVTZXJ2aWNlLmdldFNvcnRDcml0ZXJpYSh0aGlzLnRhYmxlSWQpIHx8IFtdO1xuICAgIGlmIChzb3J0Q3JpdGVyaWEubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRDb2x1bW5Tb3J0SW5kZXhlcyhzb3J0Q3JpdGVyaWEpO1xuXG4gICAgcmV0dXJuIGRhdGEuc29ydCgocHJldmlvdXM6IE9lcGFUYWJsZVJvdywgY3VycmVudDogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBsZXQgc29ydEluZGV4ID0gMDtcbiAgICAgIGxldCBzb3J0UmVzdWx0ID0gMDtcbiAgICAgIHdoaWxlIChzb3J0SW5kZXggPCBzb3J0Q3JpdGVyaWEubGVuZ3RoICYmIHNvcnRSZXN1bHQgPT09IDApIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldFJvd1NvcnRWYWx1ZShwcmV2aW91cywgc29ydENyaXRlcmlhW3NvcnRJbmRleF0uY29sdW1uSWQpO1xuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZ2V0Um93U29ydFZhbHVlKGN1cnJlbnQsIHNvcnRDcml0ZXJpYVtzb3J0SW5kZXhdLmNvbHVtbklkKTtcbiAgICAgICAgaWYgKHByZXYgPiBjdXJyKSB7XG4gICAgICAgICAgc29ydFJlc3VsdCA9ICAoc29ydENyaXRlcmlhW3NvcnRJbmRleF0uc29ydCA9PT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2IDwgY3Vycikge1xuICAgICAgICAgIHNvcnRSZXN1bHQgPSAgKHNvcnRDcml0ZXJpYVtzb3J0SW5kZXhdLnNvcnQgPT09ICdhc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3J0UmVzdWx0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzb3J0SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3J0UmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0Q29sdW1uU29ydEluZGV4ZXMoc29ydENyaXRlcmlhOiBPZXBhVGFibGVTb3J0Q3JpdGVyaW9uW10pIHtcbiAgICBpZiAoc29ydENyaXRlcmlhICYmIHNvcnRDcml0ZXJpYS5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpPTA7IGk8c29ydENyaXRlcmlhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGF0YUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4/LmlkID09PSBzb3J0Q3JpdGVyaWFbaV0uY29sdW1uSWQpIHtcbiAgICAgICAgICAgIGNvbHVtbi5zb3J0SW5kZXggPSBpICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGRpc3BsYXkgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjZWxsLlxuICAgKiBAcGFyYW0gcm93XG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHVibGljIGdldFJvd1ZhbHVlKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIHZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgaXNDZWxsVmFsdWVIaWRkZW4ocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgaGlkZGVuOiBib29sZWFuID0gZmFsc2U7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICBoaWRkZW4gPSBjZWxsLmhpZGVWYWx1ZSB8fCBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGlkZGVuO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByb3cgUmV0cmlldmUgdGhlIHNvcnQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjZWxsICh3aWxsIGRlZmF1bHQgdG8gZGlzcGxheSB2YWx1ZSBpZiBzb3J0XG4gICAqIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQpLlxuICAgKiBAcGFyYW0gY29sdW1uSWRcbiAgICovXG4gIHB1YmxpYyBnZXRSb3dTb3J0VmFsdWUocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgaWYgKGNlbGwuc29ydFZhbHVlICE9PSB1bmRlZmluZWQgJiYgY2VsbC5zb3J0VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YWx1ZSA9IGNlbGwuc29ydFZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYWdlKGRhdGE6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSB0aGlzLmRhdGEpOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbk9uKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVQYWdlKCk7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdlSW5mby5wYWdlIC0gMSkgKiB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZSA+IC0xID8gKHN0YXJ0ICsgdGhpcy5wYWdlSW5mby5pdGVtc1BlclBhZ2UpIDogZGF0YS5sZW5ndGg7XG4gICAgLy8gbm90IHN1cmUgd2h5LCBidXQgbWF4U2l6ZSB3YXMgZ2V0dGluZyBsb3N0LiBSZXNldCBpdCBoZXJlIHRvIHByZXZlbnQgd2VpcmRuZXNzLlxuICAgIHRoaXMucGFnZUluZm8ubWF4U2l6ZSA9IDU7XG4gICAgcmV0dXJuIGRhdGEuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUGFnaW5nYXRpb24oKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uT24gPSAhdGhpcy5wYWdpbmF0aW9uT247XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRmlsdGVyQ2hhbmdlZChmaWx0ZXI6IE9lcGFUYWJsZUZpbHRlcikge1xuICAgIGNvbnN0IG1hdGNoRmlsdGVyID0gdGhpcy5jdXJyZW50RmlsdGVycy5maW5kKChmKSA9PiB7XG4gICAgICByZXR1cm4gZi5jb2x1bW5JZCA9PT0gZmlsdGVyLmNvbHVtbklkO1xuICAgIH0pO1xuICAgIGlmICghbWF0Y2hGaWx0ZXIpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRjaEZpbHRlci5maWx0ZXJTdHJpbmcgPSBmaWx0ZXIuZmlsdGVyU3RyaW5nO1xuICAgIH1cbiAgICAvLyBuZWVkIHRvIGNoZWNrIGZvciBub0ZpbHRlcnMgdG8gc2VuZCBzdWJqZWN0XG4gICAgdGhpcy5ub0ZpbHRlcnMoKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9uU29ydENoYW5nZWQoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pIHtcbiAgICB0aGlzLnRhYmxlU2VydmljZS5zZXRTb3J0KHRoaXMudGFibGVJZCwgY29sdW1uKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgb25QYWdlQ2hhbmdlZChwYWdlRXZlbnQ6IFBhZ2VDaGFuZ2VkRXZlbnQpIHtcbiAgICB0aGlzLnBhZ2VJbmZvID0ge1xuICAgICAgcGFnZTogcGFnZUV2ZW50LnBhZ2UsXG4gICAgICBpdGVtc1BlclBhZ2U6IHBhZ2VFdmVudC5pdGVtc1BlclBhZ2UsXG4gICAgICBtYXhTaXplOiB0aGlzLnBhZ2VJbmZvLm1heFNpemUsXG4gICAgICBsZW5ndGg6IHRoaXMucGFnZUluZm8ubGVuZ3RoLFxuICAgICAgbnVtUGFnZXM6IHRoaXMucGFnZUluZm8ubnVtUGFnZXNcbiAgICB9XG4gICAgdGhpcy50YWJsZVNlcnZpY2Uuc2V0UGFnZSh0aGlzLnRhYmxlSWQsIHBhZ2VFdmVudC5wYWdlKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYmxlKGNsZWFyU2VsY3RlZFJvd3M6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuZmlsdGVyRGF0YSh0aGlzLmRhdGEpO1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSB0aGlzLnNvcnREYXRhKGZpbHRlcmVkRGF0YSk7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5jaGFuZ2VQYWdlKHNvcnRlZERhdGEpO1xuICAgIHRoaXMucGFnZUluZm8ubGVuZ3RoID0gc29ydGVkRGF0YS5sZW5ndGg7XG4gICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBpZiAoY2xlYXJTZWxjdGVkUm93cykge1xuICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KFtdKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhSGFzRGV0YWlscyA9IHRoaXMuY2hlY2tGb3JEZXRhaWxzKHRoaXMucm93cyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2UoKSB7XG4gICAgY29uc3Qgc2F2ZWRQYWdlTnVtYmVyID0gdGhpcy50YWJsZVNlcnZpY2UuZ2V0UGFnZSh0aGlzLnRhYmxlSWQpO1xuICAgIGlmIChzYXZlZFBhZ2VOdW1iZXIgJiYgdGhpcy5wYWdlSW5mby5wYWdlICE9PSBzYXZlZFBhZ2VOdW1iZXIpIHtcbiAgICAgIHRoaXMucGFnZUluZm8ucGFnZSA9IHNhdmVkUGFnZU51bWJlcjtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VJbmZvLnBhZ2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ZvckRldGFpbHMoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93Pik6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNEZXRhaWxzID0gZmFsc2U7XG4gICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICAgIGRhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5zaG93RGV0YWlsID09PSB0cnVlIHx8IHJvdy5zaG93RGV0YWlsID09PSBmYWxzZSkge1xuICAgICAgICAgIGhhc0RldGFpbHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0RldGFpbHM7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQWxsRGV0YWlscygpIHtcbiAgICB0aGlzLnNob3dBbGxEZXRhaWxzID0gIXRoaXMuc2hvd0FsbERldGFpbHM7XG4gICAgaWYgKHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5zaG93RGV0YWlsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByb3cuc2hvd0RldGFpbCA9IHRoaXMuc2hvd0FsbERldGFpbHM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93RGV0YWlsKHRvZ2dsZVJvdzogT2VwYVRhYmxlUm93KSB7XG4gICAgaWYgKHRvZ2dsZVJvdyAmJiB0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9kYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICAgIGlmIChyb3cuZGF0YVNvdXJjZSA9PT0gdG9nZ2xlUm93LmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICByb3cuc2hvd0RldGFpbCA9ICF0b2dnbGVSb3cuc2hvd0RldGFpbDtcbiAgICAgICAgICB0b2dnbGVSb3cuc2hvd0RldGFpbCA9IHJvdy5zaG93RGV0YWlsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNBY3Rpb25Db2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBhY3Rpb25Db2x1bW4gPSBmYWxzZTtcbiAgICB0aGlzLmhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4uaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgICAgYWN0aW9uQ29sdW1uID0gY29sdW1uLmFjdGlvbkNvbHVtbiB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGlvbkNvbHVtbjtcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbHVtbkhpZGRlbihjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGhpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICBoaWRkZW4gPSBjb2x1bW4uaGlkZGVuIHx8IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gaGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldEhpZGRlbkNvbHVtbnMoKTogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiB7XG4gICAgY29uc3QgY29sdW1uczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIHRoaXMuaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5oaWRkZW4pIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgY2VsbENsaWNrKGV2ZW50OiBUYWJsZURhdGFDZWxsQ2xpY2tFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJvdyA9IGV2ZW50LnJvdztcbiAgICBjb25zdCBjb2x1bW5JZCA9IGV2ZW50LmNvbHVtbklEO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZShyb3csIGNvbHVtbklkKTtcbiAgICB0aGlzLmNlbGxDbGlja2VkLmVtaXQoeyByb3csIGNvbHVtbklkLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFjdGlvbkNsaWNrKGV2ZW50OiBPZXBhQWN0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNsaWNrZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQWxsUm93c1NlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9ICF0aGlzLmFsbFJvd3NTZWxlY3RlZDtcbiAgICAvLyBkZXNlbGVjdCBhbGwgcm93c1xuICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICByLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgfSk7XG4gICAgLy8gc2VsZWN0IG9ubHkgdmlzaWJsZSByb3dzXG4gICAgdGhpcy5yb3dzLmZvckVhY2goKHI6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHIuc2VsZWN0YWJsZSkge1xuICAgICAgICByLnNlbGVjdGVkID0gdGhpcy5hbGxSb3dzU2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgICBpZiAoci5zZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZFJvd3MucHVzaChyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJvd3Muc2xpY2UoKTtcbiAgICB0aGlzLmNvcHlTZWxlY3Rpb25TdGF0ZSgpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVJvd1NlbGVjdGlvbihyb3c6IE9lcGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIHJvdy5zZWxlY3RlZCA9ICFyb3cuc2VsZWN0ZWQ7XG4gICAgdGhpcy5yb3dzLmZvckVhY2goZHIgPT4ge1xuICAgICAgaWYgKHJvdy5wcml2YXRlSWQgPT09IGRyLnByaXZhdGVJZCkge1xuICAgICAgICBkci5zZWxlY3RlZCA9IHJvdy5zZWxlY3RlZDtcbiAgICAgIH1cbiAgICAgIGlmIChkci5zZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZFJvd3MucHVzaChkcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY29weVNlbGVjdGlvblN0YXRlKCk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBwcml2YXRlIGNvcHlTZWxlY3Rpb25TdGF0ZSgpIHtcbiAgICB0aGlzLnJvd3MuZm9yRWFjaCgocjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICB0aGlzLl9kYXRhLmZvckVhY2goZHIgPT4ge1xuICAgICAgICBpZiAoZHIucHJpdmF0ZUlkID09PSByLnByaXZhdGVJZCkge1xuICAgICAgICAgIGRyLnNlbGVjdGVkID0gci5zZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2luZ2xlUm93U2VsZWN0aW9uKHJvdzogT2VwYVRhYmxlUm93KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gICAgcm93LnNlbGVjdGVkID0gIXJvdy5zZWxlY3RlZDtcbiAgICAvLyBhZGQgcm93IHRvIHNlbGVjdGVkIHJvd3MgaWYgaXQgaXMgc2VsZWN0ZWRcbiAgICBpZiAocm93LnNlbGVjdGVkKSB7XG4gICAgICBzZWxlY3RlZFJvd3MucHVzaChyb3cpO1xuICAgIH1cbiAgICAvLyB1bnNlbGVjdCBhbnkgb3RoZXIgcm93IHRoYXQgbWF5IGJlIHNlbGVjdGVkXG4gICAgdGhpcy5fZGF0YS5mb3JFYWNoKChkcjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAocm93LnByaXZhdGVJZCA9PT0gZHIucHJpdmF0ZUlkKSB7XG4gICAgICAgIGRyLnNlbGVjdGVkID0gcm93LnNlbGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVSb3dzRm9yRXhwb3J0KHJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4pOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICAvLyB0aGlzLmR1bXBEZXRhaWxSb3dzKCk7XG4gICAgaWYgKHJvd3MgJiYgcm93cy5sZW5ndGgpIHtcbiAgICAgIHJvd3MuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cG9ydFVuc2VsZWN0ZWRSb3dzICYmIHRoaXMuaGFzU2VsZWN0YWJsZUNvbHVtbigpICYmICFyb3cuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAvLyBza2lwIHVuc2VsZWN0ZWQgcm93c1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY2VsbHM6IHRoaXMuc2ltcGxpZnlDZWxscyhyb3cuY2VsbHMpLFxuICAgICAgICAgIGFjdGlvbnM6IHJvdy5hY3Rpb25zLFxuICAgICAgICAgIHNob3dEZXRhaWw6IHJvdy5zaG93RGV0YWlsLFxuICAgICAgICAgIHN1YlRhYmxlOiByb3cuZGV0YWlsID8gdGhpcy5jb252ZXJ0VG9UYWJsZShyb3cuZGV0YWlsKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpc0RpdmlkZXI6IHJvdy5pc0RpdmlkZXIsXG4gICAgICAgICAgZGl2aWRlckNsYXNzTmFtZTogcm93LmRpdmlkZXJDbGFzc05hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBoYXNTZWxlY3RhYmxlQ29sdW1uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFDb2x1bW5zLnNvbWUoKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiBjb2x1bW4uc2VsZWN0Q29sdW1uKTtcbiAgfVxuXG4gIHByaXZhdGUgc2ltcGxpZnlDZWxscyhjZWxsczogT2VwYVRhYmxlQ2VsbFtdKSB7XG4gICAgbGV0IHNpbXBsZUNlbGxzOiBPZXBhVGFibGVDZWxsW10gPSBbXTtcbiAgICBpZiAoY2VsbHMgJiYgY2VsbHMubGVuZ3RoID4gMCkge1xuICAgICAgY2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgc2ltcGxlQ2VsbHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGNlbGwuaWQsXG4gICAgICAgICAgdmFsdWU6IGNlbGwudmFsdWUsXG4gICAgICAgICAgaGlkZVZhbHVlOiBjZWxsLmhpZGVWYWx1ZSxcbiAgICAgICAgICBpY29uQ2xhc3NOYW1lOiBjZWxsLmljb25DbGFzc05hbWUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjZWxsLmNsYXNzTmFtZSxcbiAgICAgICAgICBpbWdTcmM6IGNlbGwuaW1nU3JjLFxuICAgICAgICAgIGlubmVySFRNTDogY2VsbC5pbm5lckhUTUwsXG4gICAgICAgICAgY29sU3BhbjogY2VsbC5jb2xTcGFuLFxuICAgICAgICAgIGV4Y2VsRGF0YUZvcm1hdDogY2VsbC5leGNlbERhdGFGb3JtYXRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNpbXBsZUNlbGxzO1xuICB9XG5cbiAgcHVibGljIGdhdGhlclRhYmxlRGF0YShyb3dzOiBPZXBhVGFibGVSb3dbXSk6IE9lcGFUYWJsZSB7XG4gICAgLy8gdGhpcy5kdW1wRGV0YWlsUm93cygpO1xuICAgIGNvbnN0IG9lcGFUYWJsZTogT2VwYVRhYmxlID0ge307XG4gICAgb2VwYVRhYmxlLmhlYWRlclJvd3MgPSB0aGlzLmhlYWRlclJvd3M7XG4gICAgb2VwYVRhYmxlLmFsbERhdGFSb3dzID0gdGhpcy5wcmVwYXJlUm93c0ZvckV4cG9ydChyb3dzKTtcbiAgICBvZXBhVGFibGUuc2hvd0FsbERldGFpbHMgPSB0aGlzLnNob3dBbGxEZXRhaWxzO1xuICAgIG9lcGFUYWJsZS5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lO1xuICAgIG9lcGFUYWJsZS52aXNpYmxlQ29sdW1uQ291bnQgPSB0aGlzLnZpc2libGVDb2x1bW5Db3VudDtcbiAgICBvZXBhVGFibGUuYWxsQ29sdW1uQ291bnQgPSB0aGlzLmFsbENvbHVtbkNvdW50O1xuICAgIHJldHVybiBvZXBhVGFibGU7XG4gIH1cblxuICBwcml2YXRlIGR1bXBEZXRhaWxSb3dzKCkge1xuICAgIGNvbnNvbGUubG9nKCdkdW1wRGV0YWlsUm93cyAtIFRvdGFsIHJvd3M6ICcgKyB0aGlzLl9kYXRhLmxlbmd0aCk7XG4gICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHJvdy5zaG93RGV0YWlsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTSE9XIERFVEFJTDogJyArIEpTT04uc3RyaW5naWZ5KHJvdy5kYXRhU291cmNlKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY29udmVydFRvVGFibGUodGVtcGxhdGU6IE9lcGFUZW1wbGF0ZUluZm8pOiBPZXBhVGFibGUgfCB1bmRlZmluZWQge1xuICAgIGxldCBvZXBhVGFibGU6IE9lcGFUYWJsZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGUuY29tcG9uZW50ID09PSBQVGFibGVDb21wb25lbnQpIHtcbiAgICAgIGNvbnN0IHRhYmxlOiBQVGFibGVDb21wb25lbnQgPSBuZXcgUFRhYmxlQ29tcG9uZW50KHRoaXMuc2FuaXRpemVyLCB0aGlzLnRhYmxlU2VydmljZSwgdGhpcy50YWJsZUV4cG9ydFNlcnZpY2UsIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLCB0aGlzLmVsUmVmKTtcbiAgICAgIGlmICh0ZW1wbGF0ZS5pbnB1dHMgJiYgdGVtcGxhdGUuaW5wdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGVtcGxhdGUuaW5wdXRzLmZvckVhY2goKGlucHV0OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoaW5wdXQubmFtZSA9PT0gJ2NvbmZpZycpIHtcbiAgICAgICAgICAgIHRhYmxlLmNvbmZpZyA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubmFtZSA9PT0gJ2NvbXBsZXhIZWFkZXInKSB7XG4gICAgICAgICAgICB0YWJsZS5jb21wbGV4SGVhZGVyID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgdGFibGUuaGVhZGVyID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHRhYmxlLmRhdGEgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvZXBhVGFibGUgPSB0YWJsZS5nYXRoZXJUYWJsZURhdGEodGFibGUuZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZXBhVGFibGU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRXhwb3J0VmlzaWJsZU9ubHkoKSB7XG4gICAgdGhpcy5leHBvcnRWaXNpYmxlT25seSA9ICF0aGlzLmV4cG9ydFZpc2libGVPbmx5O1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUV4cG9ydFVuc2VsZWN0ZWRSb3dzKCkge1xuICAgIHRoaXMuZXhwb3J0VW5zZWxlY3RlZFJvd3MgPSAhdGhpcy5leHBvcnRVbnNlbGVjdGVkUm93cztcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRUb0V4Y2VsKCkge1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSB0aGlzLnNvcnREYXRhKHRoaXMuX2RhdGEpO1xuICAgIGNvbnN0IGV4cG9ydFRhYmxlOiBPZXBhVGFibGUgPSB0aGlzLmdhdGhlclRhYmxlRGF0YSh0aGlzLmV4cG9ydFZpc2libGVPbmx5ID8gdGhpcy5yb3dzIDogc29ydGVkRGF0YSk7XG5cbiAgICBpZiAoKGV4cG9ydFRhYmxlLmFsbERhdGFSb3dzPy5sZW5ndGggfHwgMCkgPiAwKSB7XG4gICAgICB0aGlzLnRhYmxlRXhwb3J0U2VydmljZS5kb3dubG9hZEV4Y2VsKGV4cG9ydFRhYmxlLCB0aGlzLl9jb25maWcpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLmRvd25sb2FkRmlsZShkYXRhLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGVydCgnTm8gZGF0YSBpbiB0YWJsZSBhdmFpbGFibGUgZm9yIGV4cG9ydCcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRUb0hUTUwoKSB7XG4gICAgY29uc3Qgc29ydGVkRGF0YSA9IHRoaXMuc29ydERhdGEodGhpcy5fZGF0YSk7XG4gICAgY29uc3QgZXhwb3J0VGFibGU6IE9lcGFUYWJsZSA9IHRoaXMuZ2F0aGVyVGFibGVEYXRhKHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPyB0aGlzLnJvd3MgOiBzb3J0ZWREYXRhKTtcblxuICAgIGlmICgoZXhwb3J0VGFibGUuYWxsRGF0YVJvd3M/Lmxlbmd0aCB8fCAwKSA+IDApIHtcbiAgICAgIC8vIGZvciBub3csIGFsd2F5cyBlbWJlZCBzdWItdGFibGVzICBpbiBIVE1MIHZpZXcuXG4gICAgICB0aGlzLnRhYmxlRXhwb3J0U2VydmljZS5kb3dubG9hZEhUTUwoZXhwb3J0VGFibGUsIHRoaXMuX2NvbmZpZykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5maWxlVXRpbFNlcnZpY2UuZG93bmxvYWRGaWxlKGRhdGEsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVycm9yID0+IGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsZXJ0KCdObyBkYXRhIGluIHRhYmxlIGF2YWlsYWJsZSBmb3IgZXhwb3J0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ3VzdG9tQnRuQ2xpY2soKSB7XG4gICAgdGhpcy5jdXN0b21CdG5DbGlja2VkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkN1c3RvbUJ0bjJDbGljaygpIHtcbiAgICB0aGlzLmN1c3RvbUJ0bjJDbGlja2VkLmVtaXQoKTtcbiAgfVxuXG59XG4iLCI8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5oaWRlVGFibGVcIj5cbiAgPGZvcm0gKm5nSWY9XCJoaWRkZW5Db2x1bW5zLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbC1mb3JtLWxhYmVsXCI+U2hvdyBIaWRkZW4gQ29sdW1uczo8L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIChjaGFuZ2UpPVwidW5oaWRlQ29sdW1uKCRhbnkoJGV2ZW50KS50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICBbaWRdPVwidGFibGVJZCsnX1VuaGlkZUNvbHVtblNlbGVjdCdcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+Q2hvb3NlIGEgY29sdW1uPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29sIG9mIGhpZGRlbkNvbHVtbnNcIiBbdmFsdWVdPVwiY29sLmlkXCI+e3tjb2wudGl0bGV9fTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG5cbiAgPGRpdiBuZ0NsYXNzPVwie3tjb25maWcuZGl2Q2xhc3NOYW1lIHx8ICcnfX1cIj5cbiAgICA8cC10YWJsZSBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiIFt2YWx1ZV09XCJyb3dzXCIgXG4gICAgICBbc2Nyb2xsYWJsZV09XCJjb25maWcudmVydGljYWxTY3JvbGxcIiBbc2Nyb2xsSGVpZ2h0XT1cImNvbmZpZy5zY3JvbGxIZWlnaHRcIlxuICAgICAgW3RhYmxlU3R5bGVdPVwieydtaW4td2lkdGgnOiAnNTByZW0nfVwiPlxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxuICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGhkciBvZiBoZWFkZXJSb3dzOyBsZXQgaHI9aW5kZXg7XCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgIDx0aCAqbmdJZj1cImRhdGFIYXNEZXRhaWxzICYmIGhyID09PSAwXCIgW3Jvd1NwYW5dPVwiaGVhZGVyUm93cy5sZW5ndGhcIiBjbGFzcz1cImRldGFpbC1pbmRpY2F0b3ItY29sXCI+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cInRvZ2dsZUFsbERldGFpbHMoKVwiIFtpZF09XCJ0YWJsZUlkKydfU2hvd0FsbERldGFpbHNMaW5rJ1wiIGNsYXNzPVwiYmlcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYmktY2hldnJvbi1kb3duJzogc2hvd0FsbERldGFpbHMsICdiaS1jaGV2cm9uLXJpZ2h0JzogIXNob3dBbGxEZXRhaWxzfVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiKHNob3dBbGxEZXRhaWxzID8gJ0hpZGUnIDogJ1Nob3cnKSArICcgZGV0YWlscyBmb3IgYWxsIHJvd3MnXCIgcGxhY2VtZW50PVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1jb2wgW25nRm9yT2ZdPVwiaGRyLmNvbHVtbnNcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmhpZGRlbiAmJiBjb2wuZnJvemVuQ29sdW1uXCIgcEZyb3plbkNvbHVtbiBuZ0NsYXNzPVwie3tjb2wuY2xhc3NOYW1lIHx8ICcnfX1cIlxuICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjb2wuY29sc3BhbiB8fCAxXCIgW3Jvd1NwYW5dPVwiY29sLnJvd3NwYW4gfHwgMVwiPlxuICAgICAgICAgICAgICA8b2VwYS10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cImNvbFwiIFt0YWJsZUlkXT1cInRhYmxlSWRcIiBbYWxsUm93c1NlbGVjdGVkXT1cImFsbFJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW3Jvd0NvdW50XT1cInJvd3MubGVuZ3RoXCIgW25vRmlsdGVyc1N1YmplY3RdPVwibm9GaWx0ZXJzU3ViamVjdFwiXG4gICAgICAgICAgICAgICAgKG9uVG9nZ2xlQWxsUm93c1NlbGVjdGlvbik9XCJ0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKClcIiAob25Tb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkhpZGVDb2x1bW4pPVwiaGlkZUNvbHVtbigkZXZlbnQpXCIgKG9uRmlsdGVyQ2hhbmdlZCk9XCJvbkZpbHRlckNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L29lcGEtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5oaWRkZW4gJiYgIWNvbC5mcm96ZW5Db2x1bW5cIiBuZ0NsYXNzPVwie3tjb2wuY2xhc3NOYW1lIHx8ICcnfX1cIlxuICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjb2wuY29sc3BhbiB8fCAxXCIgW3Jvd1NwYW5dPVwiY29sLnJvd3NwYW4gfHwgMVwiPlxuICAgICAgICAgICAgICA8b2VwYS10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cImNvbFwiIFt0YWJsZUlkXT1cInRhYmxlSWRcIiBbYWxsUm93c1NlbGVjdGVkXT1cImFsbFJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW3Jvd0NvdW50XT1cInJvd3MubGVuZ3RoXCIgW25vRmlsdGVyc1N1YmplY3RdPVwibm9GaWx0ZXJzU3ViamVjdFwiXG4gICAgICAgICAgICAgICAgKG9uVG9nZ2xlQWxsUm93c1NlbGVjdGlvbik9XCJ0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKClcIiAob25Tb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkhpZGVDb2x1bW4pPVwiaGlkZUNvbHVtbigkZXZlbnQpXCIgKG9uRmlsdGVyQ2hhbmdlZCk9XCJvbkZpbHRlckNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L29lcGEtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1yPVwicm93SW5kZXhcIiBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cbiAgICAgICAgPCEtLSBEYXRhIFJvdyAtLT5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZCAqbmdJZj1cImRhdGFIYXNEZXRhaWxzXCI+XG4gICAgICAgICAgICA8IS0tIERldGFpbCBpY29uIChpZiBzcGVjaWZpZWQpIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuc2hvd0RldGFpbCA9PT0gdHJ1ZSB8fCByb3cuc2hvd0RldGFpbCA9PT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCJyb3cuZGV0YWlsSWNvbkNsYXNzTmFtZVwiIFtuZ0NsYXNzXT1cInJvdy5kZXRhaWxJY29uQ2xhc3NOYW1lXCI+PC9pPlxuICAgICAgICAgICAgICA8aSAoY2xpY2spPVwidG9nZ2xlUm93RGV0YWlsKHJvdylcIiBbaWRdPVwidGFibGVJZCsnX1Nob3dEZXRhaWxMaW5rXycrclwiIGNsYXNzPVwiYmlcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYmktY2hldnJvbi1kb3duJzogcm93LnNob3dEZXRhaWwsICdiaS1jaGV2cm9uLXJpZ2h0JzogIXJvdy5zaG93RGV0YWlsfVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiKHJvdy5zaG93RGV0YWlsID8gJ0hpZGUnIDogJ1Nob3cnKSArICcgZGV0YWlscyBmb3IgdGhpcyByb3cnXCIgcGxhY2VtZW50PVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPCEtLSBJZiByb3cgaXMgYSBkaXZpZGVyLCBpdCBzcGFucyB0aGUgd2hvbGUgdGFibGUgLS0+XG4gICAgICAgICAgPHRkICpuZ0lmPVwicm93LmlzRGl2aWRlclwiIFtjb2xTcGFuXT1cInZpc2libGVDb2x1bW5Db3VudCArIChkYXRhSGFzRGV0YWlscyA/IDEgOiAwKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuZGl2aWRlckNsYXNzTmFtZSB8fCAnb2VwYS10YWJsZS1ncmF5J1wiPiZuYnNwOzwvdGQ+XG4gICAgICAgICAgPCEtLSBEYXRhIFJvd3MgLS0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiIXJvdy5pc0RpdmlkZXJcIiBuZ0ZvciBsZXQtY29sIFtuZ0Zvck9mXT1cImRhdGFDb2x1bW5zXCIgbGV0LWk9XCJpbmRleFwiPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5oaWRkZW4gJiYgKHJvd3xjZWxsQ29sc3Bhbjpjb2wpID4gMCAmJiFjb2wuZnJvemVuQ29sdW1uXCJcbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7cm93fGNlbGxDbGFzc25hbWU6Y29sIHx8ICcnfX1cIiBbY29sU3Bhbl09XCJyb3d8Y2VsbENvbHNwYW46Y29sXCI+XG4gICAgICAgICAgICAgIDxvZXBhLXRhYmxlLWRhdGEtY2VsbCBbY29sXT1cImNvbFwiIFtpXT1cImlcIiBbcm93XT1cInJvd1wiIFtyXT1cInJcIiBbdGFibGVJZF09XCJ0YWJsZUlkXCJcbiAgICAgICAgICAgICAgICAob25BY3Rpb25DbGljayk9XCJvbkFjdGlvbkNsaWNrKCRldmVudClcIiAob25DZWxsQ2xpY2spPVwiY2VsbENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblRvZ2dsZVJvd1NlbGVjdGlvbik9XCJ0b2dnbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uU2luZ2xlUm93U2VsZWN0aW9uKT1cInNpbmdsZVJvd1NlbGVjdGlvbigkZXZlbnQpXCI+PC9vZXBhLXRhYmxlLWRhdGEtY2VsbD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmhpZGRlbiAmJiAocm93fGNlbGxDb2xzcGFuOmNvbCkgPiAwICYmY29sLmZyb3plbkNvbHVtblwiIHBGcm96ZW5Db2x1bW5cbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7cm93fGNlbGxDbGFzc25hbWU6Y29sIHx8ICcnfX1cIiBbY29sU3Bhbl09XCJyb3d8Y2VsbENvbHNwYW46Y29sXCI+XG4gICAgICAgICAgICAgIDxvZXBhLXRhYmxlLWRhdGEtY2VsbCBbY29sXT1cImNvbFwiIFtpXT1cImlcIiBbcm93XT1cInJvd1wiIFtyXT1cInJcIiBbdGFibGVJZF09XCJ0YWJsZUlkXCJcbiAgICAgICAgICAgICAgICAob25BY3Rpb25DbGljayk9XCJvbkFjdGlvbkNsaWNrKCRldmVudClcIiAob25DZWxsQ2xpY2spPVwiY2VsbENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblRvZ2dsZVJvd1NlbGVjdGlvbik9XCJ0b2dnbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uU2luZ2xlUm93U2VsZWN0aW9uKT1cInNpbmdsZVJvd1NlbGVjdGlvbigkZXZlbnQpXCI+PC9vZXBhLXRhYmxlLWRhdGEtY2VsbD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90cj5cblxuICAgICAgICA8IS0tIERldGFpbCBSb3cgLS0+XG4gICAgICAgIDx0ciAqbmdJZj1cInJvdy5zaG93RGV0YWlsXCIgY2xhc3M9XCJ0YWJsZS1pbmZvXCI+XG4gICAgICAgICAgPHRkIFtjb2xTcGFuXT1cInZpc2libGVDb2x1bW5Db3VudCArIChkYXRhSGFzRGV0YWlscyA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgPGNtbC10ZW1wbGF0ZSBbdGVtcGxhdGVJbmZvXT1cInJvdy5kZXRhaWxcIj48L2NtbC10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3AtdGFibGU+XG4gIDwvZGl2PlxuICA8IS0tIFRhYmxlIGZvb3RlciAtLT5cbiAgPGZvcm0gKm5nSWY9XCIhY29uZmlnLmhpZGVGb290ZXIgfHwgKGRhdGEgJiYgcGFnZUluZm8uaXRlbXNQZXJQYWdlIDwgZGF0YS5sZW5ndGgpXCIgY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgIDwhLS0gVGFibGUtd2lkZSBmaWx0ZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiIWNvbmZpZy5oaWRlR2xvYmFsRmlsdGVyXCIgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYWxsIGNvbHVtbnNcIlxuICAgICAgICAgICAgICBbb2VwYVRhYmxlRmlsdGVyaW5nXT1cInsgZmlsdGVyU3RyaW5nOiAnJyB9XCIgW3RhYmxlSWRdPVwidGFibGVJZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LXNtXCJcbiAgICAgICAgICAgICAgKHRhYmxlQ2hhbmdlZCk9XCJvbkZpbHRlckNoYW5nZWQoJGV2ZW50KVwiIFtpZF09XCJ0YWJsZUlkKydfRmlsdGVyQWxsQ29sdW1uc0lucHV0J1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZy5zaG93Um93Q291bnRJbkZvb3RlciAmJiBfZGF0YSAmJiBfZGF0YS5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc2Vjb25kYXJ5XCI+e3tfZGF0YS5sZW5ndGh9fTwvc3Bhbj4mbmJzcDt0b3RhbCByb3dzXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIEV4cG9ydCBCdXR0b25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIHRleHQtY2VudGVyXCIgKm5nSWY9XCJhbGxvd0VkaXRcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9FeGNlbCB8fCBjb25maWcuZXhwb3J0VG9IVE1MXCIgY2xhc3M9XCJidG4tZ3JvdXBcIiBkcm9wZG93bj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImV4cG9ydEJ0blwiIGRyb3Bkb3duVG9nZ2xlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBkcm9wZG93bi10b2dnbGVcIlxuICAgICAgICAgICAgICAgIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1iYXNpY1wiPlxuICAgICAgICAgICAgICAgIEV4cG9ydCA8c3BhbiBjbGFzcz1cImNhcmV0XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDx1bCBpZD1cImV4cG9ydC1kcm9wZG93blwiICpkcm9wZG93bk1lbnUgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9FeGNlbFwiIHJvbGU9XCJtZW51aXRlbVwiPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFRvRXhjZWwoKVwiPkV4cG9ydCB0byBFeGNlbDwvYT48L2xpPlxuICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiY29uZmlnLmV4cG9ydFRvSFRNTFwiIHJvbGU9XCJtZW51aXRlbVwiPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFRvSFRNTCgpXCI+RXhwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgdG8gSFRNTDwvYT48L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY3VzdG9tQnRuVmlzaWJsZVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBuZ0NsYXNzPVwie3snYnRuIGJ0bi1wcmltYXJ5IG1lLTEnICsgKHNtYWxsID8gJyBidG4tc20nIDogJycpfX1cIiAoY2xpY2spPVwib25DdXN0b21CdG5DbGljaygpXCJcbiAgICAgICAgICAgICAgW2lkXT1cInRhYmxlSWQrJ19DdXN0b21CdG4nXCIgW2Rpc2FibGVkXT1cIiFjdXN0b21CdG5FbmFibGVkXCI+e3tjdXN0b21CdG5MYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY3VzdG9tQnRuVmlzaWJsZTJcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7J2J0biBidG4tcHJpbWFyeSBtZS0xJyArIChzbWFsbCA/ICcgYnRuLXNtJyA6ICcnKX19XCIgKGNsaWNrKT1cIm9uQ3VzdG9tQnRuMkNsaWNrKClcIlxuICAgICAgICAgICAgICBbaWRdPVwidGFibGVJZCsnX0N1c3RvbUJ0bidcIiBbZGlzYWJsZWRdPVwiIWN1c3RvbUJ0bkVuYWJsZWQyXCI+e3tjdXN0b21CdG5MYWJlbDJ9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFjb25maWcuZGlzYWJsZVBhZ2luYXRpb25cIiBjbGFzcz1cImNvbC1zbS01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICAgICAgICAgIDxwYWdpbmF0aW9uICpuZ0lmPVwicGFnaW5hdGlvbk9uXCIgY2xhc3M9XCJwYWdpbmF0aW9uLXNtXCIgW3RvdGFsSXRlbXNdPVwicGFnZUluZm8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJwYWdlSW5mby5pdGVtc1BlclBhZ2VcIiBbbWF4U2l6ZV09XCJwYWdlSW5mby5tYXhTaXplXCIgWyhuZ01vZGVsKV09XCJjdXJyZW50UGFnZVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJjdXJyZW50VGFibGVQYWdlXCIgW2JvdW5kYXJ5TGlua3NdPVwidHJ1ZVwiIFtyb3RhdGVdPVwiZmFsc2VcIiAocGFnZUNoYW5nZWQpPVwib25QYWdlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG51bVBhZ2VzKT1cInBhZ2VJbmZvLm51bVBhZ2VzID0gJGV2ZW50XCI+XG4gICAgICAgICAgICA8L3BhZ2luYXRpb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVQYWdpbmdhdGlvbigpXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBtZS0xXCI+e3sgcGFnaW5hdGlvbk9uID9cbiAgICAgICAgICAgICAgJ1Nob3cgQWxsIFJvd3MnIDogJ1Jlc3RvcmUgUGFnaW5hdGlvbid9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNvbmZpZy5leHBvcnRUb0V4Y2VsIHx8IGNvbmZpZy5leHBvcnRUb0hUTUxcIiBjbGFzcz1cImNvbC1zbS0xMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8c3Bhbj5FeHBvcnQgb25seSB2aXNpYmxlIGRhdGE6Jm5ic3A7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImV4cG9ydFZpc2libGVPbmx5XCIgKGNsaWNrKT1cInRvZ2dsZUV4cG9ydFZpc2libGVPbmx5KClcIlxuICAgICAgICAgICAgaWQ9XCJleHBvcnRWaXNpYmxlT25seUNoZWNrYm94XCIgLz5cbiAgICAgICAgICAgICZuYnNwOyZuYnNwO1xuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaGFzU2VsZWN0YWJsZUNvbHVtbigpXCI+SW5jbHVkZSB1bnNlbGVjdGVkIHJvd3MgaW4gZXhwb3J0OiZuYnNwO1xuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJleHBvcnRVbnNlbGVjdGVkUm93c1wiIChjbGljayk9XCJ0b2dnbGVFeHBvcnRVbnNlbGVjdGVkUm93cygpXCJcbiAgICAgICAgICAgIGlkPVwiZXhwb3J0VW5zZWxlY3RlZFJvd3NDaGVja2JveFwiIC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj4iXX0=
|
|
857
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3AtdGFibGUvcC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL3RhYmxlL3AtdGFibGUvcC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QyxNQUFNLGVBQWUsQ0FBQztBQXFCN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUy9CLE1BQU0sT0FBTyxlQUFlO0lBNkpDO0lBQ2pCO0lBQ0E7SUFDQTtJQUNBO0lBaEtILGFBQWEsR0FBWSxLQUFLLENBQUM7SUFDL0IsVUFBVSxHQUEyQixFQUFFLENBQUM7SUFDeEMsSUFBSSxHQUF3QixFQUFFLENBQUM7SUFDL0Isa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbkIsaUJBQWlCLEdBQXdCLEtBQUssQ0FBQztJQUMvQyxvQkFBb0IsR0FBWSxLQUFLLENBQUM7SUFDdEMsZ0JBQWdCLEdBQXFCLElBQUksT0FBTyxFQUFXLENBQUM7SUFFNUQsV0FBVyxHQUEyQixFQUFFLENBQUM7SUFDekMsY0FBYyxHQUEyQixFQUFFLENBQUM7SUFDNUMsYUFBYSxHQUEyQixFQUFFLENBQUM7SUFDM0MsYUFBYSxHQUFrQixFQUFFLENBQUM7SUFDbEMsS0FBSyxHQUF3QixFQUFFLENBQUM7SUFDL0IsT0FBTyxHQUFvQixFQUFFLENBQUM7SUFDOUIsY0FBYyxHQUEyQixDQUFDO1lBQ2hELFlBQVksRUFBRSxFQUFFO1lBQ2hCLFFBQVEsRUFBRSxTQUFTO1NBQ3BCLENBQUMsQ0FBQztJQUVJLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUV2QixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXhCLFFBQVEsR0FBc0I7UUFDbkMsSUFBSSxFQUFFLENBQUM7UUFDUCxZQUFZLEVBQUUsRUFBRTtRQUNoQixPQUFPLEVBQUUsQ0FBQztRQUNWLFFBQVEsRUFBRSxDQUFDO1FBQ1gsTUFBTSxFQUFFLENBQUM7S0FDVixDQUFDO0lBQ0ssV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNoQixZQUFZLEdBQUcsSUFBSSxDQUFDO0lBRWxCLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDYixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQzFCLElBQ1csTUFBTSxDQUFDLElBQXFCO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEtBQUssQ0FBQztRQUMvRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUNXLGFBQWEsQ0FBQyxJQUE0QjtRQUNuRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFvQixFQUFFLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFDVyxNQUFNLENBQUMsR0FBb0I7UUFDcEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFUSxjQUFjLEdBQXVCLFNBQVMsQ0FBQztJQUMvQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBRXpCLGVBQWUsR0FBdUIsU0FBUyxDQUFDO0lBQ2hELGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUMxQixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFFMUIsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUV2QixtQkFBbUI7SUFDRixXQUFXLEdBQTBDLElBQUksWUFBWSxFQUFFLENBQUM7SUFDeEUsYUFBYSxHQUFrQyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ2xFLFdBQVcsR0FBc0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNwRSxnQkFBZ0IsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMxRCxpQkFBaUIsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVyRSxRQUFRLEdBQWtCLEVBQUUsQ0FBQztJQUU1QixZQUFZO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxhQUFzQjtRQUNwRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUM3QixJQUFJLGFBQWEsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDM0UsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsR0FBRyxNQUFNLENBQUMsRUFBRTtvQkFDakUsK0RBQStELENBQUMsQ0FBQztnQkFDbkUsTUFBTSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxDQUFDO2lCQUFNLElBQUksTUFBTSxFQUFFLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixDQUFDO1lBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQ1csSUFBSSxDQUFDLE1BQTJCO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFUSxRQUFRLENBQTJCO0lBRTVDLFlBQTJCLFNBQXVCLEVBQ3hDLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0QyxlQUFvQyxFQUNwQyxLQUFpQjtRQUpBLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxvQkFBZSxHQUFmLGVBQWUsQ0FBcUI7UUFDcEMsVUFBSyxHQUFMLEtBQUssQ0FBWTtJQUMzQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0lBQ3RELENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsS0FBNkI7UUFDdkQsTUFBTSxNQUFNLEdBQW9CLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2hELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFzQixFQUFFLEVBQUU7WUFDdkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFvQixFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsRixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLDRCQUE0QjtnQkFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0IsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sb0JBQW9CLENBQUMsVUFBa0M7UUFDN0QsTUFBTSxPQUFPLEdBQWtCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxZQUFZLEdBQVEsRUFBRSxDQUFDO1FBQzdCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFvQixFQUFFLEVBQUU7WUFDMUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBdUIsRUFBRSxFQUFFO2dCQUM5QyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzNCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNuQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDOzRCQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNuQixDQUFDO29CQUNILENBQUM7b0JBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ25CLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztvQkFDOUMsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM1RCxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzt3QkFDekIsUUFBUSxFQUFFLENBQUM7b0JBQ2IsQ0FBQztvQkFDRCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7b0JBQ3hDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNuQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDOzRCQUNwRCxRQUFRLEVBQUUsQ0FBQzt3QkFDYixDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxRQUFRLEVBQUUsQ0FBQztZQUNiLENBQUMsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxFQUFFLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFHTyxrQkFBa0IsQ0FBQyxVQUFrQztRQUMzRCxNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQy9DLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLFlBQVksR0FBTyxFQUFFLENBQUM7UUFDNUIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQW9CLEVBQUUsRUFBRTtZQUMxQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUF1QixFQUFFLEVBQUU7Z0JBQzlDLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNuQixJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDekMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs0QkFDcEQsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7d0JBQ3ZDLENBQUM7d0JBQ0QsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDbkMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3pCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUNuQixZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7d0JBQzlDLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM1RCxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzt3QkFDekIsUUFBUSxFQUFFLENBQUM7b0JBQ2IsQ0FBQztvQkFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDekMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDbkMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7b0JBQ2pDLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxRQUFRLEVBQUUsQ0FBQztZQUNiLENBQUMsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxFQUFFLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxRQUFRLENBQUMsSUFBWTtRQUMxQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlO1FBQ3JCLElBQUksTUFBMEIsQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5RSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0JBQWtCLENBQUMsUUFBZ0I7UUFDekMsSUFBSSxNQUEwQixDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25DLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUYsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxVQUFVLENBQUMsSUFBeUI7UUFDMUMsc0RBQXNEO1FBQ3RELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxZQUFZLEdBQXdCLElBQUksQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBd0IsRUFBRSxDQUFDO1FBQzFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFpQixFQUFFLEVBQUU7WUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILFlBQVksR0FBRyxTQUFTLENBQUM7UUFDekIsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHFCQUFxQixDQUFDLEdBQWlCO1FBQzdDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQW1CLEVBQUUsRUFBRTtZQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekQsSUFBSSxNQUFNLElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2hFLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BELElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CLENBQUMsR0FBaUI7UUFDNUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNiLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBbUIsRUFBRSxFQUFFO2dCQUN4QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ25ELElBQUksV0FBVyxLQUFLLFNBQVMsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3RELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3BELElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSxVQUFVLENBQUMsTUFBdUI7UUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2RCxPQUFPLEtBQUssQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxZQUFZLENBQUMsUUFBZ0I7UUFDbEMsTUFBTSxVQUFVLEdBQTJCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2pDLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDeEIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxXQUFXLEdBQTJCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7WUFDaEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxVQUFVLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUM7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxJQUF5QjtRQUN4QyxJQUFJLFlBQVksR0FBUSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlFLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBc0IsRUFBRSxPQUFxQixFQUFFLEVBQUU7WUFDakUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2xCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztZQUNuQixPQUFPLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNFLElBQUksSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO29CQUNoQixVQUFVLEdBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO3FCQUFNLElBQUksSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO29CQUN2QixVQUFVLEdBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDakIsQ0FBQztnQkFDRCxTQUFTLEVBQUUsQ0FBQztZQUNkLENBQUM7WUFDRCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxZQUFzQztRQUNsRSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUNoQyxJQUFJLE1BQU0sRUFBRSxFQUFFLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUM1QyxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzNCLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUEsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxHQUFpQixFQUFFLFFBQWdCO1FBQ3BELElBQUksS0FBVSxDQUFDO1FBQ2YsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFtQixFQUFFLEVBQUU7WUFDeEMsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN6QixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNyQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxHQUFpQixFQUFFLFFBQWdCO1FBQzFELElBQUksTUFBTSxHQUFZLEtBQUssQ0FBQztRQUM1QixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQW1CLEVBQUUsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxlQUFlLENBQUMsR0FBaUIsRUFBRSxRQUFnQjtRQUN4RCxJQUFJLEtBQVUsQ0FBQztRQUNmLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBbUIsRUFBRSxFQUFFO1lBQ3hDLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO29CQUM1RCxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDekIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixLQUFLLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxVQUFVLENBQUMsT0FBNEIsSUFBSSxDQUFDLElBQUk7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUNwRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNqRyxrRkFBa0Y7UUFDbEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLGVBQWUsQ0FBQyxNQUF1QjtRQUM1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2pELE9BQU8sQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ2pELENBQUM7UUFDRCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVNLGFBQWEsQ0FBQyxNQUF1QjtRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sYUFBYSxDQUFDLFNBQTJCO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7WUFDcEIsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZO1lBQ3BDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDOUIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRO1NBQ2pDLENBQUE7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxtQkFBNEIsS0FBSztRQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sVUFBVTtRQUNoQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEUsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFTyxlQUFlLENBQUMsSUFBeUI7UUFDL0MsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBaUIsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ3hELFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBaUIsRUFBRSxFQUFFO2dCQUN2QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2pDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sZUFBZSxDQUFDLFNBQXVCO1FBQzVDLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQWlCLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDNUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7b0JBQ3ZDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztnQkFDeEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFTSxjQUFjLENBQUMsUUFBZ0I7UUFDcEMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBb0IsRUFBRSxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBdUIsRUFBRSxFQUFFO2dCQUM5QyxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzNCLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQztnQkFDOUMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU0sY0FBYyxDQUFDLFFBQWdCO1FBQ3BDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQW9CLEVBQUUsRUFBRTtZQUMvQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQXVCLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMzQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBb0IsRUFBRSxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBdUIsRUFBRSxFQUFFO2dCQUM5QyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQThCO1FBQzdDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDdEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sYUFBYSxDQUFDLEtBQXNCO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsTUFBTSxZQUFZLEdBQXdCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM3QyxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFlLEVBQUUsRUFBRTtZQUNyQyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUNILDJCQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQWUsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqQixDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDcEMsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNmLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sa0JBQWtCLENBQUMsR0FBaUI7UUFDekMsTUFBTSxZQUFZLEdBQXdCLEVBQUUsQ0FBQztRQUM3QyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNyQixJQUFJLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyxFQUFFLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQixZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBZSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksRUFBRSxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2pDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sa0JBQWtCLENBQUMsR0FBaUI7UUFDekMsTUFBTSxZQUFZLEdBQXdCLEVBQUUsQ0FBQztRQUM3QyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUM3Qiw2Q0FBNkM7UUFDN0MsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsOENBQThDO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQ3RDLElBQUksR0FBRyxDQUFDLFNBQVMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25DLEVBQUUsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUM3QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sRUFBRSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxJQUF5QjtRQUNwRCxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO1FBQ3ZDLHlCQUF5QjtRQUN6QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQWlCLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDOUUsdUJBQXVCO29CQUN2QixPQUFPO2dCQUNULENBQUM7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO29CQUNwQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87b0JBQ3BCLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtvQkFDMUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO29CQUNsRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7b0JBQ3hCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0I7aUJBQ3ZDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQXVCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQXNCO1FBQzFDLElBQUksV0FBVyxHQUFvQixFQUFFLENBQUM7UUFDdEMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuQixXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNmLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDWCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7b0JBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO29CQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtvQkFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtpQkFDdEMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVNLGVBQWUsQ0FBQyxJQUFvQjtRQUN6Qyx5QkFBeUI7UUFDekIsTUFBTSxTQUFTLEdBQWMsRUFBRSxDQUFDO1FBQ2hDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN2QyxTQUFTLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxTQUFTLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDL0MsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUM3QyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ3ZELFNBQVMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sY0FBYztRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFpQixFQUFFLEVBQUU7WUFDdkMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDaEUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGNBQWMsQ0FBQyxRQUEwQjtRQUM5QyxJQUFJLFNBQVMsR0FBMEIsU0FBUyxDQUFDO1FBQ2pELElBQUksUUFBUSxDQUFDLFNBQVMsS0FBSyxlQUFlLEVBQUUsQ0FBQztZQUMzQyxNQUFNLEtBQUssR0FBb0IsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqSixJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7b0JBQ3JDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDNUIsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUM3QixDQUFDO3lCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxlQUFlLEVBQUUsQ0FBQzt3QkFDMUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUNwQyxDQUFDO3lCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDbkMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUM3QixDQUFDO3lCQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQzt3QkFDakMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUMzQixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNILFNBQVMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSx1QkFBdUI7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ25ELENBQUM7SUFFTSwwQkFBMEI7UUFDL0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ3pELENBQUM7SUFFTSxhQUFhO1FBQ2xCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFjLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVyRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDekUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNYLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO2dCQUNELEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2FBQ25DLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFTSxZQUFZO1FBQ2pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFjLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVyRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0Msa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3hFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDWCxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7Z0JBQ0QsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7YUFDbkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQzt3R0E3MEJVLGVBQWU7NEZBQWYsZUFBZSx5bkJDOUI1Qix3K1NBcUtNOzs0RkR2SU8sZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSxjQUFjO3dNQXdDZixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSyxNQUFNO3NCQURoQixLQUFLO2dCQXFCSyxhQUFhO3NCQUR2QixLQUFLO2dCQWNLLE1BQU07c0JBRGhCLEtBQUs7Z0JBV0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR1csV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLFdBQVc7c0JBQTNCLE1BQU07Z0JBQ1UsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUNVLGlCQUFpQjtzQkFBakMsTUFBTTtnQkFvQ0ksSUFBSTtzQkFEZCxLQUFLO2dCQXVCRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3Q2hlY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5pbXBvcnQgeyBPZXBhVGFibGUgfSBmcm9tICcuLi9vZXBhLXRhYmxlJztcbmltcG9ydCB7IE9lcGFUYWJsZUNvbmZpZyB9IGZyb20gJy4uL29lcGEtdGFibGUtY29uZmlnJztcbmltcG9ydCB7IE9lcGFUYWJsZUhlYWRlciB9IGZyb20gJy4uL29lcGEtdGFibGUtaGVhZGVyJztcbmltcG9ydCB7IE9lcGFUYWJsZUNvbHVtbiB9IGZyb20gJy4uL29lcGEtdGFibGUtY29sdW1uJztcbmltcG9ydCB7IE9lcGFUYWJsZVJvdyB9IGZyb20gJy4uL29lcGEtdGFibGUtcm93JztcbmltcG9ydCB7IE9lcGFUYWJsZUNlbGwgfSBmcm9tICcuLi9vZXBhLXRhYmxlLWNlbGwnO1xuaW1wb3J0IHsgT2VwYVRhYmxlUGFnZUluZm8gfSBmcm9tICcuLi9vZXBhLXRhYmxlLXBhZ2UtaW5mbyc7XG5pbXBvcnQgeyBPZXBhVGFibGVDZWxsQ2xpY2tFdmVudCB9IGZyb20gJy4uL29lcGEtdGFibGUtY2VsbC1jbGljay1ldmVudCc7XG5cbmltcG9ydCB7IE9lcGFBY3Rpb25FdmVudCB9IGZyb20gJy4uLy4uL2FjdGlvbi1idG4vb2VwYS1hY3Rpb24tZXZlbnQnO1xuXG5pbXBvcnQgeyBUYWJsZUV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi90YWJsZS1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBPZXBhVGVtcGxhdGVJbmZvIH0gZnJvbSAnQG9oaW9lcGEvb2VwYS1jb21tb24tbGliJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4uL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2VwYVRhYmxlU29ydENyaXRlcmlvbiB9IGZyb20gJy4uL29lcGEtdGFibGUtc29ydC1jcml0ZXJpb24nO1xuaW1wb3J0IHsgUGFnZUNoYW5nZWRFdmVudCB9IGZyb20gJ25neC1ib290c3RyYXAvcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBPZXBhUENvbHVtbiB9IGZyb20gJy4uL29lcGEtcC1jb2x1bW4nO1xuaW1wb3J0IHsgVGFibGVEYXRhQ2VsbENsaWNrRXZlbnQgfSBmcm9tICcuLi90YWJsZS1kYXRhLWNlbGwvdGFibGUtZGF0YS1jZWxsLWNsaWNrLWV2ZW50JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9lcGFUYWJsZUZpbHRlciB9IGZyb20gJy4uL29lcGEtdGFibGUtZmlsdGVyJztcbmltcG9ydCB7IE9lcGFGaWxlVXRpbFNlcnZpY2UgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWNvbW1vbi1saWInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvZXBhLXAtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcC10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3AtdGFibGUuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG4gIHB1YmxpYyBzaG93RmlsdGVyUm93OiBCb29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBoZWFkZXJSb3dzOiBBcnJheTxPZXBhVGFibGVIZWFkZXI+ID0gW107XG4gIHB1YmxpYyByb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gIHB1YmxpYyB2aXNpYmxlQ29sdW1uQ291bnQgPSAwO1xuICBwdWJsaWMgYWxsQ29sdW1uQ291bnQgPSAwO1xuICBwdWJsaWMgZXhwb3J0VmlzaWJsZU9ubHk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcbiAgcHVibGljIGV4cG9ydFVuc2VsZWN0ZWRSb3dzOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBub0ZpbHRlcnNTdWJqZWN0OiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBwdWJsaWMgZGF0YUNvbHVtbnM6IEFycmF5PE9lcGFUYWJsZUNvbHVtbj4gPSBbXTtcbiAgcHVibGljIHZpc2libGVDb2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gIHB1YmxpYyBoaWRkZW5Db2x1bW5zOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+ID0gW107XG4gIHB1YmxpYyBjb2x1bW5IZWFkZXJzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIHB1YmxpYyBfZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICBwcml2YXRlIF9jb25maWc6IE9lcGFUYWJsZUNvbmZpZyA9IHt9O1xuICBwcml2YXRlIGN1cnJlbnRGaWx0ZXJzOiBBcnJheTxPZXBhVGFibGVGaWx0ZXI+ID0gW3tcbiAgICBmaWx0ZXJTdHJpbmc6ICcnLFxuICAgIGNvbHVtbklkOiB1bmRlZmluZWRcbiAgfV07XG5cbiAgcHVibGljIGRhdGFIYXNEZXRhaWxzID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93QWxsRGV0YWlscyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBhbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgcGFnZUluZm86IE9lcGFUYWJsZVBhZ2VJbmZvID0ge1xuICAgIHBhZ2U6IDEsXG4gICAgaXRlbXNQZXJQYWdlOiAxMCxcbiAgICBtYXhTaXplOiA1LFxuICAgIG51bVBhZ2VzOiAxLFxuICAgIGxlbmd0aDogMFxuICB9O1xuICBwdWJsaWMgY3VycmVudFBhZ2UgPSAxO1xuICBwdWJsaWMgcGFnaW5hdGlvbk9uID0gdHJ1ZTtcblxuICBASW5wdXQoKSB0YWJsZUlkID0gJyc7XG4gIEBJbnB1dCgpIGFsbG93RWRpdCA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgY29uZmlnKGNvbmY6IE9lcGFUYWJsZUNvbmZpZykge1xuICAgIGlmICghY29uZi5jbGFzc05hbWUpIHtcbiAgICAgIGNvbmYuY2xhc3NOYW1lID0gJ3RhYmxlLXN0cmlwZWQgdGFibGUtYm9yZGVyZWQnO1xuICAgIH1cbiAgICBpZiAoY29uZi5jbGFzc05hbWVzKSB7XG4gICAgICBjb25mLmNsYXNzTmFtZSA9IGNvbmYuY2xhc3NOYW1lcy5qb2luKCcgJyk7XG4gICAgfVxuICAgIGlmIChjb25mLnJvd3NQZXJQYWdlKSB7XG4gICAgICB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZSA9IGNvbmYucm93c1BlclBhZ2U7XG4gICAgfVxuICAgIHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPSBjb25mLmV4cG9ydFZpc2libGVPbmx5O1xuICAgIHRoaXMuZXhwb3J0VW5zZWxlY3RlZFJvd3MgPSBjb25mLmV4cG9ydFVuc2VsZWN0ZWRSb3dzIHx8IGZhbHNlO1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmY7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpOiBPZXBhVGFibGVDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNvbXBsZXhIZWFkZXIoaGRyczogQXJyYXk8T2VwYVRhYmxlSGVhZGVyPikge1xuICAgIHRoaXMucmVzZXRIZWFkZXJzKCk7XG4gICAgaWYgKGhkcnMgJiYgaGRycy5sZW5ndGgpIHtcbiAgICAgIGhkcnMuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgICAgdGhpcy5oZWFkZXJSb3dzLnB1c2godGhpcy5leHRyYWN0SW5uZXJDb2x1bW5zKGhkci5jb2x1bW5zKSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29sdW1uSGVhZGVycyA9IHRoaXMuZXh0cmFjdENvbHVtbkhlYWRlcnModGhpcy5oZWFkZXJSb3dzKTtcbiAgICAgIHRoaXMuZGF0YUNvbHVtbnMgPSB0aGlzLmV4dHJhY3REYXRhQ29sdW1ucyh0aGlzLmhlYWRlclJvd3MpO1xuICAgICAgdGhpcy5pbml0aWFsaXplSGlkZGVuQ29sdW1ucyh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGhlYWRlcihoZHI6IE9lcGFUYWJsZUhlYWRlcikge1xuICAgIHRoaXMucmVzZXRIZWFkZXJzKCk7XG4gICAgaWYgKGhkci5jb2x1bW5zICYmIGhkci5jb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93cy5wdXNoKHRoaXMuZXh0cmFjdElubmVyQ29sdW1ucyhoZHIuY29sdW1ucykpO1xuICAgIH1cbiAgICB0aGlzLmNvbHVtbkhlYWRlcnMgPSB0aGlzLmV4dHJhY3RDb2x1bW5IZWFkZXJzKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgdGhpcy5kYXRhQ29sdW1ucyA9IHRoaXMuZXh0cmFjdERhdGFDb2x1bW5zKHRoaXMuaGVhZGVyUm93cyk7XG4gICAgdGhpcy5pbml0aWFsaXplSGlkZGVuQ29sdW1ucyhmYWxzZSk7XG4gIH1cblxuICBASW5wdXQoKSBjdXN0b21CdG5MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjdXN0b21CdG5WaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGN1c3RvbUJ0bkVuYWJsZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBjdXN0b21CdG5MYWJlbDI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgY3VzdG9tQnRuVmlzaWJsZTIgPSBmYWxzZTtcbiAgQElucHV0KCkgY3VzdG9tQnRuRW5hYmxlZDIgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzbWFsbCA9IGZhbHNlO1xuXG4gIC8vIE91dHB1dHMgKEV2ZW50cylcbiAgQE91dHB1dCgpIHB1YmxpYyBjZWxsQ2xpY2tlZDogRXZlbnRFbWl0dGVyPE9lcGFUYWJsZUNlbGxDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBhY3Rpb25DbGlja2VkOiBFdmVudEVtaXR0ZXI8T2VwYUFjdGlvbkV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByb3dTZWxlY3RlZDogRXZlbnRFbWl0dGVyPEFycmF5PE9lcGFUYWJsZVJvdz4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGN1c3RvbUJ0bkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBjdXN0b21CdG4yQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBwQ29sdW1uczogT2VwYVBDb2x1bW5bXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVzZXRIZWFkZXJzKCkge1xuICAgIHRoaXMuaGVhZGVyUm93cyA9IFtdO1xuICAgIHRoaXMuY29sdW1uSGVhZGVycyA9IFtdO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gW107XG4gICAgdGhpcy5wQ29sdW1ucyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplSGlkZGVuQ29sdW1ucyhjb21wbGV4SGVhZGVyOiBib29sZWFuKSB7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQgPSAwO1xuICAgIHRoaXMuYWxsQ29sdW1uQ291bnQgPSAwO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb2x1bW4uZmllbGQgPSBjb2x1bW4uaWQ7XG4gICAgICBjb2x1bW4uaGVhZGVyID0gY29sdW1uLnRpdGxlO1xuICAgICAgaWYgKGNvbXBsZXhIZWFkZXIgJiYgKGNvbHVtbj8uaGlkZGVuID09PSB0cnVlIHx8IGNvbHVtbj8uaGlkZGVuID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignZGlzYWJsaW5nIGhpZGRlbiBhdHRyaWJ1dGUgZm9yIGNvbHVtbjogJyArIGNvbHVtbi5pZCArXG4gICAgICAgICAgJy4gSGlkZGVuIGNvbHVtbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbXBsZXggaGVhZGVycyAoeWV0KS4nKTtcbiAgICAgICAgY29sdW1uLmhpZGRlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICB9IGVsc2UgaWYgKGNvbHVtbj8uaGlkZGVuID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuaGlkZGVuQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZpc2libGVDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgICAgIH1cbiAgICAgIHRoaXMuYWxsQ29sdW1uQ291bnQrKztcbiAgICB9KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZXM6IEFycmF5PE9lcGFUYWJsZVJvdz4pIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgdGhpcy5fZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB0aGlzLnRhYmxlU2VydmljZS5nZXREYXRhKHRoaXMudGFibGVJZCkgfHwgW107XG4gICAgfVxuICAgIGlmICh2YWx1ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlc1tpXS5wcml2YXRlSWQgPSBpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuY2xlYXJQYWdlSW5mbyh0aGlzLnRhYmxlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2RhdGEgPSB2YWx1ZXM7XG4gICAgdGhpcy50YWJsZVNlcnZpY2Uuc2V0RGF0YSh0aGlzLnRhYmxlSWQsIHRoaXMuX2RhdGEpO1xuICAgIHRoaXMudXBkYXRlVGFibGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5tYXAoeCA9PiBPYmplY3QuYXNzaWduKHt9LCB4KSk7XG4gIH1cblxuICBASW5wdXQoKSB0b3RhbFJvdzogT2VwYVRhYmxlUm93IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0YWJsZUV4cG9ydFNlcnZpY2U6IFRhYmxlRXhwb3J0U2VydmljZSxcbiAgICBwcml2YXRlIGZpbGVVdGlsU2VydmljZTogT2VwYUZpbGVVdGlsU2VydmljZSxcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhZ2luYXRpb25PbiA9ICF0aGlzLl9jb25maWcuZGlzYWJsZVBhZ2luYXRpb247XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmNsYXNzTmFtZSAhPT0gJycpIHtcbiAgICAgICQoJ3RhYmxlJykuYWRkQ2xhc3MoJ3RhYmxlICcgKyB0aGlzLmNvbmZpZy5jbGFzc05hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdElubmVyQ29sdW1ucyhpbm5lcjogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPik6IE9lcGFUYWJsZUhlYWRlciB7XG4gICAgY29uc3QgaGVhZGVyOiBPZXBhVGFibGVIZWFkZXIgPSB7IGNvbHVtbnM6IFtdIH07XG4gICAgaW5uZXIuZm9yRWFjaCgodmFsdWU6IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgY29sdW1uID0gaGVhZGVyLmNvbHVtbnMuZmluZCgoY29sOiBPZXBhVGFibGVDb2x1bW4pID0+IGNvbC5pZCA9PT0gdmFsdWUuaWQpO1xuICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAvLyBvdmVyd3JpdGUgcmVwZWF0ZWQgY29sdW1uXG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICBoZWFkZXIuY29sdW1ucy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0Q29sdW1uSGVhZGVycyhoZWFkZXJSb3dzOiBBcnJheTxPZXBhVGFibGVIZWFkZXI+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgaGVhZGVyczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGxldCByb3dJbmRleCA9IDA7XG4gICAgY29uc3QgY2hpbGRDb2x1bW5zOiBhbnkgPSB7fTtcbiAgICBoZWFkZXJSb3dzLmZvckVhY2goKGhkcjogT2VwYVRhYmxlSGVhZGVyKSA9PiB7XG4gICAgICBsZXQgY29sSW5kZXggPSAwO1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKHJvd0luZGV4ID09PSAwKSB7XG4gICAgICAgICAgaGVhZGVycy5wdXNoKGNvbHVtbi50aXRsZSk7XG4gICAgICAgICAgaWYgKGNvbHVtbi5jb2xzcGFuKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb3VudCA9IDE7IGNvdW50IDwgY29sdW1uLmNvbHNwYW47IGNvdW50KyspIHtcbiAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbHVtbi5yb3dzcGFuKSB7XG4gICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdID0gY29sdW1uLnJvd3NwYW4gLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aGlsZSAoY2hpbGRDb2x1bW5zW2NvbEluZGV4XSAmJiBjaGlsZENvbHVtbnNbY29sSW5kZXhdID4gMCkge1xuICAgICAgICAgICAgY2hpbGRDb2x1bW5zW2NvbEluZGV4XS0tO1xuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaGVhZGVyc1tjb2xJbmRleF0gKz0gJyAnICsgY29sdW1uLnRpdGxlO1xuICAgICAgICAgIGlmIChjb2x1bW4uY29sc3Bhbikge1xuICAgICAgICAgICAgZm9yIChsZXQgY291bnQgPSAxOyBjb3VudCA8IGNvbHVtbi5jb2xzcGFuOyBjb3VudCsrKSB7XG4gICAgICAgICAgICAgIGNvbEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbEluZGV4Kys7XG4gICAgICB9KTtcbiAgICAgIHJvd0luZGV4Kys7XG4gICAgfSk7XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuXG4gIHByaXZhdGUgZXh0cmFjdERhdGFDb2x1bW5zKGhlYWRlclJvd3M6IEFycmF5PE9lcGFUYWJsZUhlYWRlcj4pOiBBcnJheTxPZXBhVGFibGVDb2x1bW4+IHtcbiAgICBjb25zdCBkYXRhQ29sdW1uczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIGxldCByb3dJbmRleCA9IDA7XG4gICAgY29uc3QgY2hpbGRDb2x1bW5zOmFueSA9IHt9O1xuICAgIGhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGxldCBjb2xJbmRleCA9IDA7XG4gICAgICBoZHIuY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IE9lcGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgICBpZiAocm93SW5kZXggPT09IDApIHtcbiAgICAgICAgICBpZiAoY29sdW1uLmNvbHNwYW4gJiYgY29sdW1uLmNvbHNwYW4gPiAxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjb3VudCA9IDA7IGNvdW50IDwgY29sdW1uLmNvbHNwYW47IGNvdW50KyspIHtcbiAgICAgICAgICAgICAgZGF0YUNvbHVtbnMucHVzaCh7aWQ6ICcnLHRpdGxlOiAnJ30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29sSW5kZXggKz0gKGNvbHVtbi5jb2xzcGFuIC0gMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2x1bW4ucm93c3Bhbikge1xuICAgICAgICAgICAgICBjaGlsZENvbHVtbnNbY29sSW5kZXhdID0gY29sdW1uLnJvd3NwYW4gLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aGlsZSAoY2hpbGRDb2x1bW5zW2NvbEluZGV4XSAmJiBjaGlsZENvbHVtbnNbY29sSW5kZXhdID4gMCkge1xuICAgICAgICAgICAgY2hpbGRDb2x1bW5zW2NvbEluZGV4XS0tO1xuICAgICAgICAgICAgY29sSW5kZXgrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbHVtbi5jb2xzcGFuICYmIGNvbHVtbi5jb2xzcGFuID4gMSkge1xuICAgICAgICAgICAgY29sSW5kZXggKz0gKGNvbHVtbi5jb2xzcGFuIC0gMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGFDb2x1bW5zW2NvbEluZGV4XSA9IGNvbHVtbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29sSW5kZXgrKztcbiAgICAgIH0pO1xuICAgICAgcm93SW5kZXgrKztcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YUNvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgc2FuaXRpemUoaHRtbDogc3RyaW5nKTogU2FmZUh0bWwge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChodG1sKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgYW55IGZpbHRlcnMgYXJlIHNldFxuICAgKi9cbiAgcHVibGljIG5vRmlsdGVycygpOiBib29sZWFuIHtcbiAgICBsZXQgbm9GaWx0ZXJzID0gdHJ1ZTtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGlmIChmaWx0ZXIuZmlsdGVyU3RyaW5nICYmIGZpbHRlci5maWx0ZXJTdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBub0ZpbHRlcnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLm5vRmlsdGVyc1N1YmplY3QubmV4dChub0ZpbHRlcnMpO1xuICAgIHJldHVybiBub0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGdsb2JhbCBmaWx0ZXIgc3RyaW5nIChpZiBhbnkpIGFzIGEgUmVnRXhwXG4gICAqL1xuICBwcml2YXRlIGdldEdsb2JhbEZpbHRlcigpOiBSZWdFeHAgfCB1bmRlZmluZWQge1xuICAgIGxldCByZWdFeHA6IFJlZ0V4cCB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGlmICghZmlsdGVyLmNvbHVtbklkICYmIGZpbHRlci5maWx0ZXJTdHJpbmcgJiYgZmlsdGVyLmZpbHRlclN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlZ0V4cCA9IG5ldyBSZWdFeHAoZmlsdGVyLmZpbHRlclN0cmluZywgJ2knKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVnRXhwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBmaWx0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uIChpZiBhbnkpIGFzIGEgUmVnRXhwLlxuICAgKiBAcGFyYW0gY29sdW1uSWRcbiAgICovXG4gIHByaXZhdGUgZ2V0RmlsdGVyRm9yQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBSZWdFeHAgfCB1bmRlZmluZWQge1xuICAgIGxldCByZWdFeHA6IFJlZ0V4cCB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgIGlmIChmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkICYmIGZpbHRlci5maWx0ZXJTdHJpbmcgJiYgZmlsdGVyLmZpbHRlclN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlZ0V4cCA9IG5ldyBSZWdFeHAoZmlsdGVyLmZpbHRlclN0cmluZywgJ2knKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVnRXhwO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciB0aGUgdGFibGUgZGF0YSBwcm92aWRlZCBieSB0aGUgZ2xvYmFsIG9yIGNvbHVtbi1zcGVjaWZpY1xuICAgKiBmaWx0ZXJzIHNldCBpbiB0aGUgVUkuXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBwcml2YXRlIGZpbHRlckRhdGEoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93Pik6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIC8vIGRvbid0IGF0dGVtcHQgZmlsdGVyaW5nIGlmIHRoZXJlIGFyZSBubyBmaWx0ZXJzIHNldFxuICAgIGlmICh0aGlzLm5vRmlsdGVycygpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgbGV0IGZpbHRlcmVkRGF0YTogQXJyYXk8T2VwYVRhYmxlUm93PiA9IGRhdGE7XG4gICAgY29uc3QgdGVtcEFycmF5OiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gICAgZmlsdGVyZWREYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBsZXQgZmxhZyA9IHRoaXMuZmlsdGVyQnlDb2x1bW5GaWx0ZXJzKHJvdyk7XG4gICAgICBpZiAoZmxhZykge1xuICAgICAgICBmbGFnID0gdGhpcy5maWx0ZXJCeUdsb2JhbEZpbHRlcihyb3cpO1xuICAgICAgfVxuICAgICAgaWYgKGZsYWcgfHwgcm93LmlzRGl2aWRlcikge1xuICAgICAgICB0ZW1wQXJyYXkucHVzaChyb3cpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZpbHRlcmVkRGF0YSA9IHRlbXBBcnJheTtcbiAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3QgaWYgcm93IG1hdGNoZXMgYW55IG9mIHRoZSBjb2x1bW5uIGZpbHRlcnMgdGhhdCBtYXkgYmUgc2V0LlxuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBwcml2YXRlIGZpbHRlckJ5Q29sdW1uRmlsdGVycyhyb3c6IE9lcGFUYWJsZVJvdyk6IGJvb2xlYW4ge1xuICAgIGxldCBmbGFnID0gdHJ1ZTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgY29uc3QgcmVnRXhwID0gdGhpcy5nZXRGaWx0ZXJGb3JDb2x1bW4oY2VsbC5pZCk7XG4gICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGNlbGwuZmlsdGVyVmFsdWUgfHwgY2VsbC52YWx1ZSB8fCAnJztcbiAgICAgIGlmIChyZWdFeHAgJiYgZmlsdGVyVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmaWx0ZXJWYWx1ZS50b1N0cmluZygpLm1hdGNoKHJlZ0V4cCk7XG4gICAgICAgIGZsYWcgPSBmbGFnICYmIChyZXN1bHQgIT09IG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmbGFnO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3QgaWYgcm93IG1hdGNoZXMgdGhlIGdsb2JhbCBmaWx0ZXJcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJCeUdsb2JhbEZpbHRlcihyb3c6IE9lcGFUYWJsZVJvdyk6IGJvb2xlYW4ge1xuICAgIGxldCBmbGFnID0gdHJ1ZTtcbiAgICBjb25zdCByZWdFeHAgPSB0aGlzLmdldEdsb2JhbEZpbHRlcigpO1xuICAgIGlmIChyZWdFeHApIHtcbiAgICAgIGZsYWcgPSBmYWxzZTtcbiAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gY2VsbC5maWx0ZXJWYWx1ZSB8fCBjZWxsLnZhbHVlO1xuICAgICAgICBpZiAoZmlsdGVyVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpbHRlclZhbHVlLnRvU3RyaW5nKCkubWF0Y2gocmVnRXhwKTtcbiAgICAgICAgICBmbGFnID0gZmxhZyB8fCAocmVzdWx0ICE9PSBudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmbGFnO1xuICB9XG5cbiAgcHVibGljIGhpZGVDb2x1bW4oY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pIHtcbiAgICB0aGlzLmhpZGRlbkNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgIHRoaXMudmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihtYXRjaCA9PiB7XG4gICAgICByZXR1cm4gbWF0Y2guaWQgIT09IGNvbHVtbi5pZDtcbiAgICB9KTtcbiAgICBjb2x1bW4uaGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLnZpc2libGVDb2x1bW5Db3VudC0tO1xuICB9XG5cbiAgcHVibGljIHVuaGlkZUNvbHVtbihjb2x1bW5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaGlkZGVuQ29sczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIHRoaXMuaGlkZGVuQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wuaWQgIT09IGNvbHVtbklkKSB7XG4gICAgICAgIGhpZGRlbkNvbHMucHVzaChjb2wpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sLmhpZGRlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB2aXNpYmxlQ29sczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIHRoaXMuZGF0YUNvbHVtbnMuZm9yRWFjaChkYXRhQ29sdW1uID0+IHtcbiAgICAgIGxldCBrZWVwID0gdHJ1ZTtcbiAgICAgIGhpZGRlbkNvbHMuZm9yRWFjaChoaWRkZW5Db2x1bW4gPT4ge1xuICAgICAgICBpZiAoZGF0YUNvbHVtbi5pZCA9PT0gaGlkZGVuQ29sdW1uLmlkKSB7XG4gICAgICAgICAga2VlcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChrZWVwKSB7XG4gICAgICAgIHZpc2libGVDb2xzLnB1c2goZGF0YUNvbHVtbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5oaWRkZW5Db2x1bW5zID0gaGlkZGVuQ29scztcbiAgICB0aGlzLnZpc2libGVDb2x1bW5zID0gdmlzaWJsZUNvbHM7XG4gICAgdGhpcy52aXNpYmxlQ29sdW1uQ291bnQrKztcbiAgfVxuXG4gIHByaXZhdGUgc29ydERhdGEoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93Pik6IEFycmF5PE9lcGFUYWJsZVJvdz4ge1xuICAgIGxldCBzb3J0Q3JpdGVyaWE6IGFueSA9IHRoaXMudGFibGVTZXJ2aWNlLmdldFNvcnRDcml0ZXJpYSh0aGlzLnRhYmxlSWQpIHx8IFtdO1xuICAgIGlmIChzb3J0Q3JpdGVyaWEubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXRDb2x1bW5Tb3J0SW5kZXhlcyhzb3J0Q3JpdGVyaWEpO1xuXG4gICAgcmV0dXJuIGRhdGEuc29ydCgocHJldmlvdXM6IE9lcGFUYWJsZVJvdywgY3VycmVudDogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBsZXQgc29ydEluZGV4ID0gMDtcbiAgICAgIGxldCBzb3J0UmVzdWx0ID0gMDtcbiAgICAgIHdoaWxlIChzb3J0SW5kZXggPCBzb3J0Q3JpdGVyaWEubGVuZ3RoICYmIHNvcnRSZXN1bHQgPT09IDApIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldFJvd1NvcnRWYWx1ZShwcmV2aW91cywgc29ydENyaXRlcmlhW3NvcnRJbmRleF0uY29sdW1uSWQpO1xuICAgICAgICBsZXQgY3VyciA9IHRoaXMuZ2V0Um93U29ydFZhbHVlKGN1cnJlbnQsIHNvcnRDcml0ZXJpYVtzb3J0SW5kZXhdLmNvbHVtbklkKTtcbiAgICAgICAgaWYgKHByZXYgPiBjdXJyKSB7XG4gICAgICAgICAgc29ydFJlc3VsdCA9ICAoc29ydENyaXRlcmlhW3NvcnRJbmRleF0uc29ydCA9PT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2IDwgY3Vycikge1xuICAgICAgICAgIHNvcnRSZXN1bHQgPSAgKHNvcnRDcml0ZXJpYVtzb3J0SW5kZXhdLnNvcnQgPT09ICdhc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3J0UmVzdWx0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzb3J0SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3J0UmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0Q29sdW1uU29ydEluZGV4ZXMoc29ydENyaXRlcmlhOiBPZXBhVGFibGVTb3J0Q3JpdGVyaW9uW10pIHtcbiAgICBpZiAoc29ydENyaXRlcmlhICYmIHNvcnRDcml0ZXJpYS5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGxldCBpPTA7IGk8c29ydENyaXRlcmlhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGF0YUNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4/LmlkID09PSBzb3J0Q3JpdGVyaWFbaV0uY29sdW1uSWQpIHtcbiAgICAgICAgICAgIGNvbHVtbi5zb3J0SW5kZXggPSBpICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGRpc3BsYXkgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjZWxsLlxuICAgKiBAcGFyYW0gcm93XG4gICAqIEBwYXJhbSBjb2x1bW5JZFxuICAgKi9cbiAgcHVibGljIGdldFJvd1ZhbHVlKHJvdzogT2VwYVRhYmxlUm93LCBjb2x1bW5JZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICByb3cuY2VsbHMuZm9yRWFjaCgoY2VsbDogT2VwYVRhYmxlQ2VsbCkgPT4ge1xuICAgICAgaWYgKGNlbGwuaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgIHZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgaXNDZWxsVmFsdWVIaWRkZW4ocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgaGlkZGVuOiBib29sZWFuID0gZmFsc2U7XG4gICAgcm93LmNlbGxzLmZvckVhY2goKGNlbGw6IE9lcGFUYWJsZUNlbGwpID0+IHtcbiAgICAgIGlmIChjZWxsLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICBoaWRkZW4gPSBjZWxsLmhpZGVWYWx1ZSB8fCBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaGlkZGVuO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByb3cgUmV0cmlldmUgdGhlIHNvcnQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjZWxsICh3aWxsIGRlZmF1bHQgdG8gZGlzcGxheSB2YWx1ZSBpZiBzb3J0XG4gICAqIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQpLlxuICAgKiBAcGFyYW0gY29sdW1uSWRcbiAgICovXG4gIHB1YmxpYyBnZXRSb3dTb3J0VmFsdWUocm93OiBPZXBhVGFibGVSb3csIGNvbHVtbklkOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIHJvdy5jZWxscy5mb3JFYWNoKChjZWxsOiBPZXBhVGFibGVDZWxsKSA9PiB7XG4gICAgICBpZiAoY2VsbC5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgaWYgKGNlbGwuc29ydFZhbHVlICE9PSB1bmRlZmluZWQgJiYgY2VsbC5zb3J0VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YWx1ZSA9IGNlbGwuc29ydFZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYWdlKGRhdGE6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSB0aGlzLmRhdGEpOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbk9uKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVQYWdlKCk7XG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdlSW5mby5wYWdlIC0gMSkgKiB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLnBhZ2VJbmZvLml0ZW1zUGVyUGFnZSA+IC0xID8gKHN0YXJ0ICsgdGhpcy5wYWdlSW5mby5pdGVtc1BlclBhZ2UpIDogZGF0YS5sZW5ndGg7XG4gICAgLy8gbm90IHN1cmUgd2h5LCBidXQgbWF4U2l6ZSB3YXMgZ2V0dGluZyBsb3N0LiBSZXNldCBpdCBoZXJlIHRvIHByZXZlbnQgd2VpcmRuZXNzLlxuICAgIHRoaXMucGFnZUluZm8ubWF4U2l6ZSA9IDU7XG4gICAgcmV0dXJuIGRhdGEuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUGFnaW5nYXRpb24oKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uT24gPSAhdGhpcy5wYWdpbmF0aW9uT247XG4gICAgdGhpcy51cGRhdGVUYWJsZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRmlsdGVyQ2hhbmdlZChmaWx0ZXI6IE9lcGFUYWJsZUZpbHRlcikge1xuICAgIGNvbnN0IG1hdGNoRmlsdGVyID0gdGhpcy5jdXJyZW50RmlsdGVycy5maW5kKChmKSA9PiB7XG4gICAgICByZXR1cm4gZi5jb2x1bW5JZCA9PT0gZmlsdGVyLmNvbHVtbklkO1xuICAgIH0pO1xuICAgIGlmICghbWF0Y2hGaWx0ZXIpIHtcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRjaEZpbHRlci5maWx0ZXJTdHJpbmcgPSBmaWx0ZXIuZmlsdGVyU3RyaW5nO1xuICAgIH1cbiAgICAvLyBuZWVkIHRvIGNoZWNrIGZvciBub0ZpbHRlcnMgdG8gc2VuZCBzdWJqZWN0XG4gICAgdGhpcy5ub0ZpbHRlcnMoKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9uU29ydENoYW5nZWQoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pIHtcbiAgICB0aGlzLnRhYmxlU2VydmljZS5zZXRTb3J0KHRoaXMudGFibGVJZCwgY29sdW1uKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgb25QYWdlQ2hhbmdlZChwYWdlRXZlbnQ6IFBhZ2VDaGFuZ2VkRXZlbnQpIHtcbiAgICB0aGlzLnBhZ2VJbmZvID0ge1xuICAgICAgcGFnZTogcGFnZUV2ZW50LnBhZ2UsXG4gICAgICBpdGVtc1BlclBhZ2U6IHBhZ2VFdmVudC5pdGVtc1BlclBhZ2UsXG4gICAgICBtYXhTaXplOiB0aGlzLnBhZ2VJbmZvLm1heFNpemUsXG4gICAgICBsZW5ndGg6IHRoaXMucGFnZUluZm8ubGVuZ3RoLFxuICAgICAgbnVtUGFnZXM6IHRoaXMucGFnZUluZm8ubnVtUGFnZXNcbiAgICB9XG4gICAgdGhpcy50YWJsZVNlcnZpY2Uuc2V0UGFnZSh0aGlzLnRhYmxlSWQsIHBhZ2VFdmVudC5wYWdlKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYmxlKGNsZWFyU2VsY3RlZFJvd3M6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IHRoaXMuZmlsdGVyRGF0YSh0aGlzLmRhdGEpO1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSB0aGlzLnNvcnREYXRhKGZpbHRlcmVkRGF0YSk7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5jaGFuZ2VQYWdlKHNvcnRlZERhdGEpO1xuICAgIHRoaXMucGFnZUluZm8ubGVuZ3RoID0gc29ydGVkRGF0YS5sZW5ndGg7XG4gICAgdGhpcy5hbGxSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBpZiAoY2xlYXJTZWxjdGVkUm93cykge1xuICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KFtdKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhSGFzRGV0YWlscyA9IHRoaXMuY2hlY2tGb3JEZXRhaWxzKHRoaXMucm93cyk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2UoKSB7XG4gICAgY29uc3Qgc2F2ZWRQYWdlTnVtYmVyID0gdGhpcy50YWJsZVNlcnZpY2UuZ2V0UGFnZSh0aGlzLnRhYmxlSWQpO1xuICAgIGlmIChzYXZlZFBhZ2VOdW1iZXIgJiYgdGhpcy5wYWdlSW5mby5wYWdlICE9PSBzYXZlZFBhZ2VOdW1iZXIpIHtcbiAgICAgIHRoaXMucGFnZUluZm8ucGFnZSA9IHNhdmVkUGFnZU51bWJlcjtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VJbmZvLnBhZ2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ZvckRldGFpbHMoZGF0YTogQXJyYXk8T2VwYVRhYmxlUm93Pik6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNEZXRhaWxzID0gZmFsc2U7XG4gICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICAgIGRhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5zaG93RGV0YWlsID09PSB0cnVlIHx8IHJvdy5zaG93RGV0YWlsID09PSBmYWxzZSkge1xuICAgICAgICAgIGhhc0RldGFpbHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0RldGFpbHM7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQWxsRGV0YWlscygpIHtcbiAgICB0aGlzLnNob3dBbGxEZXRhaWxzID0gIXRoaXMuc2hvd0FsbERldGFpbHM7XG4gICAgaWYgKHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5zaG93RGV0YWlsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByb3cuc2hvd0RldGFpbCA9IHRoaXMuc2hvd0FsbERldGFpbHM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUm93RGV0YWlsKHRvZ2dsZVJvdzogT2VwYVRhYmxlUm93KSB7XG4gICAgaWYgKHRvZ2dsZVJvdyAmJiB0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9kYXRhLmZvckVhY2goKHJvdzogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICAgIGlmIChyb3cuZGF0YVNvdXJjZSA9PT0gdG9nZ2xlUm93LmRhdGFTb3VyY2UpIHtcbiAgICAgICAgICByb3cuc2hvd0RldGFpbCA9ICF0b2dnbGVSb3cuc2hvd0RldGFpbDtcbiAgICAgICAgICB0b2dnbGVSb3cuc2hvd0RldGFpbCA9IHJvdy5zaG93RGV0YWlsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNBY3Rpb25Db2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBhY3Rpb25Db2x1bW4gPSBmYWxzZTtcbiAgICB0aGlzLmhlYWRlclJvd3MuZm9yRWFjaCgoaGRyOiBPZXBhVGFibGVIZWFkZXIpID0+IHtcbiAgICAgIGhkci5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiB7XG4gICAgICAgIGlmIChjb2x1bW4uaWQgPT09IGNvbHVtbklkKSB7XG4gICAgICAgICAgYWN0aW9uQ29sdW1uID0gY29sdW1uLmFjdGlvbkNvbHVtbiB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGlvbkNvbHVtbjtcbiAgfVxuXG4gIHB1YmxpYyBpc0NvbHVtbkhpZGRlbihjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IGhpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5pZCA9PT0gY29sdW1uSWQpIHtcbiAgICAgICAgICBoaWRkZW4gPSBjb2x1bW4uaGlkZGVuIHx8IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gaGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldEhpZGRlbkNvbHVtbnMoKTogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiB7XG4gICAgY29uc3QgY29sdW1uczogQXJyYXk8T2VwYVRhYmxlQ29sdW1uPiA9IFtdO1xuICAgIHRoaXMuaGVhZGVyUm93cy5mb3JFYWNoKChoZHI6IE9lcGFUYWJsZUhlYWRlcikgPT4ge1xuICAgICAgaGRyLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBPZXBhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKGNvbHVtbi5oaWRkZW4pIHtcbiAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICBwdWJsaWMgY2VsbENsaWNrKGV2ZW50OiBUYWJsZURhdGFDZWxsQ2xpY2tFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJvdyA9IGV2ZW50LnJvdztcbiAgICBjb25zdCBjb2x1bW5JZCA9IGV2ZW50LmNvbHVtbklEO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZShyb3csIGNvbHVtbklkKTtcbiAgICB0aGlzLmNlbGxDbGlja2VkLmVtaXQoeyByb3csIGNvbHVtbklkLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFjdGlvbkNsaWNrKGV2ZW50OiBPZXBhQWN0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNsaWNrZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQWxsUm93c1NlbGVjdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9ICF0aGlzLmFsbFJvd3NTZWxlY3RlZDtcbiAgICAvLyBkZXNlbGVjdCBhbGwgcm93c1xuICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICByLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgfSk7XG4gICAgLy8gc2VsZWN0IG9ubHkgdmlzaWJsZSByb3dzXG4gICAgdGhpcy5yb3dzLmZvckVhY2goKHI6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHIuc2VsZWN0YWJsZSkge1xuICAgICAgICByLnNlbGVjdGVkID0gdGhpcy5hbGxSb3dzU2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgICBpZiAoci5zZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZFJvd3MucHVzaChyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJvd3Muc2xpY2UoKTtcbiAgICB0aGlzLmNvcHlTZWxlY3Rpb25TdGF0ZSgpO1xuICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVJvd1NlbGVjdGlvbihyb3c6IE9lcGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93czogQXJyYXk8T2VwYVRhYmxlUm93PiA9IFtdO1xuICAgIHJvdy5zZWxlY3RlZCA9ICFyb3cuc2VsZWN0ZWQ7XG4gICAgdGhpcy5yb3dzLmZvckVhY2goZHIgPT4ge1xuICAgICAgaWYgKHJvdy5wcml2YXRlSWQgPT09IGRyLnByaXZhdGVJZCkge1xuICAgICAgICBkci5zZWxlY3RlZCA9IHJvdy5zZWxlY3RlZDtcbiAgICAgIH1cbiAgICAgIGlmIChkci5zZWxlY3RlZCkge1xuICAgICAgICBzZWxlY3RlZFJvd3MucHVzaChkcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFsbFJvd3NTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY29weVNlbGVjdGlvblN0YXRlKCk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBwcml2YXRlIGNvcHlTZWxlY3Rpb25TdGF0ZSgpIHtcbiAgICB0aGlzLnJvd3MuZm9yRWFjaCgocjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICB0aGlzLl9kYXRhLmZvckVhY2goZHIgPT4ge1xuICAgICAgICBpZiAoZHIucHJpdmF0ZUlkID09PSByLnByaXZhdGVJZCkge1xuICAgICAgICAgIGRyLnNlbGVjdGVkID0gci5zZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2luZ2xlUm93U2VsZWN0aW9uKHJvdzogT2VwYVRhYmxlUm93KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzOiBBcnJheTxPZXBhVGFibGVSb3c+ID0gW107XG4gICAgcm93LnNlbGVjdGVkID0gIXJvdy5zZWxlY3RlZDtcbiAgICAvLyBhZGQgcm93IHRvIHNlbGVjdGVkIHJvd3MgaWYgaXQgaXMgc2VsZWN0ZWRcbiAgICBpZiAocm93LnNlbGVjdGVkKSB7XG4gICAgICBzZWxlY3RlZFJvd3MucHVzaChyb3cpO1xuICAgIH1cbiAgICAvLyB1bnNlbGVjdCBhbnkgb3RoZXIgcm93IHRoYXQgbWF5IGJlIHNlbGVjdGVkXG4gICAgdGhpcy5fZGF0YS5mb3JFYWNoKChkcjogT2VwYVRhYmxlUm93KSA9PiB7XG4gICAgICBpZiAocm93LnByaXZhdGVJZCA9PT0gZHIucHJpdmF0ZUlkKSB7XG4gICAgICAgIGRyLnNlbGVjdGVkID0gcm93LnNlbGVjdGVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlKCk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVSb3dzRm9yRXhwb3J0KHJvd3M6IEFycmF5PE9lcGFUYWJsZVJvdz4pOiBBcnJheTxPZXBhVGFibGVSb3c+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PE9lcGFUYWJsZVJvdz4gPSBbXTtcbiAgICAvLyB0aGlzLmR1bXBEZXRhaWxSb3dzKCk7XG4gICAgaWYgKHJvd3MgJiYgcm93cy5sZW5ndGgpIHtcbiAgICAgIHJvd3MuZm9yRWFjaCgocm93OiBPZXBhVGFibGVSb3cpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cG9ydFVuc2VsZWN0ZWRSb3dzICYmIHRoaXMuaGFzU2VsZWN0YWJsZUNvbHVtbigpICYmICFyb3cuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAvLyBza2lwIHVuc2VsZWN0ZWQgcm93c1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgY2VsbHM6IHRoaXMuc2ltcGxpZnlDZWxscyhyb3cuY2VsbHMpLFxuICAgICAgICAgIGFjdGlvbnM6IHJvdy5hY3Rpb25zLFxuICAgICAgICAgIHNob3dEZXRhaWw6IHJvdy5zaG93RGV0YWlsLFxuICAgICAgICAgIHN1YlRhYmxlOiByb3cuZGV0YWlsID8gdGhpcy5jb252ZXJ0VG9UYWJsZShyb3cuZGV0YWlsKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpc0RpdmlkZXI6IHJvdy5pc0RpdmlkZXIsXG4gICAgICAgICAgZGl2aWRlckNsYXNzTmFtZTogcm93LmRpdmlkZXJDbGFzc05hbWVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBoYXNTZWxlY3RhYmxlQ29sdW1uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFDb2x1bW5zLnNvbWUoKGNvbHVtbjogT2VwYVRhYmxlQ29sdW1uKSA9PiBjb2x1bW4uc2VsZWN0Q29sdW1uKTtcbiAgfVxuXG4gIHByaXZhdGUgc2ltcGxpZnlDZWxscyhjZWxsczogT2VwYVRhYmxlQ2VsbFtdKSB7XG4gICAgbGV0IHNpbXBsZUNlbGxzOiBPZXBhVGFibGVDZWxsW10gPSBbXTtcbiAgICBpZiAoY2VsbHMgJiYgY2VsbHMubGVuZ3RoID4gMCkge1xuICAgICAgY2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgc2ltcGxlQ2VsbHMucHVzaCh7XG4gICAgICAgICAgaWQ6IGNlbGwuaWQsXG4gICAgICAgICAgdmFsdWU6IGNlbGwudmFsdWUsXG4gICAgICAgICAgaGlkZVZhbHVlOiBjZWxsLmhpZGVWYWx1ZSxcbiAgICAgICAgICBpY29uQ2xhc3NOYW1lOiBjZWxsLmljb25DbGFzc05hbWUsXG4gICAgICAgICAgY2xhc3NOYW1lOiBjZWxsLmNsYXNzTmFtZSxcbiAgICAgICAgICBpbWdTcmM6IGNlbGwuaW1nU3JjLFxuICAgICAgICAgIGlubmVySFRNTDogY2VsbC5pbm5lckhUTUwsXG4gICAgICAgICAgY29sU3BhbjogY2VsbC5jb2xTcGFuLFxuICAgICAgICAgIGV4Y2VsRGF0YUZvcm1hdDogY2VsbC5leGNlbERhdGFGb3JtYXRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNpbXBsZUNlbGxzO1xuICB9XG5cbiAgcHVibGljIGdhdGhlclRhYmxlRGF0YShyb3dzOiBPZXBhVGFibGVSb3dbXSk6IE9lcGFUYWJsZSB7XG4gICAgLy8gdGhpcy5kdW1wRGV0YWlsUm93cygpO1xuICAgIGNvbnN0IG9lcGFUYWJsZTogT2VwYVRhYmxlID0ge307XG4gICAgb2VwYVRhYmxlLmhlYWRlclJvd3MgPSB0aGlzLmhlYWRlclJvd3M7XG4gICAgb2VwYVRhYmxlLmFsbERhdGFSb3dzID0gdGhpcy5wcmVwYXJlUm93c0ZvckV4cG9ydChyb3dzKTtcbiAgICBvZXBhVGFibGUuc2hvd0FsbERldGFpbHMgPSB0aGlzLnNob3dBbGxEZXRhaWxzO1xuICAgIG9lcGFUYWJsZS5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lO1xuICAgIG9lcGFUYWJsZS52aXNpYmxlQ29sdW1uQ291bnQgPSB0aGlzLnZpc2libGVDb2x1bW5Db3VudDtcbiAgICBvZXBhVGFibGUuYWxsQ29sdW1uQ291bnQgPSB0aGlzLmFsbENvbHVtbkNvdW50O1xuICAgIHJldHVybiBvZXBhVGFibGU7XG4gIH1cblxuICBwcml2YXRlIGR1bXBEZXRhaWxSb3dzKCkge1xuICAgIGNvbnNvbGUubG9nKCdkdW1wRGV0YWlsUm93cyAtIFRvdGFsIHJvd3M6ICcgKyB0aGlzLl9kYXRhLmxlbmd0aCk7XG4gICAgdGhpcy5fZGF0YS5mb3JFYWNoKChyb3c6IE9lcGFUYWJsZVJvdykgPT4ge1xuICAgICAgaWYgKHJvdy5zaG93RGV0YWlsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTSE9XIERFVEFJTDogJyArIEpTT04uc3RyaW5naWZ5KHJvdy5kYXRhU291cmNlKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY29udmVydFRvVGFibGUodGVtcGxhdGU6IE9lcGFUZW1wbGF0ZUluZm8pOiBPZXBhVGFibGUgfCB1bmRlZmluZWQge1xuICAgIGxldCBvZXBhVGFibGU6IE9lcGFUYWJsZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGUuY29tcG9uZW50ID09PSBQVGFibGVDb21wb25lbnQpIHtcbiAgICAgIGNvbnN0IHRhYmxlOiBQVGFibGVDb21wb25lbnQgPSBuZXcgUFRhYmxlQ29tcG9uZW50KHRoaXMuc2FuaXRpemVyLCB0aGlzLnRhYmxlU2VydmljZSwgdGhpcy50YWJsZUV4cG9ydFNlcnZpY2UsIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLCB0aGlzLmVsUmVmKTtcbiAgICAgIGlmICh0ZW1wbGF0ZS5pbnB1dHMgJiYgdGVtcGxhdGUuaW5wdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGVtcGxhdGUuaW5wdXRzLmZvckVhY2goKGlucHV0OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoaW5wdXQubmFtZSA9PT0gJ2NvbmZpZycpIHtcbiAgICAgICAgICAgIHRhYmxlLmNvbmZpZyA9IGlucHV0LnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQubmFtZSA9PT0gJ2NvbXBsZXhIZWFkZXInKSB7XG4gICAgICAgICAgICB0YWJsZS5jb21wbGV4SGVhZGVyID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgdGFibGUuaGVhZGVyID0gaW5wdXQudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5uYW1lID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHRhYmxlLmRhdGEgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBvZXBhVGFibGUgPSB0YWJsZS5nYXRoZXJUYWJsZURhdGEodGFibGUuZGF0YSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvZXBhVGFibGU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRXhwb3J0VmlzaWJsZU9ubHkoKSB7XG4gICAgdGhpcy5leHBvcnRWaXNpYmxlT25seSA9ICF0aGlzLmV4cG9ydFZpc2libGVPbmx5O1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUV4cG9ydFVuc2VsZWN0ZWRSb3dzKCkge1xuICAgIHRoaXMuZXhwb3J0VW5zZWxlY3RlZFJvd3MgPSAhdGhpcy5leHBvcnRVbnNlbGVjdGVkUm93cztcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRUb0V4Y2VsKCkge1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSB0aGlzLnNvcnREYXRhKHRoaXMuX2RhdGEpO1xuICAgIGNvbnN0IGV4cG9ydFRhYmxlOiBPZXBhVGFibGUgPSB0aGlzLmdhdGhlclRhYmxlRGF0YSh0aGlzLmV4cG9ydFZpc2libGVPbmx5ID8gdGhpcy5yb3dzIDogc29ydGVkRGF0YSk7XG5cbiAgICBpZiAoKGV4cG9ydFRhYmxlLmFsbERhdGFSb3dzPy5sZW5ndGggfHwgMCkgPiAwKSB7XG4gICAgICB0aGlzLnRhYmxlRXhwb3J0U2VydmljZS5kb3dubG9hZEV4Y2VsKGV4cG9ydFRhYmxlLCB0aGlzLl9jb25maWcpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGRhdGEgPT4ge1xuICAgICAgICAgIHRoaXMuZmlsZVV0aWxTZXJ2aWNlLmRvd25sb2FkRmlsZShkYXRhLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBlcnJvciA9PiBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGVydCgnTm8gZGF0YSBpbiB0YWJsZSBhdmFpbGFibGUgZm9yIGV4cG9ydCcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRUb0hUTUwoKSB7XG4gICAgY29uc3Qgc29ydGVkRGF0YSA9IHRoaXMuc29ydERhdGEodGhpcy5fZGF0YSk7XG4gICAgY29uc3QgZXhwb3J0VGFibGU6IE9lcGFUYWJsZSA9IHRoaXMuZ2F0aGVyVGFibGVEYXRhKHRoaXMuZXhwb3J0VmlzaWJsZU9ubHkgPyB0aGlzLnJvd3MgOiBzb3J0ZWREYXRhKTtcblxuICAgIGlmICgoZXhwb3J0VGFibGUuYWxsRGF0YVJvd3M/Lmxlbmd0aCB8fCAwKSA+IDApIHtcbiAgICAgIC8vIGZvciBub3csIGFsd2F5cyBlbWJlZCBzdWItdGFibGVzICBpbiBIVE1MIHZpZXcuXG4gICAgICB0aGlzLnRhYmxlRXhwb3J0U2VydmljZS5kb3dubG9hZEhUTUwoZXhwb3J0VGFibGUsIHRoaXMuX2NvbmZpZykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogZGF0YSA9PiB7XG4gICAgICAgICAgdGhpcy5maWxlVXRpbFNlcnZpY2UuZG93bmxvYWRGaWxlKGRhdGEsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVycm9yID0+IGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsZXJ0KCdObyBkYXRhIGluIHRhYmxlIGF2YWlsYWJsZSBmb3IgZXhwb3J0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ3VzdG9tQnRuQ2xpY2soKSB7XG4gICAgdGhpcy5jdXN0b21CdG5DbGlja2VkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkN1c3RvbUJ0bjJDbGljaygpIHtcbiAgICB0aGlzLmN1c3RvbUJ0bjJDbGlja2VkLmVtaXQoKTtcbiAgfVxuXG59XG4iLCI8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5oaWRlVGFibGVcIj5cbiAgPGZvcm0gKm5nSWY9XCJoaWRkZW5Db2x1bW5zLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTJcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbC1mb3JtLWxhYmVsXCI+U2hvdyBIaWRkZW4gQ29sdW1uczo8L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00XCI+XG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIChjaGFuZ2UpPVwidW5oaWRlQ29sdW1uKCRhbnkoJGV2ZW50KS50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICBbaWRdPVwidGFibGVJZCsnX1VuaGlkZUNvbHVtblNlbGVjdCdcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+Q2hvb3NlIGEgY29sdW1uPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29sIG9mIGhpZGRlbkNvbHVtbnNcIiBbdmFsdWVdPVwiY29sLmlkXCI+e3tjb2wudGl0bGV9fTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG5cbiAgPGRpdiBuZ0NsYXNzPVwie3tjb25maWcuZGl2Q2xhc3NOYW1lIHx8ICcnfX1cIj5cbiAgICA8cC10YWJsZSBbY29sdW1uc109XCJ2aXNpYmxlQ29sdW1uc1wiIFt2YWx1ZV09XCJyb3dzXCIgXG4gICAgICBbc2Nyb2xsYWJsZV09XCJjb25maWcudmVydGljYWxTY3JvbGxcIiBbc2Nyb2xsSGVpZ2h0XT1cImNvbmZpZy5zY3JvbGxIZWlnaHRcIlxuICAgICAgW3RhYmxlU3R5bGVdPVwieydtaW4td2lkdGgnOiAnNTByZW0nfVwiPlxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxuICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGhkciBvZiBoZWFkZXJSb3dzOyBsZXQgaHI9aW5kZXg7XCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgIDx0aCAqbmdJZj1cImRhdGFIYXNEZXRhaWxzICYmIGhyID09PSAwXCIgW3Jvd1NwYW5dPVwiaGVhZGVyUm93cy5sZW5ndGhcIiBjbGFzcz1cImRldGFpbC1pbmRpY2F0b3ItY29sXCI+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgPGkgKGNsaWNrKT1cInRvZ2dsZUFsbERldGFpbHMoKVwiIFtpZF09XCJ0YWJsZUlkKydfU2hvd0FsbERldGFpbHNMaW5rJ1wiIGNsYXNzPVwiYmlcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYmktY2hldnJvbi1kb3duJzogc2hvd0FsbERldGFpbHMsICdiaS1jaGV2cm9uLXJpZ2h0JzogIXNob3dBbGxEZXRhaWxzfVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiKHNob3dBbGxEZXRhaWxzID8gJ0hpZGUnIDogJ1Nob3cnKSArICcgZGV0YWlscyBmb3IgYWxsIHJvd3MnXCIgcGxhY2VtZW50PVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1jb2wgW25nRm9yT2ZdPVwiaGRyLmNvbHVtbnNcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmhpZGRlbiAmJiBjb2wuZnJvemVuQ29sdW1uXCIgcEZyb3plbkNvbHVtbiBuZ0NsYXNzPVwie3tjb2wuY2xhc3NOYW1lIHx8ICcnfX1cIlxuICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjb2wuY29sc3BhbiB8fCAxXCIgW3Jvd1NwYW5dPVwiY29sLnJvd3NwYW4gfHwgMVwiPlxuICAgICAgICAgICAgICA8b2VwYS10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cImNvbFwiIFt0YWJsZUlkXT1cInRhYmxlSWRcIiBbYWxsUm93c1NlbGVjdGVkXT1cImFsbFJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW3Jvd0NvdW50XT1cInJvd3MubGVuZ3RoXCIgW25vRmlsdGVyc1N1YmplY3RdPVwibm9GaWx0ZXJzU3ViamVjdFwiXG4gICAgICAgICAgICAgICAgKG9uVG9nZ2xlQWxsUm93c1NlbGVjdGlvbik9XCJ0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKClcIiAob25Tb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkhpZGVDb2x1bW4pPVwiaGlkZUNvbHVtbigkZXZlbnQpXCIgKG9uRmlsdGVyQ2hhbmdlZCk9XCJvbkZpbHRlckNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L29lcGEtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5oaWRkZW4gJiYgIWNvbC5mcm96ZW5Db2x1bW5cIiBuZ0NsYXNzPVwie3tjb2wuY2xhc3NOYW1lIHx8ICcnfX1cIlxuICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjb2wuY29sc3BhbiB8fCAxXCIgW3Jvd1NwYW5dPVwiY29sLnJvd3NwYW4gfHwgMVwiPlxuICAgICAgICAgICAgICA8b2VwYS10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cImNvbFwiIFt0YWJsZUlkXT1cInRhYmxlSWRcIiBbYWxsUm93c1NlbGVjdGVkXT1cImFsbFJvd3NTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW3Jvd0NvdW50XT1cInJvd3MubGVuZ3RoXCIgW25vRmlsdGVyc1N1YmplY3RdPVwibm9GaWx0ZXJzU3ViamVjdFwiXG4gICAgICAgICAgICAgICAgKG9uVG9nZ2xlQWxsUm93c1NlbGVjdGlvbik9XCJ0b2dnbGVBbGxSb3dzU2VsZWN0aW9uKClcIiAob25Tb3J0Q2hhbmdlZCk9XCJvblNvcnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkhpZGVDb2x1bW4pPVwiaGlkZUNvbHVtbigkZXZlbnQpXCIgKG9uRmlsdGVyQ2hhbmdlZCk9XCJvbkZpbHRlckNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8L29lcGEtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1yPVwicm93SW5kZXhcIiBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cbiAgICAgICAgPCEtLSBEYXRhIFJvdyAtLT5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZCAqbmdJZj1cImRhdGFIYXNEZXRhaWxzXCI+XG4gICAgICAgICAgICA8IS0tIERldGFpbCBpY29uIChpZiBzcGVjaWZpZWQpIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuc2hvd0RldGFpbCA9PT0gdHJ1ZSB8fCByb3cuc2hvd0RldGFpbCA9PT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCJyb3cuZGV0YWlsSWNvbkNsYXNzTmFtZVwiIFtuZ0NsYXNzXT1cInJvdy5kZXRhaWxJY29uQ2xhc3NOYW1lXCI+PC9pPlxuICAgICAgICAgICAgICA8aSAoY2xpY2spPVwidG9nZ2xlUm93RGV0YWlsKHJvdylcIiBbaWRdPVwidGFibGVJZCsnX1Nob3dEZXRhaWxMaW5rXycrclwiIGNsYXNzPVwiYmlcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYmktY2hldnJvbi1kb3duJzogcm93LnNob3dEZXRhaWwsICdiaS1jaGV2cm9uLXJpZ2h0JzogIXJvdy5zaG93RGV0YWlsfVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiKHJvdy5zaG93RGV0YWlsID8gJ0hpZGUnIDogJ1Nob3cnKSArICcgZGV0YWlscyBmb3IgdGhpcyByb3cnXCIgcGxhY2VtZW50PVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPCEtLSBJZiByb3cgaXMgYSBkaXZpZGVyLCBpdCBzcGFucyB0aGUgd2hvbGUgdGFibGUgLS0+XG4gICAgICAgICAgPHRkICpuZ0lmPVwicm93LmlzRGl2aWRlclwiIFtjb2xTcGFuXT1cInZpc2libGVDb2x1bW5Db3VudCArIChkYXRhSGFzRGV0YWlscyA/IDEgOiAwKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuZGl2aWRlckNsYXNzTmFtZSB8fCAnb2VwYS10YWJsZS1ncmF5J1wiPiZuYnNwOzwvdGQ+XG4gICAgICAgICAgPCEtLSBEYXRhIFJvd3MgLS0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiIXJvdy5pc0RpdmlkZXJcIiBuZ0ZvciBsZXQtY29sIFtuZ0Zvck9mXT1cImRhdGFDb2x1bW5zXCIgbGV0LWk9XCJpbmRleFwiPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5oaWRkZW4gJiYgKHJvd3xjZWxsQ29sc3Bhbjpjb2wpID4gMCAmJiFjb2wuZnJvemVuQ29sdW1uXCJcbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7cm93fGNlbGxDbGFzc25hbWU6Y29sIHx8ICcnfX1cIiBbY29sU3Bhbl09XCJyb3d8Y2VsbENvbHNwYW46Y29sXCI+XG4gICAgICAgICAgICAgIDxvZXBhLXRhYmxlLWRhdGEtY2VsbCBbY29sXT1cImNvbFwiIFtpXT1cImlcIiBbcm93XT1cInJvd1wiIFtyXT1cInJcIiBbdGFibGVJZF09XCJ0YWJsZUlkXCJcbiAgICAgICAgICAgICAgICAob25BY3Rpb25DbGljayk9XCJvbkFjdGlvbkNsaWNrKCRldmVudClcIiAob25DZWxsQ2xpY2spPVwiY2VsbENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblRvZ2dsZVJvd1NlbGVjdGlvbik9XCJ0b2dnbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uU2luZ2xlUm93U2VsZWN0aW9uKT1cInNpbmdsZVJvd1NlbGVjdGlvbigkZXZlbnQpXCI+PC9vZXBhLXRhYmxlLWRhdGEtY2VsbD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmhpZGRlbiAmJiAocm93fGNlbGxDb2xzcGFuOmNvbCkgPiAwICYmY29sLmZyb3plbkNvbHVtblwiIHBGcm96ZW5Db2x1bW5cbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7cm93fGNlbGxDbGFzc25hbWU6Y29sIHx8ICcnfX1cIiBbY29sU3Bhbl09XCJyb3d8Y2VsbENvbHNwYW46Y29sXCI+XG4gICAgICAgICAgICAgIDxvZXBhLXRhYmxlLWRhdGEtY2VsbCBbY29sXT1cImNvbFwiIFtpXT1cImlcIiBbcm93XT1cInJvd1wiIFtyXT1cInJcIiBbdGFibGVJZF09XCJ0YWJsZUlkXCJcbiAgICAgICAgICAgICAgICAob25BY3Rpb25DbGljayk9XCJvbkFjdGlvbkNsaWNrKCRldmVudClcIiAob25DZWxsQ2xpY2spPVwiY2VsbENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblRvZ2dsZVJvd1NlbGVjdGlvbik9XCJ0b2dnbGVSb3dTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uU2luZ2xlUm93U2VsZWN0aW9uKT1cInNpbmdsZVJvd1NlbGVjdGlvbigkZXZlbnQpXCI+PC9vZXBhLXRhYmxlLWRhdGEtY2VsbD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC90cj5cblxuICAgICAgICA8IS0tIERldGFpbCBSb3cgLS0+XG4gICAgICAgIDx0ciAqbmdJZj1cInJvdy5zaG93RGV0YWlsXCIgY2xhc3M9XCJ0YWJsZS1pbmZvXCI+XG4gICAgICAgICAgPHRkIFtjb2xTcGFuXT1cInZpc2libGVDb2x1bW5Db3VudCArIChkYXRhSGFzRGV0YWlscyA/IDEgOiAwKVwiPlxuICAgICAgICAgICAgPGNtbC10ZW1wbGF0ZSBbdGVtcGxhdGVJbmZvXT1cInJvdy5kZXRhaWxcIj48L2NtbC10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3AtdGFibGU+XG4gIDwvZGl2PlxuICA8IS0tIFRhYmxlIGZvb3RlciAtLT5cbiAgPGZvcm0gKm5nSWY9XCIhY29uZmlnLmhpZGVGb290ZXIgfHwgKGRhdGEgJiYgcGFnZUluZm8uaXRlbXNQZXJQYWdlIDwgZGF0YS5sZW5ndGgpXCIgY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgIDwhLS0gVGFibGUtd2lkZSBmaWx0ZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiIWNvbmZpZy5oaWRlR2xvYmFsRmlsdGVyXCIgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYWxsIGNvbHVtbnNcIlxuICAgICAgICAgICAgICBbb2VwYVRhYmxlRmlsdGVyaW5nXT1cInsgZmlsdGVyU3RyaW5nOiAnJyB9XCIgW3RhYmxlSWRdPVwidGFibGVJZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LXNtXCJcbiAgICAgICAgICAgICAgKHRhYmxlQ2hhbmdlZCk9XCJvbkZpbHRlckNoYW5nZWQoJGV2ZW50KVwiIFtpZF09XCJ0YWJsZUlkKydfRmlsdGVyQWxsQ29sdW1uc0lucHV0J1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbmZpZy5zaG93Um93Q291bnRJbkZvb3RlciAmJiBfZGF0YSAmJiBfZGF0YS5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc2Vjb25kYXJ5XCI+e3tfZGF0YS5sZW5ndGh9fTwvc3Bhbj4mbmJzcDt0b3RhbCByb3dzXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIEV4cG9ydCBCdXR0b25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIHRleHQtY2VudGVyXCIgKm5nSWY9XCJhbGxvd0VkaXRcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9FeGNlbCB8fCBjb25maWcuZXhwb3J0VG9IVE1MXCIgY2xhc3M9XCJidG4tZ3JvdXBcIiBkcm9wZG93bj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImV4cG9ydEJ0blwiIGRyb3Bkb3duVG9nZ2xlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBkcm9wZG93bi10b2dnbGVcIlxuICAgICAgICAgICAgICAgIGFyaWEtY29udHJvbHM9XCJkcm9wZG93bi1iYXNpY1wiPlxuICAgICAgICAgICAgICAgIEV4cG9ydCA8c3BhbiBjbGFzcz1cImNhcmV0XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDx1bCBpZD1cImV4cG9ydC1kcm9wZG93blwiICpkcm9wZG93bk1lbnUgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJjb25maWcuZXhwb3J0VG9FeGNlbFwiIHJvbGU9XCJtZW51aXRlbVwiPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFRvRXhjZWwoKVwiPkV4cG9ydCB0byBFeGNlbDwvYT48L2xpPlxuICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiY29uZmlnLmV4cG9ydFRvSFRNTFwiIHJvbGU9XCJtZW51aXRlbVwiPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFRvSFRNTCgpXCI+RXhwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgdG8gSFRNTDwvYT48L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY3VzdG9tQnRuVmlzaWJsZVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBuZ0NsYXNzPVwie3snYnRuIGJ0bi1wcmltYXJ5IG1lLTEnICsgKHNtYWxsID8gJyBidG4tc20nIDogJycpfX1cIiAoY2xpY2spPVwib25DdXN0b21CdG5DbGljaygpXCJcbiAgICAgICAgICAgICAgW2lkXT1cInRhYmxlSWQrJ19DdXN0b21CdG4nXCIgW2Rpc2FibGVkXT1cIiFjdXN0b21CdG5FbmFibGVkXCI+e3tjdXN0b21CdG5MYWJlbH19PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY3VzdG9tQnRuVmlzaWJsZTJcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbmdDbGFzcz1cInt7J2J0biBidG4tcHJpbWFyeSBtZS0xJyArIChzbWFsbCA/ICcgYnRuLXNtJyA6ICcnKX19XCIgKGNsaWNrKT1cIm9uQ3VzdG9tQnRuMkNsaWNrKClcIlxuICAgICAgICAgICAgICBbaWRdPVwidGFibGVJZCsnX0N1c3RvbUJ0bidcIiBbZGlzYWJsZWRdPVwiIWN1c3RvbUJ0bkVuYWJsZWQyXCI+e3tjdXN0b21CdG5MYWJlbDJ9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFjb25maWcuZGlzYWJsZVBhZ2luYXRpb25cIiBjbGFzcz1cImNvbC1zbS01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICAgICAgICAgIDxwYWdpbmF0aW9uICpuZ0lmPVwicGFnaW5hdGlvbk9uXCIgY2xhc3M9XCJwYWdpbmF0aW9uLXNtXCIgW3RvdGFsSXRlbXNdPVwicGFnZUluZm8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJwYWdlSW5mby5pdGVtc1BlclBhZ2VcIiBbbWF4U2l6ZV09XCJwYWdlSW5mby5tYXhTaXplXCIgWyhuZ01vZGVsKV09XCJjdXJyZW50UGFnZVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJjdXJyZW50VGFibGVQYWdlXCIgW2JvdW5kYXJ5TGlua3NdPVwidHJ1ZVwiIFtyb3RhdGVdPVwiZmFsc2VcIiAocGFnZUNoYW5nZWQpPVwib25QYWdlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG51bVBhZ2VzKT1cInBhZ2VJbmZvLm51bVBhZ2VzID0gJGV2ZW50XCI+XG4gICAgICAgICAgICA8L3BhZ2luYXRpb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0b2dnbGVQYWdpbmdhdGlvbigpXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBtZS0xXCI+e3sgcGFnaW5hdGlvbk9uID9cbiAgICAgICAgICAgICAgJ1Nob3cgQWxsIFJvd3MnIDogJ1Jlc3RvcmUgUGFnaW5hdGlvbid9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImFsbG93RWRpdCAmJiAoY29uZmlnLmV4cG9ydFRvRXhjZWwgfHwgY29uZmlnLmV4cG9ydFRvSFRNTClcIiBjbGFzcz1cImNvbC1zbS0xMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8c3Bhbj5FeHBvcnQgb25seSB2aXNpYmxlIGRhdGE6Jm5ic3A7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImV4cG9ydFZpc2libGVPbmx5XCIgKGNsaWNrKT1cInRvZ2dsZUV4cG9ydFZpc2libGVPbmx5KClcIlxuICAgICAgICAgICAgaWQ9XCJleHBvcnRWaXNpYmxlT25seUNoZWNrYm94XCIgLz5cbiAgICAgICAgICAgICZuYnNwOyZuYnNwO1xuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaGFzU2VsZWN0YWJsZUNvbHVtbigpXCI+SW5jbHVkZSB1bnNlbGVjdGVkIHJvd3MgaW4gZXhwb3J0OiZuYnNwO1xuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJleHBvcnRVbnNlbGVjdGVkUm93c1wiIChjbGljayk9XCJ0b2dnbGVFeHBvcnRVbnNlbGVjdGVkUm93cygpXCJcbiAgICAgICAgICAgIGlkPVwiZXhwb3J0VW5zZWxlY3RlZFJvd3NDaGVja2JveFwiIC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj4iXX0=
|