@testgorilla/tgo-ui 2.23.53 → 2.23.54

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.
@@ -169,7 +169,7 @@ export class TableComponent {
169
169
  this.dataSourceDetail = new MatTableDataSource(rowData);
170
170
  }
171
171
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableComponent, deps: [{ token: 'CANOPYUI_DEFAULT_APPLICATION_THEME', optional: true }, { token: i0.DestroyRef }, { token: IS_MOBILE_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
172
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TableComponent, selector: "ui-table", inputs: { config: "config", data: "data", loading: "loading", applicationTheme: "applicationTheme", tableDetailColumns: "tableDetailColumns", tableDetails: "tableDetails", disableBorderRadius: "disableBorderRadius" }, outputs: { onRowClickEvent: "onRowClickEvent", onDetailRowClickEvent: "onDetailRowClickEvent", paginatorChange: "paginatorChange", sortChange: "sortChange" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #tableContainer class=\"table-container\"\n [ngClass]=\"{ 'without-title': !tableConfig?.title, 'disable-border-radius': disableBorderRadius }\"\n [attr.theme]=\"applicationTheme\">\n <div *ngIf=\"tableConfig?.title\" class=\"table-header\">\n {{ tableConfig.title | sentencecase }}\n <ng-content select=\"[title-actions]\"></ng-content>\n </div>\n <div\n #table\n *ngIf=\"scrollSettings$ | async as scrollSettings\"\n class=\"table-wrapper\">\n <table\n class=\"main-table\"\n mat-table\n [dataSource]=\"tableData\"\n matSort\n [matSortStart]=\"tableConfig?.sort?.defaultSortStart ?? 'asc'\"\n [matSortActive]=\"tableConfig?.sort?.active ?? ''\"\n [matSortDirection]=\"tableConfig?.sort?.direction ?? ''\"\n (matSortChange)=\"onSortChange($event)\"\n multiTemplateDataRows\n >\n\n <ng-container *ngFor=\"let column of tableConfig.columns; index as i, last as isLast; trackBy: trackColumnUniqueId\">\n <ng-container *ngIf=\"isLast && column.isSticky && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\" [stickyEnd]=\"!scrollSettings?.scrollEnd\">\n <th mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: {$implicit: column.title, column, colIndex: i}\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\" [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: {$implicit: element, rowIndex}\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isLast && column.isSticky && !column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [stickyEnd]=\"scrollSettings.horizontalScroll ? !scrollSettings.scrollEnd : true\">\n <th mat-header-cell\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: {$implicit: column.title, column, colIndex: i}\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"!(isLast && column.isSticky) && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\">\n <th mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: { $implicit: column.title, column, colIndex: i }\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"!(isLast && column.isSticky) && !column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\">\n <th mat-header-cell\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') ?? ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: { $implicit: column.title, column, colIndex: i }\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n </ng-container>\n\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"displayedColumns.length\">\n <div class=\"element-detail\" *ngIf=\"dataSourceDetail.data.length\"\n [@expandDetail]=\"element === elementDetail ? 'expanded' : 'collapsed'\">\n <table\n mat-table\n [dataSource]=\"dataSourceDetail\"\n [ngClass]=\"{ 'hide-borders': element === tableData[tableData.length - 1] }\"\n >\n <ng-container *ngFor=\"let tableColumn of tableDetailColumns.columnDefs\"\n [matColumnDef]=\"tableColumn.title\">\n <th mat-header-cell *matHeaderCellDef=\"let element\" arrowPosition=\"after\"\n [ngStyle]=\"{width: tableColumn.styles?.width}\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'th-'+tableColumn.styles?.alignment : ''\">\n {{ tableColumn.title | uppercase }}\n </th>\n\n <td mat-cell *matCellDef=\"let element\" (click)=\"onDetailRowClick(element)\"\n [align]=\"tableColumn.styles?.alignment\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'td-'+tableColumn.styles?.alignment : ''\"\n [ngStyle]=\"{width: tableColumn.styles?.width }\">\n <ng-container *ngTemplateOutlet=\"tableDataTpl; context: {element, tableColumn}\"></ng-container>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnsDetailToDisplay\"></tr>\n <tr mat-row *matRowDef=\"let rowDetail; columns: columnsDetailToDisplay;\"></tr>\n </table>\n </div>\n </td>\n </ng-container>\n\n <ng-template #tableDataTpl let-element=\"element\" let-tableColumn=\"tableColumn\">\n <div class=\"align-wrapper\">\n <ng-container [ngSwitch]=\"tableColumn.type\">\n <ng-container *ngSwitchCase=\"DataType.FIELD\">\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.FUNCTION\">\n {{ tableColumn.function?.(element) }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.RENDERER\">\n <ng-template\n [dynamicComponent]=\"[tableColumn.renderer, element] | memoizeFunc : callRenderer\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchDefault>\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [ngClass]=\"{'expanded-row': elementDetail === row, 'row-clickable': tableDetails, 'selected': row?.selected, 'last-row': row === tableData[tableData.length - 1] && !elementDetail }\"\n (click)=\"toggleRow(row)\">\n </tr>\n <ng-container *ngIf=\"tableDetails && tableDetailColumns?.columnDefs?.length\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"tableConfig.noDataRowTpl\">\n <tr *matNoDataRow>\n <ng-container *ngTemplateOutlet=\"tableConfig.noDataRowTpl\"></ng-container>\n </tr>\n </ng-container>\n </table>\n </div>\n\n <ui-paginator\n *ngIf=\"!tableConfig?.hidePagination\"\n [disabled]=\"loading\"\n [applicationTheme]=\"applicationTheme !== 'classic' ? 'light' : 'classic'\"\n [pageSize]=\"tableConfig.pagination.itemsPerPage\"\n [length]=\"tableConfig.pagination.totalItems\"\n [currentPage]=\"tableConfig.pagination.currentPage\"\n [pageSizeOptions]=\"tableConfig.pagination.itemsPerPageOptions\"\n (paginatorChange)=\"onPaginatorChange($event)\"\n ></ui-paginator>\n</div>\n\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap\";.bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.flex-left,.table-container .table-header{display:flex;justify-content:flex-start;align-items:center}.table-container{--mat-table-background-color: #ffffff;overflow:hidden;border:1px #E0E0E0 solid;border-radius:8px}.table-container ::ng-deep .mat-sort-header-arrow{color:#000}.table-container .table-header{min-height:56px;padding:8px;background:#fff;line-height:24px;font-size:16px;font-weight:700;text-transform:uppercase;display:flex;justify-content:space-between}.table-container .table-wrapper{max-width:100%;overflow:auto}.table-container .table-wrapper table.main-table{width:100%;box-shadow:unset;border-top:1px #E0E0E0 solid}.table-container .table-wrapper table.main-table ::ng-deep .mat-sort-header-arrow{margin-left:8px}.table-container .table-wrapper table.main-table .mdc-data-table__cell,.table-container .table-wrapper table.main-table .mdc-data-table__header-cell{padding:8px 24px}.table-container .table-wrapper table.main-table th{font-size:14px;line-height:16px;text-transform:uppercase}.table-container .table-wrapper table.main-table td{font-size:14px;line-height:20px}.table-container .table-wrapper table.main-table td .row-value{display:flex;align-items:center;gap:16px}.table-container .table-wrapper table.main-table td .row-value ui-icon ::ng-deep mat-icon{transition:all .3s!important;font-size:24px}.table-container .table-wrapper table.main-table td .row-value ui-icon.opened ::ng-deep mat-icon{transform:rotate(180deg)}.table-container .table-wrapper table.main-table td ::ng-deep .table-skeleton-loader ngx-skeleton-loader{display:flex;justify-content:center;align-items:center;line-height:unset}.table-container .table-wrapper table.main-table td ::ng-deep .table-skeleton-loader ngx-skeleton-loader .skeleton-loader{margin-bottom:0}.table-container .table-wrapper table.main-table ::ng-deep thead{background:#f6f6f6!important}.table-container .table-wrapper table.main-table .mat-mdc-table-sticky-border-elem-left{box-shadow:24px 8px 24px #00000014}.table-container .table-wrapper table.main-table .mat-mdc-table-sticky-border-elem-right{box-shadow:0 8px 24px 4px #00000014}.table-container .column-title{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:700}.table-container.without-title table{border:unset!important}.table-container.disable-border-radius{border-radius:0!important}.table-container ::ng-deep .mat-mdc-paginator-container{padding:0 24px}.table-container[theme=dark],.table-container[theme=light]{border-radius:10px}.table-container[theme=dark] tr.selected,.table-container[theme=light] tr.selected{background:#f4f4f4!important}.table-container[theme=dark] .table-header,.table-container[theme=light] .table-header{padding:8px 24px;text-transform:none}.table-container[theme=dark] .table-wrapper table th,.table-container[theme=light] .table-wrapper table th{text-transform:none}.table-container[theme=dark] .table-wrapper table td,.table-container[theme=light] .table-wrapper table td{transition:border .3s}.table-container[theme=dark] .table-wrapper table tr.last-row td,.table-container[theme=light] .table-wrapper table tr.last-row td{--mat-table-row-item-outline-color: rgb(0, 0, 0, 0)}.table-container[theme=dark] .table-wrapper table .mat-mdc-table-sticky-border-elem-right,.table-container[theme=light] .table-wrapper table .mat-mdc-table-sticky-border-elem-right{box-shadow:0 8px 24px 4px #242424,8%!important}.table-container[theme=dark] .table-wrapper table .mat-mdc-table-sticky-border-elem-left,.table-container[theme=light] .table-wrapper table .mat-mdc-table-sticky-border-elem-left{box-shadow:24px 8px 24px #242424,8%!important}.table-container[theme=dark] .table-wrapper table ::ng-deep thead,.table-container[theme=light] .table-wrapper table ::ng-deep thead{background-color:#fff!important}.table-container[theme=dark] .table-wrapper table ::ng-deep :not(thead) tr:hover,.table-container[theme=light] .table-wrapper table ::ng-deep :not(thead) tr:hover{background-color:#fff2fc}.table-container ::ng-deep tr.detail-row{height:0}.table-container ::ng-deep tr.detail-row td{border:unset!important}.table-container ::ng-deep .mat-column-expandedDetail{padding:0!important}.table-container ::ng-deep .element-detail{overflow:hidden!important;display:flex!important}.table-container ::ng-deep .element-detail table{background-color:#fff;border-bottom:1px solid #D3D3D3;transition:border .3s}.table-container ::ng-deep .element-detail table.hide-borders{border-bottom:unset}.table-container ::ng-deep .element-detail table .mat-mdc-header-row{visibility:collapse}.table-container ::ng-deep .element-detail table .mat-mdc-cell{border-width:0}.table-container ::ng-deep .element-detail table td:first-child{padding-left:64px!important}ui-paginator{width:100%;display:flex;justify-content:flex-end;border-top:1px solid #D3D3D3}ui-paginator ::ng-deep .mat-mdc-paginator{width:100%}::ng-deep .mat-mdc-tooltip{background-color:#a9c2c9;font-family:Open Sans,serif;font-weight:400;font-size:12px;border-radius:4px;overflow:visible;max-width:248px;padding:6px 2px;--mdc-plain-tooltip-container-color: none;--mdc-plain-tooltip-supporting-text-color: $tgo-black}\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: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i2.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i4.SkeletonComponent, selector: "ui-skeleton", inputs: ["count", "theme", "appearance", "applicationTheme"] }, { kind: "component", type: i5.PaginatorComponent, selector: "ui-paginator", inputs: ["pageSizeOptions", "length", "pageSize", "disabled", "applicationTheme", "currentPage"], outputs: ["paginatorChange"] }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i7.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "applicationTheme", "useFullIconName"] }, { kind: "directive", type: i8.EllipseTextDirective, selector: "[uiEllipseText]", inputs: ["isMultiline", "maxDiffPixels", "refresh"], outputs: ["onChangeTextState"] }, { kind: "directive", type: i9.DynamicComponentDirective, selector: "[dynamicComponent]", inputs: ["dynamicComponent"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i10.DataPropertyGetterPipe, name: "dataPropertyGetter" }, { kind: "pipe", type: i11.MemoizeFuncPipe, name: "memoizeFunc" }, { kind: "pipe", type: i12.SentenceCasePipe, name: "sentencecase" }], animations: [
172
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TableComponent, selector: "ui-table", inputs: { config: "config", data: "data", loading: "loading", applicationTheme: "applicationTheme", tableDetailColumns: "tableDetailColumns", tableDetails: "tableDetails", disableBorderRadius: "disableBorderRadius" }, outputs: { onRowClickEvent: "onRowClickEvent", onDetailRowClickEvent: "onDetailRowClickEvent", paginatorChange: "paginatorChange", sortChange: "sortChange" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #tableContainer class=\"table-container\"\n [ngClass]=\"{ 'without-title': !tableConfig?.title, 'disable-border-radius': disableBorderRadius }\"\n [attr.theme]=\"applicationTheme\">\n <div *ngIf=\"tableConfig?.title\" class=\"table-header\">\n {{ tableConfig.title | sentencecase }}\n <ng-content select=\"[title-actions]\"></ng-content>\n </div>\n <div\n #table\n *ngIf=\"scrollSettings$ | async as scrollSettings\"\n class=\"table-wrapper\">\n <table\n class=\"main-table\"\n mat-table\n [dataSource]=\"tableData\"\n matSort\n [matSortStart]=\"tableConfig?.sort?.defaultSortStart ?? 'asc'\"\n [matSortActive]=\"tableConfig?.sort?.active ?? ''\"\n [matSortDirection]=\"tableConfig?.sort?.direction ?? ''\"\n (matSortChange)=\"onSortChange($event)\"\n multiTemplateDataRows\n >\n\n <ng-container *ngFor=\"let column of tableConfig.columns; index as i, last as isLast; trackBy: trackColumnUniqueId\">\n <ng-container *ngIf=\"isLast && column.isSticky && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\" [stickyEnd]=\"!scrollSettings?.scrollEnd\">\n <th mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: {$implicit: column.title, column, colIndex: i}\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\" [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: {$implicit: element, rowIndex}\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isLast && column.isSticky && !column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [stickyEnd]=\"scrollSettings.horizontalScroll ? !scrollSettings.scrollEnd : true\">\n <th mat-header-cell\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: {$implicit: column.title, column, colIndex: i}\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"!(isLast && column.isSticky) && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\">\n <th mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: { $implicit: column.title, column, colIndex: i }\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"!(isLast && column.isSticky) && !column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\">\n <th mat-header-cell\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') ?? ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: { $implicit: column.title, column, colIndex: i }\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n </ng-container>\n\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"displayedColumns.length\">\n <div class=\"element-detail\" *ngIf=\"dataSourceDetail.data.length\"\n [@expandDetail]=\"element === elementDetail ? 'expanded' : 'collapsed'\">\n <table\n mat-table\n [dataSource]=\"dataSourceDetail\"\n [ngClass]=\"{ 'hide-borders': element === tableData[tableData.length - 1] }\"\n >\n <ng-container *ngFor=\"let tableColumn of tableDetailColumns.columnDefs\"\n [matColumnDef]=\"tableColumn.title\">\n <th mat-header-cell *matHeaderCellDef=\"let element\" arrowPosition=\"after\"\n [ngStyle]=\"{width: tableColumn.styles?.width}\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'th-'+tableColumn.styles?.alignment : ''\">\n {{ tableColumn.title | uppercase }}\n </th>\n\n <td mat-cell *matCellDef=\"let element\" (click)=\"onDetailRowClick(element)\"\n [align]=\"tableColumn.styles?.alignment\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'td-'+tableColumn.styles?.alignment : ''\"\n [ngStyle]=\"{width: tableColumn.styles?.width }\">\n <ng-container *ngTemplateOutlet=\"tableDataTpl; context: {element, tableColumn}\"></ng-container>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnsDetailToDisplay\"></tr>\n <tr mat-row *matRowDef=\"let rowDetail; columns: columnsDetailToDisplay;\"></tr>\n </table>\n </div>\n </td>\n </ng-container>\n\n <ng-template #tableDataTpl let-element=\"element\" let-tableColumn=\"tableColumn\">\n <div class=\"align-wrapper\">\n <ng-container [ngSwitch]=\"tableColumn.type\">\n <ng-container *ngSwitchCase=\"DataType.FIELD\">\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.FUNCTION\">\n {{ tableColumn.function?.(element) }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.RENDERER\">\n <ng-template\n [dynamicComponent]=\"[tableColumn.renderer, element] | memoizeFunc : callRenderer\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchDefault>\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [ngClass]=\"{'expanded-row': elementDetail === row, 'row-clickable': tableDetails, 'selected': row?.selected, 'last-row': row === tableData[tableData.length - 1] && !elementDetail }\"\n (click)=\"toggleRow(row)\">\n </tr>\n <ng-container *ngIf=\"tableDetails && tableDetailColumns?.columnDefs?.length\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"tableConfig.noDataRowTpl\">\n <tr *matNoDataRow>\n <ng-container *ngTemplateOutlet=\"tableConfig.noDataRowTpl\"></ng-container>\n </tr>\n </ng-container>\n </table>\n </div>\n\n <ui-paginator\n *ngIf=\"!tableConfig?.hidePagination\"\n [disabled]=\"loading\"\n [applicationTheme]=\"applicationTheme !== 'classic' ? 'light' : 'classic'\"\n [pageSize]=\"tableConfig.pagination.itemsPerPage\"\n [length]=\"tableConfig.pagination.totalItems\"\n [currentPage]=\"tableConfig.pagination.currentPage\"\n [pageSizeOptions]=\"tableConfig.pagination.itemsPerPageOptions\"\n (paginatorChange)=\"onPaginatorChange($event)\"\n ></ui-paginator>\n</div>\n\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap\";.bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host-context(.without-table-border) .table-container{border:none}.flex-left,.table-container .table-header{display:flex;justify-content:flex-start;align-items:center}.table-container{--mat-table-background-color: #ffffff;overflow:hidden;border:1px #E0E0E0 solid;border-radius:8px}.table-container ::ng-deep .mat-sort-header-arrow{color:#000}.table-container .table-header{min-height:56px;padding:8px;background:#fff;line-height:24px;font-size:16px;font-weight:700;text-transform:uppercase;display:flex;justify-content:space-between}.table-container .table-wrapper{max-width:100%;overflow:auto}.table-container .table-wrapper table.main-table{width:100%;box-shadow:unset;border-top:1px #E0E0E0 solid}.table-container .table-wrapper table.main-table ::ng-deep .mat-sort-header-arrow{margin-left:8px}.table-container .table-wrapper table.main-table .mdc-data-table__cell,.table-container .table-wrapper table.main-table .mdc-data-table__header-cell{padding:8px 24px}.table-container .table-wrapper table.main-table th{font-size:14px;line-height:16px;text-transform:uppercase}.table-container .table-wrapper table.main-table td{font-size:14px;line-height:20px}.table-container .table-wrapper table.main-table td .row-value{display:flex;align-items:center;gap:16px}.table-container .table-wrapper table.main-table td .row-value ui-icon ::ng-deep mat-icon{transition:all .3s!important;font-size:24px}.table-container .table-wrapper table.main-table td .row-value ui-icon.opened ::ng-deep mat-icon{transform:rotate(180deg)}.table-container .table-wrapper table.main-table td ::ng-deep .table-skeleton-loader ngx-skeleton-loader{display:flex;justify-content:center;align-items:center;line-height:unset}.table-container .table-wrapper table.main-table td ::ng-deep .table-skeleton-loader ngx-skeleton-loader .skeleton-loader{margin-bottom:0}.table-container .table-wrapper table.main-table ::ng-deep thead{background:#f6f6f6!important}.table-container .table-wrapper table.main-table .mat-mdc-table-sticky-border-elem-left{box-shadow:24px 8px 24px #00000014}.table-container .table-wrapper table.main-table .mat-mdc-table-sticky-border-elem-right{box-shadow:0 8px 24px 4px #00000014}.table-container .column-title{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:700}.table-container.without-title table{border:unset!important}.table-container.disable-border-radius{border-radius:0!important}.table-container ::ng-deep .mat-mdc-paginator-container{padding:0 24px}.table-container[theme=dark],.table-container[theme=light]{border-radius:10px}.table-container[theme=dark] tr.selected,.table-container[theme=light] tr.selected{background:#f4f4f4!important}.table-container[theme=dark] .table-header,.table-container[theme=light] .table-header{padding:8px 24px;text-transform:none}.table-container[theme=dark] .table-wrapper table th,.table-container[theme=light] .table-wrapper table th{text-transform:none}.table-container[theme=dark] .table-wrapper table td,.table-container[theme=light] .table-wrapper table td{transition:border .3s}.table-container[theme=dark] .table-wrapper table tr.last-row td,.table-container[theme=light] .table-wrapper table tr.last-row td{--mat-table-row-item-outline-color: rgb(0, 0, 0, 0)}.table-container[theme=dark] .table-wrapper table .mat-mdc-table-sticky-border-elem-right,.table-container[theme=light] .table-wrapper table .mat-mdc-table-sticky-border-elem-right{box-shadow:0 8px 24px 4px #242424,8%!important}.table-container[theme=dark] .table-wrapper table .mat-mdc-table-sticky-border-elem-left,.table-container[theme=light] .table-wrapper table .mat-mdc-table-sticky-border-elem-left{box-shadow:24px 8px 24px #242424,8%!important}.table-container[theme=dark] .table-wrapper table ::ng-deep thead,.table-container[theme=light] .table-wrapper table ::ng-deep thead{background-color:#fff!important}.table-container[theme=dark] .table-wrapper table ::ng-deep :not(thead) tr:hover,.table-container[theme=light] .table-wrapper table ::ng-deep :not(thead) tr:hover{background-color:#fff2fc}.table-container ::ng-deep tr.detail-row{height:0}.table-container ::ng-deep tr.detail-row td{border:unset!important}.table-container ::ng-deep .mat-column-expandedDetail{padding:0!important}.table-container ::ng-deep .element-detail{overflow:hidden!important;display:flex!important}.table-container ::ng-deep .element-detail table{background-color:#fff;border-bottom:1px solid #D3D3D3;transition:border .3s}.table-container ::ng-deep .element-detail table.hide-borders{border-bottom:unset}.table-container ::ng-deep .element-detail table .mat-mdc-header-row{visibility:collapse}.table-container ::ng-deep .element-detail table .mat-mdc-cell{border-width:0}.table-container ::ng-deep .element-detail table td:first-child{padding-left:64px!important}ui-paginator{width:100%;display:flex;justify-content:flex-end;border-top:1px solid #D3D3D3}ui-paginator ::ng-deep .mat-mdc-paginator{width:100%}::ng-deep .mat-mdc-tooltip{background-color:#a9c2c9;font-family:Open Sans,serif;font-weight:400;font-size:12px;border-radius:4px;overflow:visible;max-width:248px;padding:6px 2px;--mdc-plain-tooltip-container-color: none;--mdc-plain-tooltip-supporting-text-color: $tgo-black}\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: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i2.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i4.SkeletonComponent, selector: "ui-skeleton", inputs: ["count", "theme", "appearance", "applicationTheme"] }, { kind: "component", type: i5.PaginatorComponent, selector: "ui-paginator", inputs: ["pageSizeOptions", "length", "pageSize", "disabled", "applicationTheme", "currentPage"], outputs: ["paginatorChange"] }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i7.IconComponent, selector: "ui-icon", inputs: ["size", "cssClass", "name", "color", "filled", "applicationTheme", "useFullIconName"] }, { kind: "directive", type: i8.EllipseTextDirective, selector: "[uiEllipseText]", inputs: ["isMultiline", "maxDiffPixels", "refresh"], outputs: ["onChangeTextState"] }, { kind: "directive", type: i9.DynamicComponentDirective, selector: "[dynamicComponent]", inputs: ["dynamicComponent"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i10.DataPropertyGetterPipe, name: "dataPropertyGetter" }, { kind: "pipe", type: i11.MemoizeFuncPipe, name: "memoizeFunc" }, { kind: "pipe", type: i12.SentenceCasePipe, name: "sentencecase" }], animations: [
173
173
  trigger('expandDetail', [
174
174
  state('collapsed, void', style({ height: '0px' })),
175
175
  state('expanded', style({ height: '*' })),
@@ -187,7 +187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
187
187
  transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
188
188
  transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)'))
189
189
  ])
190
- ], template: "<div #tableContainer class=\"table-container\"\n [ngClass]=\"{ 'without-title': !tableConfig?.title, 'disable-border-radius': disableBorderRadius }\"\n [attr.theme]=\"applicationTheme\">\n <div *ngIf=\"tableConfig?.title\" class=\"table-header\">\n {{ tableConfig.title | sentencecase }}\n <ng-content select=\"[title-actions]\"></ng-content>\n </div>\n <div\n #table\n *ngIf=\"scrollSettings$ | async as scrollSettings\"\n class=\"table-wrapper\">\n <table\n class=\"main-table\"\n mat-table\n [dataSource]=\"tableData\"\n matSort\n [matSortStart]=\"tableConfig?.sort?.defaultSortStart ?? 'asc'\"\n [matSortActive]=\"tableConfig?.sort?.active ?? ''\"\n [matSortDirection]=\"tableConfig?.sort?.direction ?? ''\"\n (matSortChange)=\"onSortChange($event)\"\n multiTemplateDataRows\n >\n\n <ng-container *ngFor=\"let column of tableConfig.columns; index as i, last as isLast; trackBy: trackColumnUniqueId\">\n <ng-container *ngIf=\"isLast && column.isSticky && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\" [stickyEnd]=\"!scrollSettings?.scrollEnd\">\n <th mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: {$implicit: column.title, column, colIndex: i}\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\" [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: {$implicit: element, rowIndex}\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isLast && column.isSticky && !column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [stickyEnd]=\"scrollSettings.horizontalScroll ? !scrollSettings.scrollEnd : true\">\n <th mat-header-cell\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: {$implicit: column.title, column, colIndex: i}\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"!(isLast && column.isSticky) && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\">\n <th mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: { $implicit: column.title, column, colIndex: i }\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"!(isLast && column.isSticky) && !column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\">\n <th mat-header-cell\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') ?? ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: { $implicit: column.title, column, colIndex: i }\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n </ng-container>\n\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"displayedColumns.length\">\n <div class=\"element-detail\" *ngIf=\"dataSourceDetail.data.length\"\n [@expandDetail]=\"element === elementDetail ? 'expanded' : 'collapsed'\">\n <table\n mat-table\n [dataSource]=\"dataSourceDetail\"\n [ngClass]=\"{ 'hide-borders': element === tableData[tableData.length - 1] }\"\n >\n <ng-container *ngFor=\"let tableColumn of tableDetailColumns.columnDefs\"\n [matColumnDef]=\"tableColumn.title\">\n <th mat-header-cell *matHeaderCellDef=\"let element\" arrowPosition=\"after\"\n [ngStyle]=\"{width: tableColumn.styles?.width}\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'th-'+tableColumn.styles?.alignment : ''\">\n {{ tableColumn.title | uppercase }}\n </th>\n\n <td mat-cell *matCellDef=\"let element\" (click)=\"onDetailRowClick(element)\"\n [align]=\"tableColumn.styles?.alignment\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'td-'+tableColumn.styles?.alignment : ''\"\n [ngStyle]=\"{width: tableColumn.styles?.width }\">\n <ng-container *ngTemplateOutlet=\"tableDataTpl; context: {element, tableColumn}\"></ng-container>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnsDetailToDisplay\"></tr>\n <tr mat-row *matRowDef=\"let rowDetail; columns: columnsDetailToDisplay;\"></tr>\n </table>\n </div>\n </td>\n </ng-container>\n\n <ng-template #tableDataTpl let-element=\"element\" let-tableColumn=\"tableColumn\">\n <div class=\"align-wrapper\">\n <ng-container [ngSwitch]=\"tableColumn.type\">\n <ng-container *ngSwitchCase=\"DataType.FIELD\">\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.FUNCTION\">\n {{ tableColumn.function?.(element) }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.RENDERER\">\n <ng-template\n [dynamicComponent]=\"[tableColumn.renderer, element] | memoizeFunc : callRenderer\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchDefault>\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [ngClass]=\"{'expanded-row': elementDetail === row, 'row-clickable': tableDetails, 'selected': row?.selected, 'last-row': row === tableData[tableData.length - 1] && !elementDetail }\"\n (click)=\"toggleRow(row)\">\n </tr>\n <ng-container *ngIf=\"tableDetails && tableDetailColumns?.columnDefs?.length\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"tableConfig.noDataRowTpl\">\n <tr *matNoDataRow>\n <ng-container *ngTemplateOutlet=\"tableConfig.noDataRowTpl\"></ng-container>\n </tr>\n </ng-container>\n </table>\n </div>\n\n <ui-paginator\n *ngIf=\"!tableConfig?.hidePagination\"\n [disabled]=\"loading\"\n [applicationTheme]=\"applicationTheme !== 'classic' ? 'light' : 'classic'\"\n [pageSize]=\"tableConfig.pagination.itemsPerPage\"\n [length]=\"tableConfig.pagination.totalItems\"\n [currentPage]=\"tableConfig.pagination.currentPage\"\n [pageSizeOptions]=\"tableConfig.pagination.itemsPerPageOptions\"\n (paginatorChange)=\"onPaginatorChange($event)\"\n ></ui-paginator>\n</div>\n\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap\";.bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.flex-left,.table-container .table-header{display:flex;justify-content:flex-start;align-items:center}.table-container{--mat-table-background-color: #ffffff;overflow:hidden;border:1px #E0E0E0 solid;border-radius:8px}.table-container ::ng-deep .mat-sort-header-arrow{color:#000}.table-container .table-header{min-height:56px;padding:8px;background:#fff;line-height:24px;font-size:16px;font-weight:700;text-transform:uppercase;display:flex;justify-content:space-between}.table-container .table-wrapper{max-width:100%;overflow:auto}.table-container .table-wrapper table.main-table{width:100%;box-shadow:unset;border-top:1px #E0E0E0 solid}.table-container .table-wrapper table.main-table ::ng-deep .mat-sort-header-arrow{margin-left:8px}.table-container .table-wrapper table.main-table .mdc-data-table__cell,.table-container .table-wrapper table.main-table .mdc-data-table__header-cell{padding:8px 24px}.table-container .table-wrapper table.main-table th{font-size:14px;line-height:16px;text-transform:uppercase}.table-container .table-wrapper table.main-table td{font-size:14px;line-height:20px}.table-container .table-wrapper table.main-table td .row-value{display:flex;align-items:center;gap:16px}.table-container .table-wrapper table.main-table td .row-value ui-icon ::ng-deep mat-icon{transition:all .3s!important;font-size:24px}.table-container .table-wrapper table.main-table td .row-value ui-icon.opened ::ng-deep mat-icon{transform:rotate(180deg)}.table-container .table-wrapper table.main-table td ::ng-deep .table-skeleton-loader ngx-skeleton-loader{display:flex;justify-content:center;align-items:center;line-height:unset}.table-container .table-wrapper table.main-table td ::ng-deep .table-skeleton-loader ngx-skeleton-loader .skeleton-loader{margin-bottom:0}.table-container .table-wrapper table.main-table ::ng-deep thead{background:#f6f6f6!important}.table-container .table-wrapper table.main-table .mat-mdc-table-sticky-border-elem-left{box-shadow:24px 8px 24px #00000014}.table-container .table-wrapper table.main-table .mat-mdc-table-sticky-border-elem-right{box-shadow:0 8px 24px 4px #00000014}.table-container .column-title{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:700}.table-container.without-title table{border:unset!important}.table-container.disable-border-radius{border-radius:0!important}.table-container ::ng-deep .mat-mdc-paginator-container{padding:0 24px}.table-container[theme=dark],.table-container[theme=light]{border-radius:10px}.table-container[theme=dark] tr.selected,.table-container[theme=light] tr.selected{background:#f4f4f4!important}.table-container[theme=dark] .table-header,.table-container[theme=light] .table-header{padding:8px 24px;text-transform:none}.table-container[theme=dark] .table-wrapper table th,.table-container[theme=light] .table-wrapper table th{text-transform:none}.table-container[theme=dark] .table-wrapper table td,.table-container[theme=light] .table-wrapper table td{transition:border .3s}.table-container[theme=dark] .table-wrapper table tr.last-row td,.table-container[theme=light] .table-wrapper table tr.last-row td{--mat-table-row-item-outline-color: rgb(0, 0, 0, 0)}.table-container[theme=dark] .table-wrapper table .mat-mdc-table-sticky-border-elem-right,.table-container[theme=light] .table-wrapper table .mat-mdc-table-sticky-border-elem-right{box-shadow:0 8px 24px 4px #242424,8%!important}.table-container[theme=dark] .table-wrapper table .mat-mdc-table-sticky-border-elem-left,.table-container[theme=light] .table-wrapper table .mat-mdc-table-sticky-border-elem-left{box-shadow:24px 8px 24px #242424,8%!important}.table-container[theme=dark] .table-wrapper table ::ng-deep thead,.table-container[theme=light] .table-wrapper table ::ng-deep thead{background-color:#fff!important}.table-container[theme=dark] .table-wrapper table ::ng-deep :not(thead) tr:hover,.table-container[theme=light] .table-wrapper table ::ng-deep :not(thead) tr:hover{background-color:#fff2fc}.table-container ::ng-deep tr.detail-row{height:0}.table-container ::ng-deep tr.detail-row td{border:unset!important}.table-container ::ng-deep .mat-column-expandedDetail{padding:0!important}.table-container ::ng-deep .element-detail{overflow:hidden!important;display:flex!important}.table-container ::ng-deep .element-detail table{background-color:#fff;border-bottom:1px solid #D3D3D3;transition:border .3s}.table-container ::ng-deep .element-detail table.hide-borders{border-bottom:unset}.table-container ::ng-deep .element-detail table .mat-mdc-header-row{visibility:collapse}.table-container ::ng-deep .element-detail table .mat-mdc-cell{border-width:0}.table-container ::ng-deep .element-detail table td:first-child{padding-left:64px!important}ui-paginator{width:100%;display:flex;justify-content:flex-end;border-top:1px solid #D3D3D3}ui-paginator ::ng-deep .mat-mdc-paginator{width:100%}::ng-deep .mat-mdc-tooltip{background-color:#a9c2c9;font-family:Open Sans,serif;font-weight:400;font-size:12px;border-radius:4px;overflow:visible;max-width:248px;padding:6px 2px;--mdc-plain-tooltip-container-color: none;--mdc-plain-tooltip-supporting-text-color: $tgo-black}\n"] }]
190
+ ], template: "<div #tableContainer class=\"table-container\"\n [ngClass]=\"{ 'without-title': !tableConfig?.title, 'disable-border-radius': disableBorderRadius }\"\n [attr.theme]=\"applicationTheme\">\n <div *ngIf=\"tableConfig?.title\" class=\"table-header\">\n {{ tableConfig.title | sentencecase }}\n <ng-content select=\"[title-actions]\"></ng-content>\n </div>\n <div\n #table\n *ngIf=\"scrollSettings$ | async as scrollSettings\"\n class=\"table-wrapper\">\n <table\n class=\"main-table\"\n mat-table\n [dataSource]=\"tableData\"\n matSort\n [matSortStart]=\"tableConfig?.sort?.defaultSortStart ?? 'asc'\"\n [matSortActive]=\"tableConfig?.sort?.active ?? ''\"\n [matSortDirection]=\"tableConfig?.sort?.direction ?? ''\"\n (matSortChange)=\"onSortChange($event)\"\n multiTemplateDataRows\n >\n\n <ng-container *ngFor=\"let column of tableConfig.columns; index as i, last as isLast; trackBy: trackColumnUniqueId\">\n <ng-container *ngIf=\"isLast && column.isSticky && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\" [stickyEnd]=\"!scrollSettings?.scrollEnd\">\n <th mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: {$implicit: column.title, column, colIndex: i}\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\" [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: {$implicit: element, rowIndex}\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"isLast && column.isSticky && !column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [stickyEnd]=\"scrollSettings.horizontalScroll ? !scrollSettings.scrollEnd : true\">\n <th mat-header-cell\n *matHeaderCellDef\n [attr.sortable]=\"column.allowSort ?? false\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: {$implicit: column.title, column, colIndex: i}\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"!(isLast && column.isSticky) && column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\">\n <th mat-header-cell\n [start]=\"column.sortStart ?? 'asc'\"\n [mat-sort-header]=\"column.sortHeader ?? column.key\"\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') || ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: { $implicit: column.title, column, colIndex: i }\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"!(isLast && column.isSticky) && !column.allowSort\">\n <ng-container [matColumnDef]=\"column.uniqueId ?? column.key\"\n [sticky]=\"(isMobile$ | async) ? false : !scrollSettings.scrollStart && !!column.isSticky\">\n <th mat-header-cell\n [attr.sortable]=\"column.allowSort ?? false\"\n *matHeaderCellDef\n [style.font-weight]=\"'bold'\"\n [matTooltipClass]=\"applicationTheme\"\n [matTooltip]=\"(column?.showTooltip ? (column?.tooltip ? column.tooltip : column.title ) : '') ?? ''\"\n >\n <ng-container *ngIf=\"column.headerCellTemplate; else configValue\">\n <ng-container\n *ngTemplateOutlet=\"column.headerCellTemplate; context: { $implicit: column.title, column, colIndex: i }\"></ng-container>\n </ng-container>\n <ng-template #configValue>\n <span uiEllipseText (onChangeTextState)=\"onChangeColumnSize(i, $event)\"\n class=\"column-title\">{{ column.title | sentencecase }}</span>\n </ng-template>\n </th>\n\n <td mat-cell\n *matCellDef=\"let element; let rowIndex = dataIndex\"\n [style.width]=\"column.widthPerc + '%'\"\n [style.min-width]=\"column.minWidthPx + 'px'\"\n (click)=\"onRowClick(element); column?.rowCellTemplateClick ? column!.rowCellTemplateClick?.() : ''\"\n >\n <ui-skeleton class=\"table-skeleton-loader\" [count]=\"1\" [theme]=\"skeletonStyleConfig\"\n [appearance]=\"'line'\"\n *ngIf=\"loading; else value\"></ui-skeleton>\n <ng-template #value>\n <div class=\"row-value\">\n <ui-icon\n [applicationTheme]=\"applicationTheme\"\n *ngIf=\"!i && tableDetails\"\n size=\"24\"\n [ngClass]=\"{ opened: elementDetail && element == elementDetail }\"\n [name]=\"applicationTheme === 'classic' ? 'Arrow_down' : 'Arrow-chevron-down-in-line'\"\n ></ui-icon>\n\n <ng-container *ngIf=\"column.rowCellTemplate; else configData\">\n <ng-container\n *ngTemplateOutlet=\"column.rowCellTemplate; context: { $implicit: element, rowIndex }\"></ng-container>\n </ng-container>\n <ng-template #configData>\n <span [style.font-weight]=\"column.bold ? 'bold' : 'normal'\"\n [style.font-size]=\"column.fontSize ?? '14px'\">{{ element[column.key] }}</span>\n </ng-template>\n </div>\n </ng-template>\n </td>\n </ng-container>\n </ng-container>\n\n </ng-container>\n\n\n <ng-container matColumnDef=\"expandedDetail\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"displayedColumns.length\">\n <div class=\"element-detail\" *ngIf=\"dataSourceDetail.data.length\"\n [@expandDetail]=\"element === elementDetail ? 'expanded' : 'collapsed'\">\n <table\n mat-table\n [dataSource]=\"dataSourceDetail\"\n [ngClass]=\"{ 'hide-borders': element === tableData[tableData.length - 1] }\"\n >\n <ng-container *ngFor=\"let tableColumn of tableDetailColumns.columnDefs\"\n [matColumnDef]=\"tableColumn.title\">\n <th mat-header-cell *matHeaderCellDef=\"let element\" arrowPosition=\"after\"\n [ngStyle]=\"{width: tableColumn.styles?.width}\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'th-'+tableColumn.styles?.alignment : ''\">\n {{ tableColumn.title | uppercase }}\n </th>\n\n <td mat-cell *matCellDef=\"let element\" (click)=\"onDetailRowClick(element)\"\n [align]=\"tableColumn.styles?.alignment\"\n [ngClass]=\"tableColumn.styles?.alignment ? 'td-'+tableColumn.styles?.alignment : ''\"\n [ngStyle]=\"{width: tableColumn.styles?.width }\">\n <ng-container *ngTemplateOutlet=\"tableDataTpl; context: {element, tableColumn}\"></ng-container>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnsDetailToDisplay\"></tr>\n <tr mat-row *matRowDef=\"let rowDetail; columns: columnsDetailToDisplay;\"></tr>\n </table>\n </div>\n </td>\n </ng-container>\n\n <ng-template #tableDataTpl let-element=\"element\" let-tableColumn=\"tableColumn\">\n <div class=\"align-wrapper\">\n <ng-container [ngSwitch]=\"tableColumn.type\">\n <ng-container *ngSwitchCase=\"DataType.FIELD\">\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.FUNCTION\">\n {{ tableColumn.function?.(element) }}\n </ng-container>\n <ng-container *ngSwitchCase=\"DataType.RENDERER\">\n <ng-template\n [dynamicComponent]=\"[tableColumn.renderer, element] | memoizeFunc : callRenderer\">\n </ng-template>\n </ng-container>\n <ng-container *ngSwitchDefault>\n {{ element | dataPropertyGetter: tableColumn.key }}\n </ng-container>\n </ng-container>\n </div>\n </ng-template>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [ngClass]=\"{'expanded-row': elementDetail === row, 'row-clickable': tableDetails, 'selected': row?.selected, 'last-row': row === tableData[tableData.length - 1] && !elementDetail }\"\n (click)=\"toggleRow(row)\">\n </tr>\n <ng-container *ngIf=\"tableDetails && tableDetailColumns?.columnDefs?.length\">\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\"></tr>\n </ng-container>\n\n <ng-container *ngIf=\"tableConfig.noDataRowTpl\">\n <tr *matNoDataRow>\n <ng-container *ngTemplateOutlet=\"tableConfig.noDataRowTpl\"></ng-container>\n </tr>\n </ng-container>\n </table>\n </div>\n\n <ui-paginator\n *ngIf=\"!tableConfig?.hidePagination\"\n [disabled]=\"loading\"\n [applicationTheme]=\"applicationTheme !== 'classic' ? 'light' : 'classic'\"\n [pageSize]=\"tableConfig.pagination.itemsPerPage\"\n [length]=\"tableConfig.pagination.totalItems\"\n [currentPage]=\"tableConfig.pagination.currentPage\"\n [pageSizeOptions]=\"tableConfig.pagination.itemsPerPageOptions\"\n (paginatorChange)=\"onPaginatorChange($event)\"\n ></ui-paginator>\n</div>\n\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap\";.bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}:host-context(.without-table-border) .table-container{border:none}.flex-left,.table-container .table-header{display:flex;justify-content:flex-start;align-items:center}.table-container{--mat-table-background-color: #ffffff;overflow:hidden;border:1px #E0E0E0 solid;border-radius:8px}.table-container ::ng-deep .mat-sort-header-arrow{color:#000}.table-container .table-header{min-height:56px;padding:8px;background:#fff;line-height:24px;font-size:16px;font-weight:700;text-transform:uppercase;display:flex;justify-content:space-between}.table-container .table-wrapper{max-width:100%;overflow:auto}.table-container .table-wrapper table.main-table{width:100%;box-shadow:unset;border-top:1px #E0E0E0 solid}.table-container .table-wrapper table.main-table ::ng-deep .mat-sort-header-arrow{margin-left:8px}.table-container .table-wrapper table.main-table .mdc-data-table__cell,.table-container .table-wrapper table.main-table .mdc-data-table__header-cell{padding:8px 24px}.table-container .table-wrapper table.main-table th{font-size:14px;line-height:16px;text-transform:uppercase}.table-container .table-wrapper table.main-table td{font-size:14px;line-height:20px}.table-container .table-wrapper table.main-table td .row-value{display:flex;align-items:center;gap:16px}.table-container .table-wrapper table.main-table td .row-value ui-icon ::ng-deep mat-icon{transition:all .3s!important;font-size:24px}.table-container .table-wrapper table.main-table td .row-value ui-icon.opened ::ng-deep mat-icon{transform:rotate(180deg)}.table-container .table-wrapper table.main-table td ::ng-deep .table-skeleton-loader ngx-skeleton-loader{display:flex;justify-content:center;align-items:center;line-height:unset}.table-container .table-wrapper table.main-table td ::ng-deep .table-skeleton-loader ngx-skeleton-loader .skeleton-loader{margin-bottom:0}.table-container .table-wrapper table.main-table ::ng-deep thead{background:#f6f6f6!important}.table-container .table-wrapper table.main-table .mat-mdc-table-sticky-border-elem-left{box-shadow:24px 8px 24px #00000014}.table-container .table-wrapper table.main-table .mat-mdc-table-sticky-border-elem-right{box-shadow:0 8px 24px 4px #00000014}.table-container .column-title{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:700}.table-container.without-title table{border:unset!important}.table-container.disable-border-radius{border-radius:0!important}.table-container ::ng-deep .mat-mdc-paginator-container{padding:0 24px}.table-container[theme=dark],.table-container[theme=light]{border-radius:10px}.table-container[theme=dark] tr.selected,.table-container[theme=light] tr.selected{background:#f4f4f4!important}.table-container[theme=dark] .table-header,.table-container[theme=light] .table-header{padding:8px 24px;text-transform:none}.table-container[theme=dark] .table-wrapper table th,.table-container[theme=light] .table-wrapper table th{text-transform:none}.table-container[theme=dark] .table-wrapper table td,.table-container[theme=light] .table-wrapper table td{transition:border .3s}.table-container[theme=dark] .table-wrapper table tr.last-row td,.table-container[theme=light] .table-wrapper table tr.last-row td{--mat-table-row-item-outline-color: rgb(0, 0, 0, 0)}.table-container[theme=dark] .table-wrapper table .mat-mdc-table-sticky-border-elem-right,.table-container[theme=light] .table-wrapper table .mat-mdc-table-sticky-border-elem-right{box-shadow:0 8px 24px 4px #242424,8%!important}.table-container[theme=dark] .table-wrapper table .mat-mdc-table-sticky-border-elem-left,.table-container[theme=light] .table-wrapper table .mat-mdc-table-sticky-border-elem-left{box-shadow:24px 8px 24px #242424,8%!important}.table-container[theme=dark] .table-wrapper table ::ng-deep thead,.table-container[theme=light] .table-wrapper table ::ng-deep thead{background-color:#fff!important}.table-container[theme=dark] .table-wrapper table ::ng-deep :not(thead) tr:hover,.table-container[theme=light] .table-wrapper table ::ng-deep :not(thead) tr:hover{background-color:#fff2fc}.table-container ::ng-deep tr.detail-row{height:0}.table-container ::ng-deep tr.detail-row td{border:unset!important}.table-container ::ng-deep .mat-column-expandedDetail{padding:0!important}.table-container ::ng-deep .element-detail{overflow:hidden!important;display:flex!important}.table-container ::ng-deep .element-detail table{background-color:#fff;border-bottom:1px solid #D3D3D3;transition:border .3s}.table-container ::ng-deep .element-detail table.hide-borders{border-bottom:unset}.table-container ::ng-deep .element-detail table .mat-mdc-header-row{visibility:collapse}.table-container ::ng-deep .element-detail table .mat-mdc-cell{border-width:0}.table-container ::ng-deep .element-detail table td:first-child{padding-left:64px!important}ui-paginator{width:100%;display:flex;justify-content:flex-end;border-top:1px solid #D3D3D3}ui-paginator ::ng-deep .mat-mdc-paginator{width:100%}::ng-deep .mat-mdc-tooltip{background-color:#a9c2c9;font-family:Open Sans,serif;font-weight:400;font-size:12px;border-radius:4px;overflow:visible;max-width:248px;padding:6px 2px;--mdc-plain-tooltip-container-color: none;--mdc-plain-tooltip-supporting-text-color: $tgo-black}\n"] }]
191
191
  }], ctorParameters: () => [{ type: undefined, decorators: [{
192
192
  type: Optional
193
193
  }, {
@@ -223,4 +223,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
223
223
  type: ViewChild,
224
224
  args: ['table']
225
225
  }] } });
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGdvLWNhbm9weS11aS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFHVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsVUFBVSxFQVVYLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0I1RCxNQUFNLE9BQU8sY0FBYztJQUN6Qjs7Ozs7T0FLRztJQUNILElBQStCLE1BQU0sQ0FBQyxNQUFzQjtRQUMxRCxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBRXRFLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBc0MsQ0FBQztRQUUxRCxJ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QUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7NEJBQ3JGLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQzt5QkFDakYsQ0FBQztxQkFDSDs7MEJBMEZFLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0NBQW9DOzswQkFFdkQsTUFBTTsyQkFBQyxlQUFlO3lDQW5GTSxNQUFNO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFrQlosSUFBSTtzQkFBaEIsS0FBSztnQkFZRyxPQUFPO3NCQUFmLEtBQUs7Z0JBUUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVFHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQVFHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRWEsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbHVtbkVsbGlwc2UsXG4gIENvbHVtblR5cGUsXG4gIENvbXBvbmVudFJlbmRlcmVyLFxuICBEYXRhU291cmNlLFxuICBQYWdpbmF0aW9uLFxuICBTY3JvbGxTZXR0aW5ncyxcbiAgVGFibGVDb2x1bW4sXG4gIFRhYmxlQ29uZmlnLFxuICBUYWJsZUNvbmZpZ1dpdGhQYWdpbmF0aW9uLFxuICBUYWJsZURhdGEsXG4gIFRhYmxlRGV0YWlsQ29sdW1uXG59IGZyb20gJy4vdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uVGhlbWUgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwbGljYXRpb24tdGhlbWUubW9kZWwnO1xuaW1wb3J0IHsgc29ydEJ5T3JkZXIgfSBmcm9tICcuLi8uLi91dGlscy90YWJsZS51dGlscyc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBJU19NT0JJTEVfVE9LRU4gfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvaXMtbW9iaWxlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndWktdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2V4cGFuZERldGFpbCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQsIHZvaWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IHZvaWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBEYXRhU291cmNlLCBURGV0YWlsIGV4dGVuZHMgRGF0YVNvdXJjZT4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICAvKipcbiAgICogVGFibGUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7VGFibGVDb25maWd9XG4gICAqIEBtZW1iZXJvZiBUYWJsZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2V0IGNvbmZpZyhjb25maWc6IFRhYmxlQ29uZmlnPFQ+KSB7XG4gICAgY29uZmlnLnBhZ2luYXRpb24gPSBjb25maWcucGFnaW5hdGlvbiA/PyB0aGlzLmRlZmF1bHRQYWdpbmF0aW9uQ29uZmlnO1xuXG4gICAgdGhpcy50YWJsZUNvbmZpZyA9IGNvbmZpZyBhcyBUYWJsZUNvbmZpZ1dpdGhQYWdpbmF0aW9uPFQ+O1xuXG4gICAgdGhpcy5jb2x1bW5zVG9vbHRpcFN0YXRlID0gY29uZmlnLmNvbHVtbnMubWFwKChjb2x1bW4sIGluZGV4KSA9PiAoe1xuICAgICAgaW5kZXgsXG4gICAgICBzaG93VG9vbHRpcDogY29sdW1uLnNob3dUb29sdGlwID8/IGZhbHNlXG4gICAgfSkpO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHNvcnRCeU9yZGVyPFQ+KGNvbmZpZy5jb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi5oaWRkZW4pKS5tYXAoY29sdW1uID0+IGNvbHVtbi51bmlxdWVJZCA/PyBjb2x1bW4ua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnB1dCBwcm9wZXJ0eSBmb3IgcHJvdmlkaW5nIHRoZSB0YWJsZSBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7VGFibGVEYXRhfVxuICAgKiBAbWVtYmVyb2YgVGFibGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhKHRhYmxlRGF0YTogVGFibGVEYXRhKSB7XG4gICAgdGhpcy50YWJsZURhdGEgPSB0YWJsZURhdGE7XG4gICAgdGhpcy5zb3VyY2VEYXRhID0gdGFibGVEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIElucHV0IHByb3BlcnR5IGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFibGUgaXMgaW4gYSBsb2FkaW5nIHN0YXRlLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlcm9mIFRhYmxlQ29tcG9uZW50XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqXG4gICAqIERlZmluZXMgdGhlIGFwcGxpY2F0aW9uIHRoZW1lXG4gICAqIEB0eXBlIHtBcHBsaWNhdGlvblRoZW1lfVxuICAgKiBAbWVtYmVyb2YgVGFibGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGFwcGxpY2F0aW9uVGhlbWU6IEFwcGxpY2F0aW9uVGhlbWUgPSAnbGlnaHQnO1xuXG4gIC8qKlxuICAgKiBEYXRhIHN0cnVjdHVyZSB0byBzZWxlY3Qgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgcmVuZGVyZWQgYW5kIHRoZWlyIGNhcGFiaWxpdGllc1xuICAgKlxuICAgKiBAdHlwZSB7VGFibGVEZXRhaWxDb2x1bW59XG4gICAqIEBtZW1iZXJvZiBUYWJsZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgdGFibGVEZXRhaWxDb2x1bW5zOiBUYWJsZURldGFpbENvbHVtbjxULCBURGV0YWlsPjtcbiAgQElucHV0KCkgdGFibGVEZXRhaWxzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYm9yZGVyIHJhZGl1cyBmb3IgdGFibGVcbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBUYWJsZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZUJvcmRlclJhZGl1cyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBvblJvd0NsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkRldGFpbFJvd0NsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBwYWdpbmF0b3JDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgndGFibGUnKSB0YWJsZTogRWxlbWVudFJlZjtcblxuICBwcm90ZWN0ZWQgdGFibGVEYXRhOiBUYWJsZURhdGE7XG4gIHByb3RlY3RlZCBzb3VyY2VEYXRhOiBUYWJsZURhdGE7XG4gIHByb3RlY3RlZCBjb2x1bW5zVG9vbHRpcFN0YXRlOiBDb2x1bW5FbGxpcHNlW10gPSBbXTtcbiAgcHJvdGVjdGVkIHRhYmxlQ29uZmlnOiBUYWJsZUNvbmZpZ1dpdGhQYWdpbmF0aW9uPFQ+O1xuICBwcm90ZWN0ZWQgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIGNvbHVtbnNEZXRhaWxUb0Rpc3BsYXk6IHN0cmluZ1tdID0gW107XG4gIHByb3RlY3RlZCBza2VsZXRvblN0eWxlQ29uZmlnID0ge1xuICAgIGJhY2tncm91bmQ6ICcjRjZGNkY2JyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc0cHgnLFxuICAgIGhlaWdodDogJzI0cHgnXG4gIH07XG4gIHByb3RlY3RlZCBkYXRhU291cmNlRGV0YWlsID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKTtcbiAgcHJvdGVjdGVkIGVsZW1lbnREZXRhaWw6IGFueTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERhdGFUeXBlID0gQ29sdW1uVHlwZTtcbiAgcHJvdGVjdGVkIHNjcm9sbFNldHRpbmdzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Nyb2xsU2V0dGluZ3M+KHsgc2Nyb2xsRW5kOiBmYWxzZSwgaG9yaXpvbnRhbFNjcm9sbDogZmFsc2UsIHNjcm9sbFN0YXJ0OiBmYWxzZSB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KCdDQU5PUFlVSV9ERUZBVUxUX0FQUExJQ0FUSU9OX1RIRU1FJykgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXBwVGhlbWU6IEFwcGxpY2F0aW9uVGhlbWUsXG4gICAgcHJpdmF0ZSBkZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICAgIEBJbmplY3QoSVNfTU9CSUxFX1RPS0VOKSBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNNb2JpbGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+XG4gICkge1xuICAgIGlmIChkZWZhdWx0QXBwVGhlbWUpIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25UaGVtZSA9IGRlZmF1bHRBcHBUaGVtZTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5hcHBsaWNhdGlvblRoZW1lICE9PSAnY2xhc3NpYycpIHtcbiAgICAgIHRoaXMuc2tlbGV0b25TdHlsZUNvbmZpZy5iYWNrZ3JvdW5kID0gJyNGNEY0RjQnO1xuICAgIH1cbiAgICBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgndGhlbWUnLCB0aGlzLmFwcGxpY2F0aW9uVGhlbWUpO1xuXG4gICAgaWYgKHRoaXMudGFibGVEZXRhaWxDb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbHVtbnNEZXRhaWxUb0Rpc3BsYXkgPSB0aGlzLnRhYmxlRGV0YWlsQ29sdW1ucy5jb2x1bW5EZWZzLm1hcChcbiAgICAgICAgKHRhYmxlQ29sdW1uOiBUYWJsZUNvbHVtbjxURGV0YWlsPikgPT4gdGFibGVDb2x1bW4udGl0bGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaGFzVGFibGVTY3JvbGwoKTtcbiAgICBmcm9tRXZlbnQodGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhc1RhYmxlU2Nyb2xsKCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUNvbmZpZyddICYmIGNoYW5nZXNbJ3RhYmxlQ29uZmlnJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLm9uU29ydENoYW5nZShjaGFuZ2VzWyd0YWJsZUNvbmZpZyddLmN1cnJlbnRWYWx1ZS5zb3J0KTtcbiAgICB9XG4gIH1cblxuICBoYXNUYWJsZVNjcm9sbCgpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGUubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsID0gdGFibGUuc2Nyb2xsV2lkdGggPiB0YWJsZS5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBzY3JvbGxFbmQgPSB0YWJsZS5zY3JvbGxMZWZ0ICsgdGFibGUuY2xpZW50V2lkdGggPj0gdGFibGUuc2Nyb2xsV2lkdGg7XG4gICAgdGhpcy5zY3JvbGxTZXR0aW5ncyQubmV4dCh7XG4gICAgICBzY3JvbGxTdGFydDogIXRhYmxlLnNjcm9sbExlZnQsXG4gICAgICBzY3JvbGxFbmQsXG4gICAgICBob3Jpem9udGFsU2Nyb2xsXG4gICAgfSk7XG4gIH1cblxuICBjYWxsUmVuZGVyZXIoW3JlbmRlcmVyRm4sIGVsZW1lbnRdOiBbKHY6IFQpID0+IENvbXBvbmVudFJlbmRlcmVyIHwgc3RyaW5nLCBUXSk6IGFueSB7XG4gICAgaWYgKHJlbmRlcmVyRm4pIHtcbiAgICAgIHJldHVybiByZW5kZXJlckZuKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblBhZ2luYXRvckNoYW5nZShldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0b3JDaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFuZ2VDb2x1bW5TaXplKGNvbHVtbkluZGV4OiBudW1iZXIsIHNob3dUb29sdGlwOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5zVG9vbHRpcFN0YXRlID0gdGhpcy5jb2x1bW5zVG9vbHRpcFN0YXRlLm1hcChjb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbi5pbmRleCA9PT0gY29sdW1uSW5kZXgpIHtcbiAgICAgICAgY29sdW1uLnNob3dUb29sdGlwID0gc2hvd1Rvb2x0aXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU29ydENoYW5nZShzb3J0U3RhdGU6IFNvcnQpOiB2b2lkIHtcbiAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdChzb3J0U3RhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUm93Q2xpY2socm93UGFyYW1zOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uUm93Q2xpY2tFdmVudC5lbWl0KHJvd1BhcmFtcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EZXRhaWxSb3dDbGljayhyb3dQYXJhbXM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25EZXRhaWxSb3dDbGlja0V2ZW50LmVtaXQocm93UGFyYW1zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVSb3coZWxlbWVudDogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRhYmxlRGV0YWlscykge1xuICAgICAgdGhpcy5lbGVtZW50RGV0YWlsID0gdGhpcy5lbGVtZW50RGV0YWlsID09PSBlbGVtZW50ID8gbnVsbCA6IGVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5lbGVtZW50RGV0YWlsKSB7XG4gICAgICAgIHRoaXMudGFibGVEZXRhaWxDb2x1bW5zLnNldERldGFpbFJvd0RhdGEoe1xuICAgICAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICAgICAgc2V0RGV0YWlsRGF0YVNvdXJjZTogdGhpcy5zZXRUYWJsZURldGFpbERhdGFTb3VyY2UuYmluZCh0aGlzKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRhYmxlRGV0YWlsRGF0YVNvdXJjZShyb3dEYXRhOiBURGV0YWlsW10pOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2VEZXRhaWwgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4ocm93RGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRQYWdpbmF0aW9uQ29uZmlnOiBQYWdpbmF0aW9uID0ge1xuICAgIGN1cnJlbnRQYWdlOiAwLFxuICAgIGl0ZW1zUGVyUGFnZTogMTAsXG4gICAgaXRlbXNQZXJQYWdlT3B0aW9uczogWzEwLCAyNSwgNTBdLFxuICAgIHRvdGFsSXRlbXM6IDIwXG4gIH07XG5cbiAgdHJhY2tDb2x1bW5VbmlxdWVJZCA9IChpbmRleDogbnVtYmVyLCBjb2x1bW46IFRhYmxlQ29sdW1uPFQ+KTogc3RyaW5nID0+IGNvbHVtbi51bmlxdWVJZCA/PyBjb2x1bW4ua2V5O1xufVxuIiwiPGRpdiAjdGFibGVDb250YWluZXIgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIlxuICAgICBbbmdDbGFzc109XCJ7ICd3aXRob3V0LXRpdGxlJzogIXRhYmxlQ29uZmlnPy50aXRsZSwgJ2Rpc2FibGUtYm9yZGVyLXJhZGl1cyc6IGRpc2FibGVCb3JkZXJSYWRpdXMgfVwiXG4gICAgIFthdHRyLnRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIj5cbiAgPGRpdiAqbmdJZj1cInRhYmxlQ29uZmlnPy50aXRsZVwiIGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAge3sgdGFibGVDb25maWcudGl0bGUgfCBzZW50ZW5jZWNhc2UgfX1cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbdGl0bGUtYWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgI3RhYmxlXG4gICAgKm5nSWY9XCJzY3JvbGxTZXR0aW5ncyQgfCBhc3luYyBhcyBzY3JvbGxTZXR0aW5nc1wiXG4gICAgY2xhc3M9XCJ0YWJsZS13cmFwcGVyXCI+XG4gICAgPHRhYmxlXG4gICAgICBjbGFzcz1cIm1haW4tdGFibGVcIlxuICAgICAgbWF0LXRhYmxlXG4gICAgICBbZGF0YVNvdXJjZV09XCJ0YWJsZURhdGFcIlxuICAgICAgbWF0U29ydFxuICAgICAgW21hdFNvcnRTdGFydF09XCJ0YWJsZUNvbmZpZz8uc29ydD8uZGVmYXVsdFNvcnRTdGFydCA/PyAnYXNjJ1wiXG4gICAgICBbbWF0U29ydEFjdGl2ZV09XCJ0YWJsZUNvbmZpZz8uc29ydD8uYWN0aXZlID8/ICcnXCJcbiAgICAgIFttYXRTb3J0RGlyZWN0aW9uXT1cInRhYmxlQ29uZmlnPy5zb3J0Py5kaXJlY3Rpb24gPz8gJydcIlxuICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCRldmVudClcIlxuICAgICAgbXVsdGlUZW1wbGF0ZURhdGFSb3dzXG4gICAgPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdGFibGVDb25maWcuY29sdW1uczsgaW5kZXggYXMgaSwgbGFzdCBhcyBpc0xhc3Q7IHRyYWNrQnk6IHRyYWNrQ29sdW1uVW5pcXVlSWRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTGFzdCAmJiBjb2x1bW4uaXNTdGlja3kgJiYgY29sdW1uLmFsbG93U29ydFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4udW5pcXVlSWQgPz8gY29sdW1uLmtleVwiIFtzdGlja3lFbmRdPVwiIXNjcm9sbFNldHRpbmdzPy5zY3JvbGxFbmRcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICAgICBbc3RhcnRdPVwiY29sdW1uLnNvcnRTdGFydCA/PyAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgW21hdC1zb3J0LWhlYWRlcl09XCJjb2x1bW4uc29ydEhlYWRlciA/PyBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgICAgIFthdHRyLnNvcnRhYmxlXT1cImNvbHVtbi5hbGxvd1NvcnQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhQZXJjICsgJyUnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5taW5XaWR0aFB4ICsgJ3B4J1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmZvbnQtd2VpZ2h0XT1cIidib2xkJ1wiXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBDbGFzc109XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCIoY29sdW1uPy5zaG93VG9vbHRpcCA/IChjb2x1bW4/LnRvb2x0aXAgPyBjb2x1bW4udG9vbHRpcCA6IGNvbHVtbi50aXRsZSApIDogJycpIHx8ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbi50aXRsZSwgY29sdW1uLCBjb2xJbmRleDogaX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29uZmlnVmFsdWU+XG4gICAgICAgICAgICAgICAgIDxzcGFuIHVpRWxsaXBzZVRleHQgKG9uQ2hhbmdlVGV4dFN0YXRlKT1cIm9uQ2hhbmdlQ29sdW1uU2l6ZShpLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2x1bW4tdGl0bGVcIj57eyBjb2x1bW4udGl0bGUgfCBzZW50ZW5jZWNhc2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGxcbiAgICAgICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgcm93SW5kZXggPSBkYXRhSW5kZXhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhQZXJjICsgJyUnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5taW5XaWR0aFB4ICsgJ3B4J1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2soZWxlbWVudCk7IGNvbHVtbj8ucm93Q2VsbFRlbXBsYXRlQ2xpY2sgPyBjb2x1bW4hLnJvd0NlbGxUZW1wbGF0ZUNsaWNrPy4oKSA6ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHVpLXNrZWxldG9uIGNsYXNzPVwidGFibGUtc2tlbGV0b24tbG9hZGVyXCIgW2NvdW50XT1cIjFcIiBbdGhlbWVdPVwic2tlbGV0b25TdHlsZUNvbmZpZ1wiIFthcHBlYXJhbmNlXT1cIidsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRpbmc7IGVsc2UgdmFsdWVcIj48L3VpLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbHVlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpICYmIHRhYmxlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBlbGVtZW50RGV0YWlsICYmIGVsZW1lbnQgPT0gZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Fycm93X2Rvd24nIDogJ0Fycm93LWNoZXZyb24tZG93bi1pbi1saW5lJ1wiXG4gICAgICAgICAgICAgICAgICA+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5yb3dDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4ucm93Q2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBlbGVtZW50LCByb3dJbmRleH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWdEYXRhPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLmZvbnQtd2VpZ2h0XT1cImNvbHVtbi5ib2xkID8gJ2JvbGQnIDogJ25vcm1hbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnQtc2l6ZV09XCJjb2x1bW4uZm9udFNpemUgPz8gJzE0cHgnXCI+e3sgZWxlbWVudFtjb2x1bW4ua2V5XSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMYXN0ICYmIGNvbHVtbi5pc1N0aWNreSAmJiAhY29sdW1uLmFsbG93U29ydFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4udW5pcXVlSWQgPz8gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpY2t5RW5kXT1cInNjcm9sbFNldHRpbmdzLmhvcml6b250YWxTY3JvbGwgPyAhc2Nyb2xsU2V0dGluZ3Muc2Nyb2xsRW5kIDogdHJ1ZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICAgICAgW2F0dHIuc29ydGFibGVdPVwiY29sdW1uLmFsbG93U29ydCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFBlcmMgKyAnJSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLm1pbldpZHRoUHggKyAncHgnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC13ZWlnaHRdPVwiJ2JvbGQnXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcENsYXNzXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIihjb2x1bW4/LnNob3dUb29sdGlwID8gKGNvbHVtbj8udG9vbHRpcCA/IGNvbHVtbi50b29sdGlwIDogY29sdW1uLnRpdGxlICkgOiAnJykgfHwgJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmhlYWRlckNlbGxUZW1wbGF0ZTsgZWxzZSBjb25maWdWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uLmhlYWRlckNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogY29sdW1uLnRpdGxlLCBjb2x1bW4sIGNvbEluZGV4OiBpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWdWYWx1ZT5cbiAgICAgICAgICAgICAgICAgPHNwYW4gdWlFbGxpcHNlVGV4dCAob25DaGFuZ2VUZXh0U3RhdGUpPVwib25DaGFuZ2VDb2x1bW5TaXplKGksICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi10aXRsZVwiPnt7IGNvbHVtbi50aXRsZSB8IHNlbnRlbmNlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbFxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFBlcmMgKyAnJSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLm1pbldpZHRoUHggKyAncHgnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljayhlbGVtZW50KTsgY29sdW1uPy5yb3dDZWxsVGVtcGxhdGVDbGljayA/IGNvbHVtbiEucm93Q2VsbFRlbXBsYXRlQ2xpY2s/LigpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dWktc2tlbGV0b24gY2xhc3M9XCJ0YWJsZS1za2VsZXRvbi1sb2FkZXJcIiBbY291bnRdPVwiMVwiIFt0aGVtZV09XCJza2VsZXRvblN0eWxlQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cIidsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRpbmc7IGVsc2UgdmFsdWVcIj48L3VpLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbHVlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpICYmIHRhYmxlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBlbGVtZW50RGV0YWlsICYmIGVsZW1lbnQgPT0gZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Fycm93X2Rvd24nIDogJ0Fycm93LWNoZXZyb24tZG93bi1pbi1saW5lJ1wiXG4gICAgICAgICAgICAgICAgICA+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5yb3dDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4ucm93Q2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZWxlbWVudCwgcm93SW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbmZpZ0RhdGE+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuZm9udC13ZWlnaHRdPVwiY29sdW1uLmJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC1zaXplXT1cImNvbHVtbi5mb250U2l6ZSA/PyAnMTRweCdcIj57eyBlbGVtZW50W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cIiEoaXNMYXN0ICYmIGNvbHVtbi5pc1N0aWNreSkgJiYgY29sdW1uLmFsbG93U29ydFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4udW5pcXVlSWQgPz8gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpY2t5XT1cIihpc01vYmlsZSQgfCBhc3luYykgPyBmYWxzZSA6ICFzY3JvbGxTZXR0aW5ncy5zY3JvbGxTdGFydCAgJiYgISFjb2x1bW4uaXNTdGlja3lcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICAgICBbc3RhcnRdPVwiY29sdW1uLnNvcnRTdGFydCA/PyAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgW21hdC1zb3J0LWhlYWRlcl09XCJjb2x1bW4uc29ydEhlYWRlciA/PyBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5zb3J0YWJsZV09XCJjb2x1bW4uYWxsb3dTb3J0ID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgICAgIFtzdHlsZS5mb250LXdlaWdodF09XCInYm9sZCdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhQZXJjICsgJyUnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5taW5XaWR0aFB4ICsgJ3B4J1wiXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBDbGFzc109XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCIoY29sdW1uPy5zaG93VG9vbHRpcCA/IChjb2x1bW4/LnRvb2x0aXAgPyBjb2x1bW4udG9vbHRpcCA6IGNvbHVtbi50aXRsZSApIDogJycpIHx8ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4udGl0bGUsIGNvbHVtbiwgY29sSW5kZXg6IGkgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWdWYWx1ZT5cbiAgICAgICAgICAgICAgICAgPHNwYW4gdWlFbGxpcHNlVGV4dCAob25DaGFuZ2VUZXh0U3RhdGUpPVwib25DaGFuZ2VDb2x1bW5TaXplKGksICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi10aXRsZVwiPnt7IGNvbHVtbi50aXRsZSB8IHNlbnRlbmNlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbFxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFBlcmMgKyAnJSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLm1pbldpZHRoUHggKyAncHgnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljayhlbGVtZW50KTsgY29sdW1uPy5yb3dDZWxsVGVtcGxhdGVDbGljayA/IGNvbHVtbiEucm93Q2VsbFRlbXBsYXRlQ2xpY2s/LigpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dWktc2tlbGV0b24gY2xhc3M9XCJ0YWJsZS1za2VsZXRvbi1sb2FkZXJcIiBbY291bnRdPVwiMVwiIFt0aGVtZV09XCJza2VsZXRvblN0eWxlQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cIidsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRpbmc7IGVsc2UgdmFsdWVcIj48L3VpLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbHVlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpICYmIHRhYmxlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBlbGVtZW50RGV0YWlsICYmIGVsZW1lbnQgPT0gZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Fycm93X2Rvd24nIDogJ0Fycm93LWNoZXZyb24tZG93bi1pbi1saW5lJ1wiXG4gICAgICAgICAgICAgICAgICA+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5yb3dDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4ucm93Q2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZWxlbWVudCwgcm93SW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbmZpZ0RhdGE+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuZm9udC13ZWlnaHRdPVwiY29sdW1uLmJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC1zaXplXT1cImNvbHVtbi5mb250U2l6ZSA/PyAnMTRweCdcIj57eyBlbGVtZW50W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiIShpc0xhc3QgJiYgY29sdW1uLmlzU3RpY2t5KSAmJiAhY29sdW1uLmFsbG93U29ydFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4udW5pcXVlSWQgPz8gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpY2t5XT1cIihpc01vYmlsZSQgfCBhc3luYykgPyBmYWxzZSA6ICFzY3JvbGxTZXR0aW5ncy5zY3JvbGxTdGFydCAmJiAhIWNvbHVtbi5pc1N0aWNreVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgICAgIFthdHRyLnNvcnRhYmxlXT1cImNvbHVtbi5hbGxvd1NvcnQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICAgICAgW3N0eWxlLmZvbnQtd2VpZ2h0XT1cIidib2xkJ1wiXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBDbGFzc109XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCIoY29sdW1uPy5zaG93VG9vbHRpcCA/IChjb2x1bW4/LnRvb2x0aXAgPyBjb2x1bW4udG9vbHRpcCA6IGNvbHVtbi50aXRsZSApIDogJycpID8/ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4udGl0bGUsIGNvbHVtbiwgY29sSW5kZXg6IGkgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWdWYWx1ZT5cbiAgICAgICAgICAgICAgICAgPHNwYW4gdWlFbGxpcHNlVGV4dCAob25DaGFuZ2VUZXh0U3RhdGUpPVwib25DaGFuZ2VDb2x1bW5TaXplKGksICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi10aXRsZVwiPnt7IGNvbHVtbi50aXRsZSB8IHNlbnRlbmNlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbFxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFBlcmMgKyAnJSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLm1pbldpZHRoUHggKyAncHgnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljayhlbGVtZW50KTsgY29sdW1uPy5yb3dDZWxsVGVtcGxhdGVDbGljayA/IGNvbHVtbiEucm93Q2VsbFRlbXBsYXRlQ2xpY2s/LigpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dWktc2tlbGV0b24gY2xhc3M9XCJ0YWJsZS1za2VsZXRvbi1sb2FkZXJcIiBbY291bnRdPVwiMVwiIFt0aGVtZV09XCJza2VsZXRvblN0eWxlQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cIidsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRpbmc7IGVsc2UgdmFsdWVcIj48L3VpLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbHVlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpICYmIHRhYmxlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBlbGVtZW50RGV0YWlsICYmIGVsZW1lbnQgPT0gZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Fycm93X2Rvd24nIDogJ0Fycm93LWNoZXZyb24tZG93bi1pbi1saW5lJ1wiXG4gICAgICAgICAgICAgICAgICA+PC91aS1pY29uPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnJvd0NlbGxUZW1wbGF0ZTsgZWxzZSBjb25maWdEYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5yb3dDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiAgZWxlbWVudCwgcm93SW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbmZpZ0RhdGE+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuZm9udC13ZWlnaHRdPVwiY29sdW1uLmJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC1zaXplXT1cImNvbHVtbi5mb250U2l6ZSA/PyAnMTRweCdcIj57eyBlbGVtZW50W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgW2F0dHIuY29sc3Bhbl09XCJkaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbGVtZW50LWRldGFpbFwiICpuZ0lmPVwiZGF0YVNvdXJjZURldGFpbC5kYXRhLmxlbmd0aFwiXG4gICAgICAgICAgICAgICBbQGV4cGFuZERldGFpbF09XCJlbGVtZW50ID09PSBlbGVtZW50RGV0YWlsID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XG4gICAgICAgICAgICA8dGFibGVcbiAgICAgICAgICAgICAgbWF0LXRhYmxlXG4gICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VEZXRhaWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdoaWRlLWJvcmRlcnMnOiBlbGVtZW50ID09PSB0YWJsZURhdGFbdGFibGVEYXRhLmxlbmd0aCAtIDFdIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YWJsZUNvbHVtbiBvZiB0YWJsZURldGFpbENvbHVtbnMuY29sdW1uRGVmc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdENvbHVtbkRlZl09XCJ0YWJsZUNvbHVtbi50aXRsZVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGFycm93UG9zaXRpb249XCJhZnRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInt3aWR0aDogdGFibGVDb2x1bW4uc3R5bGVzPy53aWR0aH1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0YWJsZUNvbHVtbi5zdHlsZXM/LmFsaWdubWVudCA/ICd0aC0nK3RhYmxlQ29sdW1uLnN0eWxlcz8uYWxpZ25tZW50IDogJydcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRhYmxlQ29sdW1uLnRpdGxlIHwgdXBwZXJjYXNlIH19XG4gICAgICAgICAgICAgICAgPC90aD5cblxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgKGNsaWNrKT1cIm9uRGV0YWlsUm93Q2xpY2soZWxlbWVudClcIlxuICAgICAgICAgICAgICAgICAgICBbYWxpZ25dPVwidGFibGVDb2x1bW4uc3R5bGVzPy5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0YWJsZUNvbHVtbi5zdHlsZXM/LmFsaWdubWVudCA/ICd0ZC0nK3RhYmxlQ29sdW1uLnN0eWxlcz8uYWxpZ25tZW50IDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7d2lkdGg6IHRhYmxlQ29sdW1uLnN0eWxlcz8ud2lkdGggfVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlRGF0YVRwbDsgY29udGV4dDoge2VsZW1lbnQsIHRhYmxlQ29sdW1ufVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uc0RldGFpbFRvRGlzcGxheVwiPjwvdHI+XG4gICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93RGV0YWlsOyBjb2x1bW5zOiBjb2x1bW5zRGV0YWlsVG9EaXNwbGF5O1wiPjwvdHI+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjdGFibGVEYXRhVHBsIGxldC1lbGVtZW50PVwiZWxlbWVudFwiIGxldC10YWJsZUNvbHVtbj1cInRhYmxlQ29sdW1uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi13cmFwcGVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidGFibGVDb2x1bW4udHlwZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiRGF0YVR5cGUuRklFTERcIj5cbiAgICAgICAgICAgICAge3sgZWxlbWVudCB8IGRhdGFQcm9wZXJ0eUdldHRlcjogdGFibGVDb2x1bW4ua2V5IH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkRhdGFUeXBlLkZVTkNUSU9OXCI+XG4gICAgICAgICAgICAgIHt7IHRhYmxlQ29sdW1uLmZ1bmN0aW9uPy4oZWxlbWVudCkgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiRGF0YVR5cGUuUkVOREVSRVJcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgW2R5bmFtaWNDb21wb25lbnRdPVwiW3RhYmxlQ29sdW1uLnJlbmRlcmVyLCBlbGVtZW50XSB8IG1lbW9pemVGdW5jIDogY2FsbFJlbmRlcmVyXCI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAge3sgZWxlbWVudCB8IGRhdGFQcm9wZXJ0eUdldHRlcjogdGFibGVDb2x1bW4ua2V5IH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2V4cGFuZGVkLXJvdyc6IGVsZW1lbnREZXRhaWwgPT09IHJvdywgJ3Jvdy1jbGlja2FibGUnOiB0YWJsZURldGFpbHMsICdzZWxlY3RlZCc6IHJvdz8uc2VsZWN0ZWQsICdsYXN0LXJvdyc6IHJvdyA9PT0gdGFibGVEYXRhW3RhYmxlRGF0YS5sZW5ndGggLSAxXSAmJiAhZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUm93KHJvdylcIj5cbiAgICAgIDwvdHI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGVEZXRhaWxzICYmIHRhYmxlRGV0YWlsQ29sdW1ucz8uY29sdW1uRGVmcz8ubGVuZ3RoXCI+XG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2V4cGFuZGVkRGV0YWlsJ11cIiBjbGFzcz1cImRldGFpbC1yb3dcIj48L3RyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZUNvbmZpZy5ub0RhdGFSb3dUcGxcIj5cbiAgICAgICAgPHRyICptYXROb0RhdGFSb3c+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlQ29uZmlnLm5vRGF0YVJvd1RwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG5cbiAgPHVpLXBhZ2luYXRvclxuICAgICpuZ0lmPVwiIXRhYmxlQ29uZmlnPy5oaWRlUGFnaW5hdGlvblwiXG4gICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIlxuICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgIT09ICdjbGFzc2ljJyA/ICdsaWdodCcgOiAnY2xhc3NpYydcIlxuICAgIFtwYWdlU2l6ZV09XCJ0YWJsZUNvbmZpZy5wYWdpbmF0aW9uLml0ZW1zUGVyUGFnZVwiXG4gICAgW2xlbmd0aF09XCJ0YWJsZUNvbmZpZy5wYWdpbmF0aW9uLnRvdGFsSXRlbXNcIlxuICAgIFtjdXJyZW50UGFnZV09XCJ0YWJsZUNvbmZpZy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlXCJcbiAgICBbcGFnZVNpemVPcHRpb25zXT1cInRhYmxlQ29uZmlnLnBhZ2luYXRpb24uaXRlbXNQZXJQYWdlT3B0aW9uc1wiXG4gICAgKHBhZ2luYXRvckNoYW5nZSk9XCJvblBhZ2luYXRvckNoYW5nZSgkZXZlbnQpXCJcbiAgPjwvdWktcGFnaW5hdG9yPlxuPC9kaXY+XG5cbiJdfQ==
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGdvLWNhbm9weS11aS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFHVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsVUFBVSxFQVVYLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0I1RCxNQUFNLE9BQU8sY0FBYztJQUN6Qjs7Ozs7T0FLRztJQUNILElBQStCLE1BQU0sQ0FBQyxNQUFzQjtRQUMxRCxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBRXRFLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBc0MsQ0FBQztRQUUxRCxJ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QUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7NEJBQ3JGLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQzt5QkFDakYsQ0FBQztxQkFDSDs7MEJBMEZFLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsb0NBQW9DOzswQkFFdkQsTUFBTTsyQkFBQyxlQUFlO3lDQW5GTSxNQUFNO3NCQUFwQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFrQlosSUFBSTtzQkFBaEIsS0FBSztnQkFZRyxPQUFPO3NCQUFmLEtBQUs7Z0JBUUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVFHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQVFHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRWEsS0FBSztzQkFBeEIsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbHVtbkVsbGlwc2UsXG4gIENvbHVtblR5cGUsXG4gIENvbXBvbmVudFJlbmRlcmVyLFxuICBEYXRhU291cmNlLFxuICBQYWdpbmF0aW9uLFxuICBTY3JvbGxTZXR0aW5ncyxcbiAgVGFibGVDb2x1bW4sXG4gIFRhYmxlQ29uZmlnLFxuICBUYWJsZUNvbmZpZ1dpdGhQYWdpbmF0aW9uLFxuICBUYWJsZURhdGEsXG4gIFRhYmxlRGV0YWlsQ29sdW1uXG59IGZyb20gJy4vdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uVGhlbWUgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwbGljYXRpb24tdGhlbWUubW9kZWwnO1xuaW1wb3J0IHsgc29ydEJ5T3JkZXIgfSBmcm9tICcuLi8uLi91dGlscy90YWJsZS51dGlscyc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBJU19NT0JJTEVfVE9LRU4gfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvaXMtbW9iaWxlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndWktdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2V4cGFuZERldGFpbCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQsIHZvaWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IHZvaWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyBEYXRhU291cmNlLCBURGV0YWlsIGV4dGVuZHMgRGF0YVNvdXJjZT4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICAvKipcbiAgICogVGFibGUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAdHlwZSB7VGFibGVDb25maWd9XG4gICAqIEBtZW1iZXJvZiBUYWJsZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2V0IGNvbmZpZyhjb25maWc6IFRhYmxlQ29uZmlnPFQ+KSB7XG4gICAgY29uZmlnLnBhZ2luYXRpb24gPSBjb25maWcucGFnaW5hdGlvbiA/PyB0aGlzLmRlZmF1bHRQYWdpbmF0aW9uQ29uZmlnO1xuXG4gICAgdGhpcy50YWJsZUNvbmZpZyA9IGNvbmZpZyBhcyBUYWJsZUNvbmZpZ1dpdGhQYWdpbmF0aW9uPFQ+O1xuXG4gICAgdGhpcy5jb2x1bW5zVG9vbHRpcFN0YXRlID0gY29uZmlnLmNvbHVtbnMubWFwKChjb2x1bW4sIGluZGV4KSA9PiAoe1xuICAgICAgaW5kZXgsXG4gICAgICBzaG93VG9vbHRpcDogY29sdW1uLnNob3dUb29sdGlwID8/IGZhbHNlXG4gICAgfSkpO1xuICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHNvcnRCeU9yZGVyPFQ+KGNvbmZpZy5jb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi5oaWRkZW4pKS5tYXAoY29sdW1uID0+IGNvbHVtbi51bmlxdWVJZCA/PyBjb2x1bW4ua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnB1dCBwcm9wZXJ0eSBmb3IgcHJvdmlkaW5nIHRoZSB0YWJsZSBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7VGFibGVEYXRhfVxuICAgKiBAbWVtYmVyb2YgVGFibGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhKHRhYmxlRGF0YTogVGFibGVEYXRhKSB7XG4gICAgdGhpcy50YWJsZURhdGEgPSB0YWJsZURhdGE7XG4gICAgdGhpcy5zb3VyY2VEYXRhID0gdGFibGVEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIElucHV0IHByb3BlcnR5IGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFibGUgaXMgaW4gYSBsb2FkaW5nIHN0YXRlLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlcm9mIFRhYmxlQ29tcG9uZW50XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqXG4gICAqIERlZmluZXMgdGhlIGFwcGxpY2F0aW9uIHRoZW1lXG4gICAqIEB0eXBlIHtBcHBsaWNhdGlvblRoZW1lfVxuICAgKiBAbWVtYmVyb2YgVGFibGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGFwcGxpY2F0aW9uVGhlbWU6IEFwcGxpY2F0aW9uVGhlbWUgPSAnbGlnaHQnO1xuXG4gIC8qKlxuICAgKiBEYXRhIHN0cnVjdHVyZSB0byBzZWxlY3Qgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgcmVuZGVyZWQgYW5kIHRoZWlyIGNhcGFiaWxpdGllc1xuICAgKlxuICAgKiBAdHlwZSB7VGFibGVEZXRhaWxDb2x1bW59XG4gICAqIEBtZW1iZXJvZiBUYWJsZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgdGFibGVEZXRhaWxDb2x1bW5zOiBUYWJsZURldGFpbENvbHVtbjxULCBURGV0YWlsPjtcbiAgQElucHV0KCkgdGFibGVEZXRhaWxzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgYm9yZGVyIHJhZGl1cyBmb3IgdGFibGVcbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBUYWJsZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZUJvcmRlclJhZGl1cyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBvblJvd0NsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkRldGFpbFJvd0NsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBwYWdpbmF0b3JDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgndGFibGUnKSB0YWJsZTogRWxlbWVudFJlZjtcblxuICBwcm90ZWN0ZWQgdGFibGVEYXRhOiBUYWJsZURhdGE7XG4gIHByb3RlY3RlZCBzb3VyY2VEYXRhOiBUYWJsZURhdGE7XG4gIHByb3RlY3RlZCBjb2x1bW5zVG9vbHRpcFN0YXRlOiBDb2x1bW5FbGxpcHNlW10gPSBbXTtcbiAgcHJvdGVjdGVkIHRhYmxlQ29uZmlnOiBUYWJsZUNvbmZpZ1dpdGhQYWdpbmF0aW9uPFQ+O1xuICBwcm90ZWN0ZWQgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIGNvbHVtbnNEZXRhaWxUb0Rpc3BsYXk6IHN0cmluZ1tdID0gW107XG4gIHByb3RlY3RlZCBza2VsZXRvblN0eWxlQ29uZmlnID0ge1xuICAgIGJhY2tncm91bmQ6ICcjRjZGNkY2JyxcbiAgICAnYm9yZGVyLXJhZGl1cyc6ICc0cHgnLFxuICAgIGhlaWdodDogJzI0cHgnXG4gIH07XG4gIHByb3RlY3RlZCBkYXRhU291cmNlRGV0YWlsID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKTtcbiAgcHJvdGVjdGVkIGVsZW1lbnREZXRhaWw6IGFueTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERhdGFUeXBlID0gQ29sdW1uVHlwZTtcbiAgcHJvdGVjdGVkIHNjcm9sbFNldHRpbmdzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Nyb2xsU2V0dGluZ3M+KHsgc2Nyb2xsRW5kOiBmYWxzZSwgaG9yaXpvbnRhbFNjcm9sbDogZmFsc2UsIHNjcm9sbFN0YXJ0OiBmYWxzZSB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KCdDQU5PUFlVSV9ERUZBVUxUX0FQUExJQ0FUSU9OX1RIRU1FJykgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXBwVGhlbWU6IEFwcGxpY2F0aW9uVGhlbWUsXG4gICAgcHJpdmF0ZSBkZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICAgIEBJbmplY3QoSVNfTU9CSUxFX1RPS0VOKSBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNNb2JpbGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+XG4gICkge1xuICAgIGlmIChkZWZhdWx0QXBwVGhlbWUpIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25UaGVtZSA9IGRlZmF1bHRBcHBUaGVtZTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5hcHBsaWNhdGlvblRoZW1lICE9PSAnY2xhc3NpYycpIHtcbiAgICAgIHRoaXMuc2tlbGV0b25TdHlsZUNvbmZpZy5iYWNrZ3JvdW5kID0gJyNGNEY0RjQnO1xuICAgIH1cbiAgICBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgndGhlbWUnLCB0aGlzLmFwcGxpY2F0aW9uVGhlbWUpO1xuXG4gICAgaWYgKHRoaXMudGFibGVEZXRhaWxDb2x1bW5zKSB7XG4gICAgICB0aGlzLmNvbHVtbnNEZXRhaWxUb0Rpc3BsYXkgPSB0aGlzLnRhYmxlRGV0YWlsQ29sdW1ucy5jb2x1bW5EZWZzLm1hcChcbiAgICAgICAgKHRhYmxlQ29sdW1uOiBUYWJsZUNvbHVtbjxURGV0YWlsPikgPT4gdGFibGVDb2x1bW4udGl0bGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaGFzVGFibGVTY3JvbGwoKTtcbiAgICBmcm9tRXZlbnQodGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhc1RhYmxlU2Nyb2xsKCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUNvbmZpZyddICYmIGNoYW5nZXNbJ3RhYmxlQ29uZmlnJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLm9uU29ydENoYW5nZShjaGFuZ2VzWyd0YWJsZUNvbmZpZyddLmN1cnJlbnRWYWx1ZS5zb3J0KTtcbiAgICB9XG4gIH1cblxuICBoYXNUYWJsZVNjcm9sbCgpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGUubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsID0gdGFibGUuc2Nyb2xsV2lkdGggPiB0YWJsZS5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBzY3JvbGxFbmQgPSB0YWJsZS5zY3JvbGxMZWZ0ICsgdGFibGUuY2xpZW50V2lkdGggPj0gdGFibGUuc2Nyb2xsV2lkdGg7XG4gICAgdGhpcy5zY3JvbGxTZXR0aW5ncyQubmV4dCh7XG4gICAgICBzY3JvbGxTdGFydDogIXRhYmxlLnNjcm9sbExlZnQsXG4gICAgICBzY3JvbGxFbmQsXG4gICAgICBob3Jpem9udGFsU2Nyb2xsXG4gICAgfSk7XG4gIH1cblxuICBjYWxsUmVuZGVyZXIoW3JlbmRlcmVyRm4sIGVsZW1lbnRdOiBbKHY6IFQpID0+IENvbXBvbmVudFJlbmRlcmVyIHwgc3RyaW5nLCBUXSk6IGFueSB7XG4gICAgaWYgKHJlbmRlcmVyRm4pIHtcbiAgICAgIHJldHVybiByZW5kZXJlckZuKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvblBhZ2luYXRvckNoYW5nZShldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0b3JDaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DaGFuZ2VDb2x1bW5TaXplKGNvbHVtbkluZGV4OiBudW1iZXIsIHNob3dUb29sdGlwOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5zVG9vbHRpcFN0YXRlID0gdGhpcy5jb2x1bW5zVG9vbHRpcFN0YXRlLm1hcChjb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbi5pbmRleCA9PT0gY29sdW1uSW5kZXgpIHtcbiAgICAgICAgY29sdW1uLnNob3dUb29sdGlwID0gc2hvd1Rvb2x0aXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU29ydENoYW5nZShzb3J0U3RhdGU6IFNvcnQpOiB2b2lkIHtcbiAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdChzb3J0U3RhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUm93Q2xpY2socm93UGFyYW1zOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uUm93Q2xpY2tFdmVudC5lbWl0KHJvd1BhcmFtcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25EZXRhaWxSb3dDbGljayhyb3dQYXJhbXM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25EZXRhaWxSb3dDbGlja0V2ZW50LmVtaXQocm93UGFyYW1zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0b2dnbGVSb3coZWxlbWVudDogVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRhYmxlRGV0YWlscykge1xuICAgICAgdGhpcy5lbGVtZW50RGV0YWlsID0gdGhpcy5lbGVtZW50RGV0YWlsID09PSBlbGVtZW50ID8gbnVsbCA6IGVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5lbGVtZW50RGV0YWlsKSB7XG4gICAgICAgIHRoaXMudGFibGVEZXRhaWxDb2x1bW5zLnNldERldGFpbFJvd0RhdGEoe1xuICAgICAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICAgICAgc2V0RGV0YWlsRGF0YVNvdXJjZTogdGhpcy5zZXRUYWJsZURldGFpbERhdGFTb3VyY2UuYmluZCh0aGlzKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRhYmxlRGV0YWlsRGF0YVNvdXJjZShyb3dEYXRhOiBURGV0YWlsW10pOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2VEZXRhaWwgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4ocm93RGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGRlZmF1bHRQYWdpbmF0aW9uQ29uZmlnOiBQYWdpbmF0aW9uID0ge1xuICAgIGN1cnJlbnRQYWdlOiAwLFxuICAgIGl0ZW1zUGVyUGFnZTogMTAsXG4gICAgaXRlbXNQZXJQYWdlT3B0aW9uczogWzEwLCAyNSwgNTBdLFxuICAgIHRvdGFsSXRlbXM6IDIwXG4gIH07XG5cbiAgdHJhY2tDb2x1bW5VbmlxdWVJZCA9IChpbmRleDogbnVtYmVyLCBjb2x1bW46IFRhYmxlQ29sdW1uPFQ+KTogc3RyaW5nID0+IGNvbHVtbi51bmlxdWVJZCA/PyBjb2x1bW4ua2V5O1xufVxuIiwiPGRpdiAjdGFibGVDb250YWluZXIgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIlxuICAgICBbbmdDbGFzc109XCJ7ICd3aXRob3V0LXRpdGxlJzogIXRhYmxlQ29uZmlnPy50aXRsZSwgJ2Rpc2FibGUtYm9yZGVyLXJhZGl1cyc6IGRpc2FibGVCb3JkZXJSYWRpdXMgfVwiXG4gICAgIFthdHRyLnRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIj5cbiAgPGRpdiAqbmdJZj1cInRhYmxlQ29uZmlnPy50aXRsZVwiIGNsYXNzPVwidGFibGUtaGVhZGVyXCI+XG4gICAge3sgdGFibGVDb25maWcudGl0bGUgfCBzZW50ZW5jZWNhc2UgfX1cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbdGl0bGUtYWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgI3RhYmxlXG4gICAgKm5nSWY9XCJzY3JvbGxTZXR0aW5ncyQgfCBhc3luYyBhcyBzY3JvbGxTZXR0aW5nc1wiXG4gICAgY2xhc3M9XCJ0YWJsZS13cmFwcGVyXCI+XG4gICAgPHRhYmxlXG4gICAgICBjbGFzcz1cIm1haW4tdGFibGVcIlxuICAgICAgbWF0LXRhYmxlXG4gICAgICBbZGF0YVNvdXJjZV09XCJ0YWJsZURhdGFcIlxuICAgICAgbWF0U29ydFxuICAgICAgW21hdFNvcnRTdGFydF09XCJ0YWJsZUNvbmZpZz8uc29ydD8uZGVmYXVsdFNvcnRTdGFydCA/PyAnYXNjJ1wiXG4gICAgICBbbWF0U29ydEFjdGl2ZV09XCJ0YWJsZUNvbmZpZz8uc29ydD8uYWN0aXZlID8/ICcnXCJcbiAgICAgIFttYXRTb3J0RGlyZWN0aW9uXT1cInRhYmxlQ29uZmlnPy5zb3J0Py5kaXJlY3Rpb24gPz8gJydcIlxuICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCRldmVudClcIlxuICAgICAgbXVsdGlUZW1wbGF0ZURhdGFSb3dzXG4gICAgPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdGFibGVDb25maWcuY29sdW1uczsgaW5kZXggYXMgaSwgbGFzdCBhcyBpc0xhc3Q7IHRyYWNrQnk6IHRyYWNrQ29sdW1uVW5pcXVlSWRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTGFzdCAmJiBjb2x1bW4uaXNTdGlja3kgJiYgY29sdW1uLmFsbG93U29ydFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4udW5pcXVlSWQgPz8gY29sdW1uLmtleVwiIFtzdGlja3lFbmRdPVwiIXNjcm9sbFNldHRpbmdzPy5zY3JvbGxFbmRcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICAgICBbc3RhcnRdPVwiY29sdW1uLnNvcnRTdGFydCA/PyAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgW21hdC1zb3J0LWhlYWRlcl09XCJjb2x1bW4uc29ydEhlYWRlciA/PyBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgICAgIFthdHRyLnNvcnRhYmxlXT1cImNvbHVtbi5hbGxvd1NvcnQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhQZXJjICsgJyUnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5taW5XaWR0aFB4ICsgJ3B4J1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmZvbnQtd2VpZ2h0XT1cIidib2xkJ1wiXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBDbGFzc109XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCIoY29sdW1uPy5zaG93VG9vbHRpcCA/IChjb2x1bW4/LnRvb2x0aXAgPyBjb2x1bW4udG9vbHRpcCA6IGNvbHVtbi50aXRsZSApIDogJycpIHx8ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbi50aXRsZSwgY29sdW1uLCBjb2xJbmRleDogaX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY29uZmlnVmFsdWU+XG4gICAgICAgICAgICAgICAgIDxzcGFuIHVpRWxsaXBzZVRleHQgKG9uQ2hhbmdlVGV4dFN0YXRlKT1cIm9uQ2hhbmdlQ29sdW1uU2l6ZShpLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2x1bW4tdGl0bGVcIj57eyBjb2x1bW4udGl0bGUgfCBzZW50ZW5jZWNhc2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGxcbiAgICAgICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgcm93SW5kZXggPSBkYXRhSW5kZXhcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhQZXJjICsgJyUnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5taW5XaWR0aFB4ICsgJ3B4J1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2soZWxlbWVudCk7IGNvbHVtbj8ucm93Q2VsbFRlbXBsYXRlQ2xpY2sgPyBjb2x1bW4hLnJvd0NlbGxUZW1wbGF0ZUNsaWNrPy4oKSA6ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHVpLXNrZWxldG9uIGNsYXNzPVwidGFibGUtc2tlbGV0b24tbG9hZGVyXCIgW2NvdW50XT1cIjFcIiBbdGhlbWVdPVwic2tlbGV0b25TdHlsZUNvbmZpZ1wiIFthcHBlYXJhbmNlXT1cIidsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRpbmc7IGVsc2UgdmFsdWVcIj48L3VpLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbHVlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpICYmIHRhYmxlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBlbGVtZW50RGV0YWlsICYmIGVsZW1lbnQgPT0gZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Fycm93X2Rvd24nIDogJ0Fycm93LWNoZXZyb24tZG93bi1pbi1saW5lJ1wiXG4gICAgICAgICAgICAgICAgICA+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5yb3dDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4ucm93Q2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBlbGVtZW50LCByb3dJbmRleH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWdEYXRhPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLmZvbnQtd2VpZ2h0XT1cImNvbHVtbi5ib2xkID8gJ2JvbGQnIDogJ25vcm1hbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnQtc2l6ZV09XCJjb2x1bW4uZm9udFNpemUgPz8gJzE0cHgnXCI+e3sgZWxlbWVudFtjb2x1bW4ua2V5XSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMYXN0ICYmIGNvbHVtbi5pc1N0aWNreSAmJiAhY29sdW1uLmFsbG93U29ydFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4udW5pcXVlSWQgPz8gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpY2t5RW5kXT1cInNjcm9sbFNldHRpbmdzLmhvcml6b250YWxTY3JvbGwgPyAhc2Nyb2xsU2V0dGluZ3Muc2Nyb2xsRW5kIDogdHJ1ZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICAgICAgW2F0dHIuc29ydGFibGVdPVwiY29sdW1uLmFsbG93U29ydCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFBlcmMgKyAnJSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLm1pbldpZHRoUHggKyAncHgnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC13ZWlnaHRdPVwiJ2JvbGQnXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcENsYXNzXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIihjb2x1bW4/LnNob3dUb29sdGlwID8gKGNvbHVtbj8udG9vbHRpcCA/IGNvbHVtbi50b29sdGlwIDogY29sdW1uLnRpdGxlICkgOiAnJykgfHwgJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmhlYWRlckNlbGxUZW1wbGF0ZTsgZWxzZSBjb25maWdWYWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29sdW1uLmhlYWRlckNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogY29sdW1uLnRpdGxlLCBjb2x1bW4sIGNvbEluZGV4OiBpfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWdWYWx1ZT5cbiAgICAgICAgICAgICAgICAgPHNwYW4gdWlFbGxpcHNlVGV4dCAob25DaGFuZ2VUZXh0U3RhdGUpPVwib25DaGFuZ2VDb2x1bW5TaXplKGksICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi10aXRsZVwiPnt7IGNvbHVtbi50aXRsZSB8IHNlbnRlbmNlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbFxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFBlcmMgKyAnJSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLm1pbldpZHRoUHggKyAncHgnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljayhlbGVtZW50KTsgY29sdW1uPy5yb3dDZWxsVGVtcGxhdGVDbGljayA/IGNvbHVtbiEucm93Q2VsbFRlbXBsYXRlQ2xpY2s/LigpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dWktc2tlbGV0b24gY2xhc3M9XCJ0YWJsZS1za2VsZXRvbi1sb2FkZXJcIiBbY291bnRdPVwiMVwiIFt0aGVtZV09XCJza2VsZXRvblN0eWxlQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cIidsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRpbmc7IGVsc2UgdmFsdWVcIj48L3VpLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbHVlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpICYmIHRhYmxlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBlbGVtZW50RGV0YWlsICYmIGVsZW1lbnQgPT0gZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Fycm93X2Rvd24nIDogJ0Fycm93LWNoZXZyb24tZG93bi1pbi1saW5lJ1wiXG4gICAgICAgICAgICAgICAgICA+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5yb3dDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4ucm93Q2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZWxlbWVudCwgcm93SW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbmZpZ0RhdGE+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuZm9udC13ZWlnaHRdPVwiY29sdW1uLmJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC1zaXplXT1cImNvbHVtbi5mb250U2l6ZSA/PyAnMTRweCdcIj57eyBlbGVtZW50W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cIiEoaXNMYXN0ICYmIGNvbHVtbi5pc1N0aWNreSkgJiYgY29sdW1uLmFsbG93U29ydFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4udW5pcXVlSWQgPz8gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpY2t5XT1cIihpc01vYmlsZSQgfCBhc3luYykgPyBmYWxzZSA6ICFzY3JvbGxTZXR0aW5ncy5zY3JvbGxTdGFydCAgJiYgISFjb2x1bW4uaXNTdGlja3lcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICAgICBbc3RhcnRdPVwiY29sdW1uLnNvcnRTdGFydCA/PyAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgW21hdC1zb3J0LWhlYWRlcl09XCJjb2x1bW4uc29ydEhlYWRlciA/PyBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5zb3J0YWJsZV09XCJjb2x1bW4uYWxsb3dTb3J0ID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgICAgIFtzdHlsZS5mb250LXdlaWdodF09XCInYm9sZCdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGhQZXJjICsgJyUnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cImNvbHVtbi5taW5XaWR0aFB4ICsgJ3B4J1wiXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBDbGFzc109XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCIoY29sdW1uPy5zaG93VG9vbHRpcCA/IChjb2x1bW4/LnRvb2x0aXAgPyBjb2x1bW4udG9vbHRpcCA6IGNvbHVtbi50aXRsZSApIDogJycpIHx8ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4udGl0bGUsIGNvbHVtbiwgY29sSW5kZXg6IGkgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWdWYWx1ZT5cbiAgICAgICAgICAgICAgICAgPHNwYW4gdWlFbGxpcHNlVGV4dCAob25DaGFuZ2VUZXh0U3RhdGUpPVwib25DaGFuZ2VDb2x1bW5TaXplKGksICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi10aXRsZVwiPnt7IGNvbHVtbi50aXRsZSB8IHNlbnRlbmNlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbFxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFBlcmMgKyAnJSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLm1pbldpZHRoUHggKyAncHgnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljayhlbGVtZW50KTsgY29sdW1uPy5yb3dDZWxsVGVtcGxhdGVDbGljayA/IGNvbHVtbiEucm93Q2VsbFRlbXBsYXRlQ2xpY2s/LigpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dWktc2tlbGV0b24gY2xhc3M9XCJ0YWJsZS1za2VsZXRvbi1sb2FkZXJcIiBbY291bnRdPVwiMVwiIFt0aGVtZV09XCJza2VsZXRvblN0eWxlQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cIidsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRpbmc7IGVsc2UgdmFsdWVcIj48L3VpLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbHVlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpICYmIHRhYmxlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBlbGVtZW50RGV0YWlsICYmIGVsZW1lbnQgPT0gZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Fycm93X2Rvd24nIDogJ0Fycm93LWNoZXZyb24tZG93bi1pbi1saW5lJ1wiXG4gICAgICAgICAgICAgICAgICA+PC91aS1pY29uPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5yb3dDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2x1bW4ucm93Q2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogZWxlbWVudCwgcm93SW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbmZpZ0RhdGE+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuZm9udC13ZWlnaHRdPVwiY29sdW1uLmJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC1zaXplXT1cImNvbHVtbi5mb250U2l6ZSA/PyAnMTRweCdcIj57eyBlbGVtZW50W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiIShpc0xhc3QgJiYgY29sdW1uLmlzU3RpY2t5KSAmJiAhY29sdW1uLmFsbG93U29ydFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4udW5pcXVlSWQgPz8gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RpY2t5XT1cIihpc01vYmlsZSQgfCBhc3luYykgPyBmYWxzZSA6ICFzY3JvbGxTZXR0aW5ncy5zY3JvbGxTdGFydCAmJiAhIWNvbHVtbi5pc1N0aWNreVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgICAgIFthdHRyLnNvcnRhYmxlXT1cImNvbHVtbi5hbGxvd1NvcnQgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICAgICAgW3N0eWxlLmZvbnQtd2VpZ2h0XT1cIidib2xkJ1wiXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBDbGFzc109XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCIoY29sdW1uPy5zaG93VG9vbHRpcCA/IChjb2x1bW4/LnRvb2x0aXAgPyBjb2x1bW4udG9vbHRpcCA6IGNvbHVtbi50aXRsZSApIDogJycpID8/ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGVsc2UgY29uZmlnVmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5oZWFkZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2x1bW4udGl0bGUsIGNvbHVtbiwgY29sSW5kZXg6IGkgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjb25maWdWYWx1ZT5cbiAgICAgICAgICAgICAgICAgPHNwYW4gdWlFbGxpcHNlVGV4dCAob25DaGFuZ2VUZXh0U3RhdGUpPVwib25DaGFuZ2VDb2x1bW5TaXplKGksICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbHVtbi10aXRsZVwiPnt7IGNvbHVtbi50aXRsZSB8IHNlbnRlbmNlY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbFxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCByb3dJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aFBlcmMgKyAnJSdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiY29sdW1uLm1pbldpZHRoUHggKyAncHgnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Sb3dDbGljayhlbGVtZW50KTsgY29sdW1uPy5yb3dDZWxsVGVtcGxhdGVDbGljayA/IGNvbHVtbiEucm93Q2VsbFRlbXBsYXRlQ2xpY2s/LigpIDogJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dWktc2tlbGV0b24gY2xhc3M9XCJ0YWJsZS1za2VsZXRvbi1sb2FkZXJcIiBbY291bnRdPVwiMVwiIFt0aGVtZV09XCJza2VsZXRvblN0eWxlQ29uZmlnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cIidsaW5lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImxvYWRpbmc7IGVsc2UgdmFsdWVcIj48L3VpLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbHVlPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIDx1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpICYmIHRhYmxlRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb3BlbmVkOiBlbGVtZW50RGV0YWlsICYmIGVsZW1lbnQgPT0gZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb25UaGVtZSA9PT0gJ2NsYXNzaWMnID8gJ0Fycm93X2Rvd24nIDogJ0Fycm93LWNoZXZyb24tZG93bi1pbi1saW5lJ1wiXG4gICAgICAgICAgICAgICAgICA+PC91aS1pY29uPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnJvd0NlbGxUZW1wbGF0ZTsgZWxzZSBjb25maWdEYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbHVtbi5yb3dDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiAgZWxlbWVudCwgcm93SW5kZXggfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbmZpZ0RhdGE+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuZm9udC13ZWlnaHRdPVwiY29sdW1uLmJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udC1zaXplXT1cImNvbHVtbi5mb250U2l6ZSA/PyAnMTRweCdcIj57eyBlbGVtZW50W2NvbHVtbi5rZXldIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgW2F0dHIuY29sc3Bhbl09XCJkaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbGVtZW50LWRldGFpbFwiICpuZ0lmPVwiZGF0YVNvdXJjZURldGFpbC5kYXRhLmxlbmd0aFwiXG4gICAgICAgICAgICAgICBbQGV4cGFuZERldGFpbF09XCJlbGVtZW50ID09PSBlbGVtZW50RGV0YWlsID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XG4gICAgICAgICAgICA8dGFibGVcbiAgICAgICAgICAgICAgbWF0LXRhYmxlXG4gICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VEZXRhaWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdoaWRlLWJvcmRlcnMnOiBlbGVtZW50ID09PSB0YWJsZURhdGFbdGFibGVEYXRhLmxlbmd0aCAtIDFdIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YWJsZUNvbHVtbiBvZiB0YWJsZURldGFpbENvbHVtbnMuY29sdW1uRGVmc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdENvbHVtbkRlZl09XCJ0YWJsZUNvbHVtbi50aXRsZVwiPlxuICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGFycm93UG9zaXRpb249XCJhZnRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInt3aWR0aDogdGFibGVDb2x1bW4uc3R5bGVzPy53aWR0aH1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0YWJsZUNvbHVtbi5zdHlsZXM/LmFsaWdubWVudCA/ICd0aC0nK3RhYmxlQ29sdW1uLnN0eWxlcz8uYWxpZ25tZW50IDogJydcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRhYmxlQ29sdW1uLnRpdGxlIHwgdXBwZXJjYXNlIH19XG4gICAgICAgICAgICAgICAgPC90aD5cblxuICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgKGNsaWNrKT1cIm9uRGV0YWlsUm93Q2xpY2soZWxlbWVudClcIlxuICAgICAgICAgICAgICAgICAgICBbYWxpZ25dPVwidGFibGVDb2x1bW4uc3R5bGVzPy5hbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0YWJsZUNvbHVtbi5zdHlsZXM/LmFsaWdubWVudCA/ICd0ZC0nK3RhYmxlQ29sdW1uLnN0eWxlcz8uYWxpZ25tZW50IDogJydcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7d2lkdGg6IHRhYmxlQ29sdW1uLnN0eWxlcz8ud2lkdGggfVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlRGF0YVRwbDsgY29udGV4dDoge2VsZW1lbnQsIHRhYmxlQ29sdW1ufVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uc0RldGFpbFRvRGlzcGxheVwiPjwvdHI+XG4gICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93RGV0YWlsOyBjb2x1bW5zOiBjb2x1bW5zRGV0YWlsVG9EaXNwbGF5O1wiPjwvdHI+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjdGFibGVEYXRhVHBsIGxldC1lbGVtZW50PVwiZWxlbWVudFwiIGxldC10YWJsZUNvbHVtbj1cInRhYmxlQ29sdW1uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi13cmFwcGVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwidGFibGVDb2x1bW4udHlwZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiRGF0YVR5cGUuRklFTERcIj5cbiAgICAgICAgICAgICAge3sgZWxlbWVudCB8IGRhdGFQcm9wZXJ0eUdldHRlcjogdGFibGVDb2x1bW4ua2V5IH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkRhdGFUeXBlLkZVTkNUSU9OXCI+XG4gICAgICAgICAgICAgIHt7IHRhYmxlQ29sdW1uLmZ1bmN0aW9uPy4oZWxlbWVudCkgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiRGF0YVR5cGUuUkVOREVSRVJcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgW2R5bmFtaWNDb21wb25lbnRdPVwiW3RhYmxlQ29sdW1uLnJlbmRlcmVyLCBlbGVtZW50XSB8IG1lbW9pemVGdW5jIDogY2FsbFJlbmRlcmVyXCI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAge3sgZWxlbWVudCB8IGRhdGFQcm9wZXJ0eUdldHRlcjogdGFibGVDb2x1bW4ua2V5IH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2V4cGFuZGVkLXJvdyc6IGVsZW1lbnREZXRhaWwgPT09IHJvdywgJ3Jvdy1jbGlja2FibGUnOiB0YWJsZURldGFpbHMsICdzZWxlY3RlZCc6IHJvdz8uc2VsZWN0ZWQsICdsYXN0LXJvdyc6IHJvdyA9PT0gdGFibGVEYXRhW3RhYmxlRGF0YS5sZW5ndGggLSAxXSAmJiAhZWxlbWVudERldGFpbCB9XCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUm93KHJvdylcIj5cbiAgICAgIDwvdHI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGVEZXRhaWxzICYmIHRhYmxlRGV0YWlsQ29sdW1ucz8uY29sdW1uRGVmcz8ubGVuZ3RoXCI+XG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2V4cGFuZGVkRGV0YWlsJ11cIiBjbGFzcz1cImRldGFpbC1yb3dcIj48L3RyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZUNvbmZpZy5ub0RhdGFSb3dUcGxcIj5cbiAgICAgICAgPHRyICptYXROb0RhdGFSb3c+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlQ29uZmlnLm5vRGF0YVJvd1RwbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90YWJsZT5cbiAgPC9kaXY+XG5cbiAgPHVpLXBhZ2luYXRvclxuICAgICpuZ0lmPVwiIXRhYmxlQ29uZmlnPy5oaWRlUGFnaW5hdGlvblwiXG4gICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIlxuICAgIFthcHBsaWNhdGlvblRoZW1lXT1cImFwcGxpY2F0aW9uVGhlbWUgIT09ICdjbGFzc2ljJyA/ICdsaWdodCcgOiAnY2xhc3NpYydcIlxuICAgIFtwYWdlU2l6ZV09XCJ0YWJsZUNvbmZpZy5wYWdpbmF0aW9uLml0ZW1zUGVyUGFnZVwiXG4gICAgW2xlbmd0aF09XCJ0YWJsZUNvbmZpZy5wYWdpbmF0aW9uLnRvdGFsSXRlbXNcIlxuICAgIFtjdXJyZW50UGFnZV09XCJ0YWJsZUNvbmZpZy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlXCJcbiAgICBbcGFnZVNpemVPcHRpb25zXT1cInRhYmxlQ29uZmlnLnBhZ2luYXRpb24uaXRlbXNQZXJQYWdlT3B0aW9uc1wiXG4gICAgKHBhZ2luYXRvckNoYW5nZSk9XCJvblBhZ2luYXRvckNoYW5nZSgkZXZlbnQpXCJcbiAgPjwvdWktcGFnaW5hdG9yPlxuPC9kaXY+XG5cbiJdfQ==