@coolon/angular-ui-powerups 16.1.0-aplpha.97 → 16.1.0-aplpha.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/table.scss +5 -0
- package/esm2022/lib/components/components.module.mjs +1 -1
- package/esm2022/lib/components/tables/abstract-table-model.mjs +7 -1
- package/esm2022/lib/components/tables/renderer/cell-portal-ref.mjs +19 -1
- package/esm2022/lib/components/tables/renderer/footer-row-portal-ref.mjs +12 -0
- package/esm2022/lib/components/tables/renderer/table-body/table-body.component.mjs +12 -7
- package/fesm2022/coolon-angular-ui-powerups.mjs +94 -56
- package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
- package/lib/components/tables/abstract-table-model.d.ts +3 -0
- package/lib/components/tables/renderer/cell-portal-ref.d.ts +8 -0
- package/lib/components/tables/renderer/footer-row-portal-ref.d.ts +8 -0
- package/lib/components/tables/renderer/table-body/table-body.component.d.ts +2 -0
- package/package.json +1 -1
|
@@ -8,10 +8,11 @@ import { AbstractTableModel } from "../../abstract-table-model";
|
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import * as i1 from "@angular/common";
|
|
10
10
|
import * as i2 from "@angular/material/table";
|
|
11
|
-
import * as i3 from "@angular/cdk/
|
|
12
|
-
import * as i4 from "
|
|
13
|
-
import * as i5 from "
|
|
14
|
-
import * as i6 from "../table-
|
|
11
|
+
import * as i3 from "@angular/cdk/portal";
|
|
12
|
+
import * as i4 from "@angular/cdk/scrolling";
|
|
13
|
+
import * as i5 from "ng-table-virtual-scroll";
|
|
14
|
+
import * as i6 from "../table-cell/table-cell.component";
|
|
15
|
+
import * as i7 from "../table-header-cell/table-header-cell.component";
|
|
15
16
|
export const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
|
|
16
17
|
export class TableRowAttributesDirective {
|
|
17
18
|
elementRef;
|
|
@@ -159,8 +160,12 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
159
160
|
clearTimeout(this.scrollTimeout);
|
|
160
161
|
}
|
|
161
162
|
}
|
|
163
|
+
initialiseFooter($event) {
|
|
164
|
+
const portalRef = $event;
|
|
165
|
+
this.tableModel.footerRowPortalRef.onInit(portalRef.instance);
|
|
166
|
+
}
|
|
162
167
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, deps: [{ token: AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
163
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableBodyComponent, selector: "aup-table-body", inputs: { data$: "data$", tableModel: "tableModel", showHeader$: "showHeader$", showHeader: "showHeader", trackBy: "trackBy", scrollMode$: "scrollMode$", scrollMode: "scrollMode" }, host: { properties: { "attr.scrollMode": "this.scrollMode", "class": "this.baseCssClass", "class.hide-header": "this.hideHeader", "style.--aup-table-header-height": "this.headerHeightCssVar", "style.--aup-table-row-height": "this.rowHeightCssVar" } }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, ngImport: i0, template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\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: "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: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type:
|
|
168
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableBodyComponent, selector: "aup-table-body", inputs: { data$: "data$", tableModel: "tableModel", showHeader$: "showHeader$", showHeader: "showHeader", trackBy: "trackBy", scrollMode$: "scrollMode$", scrollMode: "scrollMode" }, host: { properties: { "attr.scrollMode": "this.scrollMode", "class": "this.baseCssClass", "class.hide-header": "this.hideHeader", "style.--aup-table-header-height": "this.headerHeightCssVar", "style.--aup-table-row-height": "this.rowHeightCssVar" } }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, ngImport: i0, template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n <ng-container matColumnDef=\"sticky-footer\" *ngIf=\"tableModel.footerRowPortalRef\">\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"columns$.length\">\n <ng-container [cdkPortalOutlet]=\"tableModel.footerRowPortalRef.portal\" (attached)=\"initialiseFooter($event)\"></ng-container>\n </td>\n <tr mat-footer-row *matFooterRowDef=\"['sticky-footer']; sticky: true\"></tr>\n </ng-container>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n<!-- Layout doesn't work yet - probably needs fixed footer row height -->\n<!-- <ng-container matColumnDef=\"sticky-footer\" *ngIf=\"tableModel.footerRowPortalRef\">-->\n<!-- <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"columns$.length\">-->\n<!-- <ng-container [cdkPortalOutlet]=\"tableModel.footerRowPortalRef.portal\" (attached)=\"initialiseFooter($event)\"></ng-container>-->\n<!-- </td>-->\n<!-- <tr mat-footer-row *matFooterRowDef=\"['sticky-footer']; sticky: true\"></tr>-->\n<!-- </ng-container>-->\n\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\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: "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.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { 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: "directive", type: i2.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-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: "component", type: i2.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i5.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "directive", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: ["aupTableRowAttributes"] }, { kind: "component", type: i6.TableCellComponent, selector: "aup-table-cell", inputs: ["row", "column", "editSession", "tableModel"] }, { kind: "component", type: i7.TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: ["column"] }] });
|
|
164
169
|
}
|
|
165
170
|
__decorate([
|
|
166
171
|
Proxify(),
|
|
@@ -188,7 +193,7 @@ __decorate([
|
|
|
188
193
|
], TableBodyComponent.prototype, "scrollMode", null);
|
|
189
194
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
|
|
190
195
|
type: Component,
|
|
191
|
-
args: [{ selector: "aup-table-body", template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"] }]
|
|
196
|
+
args: [{ selector: "aup-table-body", template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n <ng-container matColumnDef=\"sticky-footer\" *ngIf=\"tableModel.footerRowPortalRef\">\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"columns$.length\">\n <ng-container [cdkPortalOutlet]=\"tableModel.footerRowPortalRef.portal\" (attached)=\"initialiseFooter($event)\"></ng-container>\n </td>\n <tr mat-footer-row *matFooterRowDef=\"['sticky-footer']; sticky: true\"></tr>\n </ng-container>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n<!-- Layout doesn't work yet - probably needs fixed footer row height -->\n<!-- <ng-container matColumnDef=\"sticky-footer\" *ngIf=\"tableModel.footerRowPortalRef\">-->\n<!-- <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"columns$.length\">-->\n<!-- <ng-container [cdkPortalOutlet]=\"tableModel.footerRowPortalRef.portal\" (attached)=\"initialiseFooter($event)\"></ng-container>-->\n<!-- </td>-->\n<!-- <tr mat-footer-row *matFooterRowDef=\"['sticky-footer']; sticky: true\"></tr>-->\n<!-- </ng-container>-->\n\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"] }]
|
|
192
197
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
193
198
|
type: Inject,
|
|
194
199
|
args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
|
|
@@ -227,4 +232,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
|
|
|
227
232
|
type: HostBinding,
|
|
228
233
|
args: ["style.--aup-table-row-height"]
|
|
229
234
|
}] } });
|
|
230
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBRUwsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUVMLFFBQVEsRUFDUixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBRWpCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQUc5RCxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBRyxJQUFJLGNBQWMsQ0FBUyw0Q0FBNEMsQ0FBQyxDQUFBO0FBTWxJLE1BQU0sT0FBTywyQkFBMkI7SUFLUDtJQUYvQixxQkFBcUIsQ0FBd0I7SUFFN0MsWUFBK0IsVUFBbUM7UUFBbkMs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QUU7OytDQUNzQjtBQUdoQztJQURDLE9BQU8sRUFBRTs7b0RBQ29DO0FBRzlDO0lBREMsT0FBTyxFQUFFOztxREFDaUM7QUFHM0M7SUFEQyxpQkFBaUIsRUFBRTs7b0RBQ0Y7QUFNbEI7SUFEQyxPQUFPLEVBQUU7OEJBQ0csVUFBVTtxREFBcUY7QUFJNUc7SUFGQyxpQkFBaUIsRUFBRTs7b0RBRStCOzJGQXRCakQsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGdCQUFnQjs7MEJBaURiLE1BQU07MkJBQUMsMENBQTBDOzswQkFBRyxRQUFROzRDQTFDaEUsS0FBSztzQkFEYixLQUFLO2dCQUlHLFVBQVU7c0JBRGxCLEtBQUs7Z0JBSUcsV0FBVztzQkFEbkIsS0FBSztnQkFJRyxVQUFVO3NCQURsQixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJRyxXQUFXO3NCQURuQixLQUFLO2dCQUtHLFVBQVU7c0JBRmxCLEtBQUs7O3NCQUNMLFdBQVc7dUJBQUMsaUJBQWlCO2dCQUk5QixjQUFjO3NCQURiLFNBQVM7dUJBQUMsd0JBQXdCO2dCQWNuQyxZQUFZO3NCQURYLFdBQVc7dUJBQUMsT0FBTztnQkFrRGhCLFVBQVU7c0JBRGIsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBTTVCLGtCQUFrQjtzQkFEckIsV0FBVzt1QkFBQyxpQ0FBaUM7Z0JBTTFDLGVBQWU7c0JBRGxCLFdBQVc7dUJBQUMsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnR9IGZyb20gXCJAYW5ndWxhci9jZGsvc2Nyb2xsaW5nXCI7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIERzbCxcbiAgTGlzdE1vZGVsLFxuICBMaXN0TW9kZWxDaGFpbixcbiAgTWFwTW9kZWxDaGFpbixcbiAgTXV0YWJsZVZhbHVlTW9kZWwsXG4gIFByb3hpZnksXG4gIHByb3hpZnksXG4gIFN0b3JlSW5WYWx1ZU1vZGVsLFxuICBUcmFuc2FjdGlvbk9ic2VydmVyLFxuICBWYWx1ZU1vZGVsXG59IGZyb20gXCJAY29vbG9uL3BlY3RpblwiO1xuaW1wb3J0IHtUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlfSBmcm9tIFwibmctdGFibGUtdmlydHVhbC1zY3JvbGxcIjtcbmltcG9ydCB7UmVzaXplQXdhcmVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi9yZXNpemUtYXdhcmUuY29tcG9uZW50XCI7XG5pbXBvcnQge0Fic3RyYWN0VGFibGVNb2RlbH0gZnJvbSBcIi4uLy4uL2Fic3RyYWN0LXRhYmxlLW1vZGVsXCI7XG5pbXBvcnQge0NvbHVtbk1vZGVsfSBmcm9tIFwiLi4vLi4vY29sdW1uL2NvbHVtbi1tb2RlbFwiO1xuXG5leHBvcnQgY29uc3QgQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSID0gbmV3IEluamVjdGlvblRva2VuPG51bWJlcj4oXCJBVVBfVEFCTEVfVklSVFVBTF9TQ1JPTExfQlVGRkVSX01VTFRJUExJRVJcIilcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2F1cFRhYmxlUm93QXR0cmlidXRlc11cIixcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVSb3dBdHRyaWJ1dGVzRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKVxuICBhdXBUYWJsZVJvd0F0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYXR0ciBpbiB0aGlzLmF1cFRhYmxlUm93QXR0cmlidXRlcykge1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIHRoaXMuYXVwVGFibGVSb3dBdHRyaWJ1dGVzW2F0dHJdKTtcbiAgICB9XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImF1cC10YWJsZS1ib2R5XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGFibGUtYm9keS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGFibGUtYm9keS5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5Q29tcG9uZW50PFJvdyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBSZXNpemVBd2FyZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3IgZGF0YSQgPSBwcm94aWZ5KExpc3RNb2RlbDxSb3c+KTtcblxuICBASW5wdXQoKSBAUHJveGlmeSgpXG4gIGFjY2Vzc29yIHRhYmxlTW9kZWwgPSBwcm94aWZ5KEFic3RyYWN0VGFibGVNb2RlbDxSb3c+KTtcblxuICBASW5wdXQoKSBAUHJveGlmeSgpXG4gIGFjY2Vzc29yIHNob3dIZWFkZXIkID0gcHJveGlmeShWYWx1ZU1vZGVsPGJvb2xlYW4+KTtcblxuICBASW5wdXQoKSBAU3RvcmVJblZhbHVlTW9kZWwoKVxuICBhY2Nlc3NvciBzaG93SGVhZGVyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICB0cmFja0J5OiAoaW5kZXg6IG51bWJlciwgaXRlbTogUm93KSA9PiBhbnlcblxuICBASW5wdXQoKSBAUHJveGlmeSgpXG4gIGFjY2Vzc29yIHNjcm9sbE1vZGUkOiBWYWx1ZU1vZGVsPFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlPiA9IHByb3hpZnkoVmFsdWVNb2RlbDxUYWJsZUJvZHlDb21wb25lbnQuU2Nyb2xsTW9kZT4pO1xuXG4gIEBJbnB1dCgpIEBTdG9yZUluVmFsdWVNb2RlbCgpXG4gIEBIb3N0QmluZGluZyhcImF0dHIuc2Nyb2xsTW9kZVwiKVxuICBhY2Nlc3NvciBzY3JvbGxNb2RlOiBUYWJsZUJvZHlDb21wb25lbnQuU2Nyb2xsTW9kZSA9IFwibm9uZVwiO1xuXG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KVxuICBzY3JvbGxWaWV3cG9ydDogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0XG5cbiAgY29sdW1ucyQ6IExpc3RNb2RlbENoYWluPENvbHVtbk1vZGVsPFJvdz4+O1xuICBjb2x1bW5JZHMkOiBMaXN0TW9kZWxDaGFpbjxzdHJpbmc+O1xuXG4gIHByaXZhdGUgY29sdW1uc0J5SWQkOiBNYXBNb2RlbENoYWluPHN0cmluZywgQ29sdW1uTW9kZWw8Um93Pj47XG5cblxuICAvLyBUT0RPOiBzdXBwb3J0IHVzZXIgZGVmaW5lZCBoZWFkZXIgYW5kIHJvdyBoZWlnaHRzIHZpYSBjc3MgdmFycy5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhlYWRlckhlaWdodCQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWw8bnVtYmVyPig0OCk7XG4gIHByb3RlY3RlZCByb3dIZWlnaHQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPG51bWJlcj4oNDQpO1xuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzXCIpXG4gIGJhc2VDc3NDbGFzcyA9IFwiYXVwLXRhYmxlLWNvbXBvbmVudFwiO1xuXG4gIHByb3RlY3RlZCB2aXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZSA9IG5ldyBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlPFJvdz4oKTtcbiAgcHJpdmF0ZSB2aXJ0dWFsU2Nyb2xsQWN0aXZlJCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbChmYWxzZSk7XG4gIHByaXZhdGUgc2Nyb2xsVGltZW91dDogYW55O1xuXG5cbiAgY29uc3RydWN0b3IoQEluamVjdChBVVBfVEFCTEVfVklSVFVBTF9TQ1JPTExfQlVGRkVSX01VTFRJUExJRVIpIEBPcHRpb25hbCgpIHByb3RlY3RlZCBidWZmZXJNdWx0aXBsaWVyOiBudW1iZXIgPSAxKSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCB7Y2hhaW4sIHdoZW4sIG9ic2VydmV9ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMpO1xuXG4gICAgY29uc3QgYWN0dWFsSGVhZGVySGVpZ2h0JCA9IGNoYWluKHRoaXMuc2hvd0hlYWRlciQpLm1hcChzaG93ID0+IHtcbiAgICAgIHJldHVybiBzaG93ID8gdGhpcy5oZWFkZXJIZWlnaHQkLnZhbHVlIDogMDtcbiAgICB9LCB7ZGVwZW5kc09uOiB0aGlzLmhlYWRlckhlaWdodCR9KTtcblxuXG4gICAgLy8gcGVyZm9ybWFuY2UgaXMgdGVycmlibGUgaWYgdGhlIGRhdGEgY2hhbmdlcyB3aGlsZSB3ZSdyZSBzY3JvbGxpbmcsIHNvIHdlIHBvc3Rwb25lIHVwZGF0ZXMgdW50aWxcbiAgICAvLyBzY3JvbGxpbmcgc3RvcHMuXG4gICAgY29uc3QgZGVsYXllZERhdGVhJCA9IGNoYWluKHRoaXMuZGF0YSQpLnBvc3Rwb25lV2hpbGUodGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlJClcbiAgICB3aGVuKGRlbGF5ZWREYXRlYSQpLmNoYW5nZXMoZGVsYXRlZERhdGEgPT4ge1xuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZS5kYXRhID0gZGVsYXRlZERhdGE7XG4gICAgICB0aGlzLnNjaGVkdWxlVGFibGVIZWlnaHRDaGVjaygpO1xuICAgIH0sIHtpbml0aWFsVmFsdWU6IFwiZXZhbHVhdGVcIn0pXG5cblxuICAgIHRoaXMub25Jbml0KCgpID0+IHtcbiAgICAgIHRoaXMuY29sdW1ucyQgPSBjaGFpbih0aGlzLnRhYmxlTW9kZWwudmlzaWJsZUNvbHVtbnMkKTtcbiAgICAgIHRoaXMuY29sdW1uSWRzJCA9IGNoYWluKHRoaXMuY29sdW1ucyQpLnBsdWNrKFwiY29sdW1uSWRcIik7XG4gICAgICB0aGlzLmNvbHVtbnNCeUlkJCA9IGNoYWluKHRoaXMuY29sdW1ucyQpLmluZGV4QnkoJ2NvbHVtbklkJyk7XG4gICAgfSk7XG5cbiAgICAvLyBjb25zdCB0eG8gPSBuZXcgVHJhbnNhY3Rpb25PYnNlcnZlcih7dmVyYm9zZTogZmFsc2V9KS5vbkV2ZW50KGUgPT4gY29uc29sZS5sb2coZS5uYW1lLCBlLnBheWxvYWQpKTtcbiAgICAvLyB0eG8ub2JzZXJ2ZSgndGhpcy52aXJ0dWFsU2Nyb2xsUm93UmFuZ2UkJywgdGhpcy52aXJ0dWFsU2Nyb2xsUm93UmFuZ2UkKTtcbiAgICAvLyB0eG8ub2JzZXJ2ZSgndGhpcy52aXJ0dWFsU2Nyb2xsU3BhY2VyU2l6ZSQnLCB0aGlzLnZpcnR1YWxTY3JvbGxTcGFjZXJTaXplJCk7XG4gICAgLy8gdHhvLm9ic2VydmUoJ3RoaXMudmlydHVhbFJvd3MkJywgdGhpcy52aXJ0dWFsUm93cyQpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLnRhYmxlQm9keUhlaWdodCQnLCB0aGlzLnRhYmxlQm9keUhlaWdodCQpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkJywgdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlJCk7XG5cbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxWaWV3cG9ydCkge1xuICAgICAgY29uc3Qge29ic2VydmV9ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMpO1xuICAgICAgdGhpcy5zY3JvbGxWaWV3cG9ydC5lbGVtZW50U2Nyb2xsZWQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ub3RpZnlTY3JvbGxlZCgpKTtcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5oaWRlLWhlYWRlclwiKVxuICBnZXQgaGlkZUhlYWRlcigpIHtcbiAgICByZXR1cm4gIXRoaXMuc2hvd0hlYWRlcjtcbiAgfVxuXG4gIEBIb3N0QmluZGluZyhcInN0eWxlLi0tYXVwLXRhYmxlLWhlYWRlci1oZWlnaHRcIilcbiAgZ2V0IGhlYWRlckhlaWdodENzc1ZhcigpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5oZWFkZXJIZWlnaHQkLnZhbHVlfXB4YFxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuLS1hdXAtdGFibGUtcm93LWhlaWdodFwiKVxuICBnZXQgcm93SGVpZ2h0Q3NzVmFyKCkge1xuICAgIHJldHVybiBgJHt0aGlzLnJvd0hlaWdodCQudmFsdWV9cHhgXG4gIH1cblxuICBpc0VkaXRpbmcocm93OiBSb3cpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnRhYmxlTW9kZWwuZ2V0RWRpdFNlc3Npb25Gb3Iocm93KTtcbiAgfVxuXG4gIG5vdGlmeUNlbGxDbGlja2VkKGNvbHVtbk1vZGVsOiBDb2x1bW5Nb2RlbDxSb3c+LCByb3c6IFJvdykge1xuICAgIHRoaXMudGFibGVNb2RlbC5fbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWwsIHJvdyk7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuXG4gIGlzRmlyc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU1vZGVsLmZpcnN0VmlzaWJsZUNvbHVtbiQucXVlcnkoKS52YWx1ZT8uY29sdW1uSWQgPT09IGNvbHVtbklkO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcblxuICBpc0xhc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU1vZGVsLmxhc3RWaXNpYmxlQ29sdW1uJC5xdWVyeSgpLnZhbHVlPy5jb2x1bW5JZCA9PT0gY29sdW1uSWQ7XG4gIH1cblxuICBnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjbGFzc2VzID0gW2BhdXAtY29sLSR7dGhpcy5jb2x1bW5zQnlJZCQuZ2V0KGNvbHVtbklkKS5kYXNoZXJpc2VkQ29sdW1uSWR9YF07XG4gICAgaWYgKHRoaXMuaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQpKSB7XG4gICAgICBjbGFzc2VzLnB1c2goXCJmaXJzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMYXN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImxhc3QtdmlzaWJsZS1jb2x1bW5cIik7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVRhYmxlSGVpZ2h0Q2hlY2sod2FpdE1pbGxpcyA9IDUwKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB0Ym9keSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0Ym9keVwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGJvZHlIZWlnaHQgPSB0Ym9keS5vZmZzZXRIZWlnaHQ7XG4gICAgICBpZiAodGhpcy5kYXRhJC5sZW5ndGggPiAwICYmIGJvZHlIZWlnaHQgPCB0aGlzLnJvd0hlaWdodCQudmFsdWUpIHtcbiAgICAgICAgLy8gSGFja3MgdG8gZ2V0IG91ciB2aXJ0dWFsIHNjcm9sbCB0byByZXBhaW50XG4gICAgICAgIC8vIExvZ2dlci5nZXQodGhpcykubG9nKGByb3dDb3VudD0ke3RoaXMuZGF0YSQubGVuZ3RofSwgYm9keUhlaWdodD0ke2JvZHlIZWlnaHR9IC0+IHZpcnR1YWwgdGFibGUgbm90IHJlbmRlcmluZywgdHJpZ2dlcmluZyByZXNpemUgdG8gZm9yY2UgcmVwYWludGApXG4gICAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVzaXplJykpO1xuICAgICAgICBpZiAod2FpdE1pbGxpcyA8IDUwMCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVUYWJsZUhlaWdodENoZWNrKHdhaXRNaWxsaXMgKyA1MCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB3YWl0TWlsbGlzKVxuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTY3JvbGxlZCgpIHtcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkLnZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLmNsZWFyU2Nyb2xsVGltZW91dCgpO1xuICAgIHRoaXMuc2Nyb2xsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQudmFsdWUgPSBmYWxzZTtcbiAgICB9LCAyMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclNjcm9sbFRpbWVvdXQoKSB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVGltZW91dCk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IG5hbWVzcGFjZSBUYWJsZUJvZHlDb21wb25lbnQge1xuICBleHBvcnQgdHlwZSBTY3JvbGxNb2RlID0gXCJub25lXCIgfCBcImNsYXNzaWNcIiB8IFwidmlydHVhbFwiO1xufVxuIiwiXG48ZGl2IGNsYXNzPVwiY2xhc3NpYy1zY3JvbGwtY29udGFpbmVyXCIgKm5nSWY9XCJzY3JvbGxNb2RlJC52YWx1ZSAhPT0gJ3ZpcnR1YWwnXCI+XG4gIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YSQudmFsdWVcIiBbdHJhY2tCeV09XCJ0cmFja0J5XCIgW211bHRpVGVtcGxhdGVEYXRhUm93c10+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucyQudmFsdWU7IGluZGV4IGFzIGluZGV4OyBmaXJzdCBhcyBmaXJzdDsgbGFzdCBhcyBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7Y29sdW1uLmNvbHVtbklkfX1cIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCIgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiPlxuICAgICAgICA8YXVwLXRhYmxlLWhlYWRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIChjbGljayk9XCJub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5lbmFibGUtY3Vyc29yXT1cInRhYmxlTW9kZWwuaXNDdXJzb3JFbmFibGVkKGNvbHVtbilcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxhdXAtdGFibGUtY2VsbCBbY29sdW1uXT1cIiRhbnkoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVNb2RlbF09XCIkYW55KHRhYmxlTW9kZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0U2Vzc2lvbl09XCIkYW55KHRhYmxlTW9kZWwuZ2V0RWRpdFNlc3Npb25Gb3Iocm93KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1jZWxsPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzJC52YWx1ZTsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzJC52YWx1ZTsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInRhYmxlTW9kZWwuZ2V0Um93Q2xhc3Nlcyhyb3cpXCJcbiAgICAgICAgW2NsYXNzLmVuYWJsZS1ob3Zlcl09XCJ0YWJsZU1vZGVsLmlzSG92ZXJFbmFibGVkKClcIlxuICAgICAgICBbYXVwVGFibGVSb3dBdHRyaWJ1dGVzXT1cInRhYmxlTW9kZWwuZ2V0Um93QXR0cmlidXRlcyhyb3cpXCJcbiAgICAgICAgW2F0dHIuYXVwLXJvdy1pZF09XCJ0cmFja0J5KGksIHJvdylcIlxuICAgID48L3RyPlxuXG4gIDwvdGFibGU+XG48L2Rpdj5cblxuPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCAgKm5nSWY9XCJzY3JvbGxNb2RlJC52YWx1ZSA9PT0gJ3ZpcnR1YWwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dnNJdGVtU2l6ZV09XCJyb3dIZWlnaHQkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJIZWlnaHRdPVwiaGVhZGVySGVpZ2h0JC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYnVmZmVyTXVsdGlwbGllcl09XCJidWZmZXJNdWx0aXBsaWVyXCJcbj5cbiAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJ2aXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZVwiIFt0cmFja0J5XT1cInRyYWNrQnlcIj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJC52YWx1ZTsgaW5kZXggYXMgaW5kZXg7IGZpcnN0IGFzIGZpcnN0OyBsYXN0IGFzIGxhc3RcIlxuICAgICAgICAgICAgICAgICAgbWF0Q29sdW1uRGVmPVwie3tjb2x1bW4uY29sdW1uSWR9fVwiPlxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuZmxleF09XCJjb2x1bW4uaXNGbGV4KClcIiBbY2xhc3MuaGlkZV09XCIhY29sdW1uLmlzVmlzaWJsZSgpXCI+XG4gICAgICAgIDxhdXAtdGFibGUtaGVhZGVyLWNlbGwgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWlkXT1cImNvbHVtbi5jb2x1bW5JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1oZWFkZXItY2VsbD5cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cIm5vdGlmeUNlbGxDbGlja2VkKGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgW2NsYXNzLmVuYWJsZS1jdXJzb3JdPVwidGFibGVNb2RlbC5pc0N1cnNvckVuYWJsZWQoY29sdW1uKVwiXG4gICAgICAgICAgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCJcbiAgICAgICAgICBbY2xhc3MuaGlkZV09XCIhY29sdW1uLmlzVmlzaWJsZSgpXCJcbiAgICAgID5cbiAgICAgICAgPGF1cC10YWJsZS1jZWxsIFtjb2x1bW5dPVwiJGFueShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZU1vZGVsXT1cIiRhbnkodGFibGVNb2RlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2VkaXRTZXNzaW9uXT1cIiRhbnkodGFibGVNb2RlbC5nZXRFZGl0U2Vzc2lvbkZvcihyb3cpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWlkXT1cImNvbHVtbi5jb2x1bW5JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWNlbGw+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5JZHMkLnZhbHVlOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5JZHMkLnZhbHVlOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgW25nQ2xhc3NdPVwidGFibGVNb2RlbC5nZXRSb3dDbGFzc2VzKHJvdylcIlxuICAgICAgICBbY2xhc3MuZW5hYmxlLWhvdmVyXT1cInRhYmxlTW9kZWwuaXNIb3ZlckVuYWJsZWQoKVwiXG4gICAgICAgIFthdXBUYWJsZVJvd0F0dHJpYnV0ZXNdPVwidGFibGVNb2RlbC5nZXRSb3dBdHRyaWJ1dGVzKHJvdylcIlxuICAgICAgICBbYXR0ci5hdXAtcm93LWlkXT1cInRyYWNrQnkoaSwgcm93KVwiXG4gICAgPjwvdHI+XG5cbiAgPC90YWJsZT5cbjwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuXG4iXX0=
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBRUwsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUVMLFFBQVEsRUFDUixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBRWpCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7QUFHOUQsTUFBTSxDQUFDLE1BQU0sMENBQTBDLEdBQUcsSUFBSSxjQUFjLENBQVMsNENBQTRDLENBQUMsQ0FBQTtBQU1sSSxNQUFNLE9BQU8sMkJBQTJCO0lBS1A7SUFGL0IscUJBQXFCLENBQXdCO0lBRTdDLFlBQStCLFVBQW1DO1FBQW5D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QUFDLFFBQVEsQ0FBQyxDQUFBO0lBQy9ELENBQUM7dUdBcEtVLGtCQUFrQixrQkE2Q1QsMENBQTBDOzJGQTdDbkQsa0JBQWtCLHdoQkF3QmxCLHdCQUF3Qix1RUNsRnJDLGkrSkFtR0EsbzhGRDdEYSwyQkFBMkI7O0FBdUI3QjtJQURDLE9BQU8sRUFBRTs7K0NBQ3NCO0FBR2hDO0lBREMsT0FBTyxFQUFFOztvREFDb0M7QUFHOUM7SUFEQyxPQUFPLEVBQUU7O3FEQUNpQztBQUczQztJQURDLGlCQUFpQixFQUFFOztvREFDRjtBQU1sQjtJQURDLE9BQU8sRUFBRTs4QkFDRyxVQUFVO3FEQUFxRjtBQUk1RztJQUZDLGlCQUFpQixFQUFFOztvREFFK0I7MkZBdEJqRCxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzswQkFpRGIsTUFBTTsyQkFBQywwQ0FBMEM7OzBCQUFHLFFBQVE7NENBMUNoRSxLQUFLO3NCQURiLEtBQUs7Z0JBSUcsVUFBVTtzQkFEbEIsS0FBSztnQkFJRyxXQUFXO3NCQURuQixLQUFLO2dCQUlHLFVBQVU7c0JBRGxCLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUlHLFdBQVc7c0JBRG5CLEtBQUs7Z0JBS0csVUFBVTtzQkFGbEIsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBSTlCLGNBQWM7c0JBRGIsU0FBUzt1QkFBQyx3QkFBd0I7Z0JBY25DLFlBQVk7c0JBRFgsV0FBVzt1QkFBQyxPQUFPO2dCQWtEaEIsVUFBVTtzQkFEYixXQUFXO3VCQUFDLG1CQUFtQjtnQkFNNUIsa0JBQWtCO3NCQURyQixXQUFXO3VCQUFDLGlDQUFpQztnQkFNMUMsZUFBZTtzQkFEbEIsV0FBVzt1QkFBQyw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Nka1BvcnRhbE91dGxldEF0dGFjaGVkUmVmLCBDb21wb25lbnRQb3J0YWx9IGZyb20gXCJAYW5ndWxhci9jZGsvcG9ydGFsXCI7XG5pbXBvcnQge0Nka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBEc2wsXG4gIExpc3RNb2RlbCxcbiAgTGlzdE1vZGVsQ2hhaW4sXG4gIE1hcE1vZGVsQ2hhaW4sXG4gIE11dGFibGVWYWx1ZU1vZGVsLFxuICBQcm94aWZ5LFxuICBwcm94aWZ5LFxuICBTdG9yZUluVmFsdWVNb2RlbCwgVHJhY2UsXG4gIFRyYW5zYWN0aW9uT2JzZXJ2ZXIsXG4gIFZhbHVlTW9kZWxcbn0gZnJvbSBcIkBjb29sb24vcGVjdGluXCI7XG5pbXBvcnQge1RhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2V9IGZyb20gXCJuZy10YWJsZS12aXJ0dWFsLXNjcm9sbFwiO1xuaW1wb3J0IHtSZXNpemVBd2FyZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3Jlc2l6ZS1hd2FyZS5jb21wb25lbnRcIjtcbmltcG9ydCB7QWJzdHJhY3RUYWJsZU1vZGVsfSBmcm9tIFwiLi4vLi4vYWJzdHJhY3QtdGFibGUtbW9kZWxcIjtcbmltcG9ydCB7Q29sdW1uTW9kZWx9IGZyb20gXCIuLi8uLi9jb2x1bW4vY29sdW1uLW1vZGVsXCI7XG5cbmV4cG9ydCBjb25zdCBBVVBfVEFCTEVfVklSVFVBTF9TQ1JPTExfQlVGRkVSX01VTFRJUExJRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48bnVtYmVyPihcIkFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUlwiKVxuXG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbYXVwVGFibGVSb3dBdHRyaWJ1dGVzXVwiLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVJvd0F0dHJpYnV0ZXNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpXG4gIGF1cFRhYmxlUm93QXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBhdHRyIGluIHRoaXMuYXVwVGFibGVSb3dBdHRyaWJ1dGVzKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ciwgdGhpcy5hdXBUYWJsZVJvd0F0dHJpYnV0ZXNbYXR0cl0pO1xuICAgIH1cbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXVwLXRhYmxlLWJvZHlcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi90YWJsZS1ib2R5LmNvbXBvbmVudC5zY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlDb21wb25lbnQ8Um93IGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFJlc2l6ZUF3YXJlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBkYXRhJCA9IHByb3hpZnkoTGlzdE1vZGVsPFJvdz4pO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3IgdGFibGVNb2RlbCA9IHByb3hpZnkoQWJzdHJhY3RUYWJsZU1vZGVsPFJvdz4pO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2hvd0hlYWRlciQgPSBwcm94aWZ5KFZhbHVlTW9kZWw8Ym9vbGVhbj4pO1xuXG4gIEBJbnB1dCgpIEBTdG9yZUluVmFsdWVNb2RlbCgpXG4gIGFjY2Vzc29yIHNob3dIZWFkZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHRyYWNrQnk6IChpbmRleDogbnVtYmVyLCBpdGVtOiBSb3cpID0+IGFueVxuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2Nyb2xsTW9kZSQ6IFZhbHVlTW9kZWw8VGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGU+ID0gcHJveGlmeShWYWx1ZU1vZGVsPFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlPik7XG5cbiAgQElucHV0KCkgQFN0b3JlSW5WYWx1ZU1vZGVsKClcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci5zY3JvbGxNb2RlXCIpXG4gIGFjY2Vzc29yIHNjcm9sbE1vZGU6IFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlID0gXCJub25lXCI7XG5cbiAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpXG4gIHNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnRcblxuICBjb2x1bW5zJDogTGlzdE1vZGVsQ2hhaW48Q29sdW1uTW9kZWw8Um93Pj47XG4gIGNvbHVtbklkcyQ6IExpc3RNb2RlbENoYWluPHN0cmluZz47XG5cbiAgcHJpdmF0ZSBjb2x1bW5zQnlJZCQ6IE1hcE1vZGVsQ2hhaW48c3RyaW5nLCBDb2x1bW5Nb2RlbDxSb3c+PjtcblxuXG4gIC8vIFRPRE86IHN1cHBvcnQgdXNlciBkZWZpbmVkIGhlYWRlciBhbmQgcm93IGhlaWdodHMgdmlhIGNzcyB2YXJzLlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGVhZGVySGVpZ2h0JCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxudW1iZXI+KDQ4KTtcbiAgcHJvdGVjdGVkIHJvd0hlaWdodCQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWw8bnVtYmVyPig0NCk7XG5cbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3NcIilcbiAgYmFzZUNzc0NsYXNzID0gXCJhdXAtdGFibGUtY29tcG9uZW50XCI7XG5cbiAgcHJvdGVjdGVkIHZpcnR1YWxTY3JvbGxEYXRhU291cmNlID0gbmV3IFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2U8Um93PigpO1xuICBwcml2YXRlIHZpcnR1YWxTY3JvbGxBY3RpdmUkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsKGZhbHNlKTtcbiAgcHJpdmF0ZSBzY3JvbGxUaW1lb3V0OiBhbnk7XG5cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUikgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGJ1ZmZlck11bHRpcGxpZXI6IG51bWJlciA9IDEpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IHtjaGFpbiwgd2hlbiwgb2JzZXJ2ZX0gPSBEc2wuZGlzcG9zZVdpdGgodGhpcyk7XG5cbiAgICBjb25zdCBhY3R1YWxIZWFkZXJIZWlnaHQkID0gY2hhaW4odGhpcy5zaG93SGVhZGVyJCkubWFwKHNob3cgPT4ge1xuICAgICAgcmV0dXJuIHNob3cgPyB0aGlzLmhlYWRlckhlaWdodCQudmFsdWUgOiAwO1xuICAgIH0sIHtkZXBlbmRzT246IHRoaXMuaGVhZGVySGVpZ2h0JH0pO1xuXG5cbiAgICAvLyBwZXJmb3JtYW5jZSBpcyB0ZXJyaWJsZSBpZiB0aGUgZGF0YSBjaGFuZ2VzIHdoaWxlIHdlJ3JlIHNjcm9sbGluZywgc28gd2UgcG9zdHBvbmUgdXBkYXRlcyB1bnRpbFxuICAgIC8vIHNjcm9sbGluZyBzdG9wcy5cbiAgICBjb25zdCBkZWxheWVkRGF0ZWEkID0gY2hhaW4odGhpcy5kYXRhJCkucG9zdHBvbmVXaGlsZSh0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkKVxuICAgIHdoZW4oZGVsYXllZERhdGVhJCkuY2hhbmdlcyhkZWxhdGVkRGF0YSA9PiB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxEYXRhU291cmNlLmRhdGEgPSBkZWxhdGVkRGF0YTtcbiAgICAgIHRoaXMuc2NoZWR1bGVUYWJsZUhlaWdodENoZWNrKCk7XG4gICAgfSwge2luaXRpYWxWYWx1ZTogXCJldmFsdWF0ZVwifSlcblxuXG4gICAgdGhpcy5vbkluaXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zJCA9IGNoYWluKHRoaXMudGFibGVNb2RlbC52aXNpYmxlQ29sdW1ucyQpO1xuICAgICAgdGhpcy5jb2x1bW5JZHMkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkucGx1Y2soXCJjb2x1bW5JZFwiKTtcbiAgICAgIHRoaXMuY29sdW1uc0J5SWQkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkuaW5kZXhCeSgnY29sdW1uSWQnKTtcbiAgICB9KTtcblxuICAgIC8vIGNvbnN0IHR4byA9IG5ldyBUcmFuc2FjdGlvbk9ic2VydmVyKHt2ZXJib3NlOiBmYWxzZX0pLm9uRXZlbnQoZSA9PiBjb25zb2xlLmxvZyhlLm5hbWUsIGUucGF5bG9hZCkpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLnZpcnR1YWxTY3JvbGxSb3dSYW5nZSQnLCB0aGlzLnZpcnR1YWxTY3JvbGxSb3dSYW5nZSQpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLnZpcnR1YWxTY3JvbGxTcGFjZXJTaXplJCcsIHRoaXMudmlydHVhbFNjcm9sbFNwYWNlclNpemUkKTtcbiAgICAvLyB0eG8ub2JzZXJ2ZSgndGhpcy52aXJ0dWFsUm93cyQnLCB0aGlzLnZpcnR1YWxSb3dzJCk7XG4gICAgLy8gdHhvLm9ic2VydmUoJ3RoaXMudGFibGVCb2R5SGVpZ2h0JCcsIHRoaXMudGFibGVCb2R5SGVpZ2h0JCk7XG4gICAgLy8gdHhvLm9ic2VydmUoJ3RoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQnLCB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkKTtcblxuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIGlmICh0aGlzLnNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICBjb25zdCB7b2JzZXJ2ZX0gPSBEc2wuZGlzcG9zZVdpdGgodGhpcyk7XG4gICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0LmVsZW1lbnRTY3JvbGxlZCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLm5vdGlmeVNjcm9sbGVkKCkpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmhpZGUtaGVhZGVyXCIpXG4gIGdldCBoaWRlSGVhZGVyKCkge1xuICAgIHJldHVybiAhdGhpcy5zaG93SGVhZGVyO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuLS1hdXAtdGFibGUtaGVhZGVyLWhlaWdodFwiKVxuICBnZXQgaGVhZGVySGVpZ2h0Q3NzVmFyKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmhlYWRlckhlaWdodCQudmFsdWV9cHhgXG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS4tLWF1cC10YWJsZS1yb3ctaGVpZ2h0XCIpXG4gIGdldCByb3dIZWlnaHRDc3NWYXIoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMucm93SGVpZ2h0JC52YWx1ZX1weGBcbiAgfVxuXG4gIGlzRWRpdGluZyhyb3c6IFJvdyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMudGFibGVNb2RlbC5nZXRFZGl0U2Vzc2lvbkZvcihyb3cpO1xuICB9XG5cbiAgbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWw6IENvbHVtbk1vZGVsPFJvdz4sIHJvdzogUm93KSB7XG4gICAgdGhpcy50YWJsZU1vZGVsLl9ub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW5Nb2RlbCwgcm93KTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG5cbiAgaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwuZmlyc3RWaXNpYmxlQ29sdW1uJC5xdWVyeSgpLnZhbHVlPy5jb2x1bW5JZCA9PT0gY29sdW1uSWQ7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuXG4gIGlzTGFzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwubGFzdFZpc2libGVDb2x1bW4kLnF1ZXJ5KCkudmFsdWU/LmNvbHVtbklkID09PSBjb2x1bW5JZDtcbiAgfVxuXG4gIGdldENvbHVtbkNsYXNzZXMoY29sdW1uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbYGF1cC1jb2wtJHt0aGlzLmNvbHVtbnNCeUlkJC5nZXQoY29sdW1uSWQpLmRhc2hlcmlzZWRDb2x1bW5JZH1gXTtcbiAgICBpZiAodGhpcy5pc0ZpcnN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImZpcnN0LXZpc2libGUtY29sdW1uXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xhc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkKSkge1xuICAgICAgY2xhc3Nlcy5wdXNoKFwibGFzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVGFibGVIZWlnaHRDaGVjayh3YWl0TWlsbGlzID0gNTApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHRib2R5ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcInRib2R5XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRib2R5Lm9mZnNldEhlaWdodDtcbiAgICAgIGlmICh0aGlzLmRhdGEkLmxlbmd0aCA+IDAgJiYgYm9keUhlaWdodCA8IHRoaXMucm93SGVpZ2h0JC52YWx1ZSkge1xuICAgICAgICAvLyBIYWNrcyB0byBnZXQgb3VyIHZpcnR1YWwgc2Nyb2xsIHRvIHJlcGFpbnRcbiAgICAgICAgLy8gTG9nZ2VyLmdldCh0aGlzKS5sb2coYHJvd0NvdW50PSR7dGhpcy5kYXRhJC5sZW5ndGh9LCBib2R5SGVpZ2h0PSR7Ym9keUhlaWdodH0gLT4gdmlydHVhbCB0YWJsZSBub3QgcmVuZGVyaW5nLCB0cmlnZ2VyaW5nIHJlc2l6ZSB0byBmb3JjZSByZXBhaW50YClcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gICAgICAgIGlmICh3YWl0TWlsbGlzIDwgNTAwKSB7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVRhYmxlSGVpZ2h0Q2hlY2sod2FpdE1pbGxpcyArIDUwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHdhaXRNaWxsaXMpXG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVNjcm9sbGVkKCkge1xuICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQudmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuY2xlYXJTY3JvbGxUaW1lb3V0KCk7XG4gICAgdGhpcy5zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlJC52YWx1ZSA9IGZhbHNlO1xuICAgIH0sIDIwMCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU2Nyb2xsVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxUaW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXNlRm9vdGVyKCRldmVudDogQ2RrUG9ydGFsT3V0bGV0QXR0YWNoZWRSZWYpIHtcbiAgICBjb25zdCBwb3J0YWxSZWYgPSAkZXZlbnQgYXMgQ29tcG9uZW50UmVmPGFueT47XG4gICAgdGhpcy50YWJsZU1vZGVsLmZvb3RlclJvd1BvcnRhbFJlZi5vbkluaXQocG9ydGFsUmVmLmluc3RhbmNlKVxuICB9XG59XG5cblxuZXhwb3J0IG5hbWVzcGFjZSBUYWJsZUJvZHlDb21wb25lbnQge1xuICBleHBvcnQgdHlwZSBTY3JvbGxNb2RlID0gXCJub25lXCIgfCBcImNsYXNzaWNcIiB8IFwidmlydHVhbFwiO1xufVxuIiwiXG48ZGl2IGNsYXNzPVwiY2xhc3NpYy1zY3JvbGwtY29udGFpbmVyXCIgKm5nSWY9XCJzY3JvbGxNb2RlJC52YWx1ZSAhPT0gJ3ZpcnR1YWwnXCI+XG4gIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YSQudmFsdWVcIiBbdHJhY2tCeV09XCJ0cmFja0J5XCIgW211bHRpVGVtcGxhdGVEYXRhUm93c10+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucyQudmFsdWU7IGluZGV4IGFzIGluZGV4OyBmaXJzdCBhcyBmaXJzdDsgbGFzdCBhcyBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7Y29sdW1uLmNvbHVtbklkfX1cIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCIgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiPlxuICAgICAgICA8YXVwLXRhYmxlLWhlYWRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIChjbGljayk9XCJub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5lbmFibGUtY3Vyc29yXT1cInRhYmxlTW9kZWwuaXNDdXJzb3JFbmFibGVkKGNvbHVtbilcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxhdXAtdGFibGUtY2VsbCBbY29sdW1uXT1cIiRhbnkoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVNb2RlbF09XCIkYW55KHRhYmxlTW9kZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0U2Vzc2lvbl09XCIkYW55KHRhYmxlTW9kZWwuZ2V0RWRpdFNlc3Npb25Gb3Iocm93KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1jZWxsPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzJC52YWx1ZTsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzJC52YWx1ZTsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInRhYmxlTW9kZWwuZ2V0Um93Q2xhc3Nlcyhyb3cpXCJcbiAgICAgICAgW2NsYXNzLmVuYWJsZS1ob3Zlcl09XCJ0YWJsZU1vZGVsLmlzSG92ZXJFbmFibGVkKClcIlxuICAgICAgICBbYXVwVGFibGVSb3dBdHRyaWJ1dGVzXT1cInRhYmxlTW9kZWwuZ2V0Um93QXR0cmlidXRlcyhyb3cpXCJcbiAgICAgICAgW2F0dHIuYXVwLXJvdy1pZF09XCJ0cmFja0J5KGksIHJvdylcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdGlja3ktZm9vdGVyXCIgKm5nSWY9XCJ0YWJsZU1vZGVsLmZvb3RlclJvd1BvcnRhbFJlZlwiPlxuICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMkLmxlbmd0aFwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtjZGtQb3J0YWxPdXRsZXRdPVwidGFibGVNb2RlbC5mb290ZXJSb3dQb3J0YWxSZWYucG9ydGFsXCIgKGF0dGFjaGVkKT1cImluaXRpYWxpc2VGb290ZXIoJGV2ZW50KVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwiWydzdGlja3ktZm9vdGVyJ107IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC90YWJsZT5cbjwvZGl2PlxuXG48Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICAqbmdJZj1cInNjcm9sbE1vZGUkLnZhbHVlID09PSAndmlydHVhbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R2c0l0ZW1TaXplXT1cInJvd0hlaWdodCQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlYWRlckhlaWdodF09XCJoZWFkZXJIZWlnaHQkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJNdWx0aXBsaWVyXT1cImJ1ZmZlck11bHRpcGxpZXJcIlxuPlxuICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInZpcnR1YWxTY3JvbGxEYXRhU291cmNlXCIgW3RyYWNrQnldPVwidHJhY2tCeVwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnMkLnZhbHVlOyBpbmRleCBhcyBpbmRleDsgZmlyc3QgYXMgZmlyc3Q7IGxhc3QgYXMgbGFzdFwiXG4gICAgICAgICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5jb2x1bW5JZH19XCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiIFtjbGFzcy5oaWRlXT1cIiFjb2x1bW4uaXNWaXNpYmxlKClcIj5cbiAgICAgICAgPGF1cC10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwibm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICBbY2xhc3MuZW5hYmxlLWN1cnNvcl09XCJ0YWJsZU1vZGVsLmlzQ3Vyc29yRW5hYmxlZChjb2x1bW4pXCJcbiAgICAgICAgICBbY2xhc3MuZmxleF09XCJjb2x1bW4uaXNGbGV4KClcIlxuICAgICAgICAgIFtjbGFzcy5oaWRlXT1cIiFjb2x1bW4uaXNWaXNpYmxlKClcIlxuICAgICAgPlxuICAgICAgICA8YXVwLXRhYmxlLWNlbGwgW2NvbHVtbl09XCIkYW55KGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlTW9kZWxdPVwiJGFueSh0YWJsZU1vZGVsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZWRpdFNlc3Npb25dPVwiJGFueSh0YWJsZU1vZGVsLmdldEVkaXRTZXNzaW9uRm9yKHJvdykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtY2VsbD5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbklkcyQudmFsdWU7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbklkcyQudmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBbbmdDbGFzc109XCJ0YWJsZU1vZGVsLmdldFJvd0NsYXNzZXMocm93KVwiXG4gICAgICAgIFtjbGFzcy5lbmFibGUtaG92ZXJdPVwidGFibGVNb2RlbC5pc0hvdmVyRW5hYmxlZCgpXCJcbiAgICAgICAgW2F1cFRhYmxlUm93QXR0cmlidXRlc109XCJ0YWJsZU1vZGVsLmdldFJvd0F0dHJpYnV0ZXMocm93KVwiXG4gICAgICAgIFthdHRyLmF1cC1yb3ctaWRdPVwidHJhY2tCeShpLCByb3cpXCJcbiAgICA+PC90cj5cblxuPCEtLSAgICBMYXlvdXQgZG9lc24ndCB3b3JrIHlldCAtIHByb2JhYmx5IG5lZWRzIGZpeGVkIGZvb3RlciByb3cgaGVpZ2h0IC0tPlxuPCEtLSAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInN0aWNreS1mb290ZXJcIiAqbmdJZj1cInRhYmxlTW9kZWwuZm9vdGVyUm93UG9ydGFsUmVmXCI+LS0+XG48IS0tICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMkLmxlbmd0aFwiPi0tPlxuPCEtLSAgICAgICAgPG5nLWNvbnRhaW5lciBbY2RrUG9ydGFsT3V0bGV0XT1cInRhYmxlTW9kZWwuZm9vdGVyUm93UG9ydGFsUmVmLnBvcnRhbFwiIChhdHRhY2hlZCk9XCJpbml0aWFsaXNlRm9vdGVyKCRldmVudClcIj48L25nLWNvbnRhaW5lcj4tLT5cbjwhLS0gICAgICA8L3RkPi0tPlxuPCEtLSAgICAgIDx0ciBtYXQtZm9vdGVyLXJvdyAqbWF0Rm9vdGVyUm93RGVmPVwiWydzdGlja3ktZm9vdGVyJ107IHN0aWNreTogdHJ1ZVwiPjwvdHI+LS0+XG48IS0tICAgIDwvbmctY29udGFpbmVyPi0tPlxuXG5cbiAgPC90YWJsZT5cbjwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuXG4iXX0=
|