@rivet-health/design-system 40.35.0 → 40.35.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/table/table/table/table.component.mjs +3 -3
- package/fesm2015/rivet-health-design-system.mjs +2 -2
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +2 -2
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -316,10 +316,10 @@ export class TableComponent {
|
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
318
|
TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
319
|
-
TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "riv-table", inputs: { manager: "manager" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:copy": "onCopy($event)" } }, queries: [{ propertyName: "cellTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "summaryTemplate", first: true, predicate: ["summary"], descendants: true }, { propertyName: "menuTemplate", first: true, predicate: ["menu"], descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: ["selection"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: ["subheader"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"s.display.columnsAreReorderable\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></div>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td>\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n {{ headerRow.headerText }}\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n *ngIf=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n …\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n …\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}td.toggle-header{text-align:left}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i4.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i5.CheckboxComponent, selector: "riv-checkbox", inputs: ["name", "identifier", "value", "checkedColorToken", "indeterminateColorToken", "checkboxTooltip", "indeterminate", "disabled", "required", "state", "errorMessage", "ariaLabel"], outputs: ["valueChange"] }, { kind: "component", type: i6.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i7.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "component", type: i8.LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "zIndexOverride", "errorMessage"] }, { kind: "component", type: i9.MenuComponent, selector: "riv-menu", inputs: ["preferredPosition", "disabled"] }, { kind: "component", type: i10.MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "directive", type: i11.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i12.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i13.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i14.SrOnlyComponent, selector: "riv-sr-only" }, { kind: "component", type: i15.TableHeaderResizeHandleComponent, selector: "riv-table-header-resize-handle", outputs: ["dragResize"] }, { kind: "component", type: i16.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i17.NumberPipe, name: "rivNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
319
|
+
TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "riv-table", inputs: { manager: "manager" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:copy": "onCopy($event)" } }, queries: [{ propertyName: "cellTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "summaryTemplate", first: true, predicate: ["summary"], descendants: true }, { propertyName: "menuTemplate", first: true, predicate: ["menu"], descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: ["selection"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: ["subheader"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"s.display.columnsAreReorderable\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></div>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td>\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n {{ headerRow.headerText }}\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <ng-template #cellContent>\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <div\n *ngIf=\"\n showChevronForCell(\n columnIndex,\n hasSubRows,\n depth\n );\n else cellContent\n \"\n class=\"toggleable-cell-content\"\n >\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n <div class=\"toggleable-cell-value\">\n <ng-container\n *ngTemplateOutlet=\"cellContent\"\n ></ng-container>\n </div>\n </div>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n …\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n …\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}.toggleable-cell-content{display:flex;align-items:center}.toggleable-cell-value{flex:1 1 auto;min-width:0}td.toggle-header{text-align:left}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i4.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i5.CheckboxComponent, selector: "riv-checkbox", inputs: ["name", "identifier", "value", "checkedColorToken", "indeterminateColorToken", "checkboxTooltip", "indeterminate", "disabled", "required", "state", "errorMessage", "ariaLabel"], outputs: ["valueChange"] }, { kind: "component", type: i6.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i7.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "component", type: i8.LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "zIndexOverride", "errorMessage"] }, { kind: "component", type: i9.MenuComponent, selector: "riv-menu", inputs: ["preferredPosition", "disabled"] }, { kind: "component", type: i10.MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "directive", type: i11.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i12.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i13.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i14.SrOnlyComponent, selector: "riv-sr-only" }, { kind: "component", type: i15.TableHeaderResizeHandleComponent, selector: "riv-table-header-resize-handle", outputs: ["dragResize"] }, { kind: "component", type: i16.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i17.NumberPipe, name: "rivNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
320
320
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, decorators: [{
|
|
321
321
|
type: Component,
|
|
322
|
-
args: [{ selector: 'riv-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"s.display.columnsAreReorderable\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></div>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td>\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n {{ headerRow.headerText }}\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n *ngIf=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n …\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n …\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}td.toggle-header{text-align:left}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"] }]
|
|
322
|
+
args: [{ selector: 'riv-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"s.display.columnsAreReorderable\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></div>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td>\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n {{ headerRow.headerText }}\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <ng-template #cellContent>\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <div\n *ngIf=\"\n showChevronForCell(\n columnIndex,\n hasSubRows,\n depth\n );\n else cellContent\n \"\n class=\"toggleable-cell-content\"\n >\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n <div class=\"toggleable-cell-value\">\n <ng-container\n *ngTemplateOutlet=\"cellContent\"\n ></ng-container>\n </div>\n </div>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n …\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n …\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}.toggleable-cell-content{display:flex;align-items:center}.toggleable-cell-value{flex:1 1 auto;min-width:0}td.toggle-header{text-align:left}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"] }]
|
|
323
323
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { manager: [{
|
|
324
324
|
type: Input
|
|
325
325
|
}], cellTemplate: [{
|
|
@@ -350,4 +350,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
350
350
|
type: HostListener,
|
|
351
351
|
args: ['document:copy', ['$event']]
|
|
352
352
|
}] } });
|
|
353
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY3JFLE1BQU0sT0FBTyxjQUFjO0lBT3pCLFlBQW9CLFVBQXNCLEVBQVUsSUFBWTtRQUE1QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQStCdkQsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFeEIsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ3ZDLDZCQUF3QixHQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFB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WUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsUUFBUSxFQUFFO29CQUNuQyxFQUFFLENBQUMsSUFBbUIsQ0FBQyxDQUFDO2lCQUN6QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs0R0EvWVUsY0FBYztnR0FBZCxjQUFjLDB3QkNoQzNCLG0wakNBazBCQTs0RkRseUJhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsV0FBVyxtQkFHSix1QkFBdUIsQ0FBQyxNQUFNO3NIQVkvQyxPQUFPO3NCQUROLEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLE1BQU07Z0JBT3BCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxTQUFTO2dCQU12QixZQUFZO3NCQURYLFlBQVk7dUJBQUMsTUFBTTtnQkFJcEIsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLFdBQVc7Z0JBSXpCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxRQUFRO2dCQUl0QixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsV0FBVztnQkFpTHpCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNNUMsS0FBSztzQkFESixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVUxQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJpdlNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2lucHV0L3NlbGVjdC9zdGF0ZSc7XG5pbXBvcnQgeyBSaXZUYWJsZUNsaXBib2FyZCB9IGZyb20gJy4uL2NsaXBib2FyZCc7XG5pbXBvcnQgeyBSaXZUYWJsZSB9IGZyb20gJy4uL3N0YXRlJztcbmltcG9ydCB7IFRhYmxlUmVzdWx0SGVscGVycyB9IGZyb20gJy4uL3N0YXRlLWhlbHBlcnMvcmVzdWx0LWhlbHBlcnMnO1xuXG50eXBlIFBhZ2VTaXplT3B0aW9uID0ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAgPSB7IGtleTogJycgfSxcbj4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cblxuICBASW5wdXQoKVxuICBtYW5hZ2VyPzogUml2VGFibGUuTWFuYWdlcjxSLCBDLCBGLCBHPjtcblxuICBAQ29udGVudENoaWxkKCdjZWxsJylcbiAgY2VsbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8e1xuICAgIHJvdzogUjtcbiAgICBjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz47XG4gIH0+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ3N1bW1hcnknKVxuICBzdW1tYXJ5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7XG4gICAgY29sdW1uOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+O1xuICB9PjtcblxuICBAQ29udGVudENoaWxkKCdtZW51JylcbiAgbWVudVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8eyByb3c6IFJpdlRhYmxlLkZ1bGxSb3c8Uj4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnc2VsZWN0aW9uJylcbiAgc2VsZWN0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IHN0YXRlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJylcbiAgaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IHN0YXRlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnc3ViaGVhZGVyJylcbiAgc3ViaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7XG4gICAgc3RhdGU6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICBncm91cDogUml2VGFibGUuUm93R3JvdXA8UiwgRz47XG4gIH0+O1xuXG4gIHJlYWRvbmx5IGRlc3Ryb3kgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHJlYWRvbmx5IGNvbnRhaW5lclNpemUgPSBuZXcgU3ViamVjdDxET01SZWN0PigpO1xuICByZWFkb25seSBzZWxlY3Rpb25DYWxsb3V0UG9zaXRpb246IE9ic2VydmFibGU8RE9NUmVjdD4gPVxuICAgIHRoaXMuY29udGFpbmVyU2l6ZS5waXBlKFxuICAgICAgbWFwKHJlY3QgPT4gbmV3IERPTVJlY3QocmVjdC54ICsgNDQsIHJlY3QueSAtIDEyLCAwLCAwKSksXG4gICAgKTtcblxuICBwcml2YXRlIGhvdmVyZWRSb3c6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcm93SG92ZXJDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5tYW5hZ2VyIS5zdGF0ZSwgdGhpcy5jb250YWluZXJTaXplXSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoW3N0YXRlLCBjb250YWluZXJTaXplXSkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lclNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHRvdGFsRnJvemVuV2lkdGggPSBzdW0oXG4gICAgICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5zLmZpbHRlcihjID0+IGMucGlubmVkKS5tYXAoYyA9PiBjLndpZHRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRvdGFsRnJvemVuV2lkdGggPiBjb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIC8vIENoZWNrIGhvdyBtYW55IGNvbHVtbnMgY2FuIGJlIHBpbm5lZCB3aXRob3V0IG92ZXJmbG93aW5nLlxuICAgICAgICAgIGZvciAoY29uc3QgW2ldIG9mIHN0YXRlLmRpc3BsYXkuY29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcihjID0+IGMucGlubmVkKVxuICAgICAgICAgICAgLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3Qgc2xpY2VkRnJvemVuV2lkdGggPSBzdW0oXG4gICAgICAgICAgICAgIHN0YXRlLmRpc3BsYXkuY29sdW1ucy5zbGljZSgwLCBpICsgMSkubWFwKGMgPT4gYy53aWR0aCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNsaWNlZEZyb3plbldpZHRoID4gY29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZScsXG4gICAgICAgICAgICAgICAgaW5kZXg6IGkgLSAxLFxuICAgICAgICAgICAgICAgIGZyZWV6ZTogaSA+IDAsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZURyYWdPdmVyKTtcbiAgICB0aGlzLnNldHVwUm93U3BhbkhvdmVyKCk7XG4gIH1cblxuICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgd2hlbiB3ZSBoYXZlIGVudGVyZWQgYSBkcm9wIHpvbmUgZm9yIGFwcGx5aW5nIG91ciB2aXN1YWxcbiAgLy8gdHJlYXRtZW50LiBIb3dldmVyLCBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBkcm9wIGV2ZW50LCB5b3UgbXVzdCBjYWxsIHByZXZlbnREZWZhdWx0XG4gIC8vIG9uIHRoZSBkcmFnb3Zlci4gV2UgYXJlIGhhbmRsaW5nIHRoaXMgbmF0aXZlbHkgb24gdGhlIGRvY3VtZW50LCBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgLy8gYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIElmIHdlIGhhdmUgYSBkcmFnZ2VkT3ZlckNvbHVtbklkeCBhbmQgd2UgZHJhZyBvdmVyIGFuXG4gIC8vIGVsZW1lbnQgd2l0aCBjbGFzcyBkcm9wLXpvbmUsIHdlIHdpbGwgYXNzdW1lIHlvdSB3YW50IHRvIHRoZSBkcm9wIGVsZW1lbnQgZW5hYmxlZFxuICAvLyBhbmQgd2Ugd2lsbCBwcmV2ZW50RGVmYXVsdC5cbiAgaGFuZGxlRHJhZ092ZXIgPSAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCAhPSBudWxsICYmIHRhcmdldC5jbG9zZXN0KCcuZHJvcC16b25lJykpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVEcmFnT3Zlcik7XG4gICAgdGhpcy5yb3dIb3ZlckNsZWFudXA/LigpO1xuICAgIHRoaXMuZGVzdHJveS5uZXh0KG51bGwpO1xuICB9XG5cbiAgcmVhZG9ubHkgcGFnZVNpemVPcHRpb25zOiBSaXZTZWxlY3QuT3B0aW9uR3JvdXA8UGFnZVNpemVPcHRpb24+W10gPSBbXG4gICAge1xuICAgICAgb3B0aW9uczogUml2VGFibGUucGFnZVNpemVzLm1hcChwYWdlU2l6ZSA9PiAoe1xuICAgICAgICBpZDogcGFnZVNpemUudG9TdHJpbmcoKSxcbiAgICAgICAgdGl0bGU6IHBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiBwYWdlU2l6ZSxcbiAgICAgIH0pKSxcbiAgICB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHRyYWNrQnlSb3c6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5GdWxsUm93PFI+PiA9IChfLCByb3cpID0+XG4gICAgcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5R3JvdXA6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5Sb3dHcm91cDxSLCBHPj4gPSAoXG4gICAgXyxcbiAgICBncm91cCxcbiAgKSA9PiBncm91cC5ncm91cERhdGEua2V5O1xuICByZWFkb25seSB0cmFja0J5TmVzdGVkUm93OiBUcmFja0J5RnVuY3Rpb248Uml2VGFibGUuRnVsbE5lc3RlZFJvdzxSPj4gPSAoXG4gICAgXyxcbiAgICByb3csXG4gICkgPT4gcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5TmVzdGVkSGVhZGVyOiBUcmFja0J5RnVuY3Rpb248XG4gICAgUml2VGFibGUuRnVsbE5lc3RlZEhlYWRlclJvdzxSPlxuICA+ID0gKF8sIHJvdykgPT4gcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5Q29sdW1uOiBUcmFja0J5RnVuY3Rpb248Uml2VGFibGUuRnVsbENvbHVtbjxDPj4gPSAoXG4gICAgXyxcbiAgICBjb2x1bW4sXG4gICkgPT4gY29sdW1uLmtleTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBvcmFyeVdpZHRoczogTWFwPEMsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIHNldFdpZHRoKGNvbHVtbjogQywgd2lkdGg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAod2lkdGggPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeVdpZHRoID0gdGhpcy50ZW1wb3JhcnlXaWR0aHMuZ2V0KGNvbHVtbik7XG4gICAgICBpZiAodGVtcG9yYXJ5V2lkdGgpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5XaWR0aENoYW5nZScsXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHByZWZlcnJlZFdpZHRoOiB0ZW1wb3JhcnlXaWR0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBvcmFyeVdpZHRocy5kZWxldGUoY29sdW1uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wb3JhcnlXaWR0aHMuc2V0KGNvbHVtbiwgd2lkdGgpO1xuICAgIH1cbiAgfVxuICBnZXRXaWR0aChjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnRlbXBvcmFyeVdpZHRocy5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnRlbXBvcmFyeVdpZHRocy5nZXQoY29sdW1uLmtleSkhLCBjb2x1bW4ubWluV2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGRyYWdnZWRDb2x1bW5JZHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBkcmFnZ2VkQ29sdW1uS2V5OiBDIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdnZWRPdmVyQ29sdW1uSWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBkcmFnU3RhcnQoaWR4OiBudW1iZXIsIGtleTogQykge1xuICAgIHRoaXMuZHJhZ2dlZENvbHVtbklkeCA9IGlkeDtcbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBrZXk7XG4gIH1cblxuICBkcmFnT3ZlcihvbnRvSWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRyYWdnZWRPdmVyQ29sdW1uSWR4ID0gb250b0lkeDtcbiAgfVxuXG4gIGRyb3Aob250b0lkeDogbnVtYmVyLCBlbmFibGVkQ29sdW1uQ291bnQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwpIHtcbiAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbk9yZGVyQ2hhbmdlJyxcbiAgICAgICAgcHJldmlvdXNJbmRleDogdGhpcy5kcmFnZ2VkQ29sdW1uSWR4LFxuICAgICAgICBuZXdJbmRleDogb250b0lkeCxcbiAgICAgICAgc291cmNlOiAndGFibGVEcmFnJyxcbiAgICAgICAgY29sdW1uOiB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmFibGVkID0gb250b0lkeCA8IGVuYWJsZWRDb2x1bW5Db3VudDtcbiAgICAgIHRoaXMuZHJvcEVuYWJsZWRTdGF0ZShlbmFibGVkLCBlbmFibGVkQ29sdW1uQ291bnQpO1xuICAgICAgdGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCA9IG51bGw7XG4gICAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRyb3BFbmFibGVkU3RhdGUoZW5hYmxlZDogYm9vbGVhbiwgZW5hYmxlZENvbHVtbkNvdW50OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBudWxsICYmIHRoaXMuZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaXNFbmFibGVkID0gZW5hYmxlZENvbHVtbkNvdW50ID4gdGhpcy5kcmFnZ2VkQ29sdW1uSWR4O1xuICAgICAgY29uc3Qgc2hvdWxkRmlyZSA9IGVuYWJsZWQgPyAhaXNFbmFibGVkIDogaXNFbmFibGVkO1xuICAgICAgaWYgKHNob3VsZEZpcmUpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5FbmFibGVkQ2hhbmdlJyxcbiAgICAgICAgICBjb2x1bW46IHRoaXMuZHJhZ2dlZENvbHVtbktleSxcbiAgICAgICAgICBlbmFibGVkOiBlbmFibGVkLFxuICAgICAgICAgIHNvdXJjZTogJ2RyYWdEcm9wJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGUubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSByZXR1cm4gZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdvYmplY3QnICYmIGUgIT09IG51bGwpIHJldHVybiBlLnRvU3RyaW5nKCk7XG4gICAgZWxzZSByZXR1cm4gJ0FuIGVycm9yIG9jY3VycmVkLic7XG4gIH1cblxuICBwcml2YXRlIHNoaWZ0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLnNoaWZ0ID0gZXZlbnQuc2hpZnRLZXk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5zaGlmdCA9IGV2ZW50LnNoaWZ0S2V5O1xuICB9XG5cbiAgLy8gUm93cyB3aXRoIGxpbmtzIHJlbmRlciBhcyBgPGEgY2xhc3M9XCJyb3ctbGlua1wiPmAgcmF0aGVyIHRoYW4gYDx0cj5gLCB3aGljaFxuICAvLyB0aGUgYnJvd3NlciBkb2VzIG5vdCBzZXJpYWxpemUgYXMgYSB0YWJsZSByb3cuIENvcHlpbmcgaXMgaGFuZGxlZCBvbiB0aGVcbiAgLy8gZG9jdW1lbnQgYmVjYXVzZSBhIHNlbGVjdC1hbGwgZGlzcGF0Y2hlcyB0aGUgZXZlbnQgZnJvbSB0aGUgc2VsZWN0aW9uIHJvb3RcbiAgLy8gcmF0aGVyIHRoYW4gZnJvbSB3aXRoaW4gdGhlIHRhYmxlLlxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjb3B5JywgWyckZXZlbnQnXSlcbiAgb25Db3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChcbiAgICAgICFldmVudC5jbGlwYm9hcmREYXRhIHx8XG4gICAgICAhc2VsZWN0aW9uIHx8XG4gICAgICBzZWxlY3Rpb24uaXNDb2xsYXBzZWQgfHxcbiAgICAgIFJpdlRhYmxlQ2xpcGJvYXJkLmlzRWRpdGFibGUoZXZlbnQudGFyZ2V0KVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IHJhbmdlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHNlbGVjdGlvbi5yYW5nZUNvdW50IH0sIChfLCBpKSA9PlxuICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQoaSksXG4gICAgKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gKG5vZGU6IE5vZGUpID0+XG4gICAgICByYW5nZXMuc29tZShyYW5nZSA9PiByYW5nZS5pbnRlcnNlY3RzTm9kZShub2RlKSk7XG5cbiAgICBjb25zdCBob3N0OiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghUml2VGFibGVDbGlwYm9hcmQub3duc1NlbGVjdGlvbihob3N0LCBpc1NlbGVjdGVkKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IFJpdlRhYmxlQ2xpcGJvYXJkLmV4dHJhY3QoXG4gICAgICAvLyBBIGdyb3VwZWQgdGFibGUgcmVuZGVycyBvbmUgdGFibGUgcGVyIGdyb3VwLCBhbmQgYSBjZWxsIG1heSBob2xkIGFcbiAgICAgIC8vIG5lc3RlZCB0YWJsZSB0aGF0IHNlcmlhbGl6ZXMgaXRzZWxmLlxuICAgICAgQXJyYXkuZnJvbShob3N0LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJykpLmZpbHRlcihcbiAgICAgICAgdGFibGUgPT4gdGFibGUuY2xvc2VzdChob3N0LmxvY2FsTmFtZSkgPT09IGhvc3QsXG4gICAgICApLFxuICAgICAgaXNTZWxlY3RlZCxcbiAgICAgIC8vIFdoZXJlIHRoZSBkcmFnIHN0YXJ0ZWQgYW5kIGVuZGVkLCB3aGljaCBuYXJyb3dzIHRoZSBjb3B5IHRvIHRoZSBkcmFnZ2VkXG4gICAgICAvLyBjb2x1bW5zIHJhdGhlciB0aGFuIGV2ZXJ5IGNvbHVtbiB0aGUgcmFuZ2UgcGFzc2VzIHRocm91Z2guXG4gICAgICBbc2VsZWN0aW9uLmFuY2hvck5vZGUsIHNlbGVjdGlvbi5mb2N1c05vZGVdLFxuICAgICk7XG4gICAgaWYgKCFwYXlsb2FkKSByZXR1cm47XG5cbiAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCBwYXlsb2FkLnRleHQpO1xuICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9odG1sJywgcGF5bG9hZC5odG1sKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlKHJvd0lkOiBSWydpZCddLCBzZWxlY3RlZDogYm9vbGVhbikge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdyb3dTZWxlY3RlZENoYW5nZScsXG4gICAgICBpZDogcm93SWQsXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIGNvbnRpZ3VvdXM6IHRoaXMuc2hpZnQsXG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVSb3dDb2xsYXBzZShyb3dJZDogUlsnaWQnXSkge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICd0b2dnbGVSb3dDb2xsYXBzZScsXG4gICAgICBpZDogcm93SWQsXG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVIZWFkZXJDb2xsYXBzZShoZWFkZXJJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgdHlwZTogJ3RvZ2dsZUhlYWRlckNvbGxhcHNlJyxcbiAgICAgIGlkOiBoZWFkZXJJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4pIHtcbiAgICBpZiAoY29sdW1uLmNsaWNrUHJldmVudERlZmF1bHQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGNvbHVtbi5jbGlja1N0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBpc0V4dGVybmFsUm93TGluayhcbiAgICByb3dMaW5rOiBSaXZUYWJsZS5Sb3dMaW5rLFxuICApOiByb3dMaW5rIGlzIFJpdlRhYmxlLkV4dGVybmFsUm93TGluayB7XG4gICAgcmV0dXJuIHJvd0xpbmsudHlwZSA9PT0gJ2V4dGVybmFsJztcbiAgfVxuXG4gIGlzSW50ZXJuYWxSb3dMaW5rKFxuICAgIHJvd0xpbms6IFJpdlRhYmxlLlJvd0xpbmssXG4gICk6IHJvd0xpbmsgaXMgUml2VGFibGUuSW50ZXJuYWxSb3dMaW5rIHtcbiAgICByZXR1cm4gcm93TGluay50eXBlID09PSAnaW50ZXJuYWwnO1xuICB9XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHJvdyArIGNvbHVtbiB0byBkaXNwbGF5IGEgY2hldnJvbiwgd2hlbiBuZXN0aW5nIHJvd3NcbiAgc2hvd0NoZXZyb25Gb3JDZWxsKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgaGFzU3ViUm93czogYm9vbGVhbixcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHNob3cgdGhlIGNoZXZyb24gb24gcm93cyB3aXRoIHN1YnJvd3NcbiAgICBpZiAoIWhhc1N1YlJvd3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLypcbiAgICAgIE9ubHkgc2hvdyB0aGUgY2hldnJvbiBvbiB0aGUgY29sdW1uIG1hdGNoaW5nIHRoZSBsZXZlbCBvZiBuZXN0aW5nOlxuICAgICAgdiBQYXllclxuICAgICAgICB2IENvZGVcbiAgICAqL1xuICAgIGlmIChjb2x1bW5JbmRleCAhPSBkZXB0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gV2hlbiB3ZSBhcmUgbmVzdGluZyByb3dzLCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdGhlIHBhcmVudCdzIGRhdGEgaW4gaXRzIGNoaWxkcmVuJ3Mgcm93c1xuICBibGFua0NlbGxEdWVUb05lc3RpbmcoY29sdW1uSW5kZXg6IG51bWJlciwgZGVwdGg6IG51bWJlcikge1xuICAgIC8qXG4gICAgICBUb3AtbGV2ZWwgcm93IGlzIDAgZGVwdGgsIGFuZCBzaG91bGQgaGF2ZSBubyBjb2x1bW5zIGJsYW5rLlxuICAgICAgU2Vjb25kLWxldmVsIG5lc3RlZCByb3cgaXMgMSBkZXB0aCwgYW5kIHNob3VsZCBoYXZlIHRoZSBmaXJzdCBjb2x1bW4gYmxhbmsuXG4gICAgICBFdGMuXG4gICAgKi9cbiAgICByZXR1cm4gY29sdW1uSW5kZXggPCBkZXB0aDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSb3dTcGFuSG92ZXIoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgY29uc3Qgb25Nb3VzZU92ZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcbiAgICAgICAgICAnYS5yb3ctbGluaywgdGJvZHkgPiB0cicsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICBpZiAocm93ID09PSB0aGlzLmhvdmVyZWRSb3cpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJlZFJvdykgdGhpcy5jbGVhclJvd1NwYW5Ib3Zlcih0aGlzLmhvdmVyZWRSb3cpO1xuICAgICAgICB0aGlzLmhvdmVyZWRSb3cgPSByb3c7XG4gICAgICAgIGlmIChyb3c/Lm1hdGNoZXMoJ2Eucm93LWxpbmsnKSkgdGhpcy5hcHBseVJvd1NwYW5Ib3Zlcihyb3cpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25Nb3VzZU91dCA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCByZWxhdGVkID0gKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsKT8uY2xvc2VzdChcbiAgICAgICAgICAnYS5yb3ctbGluaywgdGJvZHkgPiB0cicsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICBpZiAoIXJlbGF0ZWQgfHwgcmVsYXRlZCAhPT0gdGhpcy5ob3ZlcmVkUm93KSB7XG4gICAgICAgICAgaWYgKHRoaXMuaG92ZXJlZFJvdykgdGhpcy5jbGVhclJvd1NwYW5Ib3Zlcih0aGlzLmhvdmVyZWRSb3cpO1xuICAgICAgICAgIHRoaXMuaG92ZXJlZFJvdyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgb25Nb3VzZU92ZXIpO1xuICAgICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIG9uTW91c2VPdXQpO1xuICAgICAgdGhpcy5yb3dIb3ZlckNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgb25Nb3VzZU92ZXIpO1xuICAgICAgICBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0Jywgb25Nb3VzZU91dCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVJvd1NwYW5Ib3Zlcihyb3c6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5mb3JFYWNoQ292ZXJpbmdSb3dTcGFuQ2VsbChyb3csIGNlbGwgPT5cbiAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgncnMtaG92ZXInKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJvd1NwYW5Ib3Zlcihyb3c6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5mb3JFYWNoQ292ZXJpbmdSb3dTcGFuQ2VsbChyb3csIGNlbGwgPT5cbiAgICAgIGNlbGwuY2xhc3NMaXN0LnJlbW92ZSgncnMtaG92ZXInKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JFYWNoQ292ZXJpbmdSb3dTcGFuQ2VsbChcbiAgICByb3c6IEhUTUxFbGVtZW50LFxuICAgIGZuOiAoY2VsbDogSFRNTEVsZW1lbnQpID0+IHZvaWQsXG4gICkge1xuICAgIGNvbnN0IHRib2R5ID0gcm93LmNsb3Nlc3QoJ3Rib2R5Jyk7XG4gICAgaWYgKCF0Ym9keSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20oXG4gICAgICB0Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiBhLnJvdy1saW5rLCA6c2NvcGUgPiB0cicpLFxuICAgICk7XG4gICAgY29uc3Qgcm93SW5kZXggPSByb3dzLmluZGV4T2Yocm93KTtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0luZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IGNlbGxzID0gcm93c1tpXS5xdWVyeVNlbGVjdG9yQWxsKCd0ZFtyb3dzcGFuXScpO1xuICAgICAgY2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKCdyb3dzcGFuJykgfHwgJzEnLCAxMCk7XG4gICAgICAgIGlmIChzcGFuID4gMSAmJiBpICsgc3BhbiA+IHJvd0luZGV4KSB7XG4gICAgICAgICAgZm4oY2VsbCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzUmVndWxhclJlc3VsdCA9IFRhYmxlUmVzdWx0SGVscGVycy5pc1JlZ3VsYXJSZXN1bHQ8UiwgRz47XG4gIGlzR3JvdXBSZXN1bHQgPSBUYWJsZVJlc3VsdEhlbHBlcnMuaXNHcm91cFJlc3VsdDxSLCBHPjtcbiAgaXNOZXN0ZWRSZXN1bHQgPSBUYWJsZVJlc3VsdEhlbHBlcnMuaXNOZXN0ZWRSZXN1bHQ8UiwgRz47XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwibWFuYWdlcj8uc3RhdGUgfCBhc3luYzsgbGV0IHNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGlvbkNhbGxvdXRQb3NpdGlvbiB8IGFzeW5jOyBsZXQgcG9zaXRpb25cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicy5zZWxlY3Rpb24uc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0aW9uVGVtcGxhdGVcIj5cbiAgICAgIDxyaXYtY2FsbG91dFxuICAgICAgICAqcml2LW92ZXJsYXlcbiAgICAgICAgW2FuY2hvcl09XCJwb3NpdGlvblwiXG4gICAgICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICAgICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgICAgICBbc2hvd0NhcmV0XT1cImZhbHNlXCJcbiAgICAgICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIid0b3AtcmlnaHQnXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0aW9uVGVtcGxhdGU7IGNvbnRleHQ6IHsgc3RhdGU6IHMgfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvcml2LWNhbGxvdXQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCIgKm5nSWY9XCJoZWFkZXJUZW1wbGF0ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRlbXBsYXRlOyBjb250ZXh0OiB7IHN0YXRlOiBzIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxyaXYtbG9hZGluZy1jb3ZlclxuICAgICAgY2xhc3M9XCJjb250YWluZXItbG9hZGVyLXdyYXBwZXJcIlxuICAgICAgW2xvYWRpbmddPVwicy5sb2FkLmxvYWRpbmdcIlxuICAgICAgW2Vycm9yTWVzc2FnZV09XCJzLmxvYWQuZXJyb3IgPyBnZXRFcnJvck1lc3NhZ2Uocy5sb2FkLmVycm9yKSA6IHVuZGVmaW5lZFwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNvbnRhaW5lclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnY29udGFpbmVyLXVuZ3JvdXBlZCc6ICFpc0dyb3VwUmVzdWx0KHMucmVzdWx0KSxcbiAgICAgICAgICAnaGFzLWhlYWRlcic6ICFpc0dyb3VwUmVzdWx0KHMucmVzdWx0KSAmJiBoZWFkZXJUZW1wbGF0ZSxcbiAgICAgICAgICAnd2l0aG91dC1jb2x1bW5zJzogcy5kaXNwbGF5LmNvbHVtbnMubGVuZ3RoID09PSAwXG4gICAgICAgIH1cIlxuICAgICAgICAocml2Q2xpZW50U2l6ZSk9XCJjb250YWluZXJTaXplLm5leHQoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxyaXYtemVyby1zdGF0ZVxuICAgICAgICAgICpuZ0lmPVwicy5kaXNwbGF5LmNvbHVtbnMubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICBjbGFzcz1cIm5vLWNvbHVtbnMtbWVzc2FnZVwiXG4gICAgICAgICAgW21lc3NhZ2VdPVwiXG4gICAgICAgICAgICAnQWxsIGNvbHVtbnMgZGlzYWJsZWQuIEVuYWJsZSBhdCBsZWFzdCBvbmUgY29sdW1uIHRvIHZpZXcgdGFibGUgZGF0YS4nXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvcml2LXplcm8tc3RhdGU+XG5cbiAgICAgICAgPCEtLVxuICAgICAgICAgIEFuIG92ZXJ2aWV3IG9mIHRoZSB0ZW1wbGF0ZXMgd2UgYXJlIHVzaW5nOlxuXG4gICAgICAgICAgaGVhZGVyc0FuZFRhYmxlQm9keSAtIGhlbHBzIHVzIGNyZWF0ZSBtdWx0aXBsZSB0YWJsZXMgZm9yIGdyb3VwZWQgcmVzdWx0c1xuICAgICAgICAgICAgaGVhZGVyUm93V2l0aFN1YlJvd3MgLSBoZWxwcyB1cyBjcmVhdGUgaGVhZGVyIHJvd3MgZm9yIG5lc3RlZCB3aXRoIGhlYWRlciByZXN1bHRzXG4gICAgICAgICAgICAgIG5lc3RlZFJvd1dpdGhTdWJSb3dzIC0gaGVscHMgdXMgY3JlYXRlIG5lc3RlZCByb3dzIGZvciB0aGUgbmVzdGVkIHJlc3VsdCB0eXBlc1xuICAgICAgICAgICAgICAgIHJvd1dyYXBwZWRXaXRoUm93TGluayAtIGhlbHBzIHVzIGFkZCBhIHJvd2xpbmsgdG8gYSByb3dcbiAgICAgICAgICAgICAgICAgIHJvd0JvZHkgLSBkaXNwbGF5cyB0aGUgcm93IGNvbnRlbnRcbiAgICAgICAgLS0+XG5cbiAgICAgICAgPCEtLSBXaGVuIHdlIGFyZSBncm91cGVkLCB3ZSBzaG93IG9uZSB0YWJsZSBwZXIgZ3JvdXAgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgcy5yZXN1bHQucmVzdWx0VHlwZSA9PT0gJ3RhYmxlLWdyb3VwaW5nJ1xuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IGdyb3VwIG9mIHMucmVzdWx0LnJvd0dyb3VwcztcbiAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUdyb3VwO1xuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3RcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGhlYWRlcnNBbmRUYWJsZUJvZHk7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBncm91cDogZ3JvdXAsIGxhc3Q6IGxhc3QgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFdoZW4gd2UgYXJlbid0IGdyb3VwZWQsIHdlIHNob3cgb25lIHRhYmxlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJpc1JlZ3VsYXJSZXN1bHQocy5yZXN1bHQpIHx8IGlzTmVzdGVkUmVzdWx0KHMucmVzdWx0KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBoZWFkZXJzQW5kVGFibGVCb2R5O1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGdyb3VwOiBudWxsLCBsYXN0OiB0cnVlIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWdyb3VwPVwiZ3JvdXBcIiBsZXQtbGFzdD1cImxhc3RcIiAjaGVhZGVyc0FuZFRhYmxlQm9keT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgZ3JvdXAgIT09IG51bGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBzdWJoZWFkZXJUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgc3RhdGU6IHMsIGdyb3VwIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ3N1YmNvbnRhaW5lci1ncm91cGVkJzogaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgfVwiPlxuICAgICAgICAgICAgPHRhYmxlPlxuICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiISFzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0aW9uLWhlYWRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cml2LXNyLW9ubHk+U2VsZWN0IHJvd3M8L3Jpdi1zci1vbmx5PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uICE9PSAnaW5kaXZpZHVhbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNHcm91cFJlc3VsdChzLnJlc3VsdClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInMuc2VsZWN0aW9uLmlzQWxsU2VsZWN0ZWQgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmlzQWxsU2VsZWN0ZWQgPT09ICdpbmRldGVybWluYXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7IHR5cGU6ICdhbGxTZWxlY3RlZENoYW5nZScgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJTZWxlY3QgYWxsIHJvd3NcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8cml2LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzR3JvdXBSZXN1bHQocy5yZXN1bHQpICYmIGdyb3VwICE9PSBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJncm91cC5zZWxlY3RlZCA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJncm91cC5zZWxlY3RlZCA9PT0gJ2luZGV0ZXJtaW5hdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2dyb3VwU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNlbGVjdCBncm91cCByb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTmVzdGVkUmVzdWx0KHMucmVzdWx0KSAmJiAhIXMucmVzdWx0Lmhhc0hlYWRlcnNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1oZWFkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgYSBjb2x1bW4gZm9yIHRoZSBjaGV2cm9ucywgaWYgd2UgaGF2ZSB0b2dnbGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1zci1vbmx5PlRvZ2dsZXM8L3Jpdi1zci1vbmx5PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHMuZGlzcGxheS5jb2x1bW5zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0V2lkdGgoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRyYWdnYWJsZV09XCJzLmRpc3BsYXkuY29sdW1uc0FyZVJlb3JkZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgZHJvcHBhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcC16b25lXCJcbiAgICAgICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoaSwgY29sdW1uLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoZHJhZ2VudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBkcmFnT3ZlcihpKVwiXG4gICAgICAgICAgICAgICAgICAgIChkcm9wKT1cImRyb3AoaSwgcy5kaXNwbGF5LmVuYWJsZWRDb3VudClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHJhZ2dlZC1vdmVyLWxlZnRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZE92ZXJDb2x1bW5JZHggPT09IGkgJiZcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCA+IGlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRyYWdnZWQtb3Zlci1yaWdodF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkT3ZlckNvbHVtbklkeCA9PT0gaSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4IDwgaVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFjb2x1bW4ub3JkZXJhYmxlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhY29sdW1uLmZpbHRlcmFibGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFzLmRpc3BsYXkuY29sdW1uc0FyZUZyZWV6YWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXMuZGlzcGxheS5jb2x1bW5zQXJlSGlkZWFibGVcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sZWZ0XT1cImNvbHVtbi5hbGlnbm1lbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJpZ2h0XT1cImNvbHVtbi5hbGlnbm1lbnQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcy5kaXNwbGF5LmNvbHVtbk5hbWVNYXAuZ2V0KGNvbHVtbi5rZXkpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cml2LW1lbnVcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLm9yZGVyYWJsZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlcmFibGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuZGlzcGxheS5jb2x1bW5zQXJlRnJlZXphYmxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkuY29sdW1uc0FyZUhpZGVhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubGVmdF09XCJjb2x1bW4uYWxpZ25tZW50ID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucmlnaHRdPVwiY29sdW1uLmFsaWdubWVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicy5xdWVyeS5vcmRlcj8uY29sdW1uID09PSBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcy5kaXNwbGF5LmNvbHVtbk5hbWVNYXAuZ2V0KGNvbHVtbi5rZXkpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5kaXJlY3Rpb24gPT09ICdkZXNjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ0Fycm93RG93bidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdBcnJvd1VwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJpdi10YWJsZS1oZWFkZXItcmVzaXplLWhhbmRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ1Jlc2l6ZSk9XCJzZXRXaWR0aChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi10YWJsZS1oZWFkZXItcmVzaXplLWhhbmRsZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ub3JkZXJhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2FzYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0IGFzY2VuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInMucXVlcnkub3JkZXI/LmNvbHVtbiA9PT0gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBzb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmNvbHVtbiA9PT0gY29sdW1uLmtleSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5xdWVyeS5vcmRlcj8uZGlyZWN0aW9uID09PSAnZGVzYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdkZXNjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydCBkZXNjZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJpdi1kaXZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLm9yZGVyYWJsZSAmJiBjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ZpbHRlckFkZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBhIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicml2LWRpdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbi5vcmRlcmFibGUgfHwgY29sdW1uLmZpbHRlcmFibGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzLmRpc3BsYXkuY29sdW1uc0FyZUZyZWV6YWJsZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZGlzcGxheS5jb2x1bW5zQXJlSGlkZWFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicy5kaXNwbGF5LmNvbHVtbnNBcmVGcmVlemFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi5waW5uZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvbHVtbnNGcmVlemVVcFRvQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWV6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlemUgdXAgdG8gY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uc0ZyZWV6ZVVwVG9DaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZXplOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBVbi1mcmVlemUgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInMuZGlzcGxheS5jb2x1bW5zQXJlSGlkZWFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2x1bW5FbmFibGVkQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgSGlkZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9yaXYtbWVudT5cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJtZW51VGVtcGxhdGVcIiBjbGFzcz1cIm1lbnUtaGVhZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cml2LXNyLW9ubHk+TWVudTwvcml2LXNyLW9ubHk+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInMucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCA+IDA7IGVsc2UgZW1wdHlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwhLS0gR3JvdXBlZCByZXN1bHRzIGRvIG5vdCBoYXZlIHN1YnJvd3Mgb3IgaGVhZGVycyAtLT5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0dyb3VwUmVzdWx0KHMucmVzdWx0KSAmJiBncm91cCAhPT0gbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3cgb2YgZ3JvdXAucm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3dJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeVJvd1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dXcmFwcGVkV2l0aFJvd0xpbms7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SXNDb2xsYXBzZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8IS0tIFJlZ3VsYXIgcmVzdWx0cyBkbyBub3QgaGF2ZSBzdWJyb3dzIG9yIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNSZWd1bGFyUmVzdWx0KHMucmVzdWx0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgIHMucmVzdWx0LnJlc3VsdFR5cGUgPT09ICdub3JtYWwtcm93cydcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdyBvZiBzLnJlc3VsdC5yb3dzQXNHcm91cC5yb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5Um93XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1dyYXBwZWRXaXRoUm93TGluaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdWJSb3dzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dJc0NvbGxhcHNlZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDwhLS0gTmVzdGVkIHdpdGggaGVhZGVyIHJlc3VsdHMgaGF2ZSBzdWJyb3dzIGFuZCBoZWFkZXJzIC0tPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlzTmVzdGVkUmVzdWx0KHMucmVzdWx0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgIHMucmVzdWx0LnJlc3VsdFR5cGUgPT09ICduZXN0ZWQtcm93cydcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRlclJvdyBvZiBzLnJlc3VsdC5uZXN0ZWRIZWFkZXJSb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU5lc3RlZEhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJSb3dXaXRoU3ViUm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBoZWFkZXJSb3c6IGhlYWRlclJvdyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1oZWFkZXJSb3c9XCJoZWFkZXJSb3dcIiAjaGVhZGVyUm93V2l0aFN1YlJvd3M+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSB0aGUgaGVhZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyUm93LmhlYWRlclRleHQgIT09IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWhlYWRlci1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUhlYWRlckNvbGxhcHNlKGhlYWRlclJvdy5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3dzIHdpdGggc3Vicm93cyBoYXZlIGEgY2hldnJvbiBpbmRpY2F0aW5nIHlvdSBjYW4gY2xpY2sgdGhlIHJvdyB0byBzZWUgdGhlIHN1YnJvd3MuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByZXZlbnQtc2hyaW5rIGNoZXZyb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUm93LmlzQ29sbGFwc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ0NoZXZyb25Eb3duJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdDaGV2cm9uVXAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cInMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlclJvdy5oZWFkZXJUZXh0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibWVudVRlbXBsYXRlXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIElmIGEgaGVhZGVyIGlzIG5vdCBjb2xsYXBzZWQsIGFsc28gc2hvdyBpdHMgc3Vicm93cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhaGVhZGVyUm93LmlzQ29sbGFwc2VkICYmIGhlYWRlclJvdy5zdWJSb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXN0ZWRSb3cgb2YgaGVhZGVyUm93LnN1YlJvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlOZXN0ZWRSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJvd1dpdGhTdWJSb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgbmVzdGVkUm93OiBuZXN0ZWRSb3csIGRlcHRoOiAwIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgbGV0LW5lc3RlZFJvdz1cIm5lc3RlZFJvd1wiXG4gICAgICAgICAgICAgICAgICAgIGxldC1kZXB0aD1cImRlcHRoXCJcbiAgICAgICAgICAgICAgICAgICAgI25lc3RlZFJvd1dpdGhTdWJSb3dzXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSB0aGUgY3VycmVudCByb3cgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dXcmFwcGVkV2l0aFJvd0xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3c6IG5lc3RlZFJvdy5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogbmVzdGVkUm93LnN1YlJvd3M/Lmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dJc0NvbGxhcHNlZDogbmVzdGVkUm93LmlzQ29sbGFwc2VkXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJZiBhIHJvdyBpcyBub3QgY29sbGFwc2VkLCBhbHNvIHNob3cgaXRzIHN1YnJvd3MgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIW5lc3RlZFJvdy5pc0NvbGxhcHNlZCAmJiBuZXN0ZWRSb3cuc3ViUm93cz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YlJvdyBvZiBuZXN0ZWRSb3cuc3ViUm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU5lc3RlZFJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZFJvd1dpdGhTdWJSb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSb3c6IHN1YlJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGggKyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1kZXB0aD1cImRlcHRoXCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LWhhc1N1YlJvd3M9XCJoYXNTdWJSb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0lzQ29sbGFwc2VkPVwicm93SXNDb2xsYXBzZWRcIlxuICAgICAgICAgICAgICAgICAgICAjcm93V3JhcHBlZFdpdGhSb3dMaW5rXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogaGFzU3ViUm93cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0lzQ29sbGFwc2VkOiByb3dJc0NvbGxhcHNlZFxuICAgICAgICAgICAgICAgICAgICAgIH0gYXMgcm93Q29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnJvd0xpbms7IGxldCBybFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0V4dGVybmFsUm93TGluayhybClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJybC5ocmVmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdy1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmdyYXllZF09XCJzLmRpc3BsYXkucm93c0FyZUdyYXllZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0JvZHk7IGNvbnRleHQ6IHJvd0NvbnRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzSW50ZXJuYWxSb3dMaW5rKHJsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwicmwucm91dGVyTGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJybC5xdWVyeVBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc0hhbmRsaW5nXT1cInJsLnF1ZXJ5UGFyYW1zSGFuZGxpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdy1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmdyYXllZF09XCJzLmRpc3BsYXkucm93c0FyZUdyYXllZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicmwuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93Qm9keTsgY29udGV4dDogcm93Q29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJvdy5yb3dMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ncmF5ZWRdPVwicy5kaXNwbGF5LnJvd3NBcmVHcmF5ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dCb2R5OyBjb250ZXh0OiByb3dDb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBsZXQtZGVwdGg9XCJkZXB0aFwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1oYXNTdWJSb3dzPVwiaGFzU3ViUm93c1wiXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3dJc0NvbGxhcHNlZD1cInJvd0lzQ29sbGFwc2VkXCJcbiAgICAgICAgICAgICAgICAgICAgI3Jvd0JvZHlcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiA9PT0gJ2luZGl2aWR1YWwnXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJpdi1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpZmllcl09XCIncml2LXRhYmxlLXNlbGVjdGlvbi0nICsgcm93LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2Uocm93LmlkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiU2VsZWN0IHJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc05lc3RlZFJlc3VsdChzLnJlc3VsdCkgJiYgISFzLnJlc3VsdC5oYXNIZWFkZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhpcyB0ZCBsaW5lcyB1cCB3aXRoIHRoZSBoZWFkZXIgY2hldnJvbiBjb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gb2Ygcy5kaXNwbGF5LmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCBhcyBjb2x1bW5JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kaXNwbGF5LmNlbGxSb3dTcGFuKHJvd0luZGV4LCBjb2x1bW4ua2V5KSBhcyBzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNwYW4gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJzcGFuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJzLXJpZ2h0LWJvcmRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkubmVlZHNSaWdodEJvcmRlcihyb3dJbmRleCwgY29sdW1uLmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFkdmFuY2VkXT1cImNvbHVtbi5kYXRhVHlwZSA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50b2dnbGVhYmxlLWNlbGxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NoZXZyb25Gb3JDZWxsKGNvbHVtbkluZGV4LCBoYXNTdWJSb3dzLCBkZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUudGV4dC1hbGlnbl09XCJjb2x1bW4uYWxpZ25tZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGV2cm9uRm9yQ2VsbChjb2x1bW5JbmRleCwgaGFzU3ViUm93cywgZGVwdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRvZ2dsZVJvd0NvbGxhcHNlKHJvdy5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaGFuZGxlQ2xpY2soJGV2ZW50LCBjb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUm93cyB3aXRoIHN1YnJvd3MgaGF2ZSBhIGNoZXZyb24gaW5kaWNhdGluZyB5b3UgY2FuIGNsaWNrIHRoZSByb3cgdG8gc2VlIHRoZSBzdWJyb3dzLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHJpdi1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGV2cm9uRm9yQ2VsbChjb2x1bW5JbmRleCwgaGFzU3ViUm93cywgZGVwdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByZXZlbnQtc2hyaW5rIGNoZXZyb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SXNDb2xsYXBzZWQgPyAnQ2hldnJvbkRvd24nIDogJ0NoZXZyb25VcCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcml2LWljb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWJsYW5rQ2VsbER1ZVRvTmVzdGluZyhjb2x1bW5JbmRleCwgZGVwdGgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWVudS1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IHJvdzogcm93IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwicy5kaXNwbGF5LmN1c3RvbVN1bW1hcnlSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sdW1uIG9mIHMuZGlzcGxheS5jb2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWR2YW5jZWRdPVwiY29sdW1uLmRhdGFUeXBlID09PSAnYWR2YW5jZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb2x1bW4ubGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRleHQtYWxpZ25dPVwiY29sdW1uLmFsaWdubWVudFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5VGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGNvbHVtbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwicy5kaXNwbGF5LmNvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi16ZXJvLXN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInMuZGlzcGxheS56ZXJvU3RhdGVNZXNzYWdlOyBsZXQgbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtemVyby1zdGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmb290ZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiZcbiAgICAgICAgICAgICAgZ3JvdXAgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgZ3JvdXAudG90YWxNYXRjaGluZ1Jvd0NvdW50ID4gcy5xdWVyeS5ncm91cGluZy5jb3VudFBlckdyb3VwICYmXG4gICAgICAgICAgICAgIGdyb3VwLnJvd3MubGVuZ3RoID09PSBzLnF1ZXJ5Lmdyb3VwaW5nLmNvdW50UGVyR3JvdXBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgcml2TGlua1xuICAgICAgICAgICAgICBjbGFzcz1cImZvb3Rlci1saW5rXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZpZXdNb3JlS2V5Q2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHZpZXdNb3JlS2V5OiBncm91cC5ncm91cERhdGEua2V5LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+VmlldyBhbGwge3sgZ3JvdXAudG90YWxNYXRjaGluZ1Jvd0NvdW50IH19PC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJyICpuZ0lmPVwiIWxhc3RcIiAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnNob3dDb250cm9sc1wiIGNsYXNzPVwicGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnZS1zaXplLWNvbnRyb2xzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCIhaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgIXMuZGlzcGxheS5oaWRlUGFnZVNpemVTZWxlY3RvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+IFJlc3VsdHMgcGVyIHBhZ2U6IDwvc3Bhbj5cbiAgICAgICAgICAgIDxyaXYtc2ltcGxlLXNlbGVjdFxuICAgICAgICAgICAgICBbc2VsZWN0ZWRPcHRpb25dPVwie1xuICAgICAgICAgICAgICAgIGlkOiBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB0aXRsZTogcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgKHNlbGVjdGVkT3B0aW9uQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3BhZ2VTaXplQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICRldmVudD8udmFsdWUgfHwgMjVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBzXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgICAgICBbb3JkZXJCeV09XCInc291cmNlJ1wiXG4gICAgICAgICAgICA+PC9yaXYtc2ltcGxlLXNlbGVjdD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nSWY9XCJzLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPiAwICYmICFpc0dyb3VwUmVzdWx0KHMucmVzdWx0KVwiXG4gICAgICAgICAgY2xhc3M9XCJwYWdlLWRhdGEtaW5kaWNhdG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlUm93U3RhcnQgfCByaXZOdW1iZXIgfX0te3tcbiAgICAgICAgICAgIHMucXVlcnkucGFnaW5hdGlvbi5wYWdlUm93RW5kIHwgcml2TnVtYmVyXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvZlxuICAgICAgICAgIHt7IHMucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCB8IHJpdk51bWJlciB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInMucXVlcnkucGFnaW5hdGlvbi5zaG93Q29udHJvbHNcIlxuICAgICAgICAgIGNsYXNzPVwicGFnaW5hdGlvbi1jb250cm9sc1wiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidiYXNpYydcIlxuICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICBbaWNvbl09XCInQXJyb3dMZWZ0J1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzLnF1ZXJ5LnBhZ2luYXRpb24ucHJldmlvdXMgPT09IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoeyB0eXBlOiAncHJldmlvdXNQYWdlTmF2aWdhdGUnIH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VzWzBdID4gMFwiXG4gICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1wYWdlcyBsZWZ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAmaGVsbGlwO1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgcGFnZSBvZiBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXNcIlxuICAgICAgICAgICAgY2xhc3M9XCJwYWdlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInBhZ2UgPT09IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgIHBhZ2UgPT09IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlID8gJ3RydWUnIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHsgdHlwZTogJ3BhZ2VDaGFuZ2UnLCBwYWdlIH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBwYWdlICsgMSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXNbcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VzLmxlbmd0aCAtIDFdIDxcbiAgICAgICAgICAgICAgcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VDb3VudCAtIDFcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1wYWdlcyByaWdodFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgJmhlbGxpcDtcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbdmFyaWFudF09XCInYmFzaWMnXCJcbiAgICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgICAgW2ljb25dPVwiJ0Fycm93UmlnaHQnXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInMucXVlcnkucGFnaW5hdGlvbi5uZXh0ID09PSBudWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHsgdHlwZTogJ25leHRQYWdlTmF2aWdhdGUnIH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9yaXYtbG9hZGluZy1jb3Zlcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
|
|
353
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY3JFLE1BQU0sT0FBTyxjQUFjO0lBT3pCLFlBQW9CLFVBQXNCLEVBQVUsSUFBWTtRQUE1QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQStCdkQsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFeEIsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ3ZDLDZCQUF3QixHQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3pELENBQUM7UUFFSSxlQUFVLEdBQXVCLElBQUksQ0FBQztRQUN0QyxvQkFBZSxHQUF3QixJQUFJLENBQUM7UUFrQ3BELDhFQUE4RTtRQUM5RSx1RkFBdUY7UUFDdkYscUZBQXFGO1FBQ3JGLHVGQUF1RjtRQUN2RixvRkFBb0Y7UUFDcEYsOEJBQThCO1FBQzlCLG1CQUFjLEdBQUcsQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDcEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7WUFDM0MsSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ3JFLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN4QjtRQUNILENBQUMsQ0FBQztRQVFPLG9CQUFlLEdBQTRDO1lBQ2xFO2dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzNDLEVBQUUsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFO29CQUN2QixLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRTtvQkFDMUIsS0FBSyxFQUFFLFFBQVE7aUJBQ2hCLENBQUMsQ0FBQzthQUNKO1NBQ0YsQ0FBQztRQUVPLGVBQVUsR0FBeUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDckUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNBLGlCQUFZLEdBQTZDLENBQ2hFLENBQUMsRUFDRCxLQUFLLEVBQ0wsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ2hCLHFCQUFnQixHQUErQyxDQUN0RSxDQUFDLEVBQ0QsR0FBRyxFQUNILEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ0gsd0JBQW1CLEdBRXhCLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNkLGtCQUFhLEdBQTRDLENBQ2hFLENBQUMsRUFDRCxNQUFNLEVBQ04sRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFFQyxvQkFBZSxHQUFtQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBd0I3RCxxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLHFCQUFnQixHQUFhLElBQUksQ0FBQztRQUNsQyx5QkFBb0IsR0FBa0IsSUFBSSxDQUFDO1FBb0RuQyxVQUFLLEdBQVksS0FBSyxDQUFDO1FBbU0vQixvQkFBZSxJQUFHLGtCQUFrQixDQUFDLGVBQXFCLEVBQUM7UUFDM0Qsa0JBQWEsSUFBRyxrQkFBa0IsQ0FBQyxhQUFtQixFQUFDO1FBQ3ZELG1CQUFjLElBQUcsa0JBQWtCLENBQUMsY0FBb0IsRUFBQztJQTVZVSxDQUFDO0lBMENwRSxlQUFlO1FBQ2IsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzdCLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUMzQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FDMUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDOUQsQ0FBQztZQUNGLElBQUksZ0JBQWdCLEdBQUcsY0FBYyxFQUFFO2dCQUNyQyw0REFBNEQ7Z0JBQzVELEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTztxQkFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztxQkFDckIsT0FBTyxFQUFFLEVBQUU7b0JBQ1osTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQzNCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDeEQsQ0FBQztvQkFDRixJQUFJLGlCQUFpQixHQUFHLGNBQWMsRUFBRTt3QkFDdEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDOzRCQUN6QixJQUFJLEVBQUUseUJBQXlCOzRCQUMvQixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7NEJBQ1osTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDO3lCQUNkLENBQUMsQ0FBQzt3QkFDSCxNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFlRCxXQUFXO1FBQ1QsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQStCRCxRQUFRLENBQUMsTUFBUyxFQUFFLEtBQW9CO1FBQ3RDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RCxJQUFJLGNBQWMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUN6QixJQUFJLEVBQUUsbUJBQW1CO29CQUN6QixNQUFNO29CQUNOLGNBQWMsRUFBRSxjQUFjO2lCQUMvQixDQUFDLENBQUM7YUFDSjtZQUNELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDO2FBQU07WUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDO0lBQ0QsUUFBUSxDQUFDLE1BQThCO1FBQ3JDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3pFO2FBQU07WUFDTCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBTUQsU0FBUyxDQUFDLEdBQVcsRUFBRSxHQUFNO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztJQUM5QixDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQWU7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWUsRUFBRSxrQkFBMEI7UUFDOUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDekIsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQ3BDLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxTQUFTO2FBQzNDLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQztZQUM3QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLE9BQWdCLEVBQUUsa0JBQTBCO1FBQzNELElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFO1lBQ3BFLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUM3RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEQsSUFBSSxVQUFVLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO29CQUN6QixJQUFJLEVBQUUscUJBQXFCO29CQUMzQixNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtvQkFDN0IsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLE1BQU0sRUFBRSxVQUFVO2lCQUNuQixDQUFDLENBQUM7YUFDSjtZQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsQ0FBVTtRQUN4QixJQUFJLENBQUMsWUFBWSxLQUFLO1lBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3pDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJO1lBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7O1lBQ3hELE9BQU8sb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUtELE9BQU8sQ0FBQyxLQUFvQjtRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUdELEtBQUssQ0FBQyxLQUFvQjtRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLHFDQUFxQztJQUVyQyxNQUFNLENBQUMsS0FBcUI7UUFDMUIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQ0UsQ0FBQyxLQUFLLENBQUMsYUFBYTtZQUNwQixDQUFDLFNBQVM7WUFDVixTQUFTLENBQUMsV0FBVztZQUNyQixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUUxQyxPQUFPO1FBRVQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDbkUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDeEIsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBVSxFQUFFLEVBQUUsQ0FDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVuRCxNQUFNLElBQUksR0FBZ0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDO1lBQUUsT0FBTztRQUUvRCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxPQUFPO1FBQ3ZDLHFFQUFxRTtRQUNyRSx1Q0FBdUM7UUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQy9DLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxDQUNoRCxFQUNELFVBQVU7UUFDViwwRUFBMEU7UUFDMUUsNkRBQTZEO1FBQzdELENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQzVDLENBQUM7UUFDRixJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFFckIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWMsRUFBRSxRQUFpQjtRQUMvQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDekIsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixFQUFFLEVBQUUsS0FBSztZQUNULFFBQVE7WUFDUixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3pCLElBQUksRUFBRSxtQkFBbUI7WUFDekIsRUFBRSxFQUFFLEtBQUs7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsUUFBZ0I7UUFDbkMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3pCLElBQUksRUFBRSxzQkFBc0I7WUFDNUIsRUFBRSxFQUFFLFFBQVE7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWlCLEVBQUUsTUFBOEI7UUFDM0QsSUFBSSxNQUFNLENBQUMsbUJBQW1CO1lBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZELElBQUksTUFBTSxDQUFDLG9CQUFvQjtZQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBRUQsaUJBQWlCLENBQ2YsT0FBeUI7UUFFekIsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsaUJBQWlCLENBQ2YsT0FBeUI7UUFFekIsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztJQUNyQyxDQUFDO0lBRUQseUZBQXlGO0lBQ3pGLGtCQUFrQixDQUNoQixXQUFtQixFQUNuQixVQUFtQixFQUNuQixLQUFhO1FBRWIsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0Q7Ozs7VUFJRTtRQUNGLElBQUksV0FBVyxJQUFJLEtBQUssRUFBRTtZQUN4QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsMkZBQTJGO0lBQzNGLHFCQUFxQixDQUFDLFdBQW1CLEVBQUUsS0FBYTtRQUN0RDs7OztVQUlFO1FBQ0YsT0FBTyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUE0QixDQUFDO1lBRTFELE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO2dCQUN4QyxNQUFNLEdBQUcsR0FBSSxLQUFLLENBQUMsTUFBc0IsQ0FBQyxPQUFPLENBQy9DLHdCQUF3QixDQUNILENBQUM7Z0JBQ3hCLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxVQUFVO29CQUFFLE9BQU87Z0JBQ3BDLElBQUksSUFBSSxDQUFDLFVBQVU7b0JBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7Z0JBQ3RCLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUM7b0JBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlELENBQUMsQ0FBQztZQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsYUFBb0MsRUFBRSxPQUFPLENBQ2xFLHdCQUF3QixDQUNILENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQzNDLElBQUksSUFBSSxDQUFDLFVBQVU7d0JBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7aUJBQ3hCO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGlCQUFpQixDQUFDLEdBQWdCO1FBQ3hDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQy9CLENBQUM7SUFDSixDQUFDO0lBRU8saUJBQWlCLENBQUMsR0FBZ0I7UUFDeEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FDbEMsQ0FBQztJQUNKLENBQUM7SUFFTywwQkFBMEIsQ0FDaEMsR0FBZ0IsRUFDaEIsRUFBK0I7UUFFL0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDckIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGtDQUFrQyxDQUFDLENBQzNELENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksUUFBUSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RELEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsUUFBUSxFQUFFO29CQUNuQyxFQUFFLENBQUMsSUFBbUIsQ0FBQyxDQUFDO2lCQUN6QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs0R0EvWVUsY0FBYztnR0FBZCxjQUFjLDB3QkNoQzNCLCtobENBazFCQTs0RkRsekJhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsV0FBVyxtQkFHSix1QkFBdUIsQ0FBQyxNQUFNO3NIQVkvQyxPQUFPO3NCQUROLEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLE1BQU07Z0JBT3BCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxTQUFTO2dCQU12QixZQUFZO3NCQURYLFlBQVk7dUJBQUMsTUFBTTtnQkFJcEIsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLFdBQVc7Z0JBSXpCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxRQUFRO2dCQUl0QixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsV0FBVztnQkFpTHpCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNNUMsS0FBSztzQkFESixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVUxQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJpdlNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2lucHV0L3NlbGVjdC9zdGF0ZSc7XG5pbXBvcnQgeyBSaXZUYWJsZUNsaXBib2FyZCB9IGZyb20gJy4uL2NsaXBib2FyZCc7XG5pbXBvcnQgeyBSaXZUYWJsZSB9IGZyb20gJy4uL3N0YXRlJztcbmltcG9ydCB7IFRhYmxlUmVzdWx0SGVscGVycyB9IGZyb20gJy4uL3N0YXRlLWhlbHBlcnMvcmVzdWx0LWhlbHBlcnMnO1xuXG50eXBlIFBhZ2VTaXplT3B0aW9uID0ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAgPSB7IGtleTogJycgfSxcbj4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cblxuICBASW5wdXQoKVxuICBtYW5hZ2VyPzogUml2VGFibGUuTWFuYWdlcjxSLCBDLCBGLCBHPjtcblxuICBAQ29udGVudENoaWxkKCdjZWxsJylcbiAgY2VsbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8e1xuICAgIHJvdzogUjtcbiAgICBjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz47XG4gIH0+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ3N1bW1hcnknKVxuICBzdW1tYXJ5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7XG4gICAgY29sdW1uOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+O1xuICB9PjtcblxuICBAQ29udGVudENoaWxkKCdtZW51JylcbiAgbWVudVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8eyByb3c6IFJpdlRhYmxlLkZ1bGxSb3c8Uj4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnc2VsZWN0aW9uJylcbiAgc2VsZWN0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IHN0YXRlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJylcbiAgaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IHN0YXRlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnc3ViaGVhZGVyJylcbiAgc3ViaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7XG4gICAgc3RhdGU6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICBncm91cDogUml2VGFibGUuUm93R3JvdXA8UiwgRz47XG4gIH0+O1xuXG4gIHJlYWRvbmx5IGRlc3Ryb3kgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHJlYWRvbmx5IGNvbnRhaW5lclNpemUgPSBuZXcgU3ViamVjdDxET01SZWN0PigpO1xuICByZWFkb25seSBzZWxlY3Rpb25DYWxsb3V0UG9zaXRpb246IE9ic2VydmFibGU8RE9NUmVjdD4gPVxuICAgIHRoaXMuY29udGFpbmVyU2l6ZS5waXBlKFxuICAgICAgbWFwKHJlY3QgPT4gbmV3IERPTVJlY3QocmVjdC54ICsgNDQsIHJlY3QueSAtIDEyLCAwLCAwKSksXG4gICAgKTtcblxuICBwcml2YXRlIGhvdmVyZWRSb3c6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcm93SG92ZXJDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5tYW5hZ2VyIS5zdGF0ZSwgdGhpcy5jb250YWluZXJTaXplXSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoW3N0YXRlLCBjb250YWluZXJTaXplXSkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lclNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHRvdGFsRnJvemVuV2lkdGggPSBzdW0oXG4gICAgICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5zLmZpbHRlcihjID0+IGMucGlubmVkKS5tYXAoYyA9PiBjLndpZHRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRvdGFsRnJvemVuV2lkdGggPiBjb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIC8vIENoZWNrIGhvdyBtYW55IGNvbHVtbnMgY2FuIGJlIHBpbm5lZCB3aXRob3V0IG92ZXJmbG93aW5nLlxuICAgICAgICAgIGZvciAoY29uc3QgW2ldIG9mIHN0YXRlLmRpc3BsYXkuY29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcihjID0+IGMucGlubmVkKVxuICAgICAgICAgICAgLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3Qgc2xpY2VkRnJvemVuV2lkdGggPSBzdW0oXG4gICAgICAgICAgICAgIHN0YXRlLmRpc3BsYXkuY29sdW1ucy5zbGljZSgwLCBpICsgMSkubWFwKGMgPT4gYy53aWR0aCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNsaWNlZEZyb3plbldpZHRoID4gY29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZScsXG4gICAgICAgICAgICAgICAgaW5kZXg6IGkgLSAxLFxuICAgICAgICAgICAgICAgIGZyZWV6ZTogaSA+IDAsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZURyYWdPdmVyKTtcbiAgICB0aGlzLnNldHVwUm93U3BhbkhvdmVyKCk7XG4gIH1cblxuICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgd2hlbiB3ZSBoYXZlIGVudGVyZWQgYSBkcm9wIHpvbmUgZm9yIGFwcGx5aW5nIG91ciB2aXN1YWxcbiAgLy8gdHJlYXRtZW50LiBIb3dldmVyLCBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBkcm9wIGV2ZW50LCB5b3UgbXVzdCBjYWxsIHByZXZlbnREZWZhdWx0XG4gIC8vIG9uIHRoZSBkcmFnb3Zlci4gV2UgYXJlIGhhbmRsaW5nIHRoaXMgbmF0aXZlbHkgb24gdGhlIGRvY3VtZW50LCBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgLy8gYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIElmIHdlIGhhdmUgYSBkcmFnZ2VkT3ZlckNvbHVtbklkeCBhbmQgd2UgZHJhZyBvdmVyIGFuXG4gIC8vIGVsZW1lbnQgd2l0aCBjbGFzcyBkcm9wLXpvbmUsIHdlIHdpbGwgYXNzdW1lIHlvdSB3YW50IHRvIHRoZSBkcm9wIGVsZW1lbnQgZW5hYmxlZFxuICAvLyBhbmQgd2Ugd2lsbCBwcmV2ZW50RGVmYXVsdC5cbiAgaGFuZGxlRHJhZ092ZXIgPSAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCAhPSBudWxsICYmIHRhcmdldC5jbG9zZXN0KCcuZHJvcC16b25lJykpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVEcmFnT3Zlcik7XG4gICAgdGhpcy5yb3dIb3ZlckNsZWFudXA/LigpO1xuICAgIHRoaXMuZGVzdHJveS5uZXh0KG51bGwpO1xuICB9XG5cbiAgcmVhZG9ubHkgcGFnZVNpemVPcHRpb25zOiBSaXZTZWxlY3QuT3B0aW9uR3JvdXA8UGFnZVNpemVPcHRpb24+W10gPSBbXG4gICAge1xuICAgICAgb3B0aW9uczogUml2VGFibGUucGFnZVNpemVzLm1hcChwYWdlU2l6ZSA9PiAoe1xuICAgICAgICBpZDogcGFnZVNpemUudG9TdHJpbmcoKSxcbiAgICAgICAgdGl0bGU6IHBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiBwYWdlU2l6ZSxcbiAgICAgIH0pKSxcbiAgICB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHRyYWNrQnlSb3c6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5GdWxsUm93PFI+PiA9IChfLCByb3cpID0+XG4gICAgcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5R3JvdXA6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5Sb3dHcm91cDxSLCBHPj4gPSAoXG4gICAgXyxcbiAgICBncm91cCxcbiAgKSA9PiBncm91cC5ncm91cERhdGEua2V5O1xuICByZWFkb25seSB0cmFja0J5TmVzdGVkUm93OiBUcmFja0J5RnVuY3Rpb248Uml2VGFibGUuRnVsbE5lc3RlZFJvdzxSPj4gPSAoXG4gICAgXyxcbiAgICByb3csXG4gICkgPT4gcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5TmVzdGVkSGVhZGVyOiBUcmFja0J5RnVuY3Rpb248XG4gICAgUml2VGFibGUuRnVsbE5lc3RlZEhlYWRlclJvdzxSPlxuICA+ID0gKF8sIHJvdykgPT4gcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5Q29sdW1uOiBUcmFja0J5RnVuY3Rpb248Uml2VGFibGUuRnVsbENvbHVtbjxDPj4gPSAoXG4gICAgXyxcbiAgICBjb2x1bW4sXG4gICkgPT4gY29sdW1uLmtleTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBvcmFyeVdpZHRoczogTWFwPEMsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIHNldFdpZHRoKGNvbHVtbjogQywgd2lkdGg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAod2lkdGggPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeVdpZHRoID0gdGhpcy50ZW1wb3JhcnlXaWR0aHMuZ2V0KGNvbHVtbik7XG4gICAgICBpZiAodGVtcG9yYXJ5V2lkdGgpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5XaWR0aENoYW5nZScsXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHByZWZlcnJlZFdpZHRoOiB0ZW1wb3JhcnlXaWR0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBvcmFyeVdpZHRocy5kZWxldGUoY29sdW1uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wb3JhcnlXaWR0aHMuc2V0KGNvbHVtbiwgd2lkdGgpO1xuICAgIH1cbiAgfVxuICBnZXRXaWR0aChjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnRlbXBvcmFyeVdpZHRocy5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnRlbXBvcmFyeVdpZHRocy5nZXQoY29sdW1uLmtleSkhLCBjb2x1bW4ubWluV2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGRyYWdnZWRDb2x1bW5JZHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBkcmFnZ2VkQ29sdW1uS2V5OiBDIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdnZWRPdmVyQ29sdW1uSWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBkcmFnU3RhcnQoaWR4OiBudW1iZXIsIGtleTogQykge1xuICAgIHRoaXMuZHJhZ2dlZENvbHVtbklkeCA9IGlkeDtcbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBrZXk7XG4gIH1cblxuICBkcmFnT3ZlcihvbnRvSWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRyYWdnZWRPdmVyQ29sdW1uSWR4ID0gb250b0lkeDtcbiAgfVxuXG4gIGRyb3Aob250b0lkeDogbnVtYmVyLCBlbmFibGVkQ29sdW1uQ291bnQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwpIHtcbiAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbk9yZGVyQ2hhbmdlJyxcbiAgICAgICAgcHJldmlvdXNJbmRleDogdGhpcy5kcmFnZ2VkQ29sdW1uSWR4LFxuICAgICAgICBuZXdJbmRleDogb250b0lkeCxcbiAgICAgICAgc291cmNlOiAndGFibGVEcmFnJyxcbiAgICAgICAgY29sdW1uOiB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmFibGVkID0gb250b0lkeCA8IGVuYWJsZWRDb2x1bW5Db3VudDtcbiAgICAgIHRoaXMuZHJvcEVuYWJsZWRTdGF0ZShlbmFibGVkLCBlbmFibGVkQ29sdW1uQ291bnQpO1xuICAgICAgdGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCA9IG51bGw7XG4gICAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRyb3BFbmFibGVkU3RhdGUoZW5hYmxlZDogYm9vbGVhbiwgZW5hYmxlZENvbHVtbkNvdW50OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBudWxsICYmIHRoaXMuZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaXNFbmFibGVkID0gZW5hYmxlZENvbHVtbkNvdW50ID4gdGhpcy5kcmFnZ2VkQ29sdW1uSWR4O1xuICAgICAgY29uc3Qgc2hvdWxkRmlyZSA9IGVuYWJsZWQgPyAhaXNFbmFibGVkIDogaXNFbmFibGVkO1xuICAgICAgaWYgKHNob3VsZEZpcmUpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5FbmFibGVkQ2hhbmdlJyxcbiAgICAgICAgICBjb2x1bW46IHRoaXMuZHJhZ2dlZENvbHVtbktleSxcbiAgICAgICAgICBlbmFibGVkOiBlbmFibGVkLFxuICAgICAgICAgIHNvdXJjZTogJ2RyYWdEcm9wJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGUubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSByZXR1cm4gZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdvYmplY3QnICYmIGUgIT09IG51bGwpIHJldHVybiBlLnRvU3RyaW5nKCk7XG4gICAgZWxzZSByZXR1cm4gJ0FuIGVycm9yIG9jY3VycmVkLic7XG4gIH1cblxuICBwcml2YXRlIHNoaWZ0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLnNoaWZ0ID0gZXZlbnQuc2hpZnRLZXk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5zaGlmdCA9IGV2ZW50LnNoaWZ0S2V5O1xuICB9XG5cbiAgLy8gUm93cyB3aXRoIGxpbmtzIHJlbmRlciBhcyBgPGEgY2xhc3M9XCJyb3ctbGlua1wiPmAgcmF0aGVyIHRoYW4gYDx0cj5gLCB3aGljaFxuICAvLyB0aGUgYnJvd3NlciBkb2VzIG5vdCBzZXJpYWxpemUgYXMgYSB0YWJsZSByb3cuIENvcHlpbmcgaXMgaGFuZGxlZCBvbiB0aGVcbiAgLy8gZG9jdW1lbnQgYmVjYXVzZSBhIHNlbGVjdC1hbGwgZGlzcGF0Y2hlcyB0aGUgZXZlbnQgZnJvbSB0aGUgc2VsZWN0aW9uIHJvb3RcbiAgLy8gcmF0aGVyIHRoYW4gZnJvbSB3aXRoaW4gdGhlIHRhYmxlLlxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjb3B5JywgWyckZXZlbnQnXSlcbiAgb25Db3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChcbiAgICAgICFldmVudC5jbGlwYm9hcmREYXRhIHx8XG4gICAgICAhc2VsZWN0aW9uIHx8XG4gICAgICBzZWxlY3Rpb24uaXNDb2xsYXBzZWQgfHxcbiAgICAgIFJpdlRhYmxlQ2xpcGJvYXJkLmlzRWRpdGFibGUoZXZlbnQudGFyZ2V0KVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IHJhbmdlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHNlbGVjdGlvbi5yYW5nZUNvdW50IH0sIChfLCBpKSA9PlxuICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQoaSksXG4gICAgKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gKG5vZGU6IE5vZGUpID0+XG4gICAgICByYW5nZXMuc29tZShyYW5nZSA9PiByYW5nZS5pbnRlcnNlY3RzTm9kZShub2RlKSk7XG5cbiAgICBjb25zdCBob3N0OiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghUml2VGFibGVDbGlwYm9hcmQub3duc1NlbGVjdGlvbihob3N0LCBpc1NlbGVjdGVkKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IFJpdlRhYmxlQ2xpcGJvYXJkLmV4dHJhY3QoXG4gICAgICAvLyBBIGdyb3VwZWQgdGFibGUgcmVuZGVycyBvbmUgdGFibGUgcGVyIGdyb3VwLCBhbmQgYSBjZWxsIG1heSBob2xkIGFcbiAgICAgIC8vIG5lc3RlZCB0YWJsZSB0aGF0IHNlcmlhbGl6ZXMgaXRzZWxmLlxuICAgICAgQXJyYXkuZnJvbShob3N0LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJykpLmZpbHRlcihcbiAgICAgICAgdGFibGUgPT4gdGFibGUuY2xvc2VzdChob3N0LmxvY2FsTmFtZSkgPT09IGhvc3QsXG4gICAgICApLFxuICAgICAgaXNTZWxlY3RlZCxcbiAgICAgIC8vIFdoZXJlIHRoZSBkcmFnIHN0YXJ0ZWQgYW5kIGVuZGVkLCB3aGljaCBuYXJyb3dzIHRoZSBjb3B5IHRvIHRoZSBkcmFnZ2VkXG4gICAgICAvLyBjb2x1bW5zIHJhdGhlciB0aGFuIGV2ZXJ5IGNvbHVtbiB0aGUgcmFuZ2UgcGFzc2VzIHRocm91Z2guXG4gICAgICBbc2VsZWN0aW9uLmFuY2hvck5vZGUsIHNlbGVjdGlvbi5mb2N1c05vZGVdLFxuICAgICk7XG4gICAgaWYgKCFwYXlsb2FkKSByZXR1cm47XG5cbiAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCBwYXlsb2FkLnRleHQpO1xuICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9odG1sJywgcGF5bG9hZC5odG1sKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlKHJvd0lkOiBSWydpZCddLCBzZWxlY3RlZDogYm9vbGVhbikge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdyb3dTZWxlY3RlZENoYW5nZScsXG4gICAgICBpZDogcm93SWQsXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIGNvbnRpZ3VvdXM6IHRoaXMuc2hpZnQsXG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVSb3dDb2xsYXBzZShyb3dJZDogUlsnaWQnXSkge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICd0b2dnbGVSb3dDb2xsYXBzZScsXG4gICAgICBpZDogcm93SWQsXG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVIZWFkZXJDb2xsYXBzZShoZWFkZXJJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgdHlwZTogJ3RvZ2dsZUhlYWRlckNvbGxhcHNlJyxcbiAgICAgIGlkOiBoZWFkZXJJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4pIHtcbiAgICBpZiAoY29sdW1uLmNsaWNrUHJldmVudERlZmF1bHQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGNvbHVtbi5jbGlja1N0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBpc0V4dGVybmFsUm93TGluayhcbiAgICByb3dMaW5rOiBSaXZUYWJsZS5Sb3dMaW5rLFxuICApOiByb3dMaW5rIGlzIFJpdlRhYmxlLkV4dGVybmFsUm93TGluayB7XG4gICAgcmV0dXJuIHJvd0xpbmsudHlwZSA9PT0gJ2V4dGVybmFsJztcbiAgfVxuXG4gIGlzSW50ZXJuYWxSb3dMaW5rKFxuICAgIHJvd0xpbms6IFJpdlRhYmxlLlJvd0xpbmssXG4gICk6IHJvd0xpbmsgaXMgUml2VGFibGUuSW50ZXJuYWxSb3dMaW5rIHtcbiAgICByZXR1cm4gcm93TGluay50eXBlID09PSAnaW50ZXJuYWwnO1xuICB9XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHJvdyArIGNvbHVtbiB0byBkaXNwbGF5IGEgY2hldnJvbiwgd2hlbiBuZXN0aW5nIHJvd3NcbiAgc2hvd0NoZXZyb25Gb3JDZWxsKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgaGFzU3ViUm93czogYm9vbGVhbixcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHNob3cgdGhlIGNoZXZyb24gb24gcm93cyB3aXRoIHN1YnJvd3NcbiAgICBpZiAoIWhhc1N1YlJvd3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLypcbiAgICAgIE9ubHkgc2hvdyB0aGUgY2hldnJvbiBvbiB0aGUgY29sdW1uIG1hdGNoaW5nIHRoZSBsZXZlbCBvZiBuZXN0aW5nOlxuICAgICAgdiBQYXllclxuICAgICAgICB2IENvZGVcbiAgICAqL1xuICAgIGlmIChjb2x1bW5JbmRleCAhPSBkZXB0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gV2hlbiB3ZSBhcmUgbmVzdGluZyByb3dzLCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdGhlIHBhcmVudCdzIGRhdGEgaW4gaXRzIGNoaWxkcmVuJ3Mgcm93c1xuICBibGFua0NlbGxEdWVUb05lc3RpbmcoY29sdW1uSW5kZXg6IG51bWJlciwgZGVwdGg6IG51bWJlcikge1xuICAgIC8qXG4gICAgICBUb3AtbGV2ZWwgcm93IGlzIDAgZGVwdGgsIGFuZCBzaG91bGQgaGF2ZSBubyBjb2x1bW5zIGJsYW5rLlxuICAgICAgU2Vjb25kLWxldmVsIG5lc3RlZCByb3cgaXMgMSBkZXB0aCwgYW5kIHNob3VsZCBoYXZlIHRoZSBmaXJzdCBjb2x1bW4gYmxhbmsuXG4gICAgICBFdGMuXG4gICAgKi9cbiAgICByZXR1cm4gY29sdW1uSW5kZXggPCBkZXB0aDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSb3dTcGFuSG92ZXIoKSB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgY29uc3Qgb25Nb3VzZU92ZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcbiAgICAgICAgICAnYS5yb3ctbGluaywgdGJvZHkgPiB0cicsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICBpZiAocm93ID09PSB0aGlzLmhvdmVyZWRSb3cpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaG92ZXJlZFJvdykgdGhpcy5jbGVhclJvd1NwYW5Ib3Zlcih0aGlzLmhvdmVyZWRSb3cpO1xuICAgICAgICB0aGlzLmhvdmVyZWRSb3cgPSByb3c7XG4gICAgICAgIGlmIChyb3c/Lm1hdGNoZXMoJ2Eucm93LWxpbmsnKSkgdGhpcy5hcHBseVJvd1NwYW5Ib3Zlcihyb3cpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25Nb3VzZU91dCA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCByZWxhdGVkID0gKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsKT8uY2xvc2VzdChcbiAgICAgICAgICAnYS5yb3ctbGluaywgdGJvZHkgPiB0cicsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICBpZiAoIXJlbGF0ZWQgfHwgcmVsYXRlZCAhPT0gdGhpcy5ob3ZlcmVkUm93KSB7XG4gICAgICAgICAgaWYgKHRoaXMuaG92ZXJlZFJvdykgdGhpcy5jbGVhclJvd1NwYW5Ib3Zlcih0aGlzLmhvdmVyZWRSb3cpO1xuICAgICAgICAgIHRoaXMuaG92ZXJlZFJvdyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgb25Nb3VzZU92ZXIpO1xuICAgICAgaG9zdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIG9uTW91c2VPdXQpO1xuICAgICAgdGhpcy5yb3dIb3ZlckNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGhvc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgb25Nb3VzZU92ZXIpO1xuICAgICAgICBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0Jywgb25Nb3VzZU91dCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVJvd1NwYW5Ib3Zlcihyb3c6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5mb3JFYWNoQ292ZXJpbmdSb3dTcGFuQ2VsbChyb3csIGNlbGwgPT5cbiAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgncnMtaG92ZXInKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJvd1NwYW5Ib3Zlcihyb3c6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5mb3JFYWNoQ292ZXJpbmdSb3dTcGFuQ2VsbChyb3csIGNlbGwgPT5cbiAgICAgIGNlbGwuY2xhc3NMaXN0LnJlbW92ZSgncnMtaG92ZXInKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JFYWNoQ292ZXJpbmdSb3dTcGFuQ2VsbChcbiAgICByb3c6IEhUTUxFbGVtZW50LFxuICAgIGZuOiAoY2VsbDogSFRNTEVsZW1lbnQpID0+IHZvaWQsXG4gICkge1xuICAgIGNvbnN0IHRib2R5ID0gcm93LmNsb3Nlc3QoJ3Rib2R5Jyk7XG4gICAgaWYgKCF0Ym9keSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20oXG4gICAgICB0Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiBhLnJvdy1saW5rLCA6c2NvcGUgPiB0cicpLFxuICAgICk7XG4gICAgY29uc3Qgcm93SW5kZXggPSByb3dzLmluZGV4T2Yocm93KTtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0luZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IGNlbGxzID0gcm93c1tpXS5xdWVyeVNlbGVjdG9yQWxsKCd0ZFtyb3dzcGFuXScpO1xuICAgICAgY2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKCdyb3dzcGFuJykgfHwgJzEnLCAxMCk7XG4gICAgICAgIGlmIChzcGFuID4gMSAmJiBpICsgc3BhbiA+IHJvd0luZGV4KSB7XG4gICAgICAgICAgZm4oY2VsbCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlzUmVndWxhclJlc3VsdCA9IFRhYmxlUmVzdWx0SGVscGVycy5pc1JlZ3VsYXJSZXN1bHQ8UiwgRz47XG4gIGlzR3JvdXBSZXN1bHQgPSBUYWJsZVJlc3VsdEhlbHBlcnMuaXNHcm91cFJlc3VsdDxSLCBHPjtcbiAgaXNOZXN0ZWRSZXN1bHQgPSBUYWJsZVJlc3VsdEhlbHBlcnMuaXNOZXN0ZWRSZXN1bHQ8UiwgRz47XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwibWFuYWdlcj8uc3RhdGUgfCBhc3luYzsgbGV0IHNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGlvbkNhbGxvdXRQb3NpdGlvbiB8IGFzeW5jOyBsZXQgcG9zaXRpb25cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicy5zZWxlY3Rpb24uc2VsZWN0ZWRDb3VudCA+IDAgJiYgc2VsZWN0aW9uVGVtcGxhdGVcIj5cbiAgICAgIDxyaXYtY2FsbG91dFxuICAgICAgICAqcml2LW92ZXJsYXlcbiAgICAgICAgW2FuY2hvcl09XCJwb3NpdGlvblwiXG4gICAgICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICAgICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgICAgICBbc2hvd0NhcmV0XT1cImZhbHNlXCJcbiAgICAgICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIid0b3AtcmlnaHQnXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0aW9uVGVtcGxhdGU7IGNvbnRleHQ6IHsgc3RhdGU6IHMgfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvcml2LWNhbGxvdXQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCIgKm5nSWY9XCJoZWFkZXJUZW1wbGF0ZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlclRlbXBsYXRlOyBjb250ZXh0OiB7IHN0YXRlOiBzIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxyaXYtbG9hZGluZy1jb3ZlclxuICAgICAgY2xhc3M9XCJjb250YWluZXItbG9hZGVyLXdyYXBwZXJcIlxuICAgICAgW2xvYWRpbmddPVwicy5sb2FkLmxvYWRpbmdcIlxuICAgICAgW2Vycm9yTWVzc2FnZV09XCJzLmxvYWQuZXJyb3IgPyBnZXRFcnJvck1lc3NhZ2Uocy5sb2FkLmVycm9yKSA6IHVuZGVmaW5lZFwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNvbnRhaW5lclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnY29udGFpbmVyLXVuZ3JvdXBlZCc6ICFpc0dyb3VwUmVzdWx0KHMucmVzdWx0KSxcbiAgICAgICAgICAnaGFzLWhlYWRlcic6ICFpc0dyb3VwUmVzdWx0KHMucmVzdWx0KSAmJiBoZWFkZXJUZW1wbGF0ZSxcbiAgICAgICAgICAnd2l0aG91dC1jb2x1bW5zJzogcy5kaXNwbGF5LmNvbHVtbnMubGVuZ3RoID09PSAwXG4gICAgICAgIH1cIlxuICAgICAgICAocml2Q2xpZW50U2l6ZSk9XCJjb250YWluZXJTaXplLm5leHQoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxyaXYtemVyby1zdGF0ZVxuICAgICAgICAgICpuZ0lmPVwicy5kaXNwbGF5LmNvbHVtbnMubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICBjbGFzcz1cIm5vLWNvbHVtbnMtbWVzc2FnZVwiXG4gICAgICAgICAgW21lc3NhZ2VdPVwiXG4gICAgICAgICAgICAnQWxsIGNvbHVtbnMgZGlzYWJsZWQuIEVuYWJsZSBhdCBsZWFzdCBvbmUgY29sdW1uIHRvIHZpZXcgdGFibGUgZGF0YS4nXG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvcml2LXplcm8tc3RhdGU+XG5cbiAgICAgICAgPCEtLVxuICAgICAgICAgIEFuIG92ZXJ2aWV3IG9mIHRoZSB0ZW1wbGF0ZXMgd2UgYXJlIHVzaW5nOlxuXG4gICAgICAgICAgaGVhZGVyc0FuZFRhYmxlQm9keSAtIGhlbHBzIHVzIGNyZWF0ZSBtdWx0aXBsZSB0YWJsZXMgZm9yIGdyb3VwZWQgcmVzdWx0c1xuICAgICAgICAgICAgaGVhZGVyUm93V2l0aFN1YlJvd3MgLSBoZWxwcyB1cyBjcmVhdGUgaGVhZGVyIHJvd3MgZm9yIG5lc3RlZCB3aXRoIGhlYWRlciByZXN1bHRzXG4gICAgICAgICAgICAgIG5lc3RlZFJvd1dpdGhTdWJSb3dzIC0gaGVscHMgdXMgY3JlYXRlIG5lc3RlZCByb3dzIGZvciB0aGUgbmVzdGVkIHJlc3VsdCB0eXBlc1xuICAgICAgICAgICAgICAgIHJvd1dyYXBwZWRXaXRoUm93TGluayAtIGhlbHBzIHVzIGFkZCBhIHJvd2xpbmsgdG8gYSByb3dcbiAgICAgICAgICAgICAgICAgIHJvd0JvZHkgLSBkaXNwbGF5cyB0aGUgcm93IGNvbnRlbnRcbiAgICAgICAgLS0+XG5cbiAgICAgICAgPCEtLSBXaGVuIHdlIGFyZSBncm91cGVkLCB3ZSBzaG93IG9uZSB0YWJsZSBwZXIgZ3JvdXAgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgcy5yZXN1bHQucmVzdWx0VHlwZSA9PT0gJ3RhYmxlLWdyb3VwaW5nJ1xuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IGdyb3VwIG9mIHMucmVzdWx0LnJvd0dyb3VwcztcbiAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUdyb3VwO1xuICAgICAgICAgICAgICBsZXQgbGFzdCA9IGxhc3RcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGhlYWRlcnNBbmRUYWJsZUJvZHk7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBncm91cDogZ3JvdXAsIGxhc3Q6IGxhc3QgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFdoZW4gd2UgYXJlbid0IGdyb3VwZWQsIHdlIHNob3cgb25lIHRhYmxlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJpc1JlZ3VsYXJSZXN1bHQocy5yZXN1bHQpIHx8IGlzTmVzdGVkUmVzdWx0KHMucmVzdWx0KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBoZWFkZXJzQW5kVGFibGVCb2R5O1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGdyb3VwOiBudWxsLCBsYXN0OiB0cnVlIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWdyb3VwPVwiZ3JvdXBcIiBsZXQtbGFzdD1cImxhc3RcIiAjaGVhZGVyc0FuZFRhYmxlQm9keT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgZ3JvdXAgIT09IG51bGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBzdWJoZWFkZXJUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgc3RhdGU6IHMsIGdyb3VwIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ3N1YmNvbnRhaW5lci1ncm91cGVkJzogaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgfVwiPlxuICAgICAgICAgICAgPHRhYmxlPlxuICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiISFzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0aW9uLWhlYWRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cml2LXNyLW9ubHk+U2VsZWN0IHJvd3M8L3Jpdi1zci1vbmx5PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uICE9PSAnaW5kaXZpZHVhbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNHcm91cFJlc3VsdChzLnJlc3VsdClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInMuc2VsZWN0aW9uLmlzQWxsU2VsZWN0ZWQgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmlzQWxsU2VsZWN0ZWQgPT09ICdpbmRldGVybWluYXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7IHR5cGU6ICdhbGxTZWxlY3RlZENoYW5nZScgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJTZWxlY3QgYWxsIHJvd3NcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8cml2LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzR3JvdXBSZXN1bHQocy5yZXN1bHQpICYmIGdyb3VwICE9PSBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJncm91cC5zZWxlY3RlZCA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJncm91cC5zZWxlY3RlZCA9PT0gJ2luZGV0ZXJtaW5hdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2dyb3VwU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNlbGVjdCBncm91cCByb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTmVzdGVkUmVzdWx0KHMucmVzdWx0KSAmJiAhIXMucmVzdWx0Lmhhc0hlYWRlcnNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1oZWFkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgYSBjb2x1bW4gZm9yIHRoZSBjaGV2cm9ucywgaWYgd2UgaGF2ZSB0b2dnbGFibGUgaGVhZGVycyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1zci1vbmx5PlRvZ2dsZXM8L3Jpdi1zci1vbmx5PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHMuZGlzcGxheS5jb2x1bW5zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ2V0V2lkdGgoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRyYWdnYWJsZV09XCJzLmRpc3BsYXkuY29sdW1uc0FyZVJlb3JkZXJhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgZHJvcHBhYmxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcC16b25lXCJcbiAgICAgICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoaSwgY29sdW1uLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoZHJhZ2VudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBkcmFnT3ZlcihpKVwiXG4gICAgICAgICAgICAgICAgICAgIChkcm9wKT1cImRyb3AoaSwgcy5kaXNwbGF5LmVuYWJsZWRDb3VudClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHJhZ2dlZC1vdmVyLWxlZnRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZE92ZXJDb2x1bW5JZHggPT09IGkgJiZcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCA+IGlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRyYWdnZWQtb3Zlci1yaWdodF09XCJcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkT3ZlckNvbHVtbklkeCA9PT0gaSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4IDwgaVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICFjb2x1bW4ub3JkZXJhYmxlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhY29sdW1uLmZpbHRlcmFibGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFzLmRpc3BsYXkuY29sdW1uc0FyZUZyZWV6YWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXMuZGlzcGxheS5jb2x1bW5zQXJlSGlkZWFibGVcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sZWZ0XT1cImNvbHVtbi5hbGlnbm1lbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJpZ2h0XT1cImNvbHVtbi5hbGlnbm1lbnQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcy5kaXNwbGF5LmNvbHVtbk5hbWVNYXAuZ2V0KGNvbHVtbi5rZXkpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cml2LW1lbnVcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLm9yZGVyYWJsZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlcmFibGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuZGlzcGxheS5jb2x1bW5zQXJlRnJlZXphYmxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkuY29sdW1uc0FyZUhpZGVhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubGVmdF09XCJjb2x1bW4uYWxpZ25tZW50ID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucmlnaHRdPVwiY29sdW1uLmFsaWdubWVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicy5xdWVyeS5vcmRlcj8uY29sdW1uID09PSBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcy5kaXNwbGF5LmNvbHVtbk5hbWVNYXAuZ2V0KGNvbHVtbi5rZXkpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5kaXJlY3Rpb24gPT09ICdkZXNjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ0Fycm93RG93bidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdBcnJvd1VwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJpdi10YWJsZS1oZWFkZXItcmVzaXplLWhhbmRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ1Jlc2l6ZSk9XCJzZXRXaWR0aChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi10YWJsZS1oZWFkZXItcmVzaXplLWhhbmRsZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ub3JkZXJhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2FzYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0IGFzY2VuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInMucXVlcnkub3JkZXI/LmNvbHVtbiA9PT0gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBzb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmNvbHVtbiA9PT0gY29sdW1uLmtleSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5xdWVyeS5vcmRlcj8uZGlyZWN0aW9uID09PSAnZGVzYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdkZXNjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydCBkZXNjZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJpdi1kaXZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLm9yZGVyYWJsZSAmJiBjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ZpbHRlckFkZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBhIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicml2LWRpdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbi5vcmRlcmFibGUgfHwgY29sdW1uLmZpbHRlcmFibGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzLmRpc3BsYXkuY29sdW1uc0FyZUZyZWV6YWJsZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZGlzcGxheS5jb2x1bW5zQXJlSGlkZWFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicy5kaXNwbGF5LmNvbHVtbnNBcmVGcmVlemFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi5waW5uZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvbHVtbnNGcmVlemVVcFRvQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWV6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlemUgdXAgdG8gY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uc0ZyZWV6ZVVwVG9DaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZXplOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBVbi1mcmVlemUgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInMuZGlzcGxheS5jb2x1bW5zQXJlSGlkZWFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2x1bW5FbmFibGVkQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaGVhZGVyTWVudSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgSGlkZSBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9yaXYtbWVudT5cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJtZW51VGVtcGxhdGVcIiBjbGFzcz1cIm1lbnUtaGVhZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cml2LXNyLW9ubHk+TWVudTwvcml2LXNyLW9ubHk+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInMucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCA+IDA7IGVsc2UgZW1wdHlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwhLS0gR3JvdXBlZCByZXN1bHRzIGRvIG5vdCBoYXZlIHN1YnJvd3Mgb3IgaGVhZGVycyAtLT5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0dyb3VwUmVzdWx0KHMucmVzdWx0KSAmJiBncm91cCAhPT0gbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3cgb2YgZ3JvdXAucm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3dJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeVJvd1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dXcmFwcGVkV2l0aFJvd0xpbms7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SXNDb2xsYXBzZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8IS0tIFJlZ3VsYXIgcmVzdWx0cyBkbyBub3QgaGF2ZSBzdWJyb3dzIG9yIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaXNSZWd1bGFyUmVzdWx0KHMucmVzdWx0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgIHMucmVzdWx0LnJlc3VsdFR5cGUgPT09ICdub3JtYWwtcm93cydcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdyBvZiBzLnJlc3VsdC5yb3dzQXNHcm91cC5yb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5Um93XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1dyYXBwZWRXaXRoUm93TGluaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNTdWJSb3dzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dJc0NvbGxhcHNlZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDwhLS0gTmVzdGVkIHdpdGggaGVhZGVyIHJlc3VsdHMgaGF2ZSBzdWJyb3dzIGFuZCBoZWFkZXJzIC0tPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlzTmVzdGVkUmVzdWx0KHMucmVzdWx0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgIHMucmVzdWx0LnJlc3VsdFR5cGUgPT09ICduZXN0ZWQtcm93cydcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRlclJvdyBvZiBzLnJlc3VsdC5uZXN0ZWRIZWFkZXJSb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU5lc3RlZEhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJSb3dXaXRoU3ViUm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBoZWFkZXJSb3c6IGhlYWRlclJvdyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1oZWFkZXJSb3c9XCJoZWFkZXJSb3dcIiAjaGVhZGVyUm93V2l0aFN1YlJvd3M+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSB0aGUgaGVhZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyUm93LmhlYWRlclRleHQgIT09IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWhlYWRlci1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUhlYWRlckNvbGxhcHNlKGhlYWRlclJvdy5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3dzIHdpdGggc3Vicm93cyBoYXZlIGEgY2hldnJvbiBpbmRpY2F0aW5nIHlvdSBjYW4gY2xpY2sgdGhlIHJvdyB0byBzZWUgdGhlIHN1YnJvd3MuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByZXZlbnQtc2hyaW5rIGNoZXZyb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUm93LmlzQ29sbGFwc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ0NoZXZyb25Eb3duJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdDaGV2cm9uVXAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cInMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhlYWRlclJvdy5oZWFkZXJUZXh0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibWVudVRlbXBsYXRlXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIElmIGEgaGVhZGVyIGlzIG5vdCBjb2xsYXBzZWQsIGFsc28gc2hvdyBpdHMgc3Vicm93cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhaGVhZGVyUm93LmlzQ29sbGFwc2VkICYmIGhlYWRlclJvdy5zdWJSb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXN0ZWRSb3cgb2YgaGVhZGVyUm93LnN1YlJvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlOZXN0ZWRSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJvd1dpdGhTdWJSb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgbmVzdGVkUm93OiBuZXN0ZWRSb3csIGRlcHRoOiAwIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgbGV0LW5lc3RlZFJvdz1cIm5lc3RlZFJvd1wiXG4gICAgICAgICAgICAgICAgICAgIGxldC1kZXB0aD1cImRlcHRoXCJcbiAgICAgICAgICAgICAgICAgICAgI25lc3RlZFJvd1dpdGhTdWJSb3dzXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSB0aGUgY3VycmVudCByb3cgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dXcmFwcGVkV2l0aFJvd0xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3c6IG5lc3RlZFJvdy5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogbmVzdGVkUm93LnN1YlJvd3M/Lmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dJc0NvbGxhcHNlZDogbmVzdGVkUm93LmlzQ29sbGFwc2VkXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJZiBhIHJvdyBpcyBub3QgY29sbGFwc2VkLCBhbHNvIHNob3cgaXRzIHN1YnJvd3MgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIW5lc3RlZFJvdy5pc0NvbGxhcHNlZCAmJiBuZXN0ZWRSb3cuc3ViUm93cz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YlJvdyBvZiBuZXN0ZWRSb3cuc3ViUm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU5lc3RlZFJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZFJvd1dpdGhTdWJSb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSb3c6IHN1YlJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGggKyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1kZXB0aD1cImRlcHRoXCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LWhhc1N1YlJvd3M9XCJoYXNTdWJSb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0lzQ29sbGFwc2VkPVwicm93SXNDb2xsYXBzZWRcIlxuICAgICAgICAgICAgICAgICAgICAjcm93V3JhcHBlZFdpdGhSb3dMaW5rXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogaGFzU3ViUm93cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0lzQ29sbGFwc2VkOiByb3dJc0NvbGxhcHNlZFxuICAgICAgICAgICAgICAgICAgICAgIH0gYXMgcm93Q29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnJvd0xpbms7IGxldCBybFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0V4dGVybmFsUm93TGluayhybClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJybC5ocmVmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdy1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmdyYXllZF09XCJzLmRpc3BsYXkucm93c0FyZUdyYXllZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0JvZHk7IGNvbnRleHQ6IHJvd0NvbnRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzSW50ZXJuYWxSb3dMaW5rKHJsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwicmwucm91dGVyTGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJybC5xdWVyeVBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc0hhbmRsaW5nXT1cInJsLnF1ZXJ5UGFyYW1zSGFuZGxpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdy1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmdyYXllZF09XCJzLmRpc3BsYXkucm93c0FyZUdyYXllZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicmwuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93Qm9keTsgY29udGV4dDogcm93Q29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJvdy5yb3dMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ncmF5ZWRdPVwicy5kaXNwbGF5LnJvd3NBcmVHcmF5ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dCb2R5OyBjb250ZXh0OiByb3dDb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBsZXQtZGVwdGg9XCJkZXB0aFwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1oYXNTdWJSb3dzPVwiaGFzU3ViUm93c1wiXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3dJc0NvbGxhcHNlZD1cInJvd0lzQ29sbGFwc2VkXCJcbiAgICAgICAgICAgICAgICAgICAgI3Jvd0JvZHlcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiA9PT0gJ2luZGl2aWR1YWwnXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJpdi1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpZmllcl09XCIncml2LXRhYmxlLXNlbGVjdGlvbi0nICsgcm93LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2Uocm93LmlkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiU2VsZWN0IHJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc05lc3RlZFJlc3VsdChzLnJlc3VsdCkgJiYgISFzLnJlc3VsdC5oYXNIZWFkZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhpcyB0ZCBsaW5lcyB1cCB3aXRoIHRoZSBoZWFkZXIgY2hldnJvbiBjb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gb2Ygcy5kaXNwbGF5LmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCBhcyBjb2x1bW5JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kaXNwbGF5LmNlbGxSb3dTcGFuKHJvd0luZGV4LCBjb2x1bW4ua2V5KSBhcyBzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNwYW4gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJzcGFuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJzLXJpZ2h0LWJvcmRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkubmVlZHNSaWdodEJvcmRlcihyb3dJbmRleCwgY29sdW1uLmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFkdmFuY2VkXT1cImNvbHVtbi5kYXRhVHlwZSA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50b2dnbGVhYmxlLWNlbGxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NoZXZyb25Gb3JDZWxsKGNvbHVtbkluZGV4LCBoYXNTdWJSb3dzLCBkZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUudGV4dC1hbGlnbl09XCJjb2x1bW4uYWxpZ25tZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGV2cm9uRm9yQ2VsbChjb2x1bW5JbmRleCwgaGFzU3ViUm93cywgZGVwdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRvZ2dsZVJvd0NvbGxhcHNlKHJvdy5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaGFuZGxlQ2xpY2soJGV2ZW50LCBjb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYmxhbmtDZWxsRHVlVG9OZXN0aW5nKGNvbHVtbkluZGV4LCBkZXB0aClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsVGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3dzIHdpdGggc3Vicm93cyBoYXZlIGEgY2hldnJvbiBpbmRpY2F0aW5nIHlvdSBjYW4gY2xpY2sgdGhlIHJvdyB0byBzZWUgdGhlIHN1YnJvd3MuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGV2cm9uRm9yQ2VsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1YlJvd3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjZWxsQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGVhYmxlLWNlbGwtY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJldmVudC1zaHJpbmsgY2hldnJvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SXNDb2xsYXBzZWQgPyAnQ2hldnJvbkRvd24nIDogJ0NoZXZyb25VcCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcml2LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZWFibGUtY2VsbC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxDb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWVudS1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IHJvdzogcm93IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwicy5kaXNwbGF5LmN1c3RvbVN1bW1hcnlSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sdW1uIG9mIHMuZGlzcGxheS5jb2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWR2YW5jZWRdPVwiY29sdW1uLmRhdGFUeXBlID09PSAnYWR2YW5jZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb2x1bW4ubGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRleHQtYWxpZ25dPVwiY29sdW1uLmFsaWdubWVudFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5VGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGNvbHVtbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwicy5kaXNwbGF5LmNvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi16ZXJvLXN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInMuZGlzcGxheS56ZXJvU3RhdGVNZXNzYWdlOyBsZXQgbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtemVyby1zdGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmb290ZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiZcbiAgICAgICAgICAgICAgZ3JvdXAgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgZ3JvdXAudG90YWxNYXRjaGluZ1Jvd0NvdW50ID4gcy5xdWVyeS5ncm91cGluZy5jb3VudFBlckdyb3VwICYmXG4gICAgICAgICAgICAgIGdyb3VwLnJvd3MubGVuZ3RoID09PSBzLnF1ZXJ5Lmdyb3VwaW5nLmNvdW50UGVyR3JvdXBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgcml2TGlua1xuICAgICAgICAgICAgICBjbGFzcz1cImZvb3Rlci1saW5rXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZpZXdNb3JlS2V5Q2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHZpZXdNb3JlS2V5OiBncm91cC5ncm91cERhdGEua2V5LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+VmlldyBhbGwge3sgZ3JvdXAudG90YWxNYXRjaGluZ1Jvd0NvdW50IH19PC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJyICpuZ0lmPVwiIWxhc3RcIiAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnNob3dDb250cm9sc1wiIGNsYXNzPVwicGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnZS1zaXplLWNvbnRyb2xzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCIhaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgIXMuZGlzcGxheS5oaWRlUGFnZVNpemVTZWxlY3RvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+IFJlc3VsdHMgcGVyIHBhZ2U6IDwvc3Bhbj5cbiAgICAgICAgICAgIDxyaXYtc2ltcGxlLXNlbGVjdFxuICAgICAgICAgICAgICBbc2VsZWN0ZWRPcHRpb25dPVwie1xuICAgICAgICAgICAgICAgIGlkOiBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB0aXRsZTogcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgKHNlbGVjdGVkT3B0aW9uQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3BhZ2VTaXplQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICRldmVudD8udmFsdWUgfHwgMjVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBzXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgICAgICBbb3JkZXJCeV09XCInc291cmNlJ1wiXG4gICAgICAgICAgICA+PC9yaXYtc2ltcGxlLXNlbGVjdD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nSWY9XCJzLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPiAwICYmICFpc0dyb3VwUmVzdWx0KHMucmVzdWx0KVwiXG4gICAgICAgICAgY2xhc3M9XCJwYWdlLWRhdGEtaW5kaWNhdG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlUm93U3RhcnQgfCByaXZOdW1iZXIgfX0te3tcbiAgICAgICAgICAgIHMucXVlcnkucGFnaW5hdGlvbi5wYWdlUm93RW5kIHwgcml2TnVtYmVyXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvZlxuICAgICAgICAgIHt7IHMucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCB8IHJpdk51bWJlciB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInMucXVlcnkucGFnaW5hdGlvbi5zaG93Q29udHJvbHNcIlxuICAgICAgICAgIGNsYXNzPVwicGFnaW5hdGlvbi1jb250cm9sc1wiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidiYXNpYydcIlxuICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICBbaWNvbl09XCInQXJyb3dMZWZ0J1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzLnF1ZXJ5LnBhZ2luYXRpb24ucHJldmlvdXMgPT09IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoeyB0eXBlOiAncHJldmlvdXNQYWdlTmF2aWdhdGUnIH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VzWzBdID4gMFwiXG4gICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1wYWdlcyBsZWZ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAmaGVsbGlwO1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgcGFnZSBvZiBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXNcIlxuICAgICAgICAgICAgY2xhc3M9XCJwYWdlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInBhZ2UgPT09IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgIHBhZ2UgPT09IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlID8gJ3RydWUnIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHsgdHlwZTogJ3BhZ2VDaGFuZ2UnLCBwYWdlIH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBwYWdlICsgMSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXNbcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VzLmxlbmd0aCAtIDFdIDxcbiAgICAgICAgICAgICAgcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VDb3VudCAtIDFcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1wYWdlcyByaWdodFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgJmhlbGxpcDtcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbdmFyaWFudF09XCInYmFzaWMnXCJcbiAgICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgICAgW2ljb25dPVwiJ0Fycm93UmlnaHQnXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInMucXVlcnkucGFnaW5hdGlvbi5uZXh0ID09PSBudWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHsgdHlwZTogJ25leHRQYWdlTmF2aWdhdGUnIH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9yaXYtbG9hZGluZy1jb3Zlcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
|