@one-paragon/angular-utilities 1.2.11 → 1.2.13
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/action-state/ngrx.d.ts +1 -1
- package/esm2022/table-builder/classes/TableBuilderDataSource.mjs +18 -27
- package/esm2022/table-builder/classes/table-builder.mjs +2 -2
- package/esm2022/table-builder/classes/table-store.mjs +9 -13
- package/esm2022/table-builder/components/column-builder/column-helpers.mjs +1 -3
- package/esm2022/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +11 -17
- package/esm2022/table-builder/components/generic-table/generic-table.component.mjs +21 -20
- package/esm2022/table-builder/components/generic-table/paginator.component.mjs +58 -56
- package/esm2022/table-builder/components/table-container/table-container.mjs +55 -51
- package/esm2022/table-builder/components/table-container/virtual-scroll-container.mjs +57 -34
- package/esm2022/table-builder/directives/tb-filter.directive.mjs +10 -19
- package/esm2022/table-builder/services/export-to-csv.service.mjs +6 -16
- package/fesm2022/one-paragon-angular-utilities.mjs +239 -242
- package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -1
- package/package.json +1 -1
- package/table-builder/classes/TableBuilderDataSource.d.ts +4 -4
- package/table-builder/classes/table-store.d.ts +5 -3
- package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +5 -3
- package/table-builder/components/generic-table/generic-table.component.d.ts +3 -1
- package/table-builder/components/generic-table/paginator.component.d.ts +20 -19
- package/table-builder/components/table-container/table-container-imports.d.ts +2 -2
- package/table-builder/components/table-container/table-container.d.ts +10 -11
- package/table-builder/components/table-container/virtual-scroll-container.d.ts +15 -2
- package/table-builder/directives/table-wrapper.directive.d.ts +1 -1
- package/table-builder/directives/tb-filter.directive.d.ts +2 -3
- package/table-builder/services/export-to-csv.service.d.ts +1 -6
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { Component, ChangeDetectionStrategy, inject } from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import { orderedCodeVisibleMetaData, TableStore } from '../../classes/table-store';
|
|
1
|
+
import { Component, ChangeDetectionStrategy, inject, computed } from '@angular/core';
|
|
2
|
+
import { TableStore } from '../../classes/table-store';
|
|
4
3
|
import { DragDropModule } from '@angular/cdk/drag-drop';
|
|
5
4
|
import { AsyncPipe } from '@angular/common';
|
|
6
5
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
@@ -8,7 +7,6 @@ import { MatIconModule } from '@angular/material/icon';
|
|
|
8
7
|
import { MatButtonModule } from '@angular/material/button';
|
|
9
8
|
import { MatMenuModule } from '@angular/material/menu';
|
|
10
9
|
import { SpaceCasePipe, StopPropagationDirective } from '../../../utilities';
|
|
11
|
-
import { defaultShareReplay } from '../../../rxjs';
|
|
12
10
|
import * as i0 from "@angular/core";
|
|
13
11
|
import * as i1 from "@angular/material/tooltip";
|
|
14
12
|
import * as i2 from "@angular/material/icon";
|
|
@@ -17,15 +15,11 @@ import * as i4 from "@angular/material/menu";
|
|
|
17
15
|
import * as i5 from "@angular/cdk/drag-drop";
|
|
18
16
|
export class GenColDisplayerComponent {
|
|
19
17
|
tableState = inject(TableStore);
|
|
20
|
-
columns
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
displayName: md.displayName,
|
|
26
|
-
isVisible: !state.hiddenKeys.includes(md.key)
|
|
27
|
-
}))), defaultShareReplay());
|
|
28
|
-
}
|
|
18
|
+
$columns = computed(() => this.tableState.$orderedCodeVisibleMetaDatas().map(md => ({
|
|
19
|
+
key: md.key,
|
|
20
|
+
displayName: md.displayName,
|
|
21
|
+
isVisible: !this.tableState.$hiddenKeys().includes(md.key)
|
|
22
|
+
})));
|
|
29
23
|
reset(displayCols) {
|
|
30
24
|
displayCols.forEach(c => c.isVisible = true);
|
|
31
25
|
this.emit(displayCols);
|
|
@@ -41,13 +35,13 @@ export class GenColDisplayerComponent {
|
|
|
41
35
|
this.tableState.setHiddenColumns(displayCols.map(c => ({ key: c.key, visible: c.isVisible })));
|
|
42
36
|
}
|
|
43
37
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenColDisplayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
44
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenColDisplayerComponent, isStandalone: true, selector: "tb-col-displayer", ngImport: i0, template: "@if(columns
|
|
38
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenColDisplayerComponent, isStandalone: true, selector: "tb-col-displayer", ngImport: i0, template: "@if($columns(); as displayCols){\r\n <span matTooltip=\"Show/hide columns\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n </button>\r\n </span>\r\n <mat-menu #menu=\"matMenu\" class=\"my-mat-menu\">\r\n\r\n <button mat-menu-item>\r\n <span matTooltip=\"Close\">\r\n <button class=\"filter-button\" mat-icon-button>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <button mat-menu-item stop-propagation>\r\n <span matTooltip=\"Show all columns\">\r\n <button mat-icon-button (click)=\"reset(displayCols)\">\r\n <mat-icon color=\"primary\">done_all</mat-icon>\r\n </button>\r\n </span>\r\n\r\n <span matTooltip=\"Hide all columns\">\r\n <button mat-icon-button (click)=\"unset(displayCols)\">\r\n <mat-icon color=\"primary\">cancel</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\" stop-propagation [cdkDropListLockAxis]=\"'y'\">\r\n @for (col of displayCols; track col.key) {\r\n <button [class.isHidden]=\"!col.isVisible\" stop-propagation mat-menu-item cdkDrag [cdkDragData]=\"col\">\r\n <div (click)=\"col.isVisible = !col.isVisible; emit(displayCols)\" style=\"display: flex; align-items: center;\">\r\n @if(col.isVisible){\r\n <button mat-icon-button matTooltip=\"Hide Column\" class=\"show-hide\">\r\n <mat-icon color=\"primary\">check_box</mat-icon>\r\n </button>\r\n } @else {\r\n <button mat-icon-button matTooltip=\"Show Column\" class=\"show-hide\">\r\n <mat-icon>indeterminate_check_box</mat-icon>\r\n </button>\r\n }\r\n \r\n <p class=\"label\">\r\n {{col.displayName || (col.key | spaceCase) }}\r\n </p>\r\n\r\n </div>\r\n </button>\r\n }\r\n\r\n </div>\r\n </mat-menu>\r\n}", styles: [".show-hide{margin-right:15px;height:24px;width:24px;padding:4px}.label{color:#6495ed;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:left;margin:0;font-size:17px;font-weight:700;display:inline-block;width:66%}.row{margin:0;padding:0}.isHidden{background-color:#d3d3d3;color:#a9a9a9;font-weight:700;font-size:17px;white-space:nowrap}.filter-button{margin-top:10px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.mdc-list-item__primary-text{display:inline-block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: SpaceCasePipe, name: "spaceCase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
45
39
|
}
|
|
46
40
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenColDisplayerComponent, decorators: [{
|
|
47
41
|
type: Component,
|
|
48
42
|
args: [{ selector: 'tb-col-displayer', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
49
43
|
AsyncPipe, MatTooltipModule, MatIconModule, MatButtonModule, MatMenuModule, StopPropagationDirective,
|
|
50
44
|
DragDropModule, SpaceCasePipe
|
|
51
|
-
], template: "@if(columns
|
|
52
|
-
}]
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
], template: "@if($columns(); as displayCols){\r\n <span matTooltip=\"Show/hide columns\">\r\n <button mat-icon-button [matMenuTriggerFor]=\"menu\">\r\n <mat-icon color=\"primary\">visibility_off</mat-icon>\r\n </button>\r\n </span>\r\n <mat-menu #menu=\"matMenu\" class=\"my-mat-menu\">\r\n\r\n <button mat-menu-item>\r\n <span matTooltip=\"Close\">\r\n <button class=\"filter-button\" mat-icon-button>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <button mat-menu-item stop-propagation>\r\n <span matTooltip=\"Show all columns\">\r\n <button mat-icon-button (click)=\"reset(displayCols)\">\r\n <mat-icon color=\"primary\">done_all</mat-icon>\r\n </button>\r\n </span>\r\n\r\n <span matTooltip=\"Hide all columns\">\r\n <button mat-icon-button (click)=\"unset(displayCols)\">\r\n <mat-icon color=\"primary\">cancel</mat-icon>\r\n </button>\r\n </span>\r\n </button>\r\n\r\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\" stop-propagation [cdkDropListLockAxis]=\"'y'\">\r\n @for (col of displayCols; track col.key) {\r\n <button [class.isHidden]=\"!col.isVisible\" stop-propagation mat-menu-item cdkDrag [cdkDragData]=\"col\">\r\n <div (click)=\"col.isVisible = !col.isVisible; emit(displayCols)\" style=\"display: flex; align-items: center;\">\r\n @if(col.isVisible){\r\n <button mat-icon-button matTooltip=\"Hide Column\" class=\"show-hide\">\r\n <mat-icon color=\"primary\">check_box</mat-icon>\r\n </button>\r\n } @else {\r\n <button mat-icon-button matTooltip=\"Show Column\" class=\"show-hide\">\r\n <mat-icon>indeterminate_check_box</mat-icon>\r\n </button>\r\n }\r\n \r\n <p class=\"label\">\r\n {{col.displayName || (col.key | spaceCase) }}\r\n </p>\r\n\r\n </div>\r\n </button>\r\n }\r\n\r\n </div>\r\n </mat-menu>\r\n}", styles: [".show-hide{margin-right:15px;height:24px;width:24px;padding:4px}.label{color:#6495ed;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;text-align:left;margin:0;font-size:17px;font-weight:700;display:inline-block;width:66%}.row{margin:0;padding:0}.isHidden{background-color:#d3d3d3;color:#a9a9a9;font-weight:700;font-size:17px;white-space:nowrap}.filter-button{margin-top:10px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.mdc-list-item__primary-text{display:inline-block;width:100%}\n"] }]
|
|
46
|
+
}] });
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuLWNvbC1kaXNwbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy9nZW4tY29sLWRpc3BsYXllci9nZW4tY29sLWRpc3BsYXllci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbi1jb2wtZGlzcGxheWVyL2dlbi1jb2wtZGlzcGxheWVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFjLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFhN0UsTUFBTSxPQUFPLHdCQUF3QjtJQUMzQixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hDLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLEdBQUcsQ0FBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1FBQ1gsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXO1FBQzNCLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7S0FDM0QsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVMLEtBQUssQ0FBQyxXQUF5QjtRQUM3QixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBNEI7UUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtJQUNyRyxDQUFDO0lBQ0QsS0FBSyxDQUFDLFdBQXlCO1FBQzdCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksQ0FBQyxXQUF5QjtRQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRyxDQUFDO3VHQXRCVSx3QkFBd0I7MkZBQXhCLHdCQUF3Qiw0RUN0QnJDLDhnRUFzREMseXVCRHBDYyxnQkFBZ0IsNFRBQUUsYUFBYSxtTEFBRSxlQUFlLDJJQUFFLGFBQWEsOHZCQUFFLHdCQUF3Qiw4REFDcEcsY0FBYyx3L0JBQUUsYUFBYTs7MkZBR3BCLHdCQUF3QjtrQkFYcEMsU0FBUzsrQkFDRSxrQkFBa0IsbUJBR1gsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLHdCQUF3Qjt3QkFDcEcsY0FBYyxFQUFFLGFBQWE7cUJBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgaW5qZWN0LCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEaXNwbGF5Q29sIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9kaXNwbGF5LWNvbCc7XHJcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcclxuaW1wb3J0IHtDZGtEcmFnRHJvcCwgRHJhZ0Ryb3BNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQgeyBTcGFjZUNhc2VQaXBlLCBTdG9wUHJvcGFnYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Yi1jb2wtZGlzcGxheWVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuLWNvbC1kaXNwbGF5ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlbi1jb2wtZGlzcGxheWVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2ggLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQXN5bmNQaXBlLCBNYXRUb29sdGlwTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdE1lbnVNb2R1bGUsIFN0b3BQcm9wYWdhdGlvbkRpcmVjdGl2ZSxcclxuICAgIERyYWdEcm9wTW9kdWxlLCBTcGFjZUNhc2VQaXBlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2VuQ29sRGlzcGxheWVyQ29tcG9uZW50IHtcclxuICBwcml2YXRlIHRhYmxlU3RhdGUgPSBpbmplY3QoVGFibGVTdG9yZSk7XHJcbiAgJGNvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRhYmxlU3RhdGUuJG9yZGVyZWRDb2RlVmlzaWJsZU1ldGFEYXRhcygpLm1hcCggbWQgPT4gKHtcclxuICAgIGtleTogbWQua2V5LFxyXG4gICAgZGlzcGxheU5hbWU6IG1kLmRpc3BsYXlOYW1lLFxyXG4gICAgaXNWaXNpYmxlOiAhdGhpcy50YWJsZVN0YXRlLiRoaWRkZW5LZXlzKCkuaW5jbHVkZXMobWQua2V5KVxyXG4gIH0pKSk7XHJcblxyXG4gIHJlc2V0KGRpc3BsYXlDb2xzOiBEaXNwbGF5Q29sW10pIHtcclxuICAgIGRpc3BsYXlDb2xzLmZvckVhY2goYyA9PiBjLmlzVmlzaWJsZSA9IHRydWUpO1xyXG4gICAgdGhpcy5lbWl0KGRpc3BsYXlDb2xzKTtcclxuICB9XHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICB0aGlzLnRhYmxlU3RhdGUuc2V0VXNlckRlZmluZWRPcmRlcih7IG5ld09yZGVyOiBldmVudC5jdXJyZW50SW5kZXgsIG9sZE9yZGVyOmV2ZW50LnByZXZpb3VzSW5kZXggfSlcclxuICB9XHJcbiAgdW5zZXQoZGlzcGxheUNvbHM6IERpc3BsYXlDb2xbXSkge1xyXG4gICAgZGlzcGxheUNvbHMuZm9yRWFjaChjID0+IGMuaXNWaXNpYmxlID0gZmFsc2UpO1xyXG4gICAgdGhpcy5lbWl0KGRpc3BsYXlDb2xzKTtcclxuICB9XHJcblxyXG4gIGVtaXQoZGlzcGxheUNvbHM6IERpc3BsYXlDb2xbXSkge1xyXG4gICAgdGhpcy50YWJsZVN0YXRlLnNldEhpZGRlbkNvbHVtbnMoZGlzcGxheUNvbHMubWFwKCBjID0+ICh7a2V5OiBjLmtleSwgdmlzaWJsZTogYy5pc1Zpc2libGV9KSkpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYoJGNvbHVtbnMoKTsgYXMgZGlzcGxheUNvbHMpe1xyXG4gIDxzcGFuIG1hdFRvb2x0aXA9XCJTaG93L2hpZGUgY29sdW1uc1wiPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cclxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwicHJpbWFyeVwiPnZpc2liaWxpdHlfb2ZmPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvc3Bhbj5cclxuICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJteS1tYXQtbWVudVwiPlxyXG5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbT5cclxuICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIkNsb3NlXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZpbHRlci1idXR0b25cIiBtYXQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gc3RvcC1wcm9wYWdhdGlvbj5cclxuICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIlNob3cgYWxsIGNvbHVtbnNcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVzZXQoZGlzcGxheUNvbHMpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+ZG9uZV9hbGw8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiBtYXRUb29sdGlwPVwiSGlkZSBhbGwgY29sdW1uc1wiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ1bnNldChkaXNwbGF5Q29scylcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCIgc3RvcC1wcm9wYWdhdGlvbiBbY2RrRHJvcExpc3RMb2NrQXhpc109XCIneSdcIj5cclxuICAgICAgQGZvciAoY29sIG9mIGRpc3BsYXlDb2xzOyB0cmFjayBjb2wua2V5KSB7XHJcbiAgICAgICAgPGJ1dHRvbiBbY2xhc3MuaXNIaWRkZW5dPVwiIWNvbC5pc1Zpc2libGVcIiBzdG9wLXByb3BhZ2F0aW9uIG1hdC1tZW51LWl0ZW0gY2RrRHJhZyBbY2RrRHJhZ0RhdGFdPVwiY29sXCI+XHJcbiAgICAgICAgPGRpdiAoY2xpY2spPVwiY29sLmlzVmlzaWJsZSA9ICFjb2wuaXNWaXNpYmxlOyBlbWl0KGRpc3BsYXlDb2xzKVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cclxuICAgICAgICAgIEBpZihjb2wuaXNWaXNpYmxlKXtcclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIkhpZGUgQ29sdW1uXCIgY2xhc3M9XCJzaG93LWhpZGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+Y2hlY2tfYm94PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlNob3cgQ29sdW1uXCIgY2xhc3M9XCJzaG93LWhpZGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24+aW5kZXRlcm1pbmF0ZV9jaGVja19ib3g8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJsYWJlbFwiPlxyXG4gICAgICAgICAgICB7e2NvbC5kaXNwbGF5TmFtZSB8fCAoY29sLmtleSB8IHNwYWNlQ2FzZSkgfX1cclxuICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9tYXQtbWVudT5cclxufSJdfQ==
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Component, ViewChild, Input, ChangeDetectionStrategy, Output, ViewContainerRef, Injector, EventEmitter, computed, inject, input, viewChild, effect, untracked, signal } from '@angular/core';
|
|
2
2
|
import { MatFooterRowDef, MatHeaderRowDef, MatTable, MatTableModule } from '@angular/material/table';
|
|
3
|
-
import { combineLatest } from 'rxjs';
|
|
4
3
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
5
4
|
import { TableStore } from '../../classes/table-store';
|
|
6
5
|
import { map } from 'rxjs/operators';
|
|
@@ -77,7 +76,6 @@ export class GenericTableComponent {
|
|
|
77
76
|
myColumns = signal({});
|
|
78
77
|
$showHeader = computed(() => !this.state.tableSettings().hideColumnHeader);
|
|
79
78
|
offset$ = this.dataStore.select(s => s.virtualScrollOffset);
|
|
80
|
-
offsetIndex = 0;
|
|
81
79
|
dataView;
|
|
82
80
|
constructor() {
|
|
83
81
|
this.setUpSelections();
|
|
@@ -149,15 +147,21 @@ export class GenericTableComponent {
|
|
|
149
147
|
this.selection.deselect(...removed);
|
|
150
148
|
}
|
|
151
149
|
});
|
|
152
|
-
if (this.state.tableSettings().usePaginator || this.state.tableSettings().useVirtualScroll) {
|
|
153
|
-
this.state.on(combineLatest([this.state.state$, this.dataStore.state$]), ([state, data]) => {
|
|
154
|
-
this.offsetIndex = data.virtualEnds.start;
|
|
155
|
-
if (this.state.tableSettings().usePaginator) {
|
|
156
|
-
this.offsetIndex += (state.pageSize * state.currentPage);
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
150
|
}
|
|
151
|
+
$usePaginator = computed(() => this.state.tableSettings().usePaginator);
|
|
152
|
+
$useVirtualScroll = computed(() => this.state.$viewType().includes('virtual'));
|
|
153
|
+
$offsetIndex = computed(() => {
|
|
154
|
+
const virtualStart = this.dataStore.selectSignal(d => d.virtualEnds.start)();
|
|
155
|
+
const pageSize = this.state.$pageSize();
|
|
156
|
+
const currentPage = this.state.$currentPage();
|
|
157
|
+
if (this.$useVirtualScroll()) {
|
|
158
|
+
return virtualStart;
|
|
159
|
+
}
|
|
160
|
+
if (this.$usePaginator()) {
|
|
161
|
+
return pageSize * currentPage;
|
|
162
|
+
}
|
|
163
|
+
return 0;
|
|
164
|
+
});
|
|
161
165
|
isGroupHeader(_, row) {
|
|
162
166
|
return row.isGroupHeader;
|
|
163
167
|
}
|
|
@@ -200,14 +204,11 @@ export class GenericTableComponent {
|
|
|
200
204
|
this.state.on(this.selection.changed, c => this.selection$.emit(c));
|
|
201
205
|
}
|
|
202
206
|
$selectableData = computed(() => {
|
|
203
|
-
if (this.state.$viewType() === 'paginator') {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
else if (this.state.$viewType() === 'virtual paginator') {
|
|
207
|
-
const previousPageRecords = this.state.state().currentPage * this.state.state().pageSize;
|
|
208
|
-
return this.$data().slice(previousPageRecords, previousPageRecords + this.state.state().pageSize);
|
|
207
|
+
if (this.state.$viewType() === 'virtual paginator' || this.state.$viewType() === 'paginator') {
|
|
208
|
+
const previousPageRecords = this.state.$currentPage() * this.state.$pageSize();
|
|
209
|
+
return this.$data().slice(previousPageRecords, previousPageRecords + this.state.$pageSize());
|
|
209
210
|
}
|
|
210
|
-
else if (this.state.$viewType() === 'all') {
|
|
211
|
+
else if (this.state.$viewType() === 'all' || this.state.$viewType() === 'virtual all') {
|
|
211
212
|
return this.$data();
|
|
212
213
|
}
|
|
213
214
|
return [];
|
|
@@ -277,14 +278,14 @@ export class GenericTableComponent {
|
|
|
277
278
|
});
|
|
278
279
|
$stickyFooter = computed(() => this.state.props().stickyFooter || this.state.$isVirtual());
|
|
279
280
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenericTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
280
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: false, isRequired: false, transformFunction: null }, $displayData: { classPropertyName: "$displayData", publicName: "displayData", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: false, isRequired: false, transformFunction: null }, columnBuilders: { classPropertyName: "columnBuilders", publicName: "columnBuilders", isSignal: false, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selection$: "selection$" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "dropList", first: true, predicate: CdkDropList, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + offsetIndex }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: FunctionPipe, name: "func" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
281
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.2", type: GenericTableComponent, isStandalone: true, selector: "tb-generic-table", inputs: { trackBy: { classPropertyName: "trackBy", publicName: "trackBy", isSignal: false, isRequired: false, transformFunction: null }, $displayData: { classPropertyName: "$displayData", publicName: "displayData", isSignal: true, isRequired: true, transformFunction: null }, $data: { classPropertyName: "$data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: false, isRequired: false, transformFunction: null }, columnBuilders: { classPropertyName: "columnBuilders", publicName: "columnBuilders", isSignal: false, isRequired: false, transformFunction: null }, $columnInfos: { classPropertyName: "$columnInfos", publicName: "columnInfos", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selection$: "selection$" }, viewQueries: [{ propertyName: "$headerRow", first: true, predicate: MatHeaderRowDef, descendants: true, isSignal: true }, { propertyName: "$footerRow", first: true, predicate: MatFooterRowDef, descendants: true, isSignal: true }, { propertyName: "$table", first: true, predicate: MatTable, descendants: true, isSignal: true }, { propertyName: "dropList", first: true, predicate: CdkDropList, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}mat-table{overflow-x:auto}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i1.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i1.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: FunctionPipe, name: "func" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
281
282
|
}
|
|
282
283
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: GenericTableComponent, decorators: [{
|
|
283
284
|
type: Component,
|
|
284
285
|
args: [{ selector: 'tb-generic-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
285
286
|
MatTableModule, DragDropModule, MatCheckboxModule, MatButtonModule, MatIconModule, NgTemplateOutlet,
|
|
286
287
|
MatTooltipModule, AsyncPipe, FunctionPipe,
|
|
287
|
-
], template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + offsetIndex }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}\n"] }]
|
|
288
|
+
], template: "<mat-table\r\n cdkDropList\r\n cdkDropListLockAxis='x'\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n class=\"table-drag-list\"\r\n [class]=\"($footerRowStyle())\"\r\n #table\r\n [dataSource]=\"state.props().dataSource!\"\r\n [trackBy]=\"trackByFunction\"\r\n [style]=\"tableWidth | async \"\r\n>\r\n\r\n <!-- select column -->\r\n <ng-container matColumnDef=\"select\">\r\n\r\n <mat-header-cell *matHeaderCellDef class=\"select-column\">\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"!!(masterToggleChecked$ | async)\"\r\n [indeterminate]=\"masterToggleIndeterminate$ | async\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n\r\n <mat-cell *matCellDef=\"let row\" class=\"select-column\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"/>\r\n </mat-cell>\r\n\r\n <mat-footer-cell *matFooterCellDef class=\"select-column\">\r\n {{ selection.selected.length }}\r\n </mat-footer-cell>\r\n </ng-container>\r\n\r\n\r\n <!-- index column -->\r\n <ng-container matColumnDef=\"index\">\r\n <mat-header-cell *matHeaderCellDef class=\"f-mat-header-cell\" class=\"index-column\">#\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let i = index;\" class=\"index-column\">\r\n {{ 1 + i + $offsetIndex() }}\r\n </mat-cell>\r\n <mat-footer-cell *matFooterCellDef class=\"index-column\"></mat-footer-cell>\r\n </ng-container>\r\n\r\n <!-- Grouping -->\r\n <ng-container matColumnDef=\"groupHeader\">\r\n <mat-cell *matCellDef=\"let row\">\r\n @let expanded = (state.getIsExpanded | func : row.key : row.groupName );\r\n <div [style.paddingLeft]=\"row.padding + 'px !important'\">\r\n <button mat-icon-button (click)=\"setExpanded(row.key, row.groupName, !expanded());\">\r\n @if (!expanded()) {\r\n <mat-icon>chevron_right</mat-icon>\r\n } @else {\r\n <mat-icon>expand_more</mat-icon>\r\n }\r\n </button>\r\n {{ getTransform | func : row.key : row.groupHeaderDisplay }} ({{ row.length }})\r\n </div>\r\n <div style=\"flex-grow: 1\">\r\n <ng-container *ngTemplateOutlet=\"state.props().groupHeaderTemplate!; context: { element: row }\"></ng-container>\r\n </div>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matRowDef=\"let row; columns: $keys(); let i = index\"/>\r\n <mat-row [style.height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n [style.min-height]=\"state.props().groupHeaderHeight ? state.props().groupHeaderHeight + 'px' : $groupHeaderHeight()\"\r\n *matRowDef=\"let row; columns: ['groupHeader']; when: isGroupHeader\" style=\"background-color: white;\"/>\r\n</mat-table>\r\n\r\n<mat-header-row [style.height]=\"$headerHeight()\" [style.min-height]=\"$headerHeight()\"\r\n *matHeaderRowDef=\"$keys(); sticky: state.props().isSticky\" [style.top.px]=\"((offset$ | async)! * -1)\"/>\r\n<mat-footer-row [style.height]=\"$rowHeight()\" [style.min-height]=\"$rowHeight()\"\r\n *matFooterRowDef=\"$keys(); sticky: $stickyFooter() \"\r\n [style.bottom.px]=\"$stickyFooter() ? (offset$ | async) : undefined\"/>", styles: [":host{--mat-paginator-container-size: initial}.select-column{min-width:var(--tb-min-select-column-width, 42px)}.index-column{min-width:var(--tb-min-index-column-width, 42px)}.mat-mdc-row:nth-child(odd){background-color:var(--tb-odd-row-background-color, #cdeefe)}.page-amounts{color:#0000008a;font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;margin-right:.2rem}:host::ng-deep .table-drag-list.cdk-drop-list-dragging .drag-header:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}:host::ng-deep .mdc-data-table__cell,:host::ng-deep .mdc-data-table__header-cell{padding:var(--tb-cell-padding, 0 0 0 .2rem);line-height:var(--tb-cell-line-height, normal)}::ng-deep .op-date-time-input{line-height:3rem;font-size:.9rem;font-family:Roboto,Helvetica Neue,sans-serif;padding-left:.2rem;width:12rem}.small-footer mat-footer-row{min-height:1rem;height:1rem}mat-table{overflow-x:auto}\n"] }]
|
|
288
289
|
}], ctorParameters: () => [], propDecorators: { trackBy: [{
|
|
289
290
|
type: Input
|
|
290
291
|
}], rows: [{
|
|
@@ -297,4 +298,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImpor
|
|
|
297
298
|
}], selection$: [{
|
|
298
299
|
type: Output
|
|
299
300
|
}] } });
|
|
300
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFvQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4TyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBYSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEgsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQW1CLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FB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aUIsb1lBQUUsZUFBZSwySUFBRSxhQUFhLG9MQUFFLGdCQUFnQixtSkFDbkcsZ0JBQWdCLDBCQUFFLFNBQVMseUNBQUUsWUFBWTs7MkZBR2hDLHFCQUFxQjtrQkFYakMsU0FBUzsrQkFDRSxrQkFBa0IsbUJBR1gsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsY0FBYyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGdCQUFnQjt3QkFDbkcsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLFlBQVk7cUJBQzFDO3dEQWdCWSxPQUFPO3NCQUFuQixLQUFLO2dCQWFHLElBQUk7c0JBQVosS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdvQyxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBZ0o5QixVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NvbnRhaW5lclJlZiwgSW5qZWN0b3IsIEV2ZW50RW1pdHRlciwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIHZpZXdDaGlsZCwgZWZmZWN0LCB1bnRyYWNrZWQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRGb290ZXJSb3dEZWYsIE1hdEhlYWRlclJvd0RlZiwgTWF0Um93RGVmLCBNYXRUYWJsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2VsZWN0aW9uQ2hhbmdlLCBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb2x1bW5CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1uLWJ1aWxkZXIvY29sdW1uLWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGljdGlvbmFyeSc7XHJcbmltcG9ydCB7IEZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWRlZic7XHJcbmltcG9ydCB7IHByZXZpb3VzQW5kQ3VycmVudCB9IGZyb20gJy4uLy4uLy4uL3J4anMvcnhqcy1vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9Db2x1bW5JbmZvJztcclxuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIENka0Ryb3BMaXN0LCBEcmFnRHJvcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBGdW5jdGlvblBpcGUgfSBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IFRyYW5zZm9ybUNyZWF0b3IgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmFuc2Zvcm0tY3JlYXRvcic7XHJcbmltcG9ydCB7IGluaXRJbmRleFN5bWJvbCB9IGZyb20gJy4uL3RhYmxlLWNvbnRhaW5lci90YWJsZS1jb250YWluZXIuaGVscGVycy9zb3J0LXN0YXRlLmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NsYXNzZXMvdGFibGUtYnVpbGRlci1nZW5lcmFsLXNldHRpbmdzJztcclxuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBEYXRhU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2RhdGEtc3RvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Yi1nZW5lcmljLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTWF0VGFibGVNb2R1bGUsIERyYWdEcm9wTW9kdWxlLCBNYXRDaGVja2JveE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBOZ1RlbXBsYXRlT3V0bGV0LFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSwgQXN5bmNQaXBlLCBGdW5jdGlvblBpcGUsXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEdlbmVyaWNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHJvdGVjdGVkIHN0YXRlID0gaW5qZWN0KFRhYmxlU3RvcmUpO1xyXG4gIHByaXZhdGUgZGF0YVN0b3JlID0gaW5qZWN0KERhdGFTdG9yZSk7XHJcbiAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xyXG4gIHByaXZhdGUgdHJhbnNmb3JtQ3JlYXRvciA9IGluamVjdChUcmFuc2Zvcm1DcmVhdG9yKTtcclxuXHJcbiAgJGhlYWRlclJvdyA9IHZpZXdDaGlsZChNYXRIZWFkZXJSb3dEZWYpO1xyXG4gICRmb290ZXJSb3cgPSB2aWV3Q2hpbGQoTWF0Rm9vdGVyUm93RGVmKTtcclxuICAkdGFibGUgPSB2aWV3Q2hpbGQoTWF0VGFibGUpO1xyXG5cclxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pIHtcclxuICAgIHRoaXMuc3RhdGUuc2V0VXNlckRlZmluZWRPcmRlcih7IG5ld09yZGVyOmV2ZW50LmN1cnJlbnRJbmRleCwgb2xkT3JkZXI6ZXZlbnQucHJldmlvdXNJbmRleCB9KVxyXG4gIH1cclxuICBfdHJhY2tCeT86IHN0cmluZztcclxuICBASW5wdXQoKSBzZXQgdHJhY2tCeSh0cmFja0J5OiBzdHJpbmcpe1xyXG4gICAgaWYodHJhY2tCeSl7XHJcbiAgICAgIHRoaXMuX3RyYWNrQnkgPSB0cmFja0J5O1xyXG4gICAgICB0aGlzLnRyYWNrQnlGdW5jdGlvbiA9IChpbmRleDpudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbVt0cmFja0J5XTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0VXBTZWxlY3Rpb25zKHRyYWNrQnkpO1xyXG4gIH1cclxuICBnZXQgdHJhY2tCeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fdHJhY2tCeSB9XHJcbiAgJGRpc3BsYXlEYXRhID0gaW5wdXQucmVxdWlyZWQ8YW55W10+KHsgYWxpYXM6ICdkaXNwbGF5RGF0YScgfSk7XHJcbiAgJGRpc3BsYXlEYXRhTGVuZ3RoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4kZGlzcGxheURhdGEoKT8ubGVuZ3RoIHx8IDApO1xyXG4gICRoYXNGb290ZXJNZXRhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0ZS4kbWV0YURhdGFBcnJheSgpLnNvbWUobWQgPT4gISFtZC5hZGRpdGlvbmFsPy5mb290ZXIpKVxyXG4gICRkYXRhID0gaW5wdXQucmVxdWlyZWQ8YW55W10+KHsgYWxpYXM6ICdkYXRhJyB9KVxyXG4gIGRhdGEkID0gdG9PYnNlcnZhYmxlKHRoaXMuJGRhdGEpO1xyXG4gIEBJbnB1dCgpIHJvd3MhOiBRdWVyeUxpc3Q8TWF0Um93RGVmPGFueT4+O1xyXG4gIEBJbnB1dCgpIGNvbHVtbkJ1aWxkZXJzITogQ29sdW1uQnVpbGRlckNvbXBvbmVudFtdO1xyXG4gICRjb2x1bW5JbmZvcyA9IGlucHV0LnJlcXVpcmVkPENvbHVtbkluZm9bXT4oeyBhbGlhczogJ2NvbHVtbkluZm9zJyB9KTtcclxuICAkaGFzQ3VzdG9tRm9vdGVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4kY29sdW1uSW5mb3MoKT8uc29tZShjaSA9PiAhIWNpLmN1c3RvbUNlbGw/LmNvbHVtbkRlZj8uZm9vdGVyQ2VsbCkpXHJcbiAgQFZpZXdDaGlsZChDZGtEcm9wTGlzdCwgeyBzdGF0aWM6IHRydWUgfSkgZHJvcExpc3QhOiBDZGtEcm9wTGlzdDtcclxuICAkZm9vdGVyUm93U3R5bGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBoYXNEYXRhID0gISF0aGlzLiRkaXNwbGF5RGF0YUxlbmd0aCgpO1xyXG4gICAgY29uc3QgbWV0YUZvb3RlciA9IHRoaXMuJGhhc0Zvb3Rlck1ldGEoKTtcclxuICAgIGNvbnN0IGN1c3RvbUZvb3RlciA9IHRoaXMuJGhhc0N1c3RvbUZvb3RlcigpO1xyXG4gICAgY29uc3QgaGFzU2VsZWN0aW9uQ29sdW1uID0gdGhpcy5zdGF0ZS5wcm9wcygpLnNlbGVjdGlvbkNvbHVtbjtcclxuICAgIHJldHVybiBjdXN0b21Gb290ZXIgfHwgKGhhc0RhdGEgJiYgKG1ldGFGb290ZXIgfHwgaGFzU2VsZWN0aW9uQ29sdW1uKSkgPyAncmVndWxhci1mb290ZXInIDogaGFzRGF0YSA/ICduby1mb290ZXInIDogJ3NtYWxsLWZvb3Rlcic7XHJcbiAgfSk7XHJcbiAgJHNob3dGb290ZXJSb3cgPSBjb21wdXRlZCgoKSA9PiB0aGlzLiRmb290ZXJSb3dTdHlsZSgpICE9PSAnbm8tZm9vdGVyJyk7XHJcbiAgY3VycmVudENvbHVtbnMhOiBzdHJpbmdbXTtcclxuICBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xyXG4gIGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcclxuICAgIHByb3ZpZGVyczogW1xyXG4gICAgICB7cHJvdmlkZTogTWF0VGFibGUsIHVzZUZhY3Rvcnk6ICgpPT4gdGhpcy4kdGFibGUoKSB9LFxyXG4gICAgICB7cHJvdmlkZTogQ2RrRHJvcExpc3QsIHVzZUZhY3Rvcnk6ICgpPT4gdGhpcy5kcm9wTGlzdCB9LFxyXG4gICAgXSxcclxuICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3JcclxuICB9KTtcclxuICByb3dEZWZBcnIgOk1hdFJvd0RlZjxhbnk+W10gPSBbXTtcclxuICAkaGFzU2VsZWN0Q29sdW1uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwoc3RhdGUgPT4gc3RhdGUucHJvcHMuc2VsZWN0aW9uQ29sdW1uKSgpKTtcclxuICAkaGFzSW5kZXhDb2x1bW4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXRlLnNlbGVjdFNpZ25hbChzdGF0ZSA9PiBzdGF0ZS5wcm9wcy5pbmRleENvbHVtbikoKSk7XHJcbiAgbXlDb2x1bW5zID0gc2lnbmFsPERpY3Rpb25hcnk8Q29sdW1uQnVpbGRlckNvbXBvbmVudD4+KHt9KTtcclxuICAkc2hvd0hlYWRlciA9IGNvbXB1dGVkKCgpID0+ICF0aGlzLnN0YXRlLnRhYmxlU2V0dGluZ3MoKS5oaWRlQ29sdW1uSGVhZGVyKVxyXG4gIG9mZnNldCQgPSB0aGlzLmRhdGFTdG9yZS5zZWxlY3QoIHMgPT4gcy52aXJ0dWFsU2Nyb2xsT2Zmc2V0ICk7XHJcbiAgb2Zmc2V0SW5kZXggPSAwO1xyXG4gIGRhdGFWaWV3ITogT2JzZXJ2YWJsZTxhbnlbXT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5zZXRVcFNlbGVjdGlvbnMoKTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkluZm9zID0gdGhpcy4kY29sdW1uSW5mb3MoKSB8fCBbXTtcclxuICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm15Q29sdW1ucygpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkluZm8gPSBjb2x1bW5JbmZvcy5maW5kKGNpID0+IGNpLm1ldGFEYXRhLmtleSA9PT0ga2V5KTtcclxuICAgICAgICAgIGlmKCFjb2x1bW5JbmZvIHx8IGNvbHVtbkluZm8uY3VzdG9tQ2VsbCAhPT0gdmFsdWUuY3VzdG9tQ2VsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5teUNvbHVtbnMoKVtrZXldO1xyXG4gICAgICAgICAgICB0aGlzLiR0YWJsZSgpPy5yZW1vdmVDb2x1bW5EZWYodmFsdWUuY29sdW1uRGVmKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbHVtbkluZm9zLmZvckVhY2goY2kgPT4gdGhpcy5hZGRNZXRhRGF0YShjaSkpXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMuJGhlYWRlclJvdygpO1xyXG4gICAgICBjb25zdCBzaG93SGVhZGVyID0gdGhpcy4kc2hvd0hlYWRlcigpO1xyXG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMuJHRhYmxlKCk7XHJcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XHJcbiAgICAgICAgaWYoaGVhZGVyUm93ICYmIHNob3dIZWFkZXIgJiYgdGFibGUpIHRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3cpO1xyXG4gICAgICAgIGVsc2UgaWYoaGVhZGVyUm93ICYmIHRhYmxlKSB0YWJsZS5yZW1vdmVIZWFkZXJSb3dEZWYoaGVhZGVyUm93KTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgY29uc3QgZm9vdGVyUm93ID0gdGhpcy4kZm9vdGVyUm93KCk7XHJcbiAgICAgIGNvbnN0IHNob3dGb290ZXIgPSB0aGlzLiRzaG93Rm9vdGVyUm93KCk7XHJcbiAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy4kdGFibGUoKTtcclxuICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICBpZihmb290ZXJSb3cgJiYgc2hvd0Zvb3RlciAmJiB0YWJsZSkgdGFibGUuYWRkRm9vdGVyUm93RGVmKGZvb3RlclJvdyk7XHJcbiAgICAgICAgZWxzZSBpZihmb290ZXJSb3cgJiYgdGFibGUpIHRhYmxlLnJlbW92ZUZvb3RlclJvd0RlZihmb290ZXJSb3cpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0VHJhY2tCeSA9IChpbmRleDpudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbVtpbml0SW5kZXhTeW1ib2xdO1xyXG4gIHRyYWNrQnlGdW5jdGlvbiA9IHRoaXMuZGVmYXVsdFRyYWNrQnk7XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMucm93cyAmJiB0aGlzLnJvd3MgJiYgdGhpcy5teUNvbHVtbnMoKS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gICRrZXlzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgZGlzcGxheWVkID0gdGhpcy5zdGF0ZS4kb3JkZXJlZFZpc2libGVDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBidWlsdCA9IHRoaXMubXlDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBrZXlzID0gZGlzcGxheWVkLmZpbHRlcihkID0+ICEhYnVpbHRbZF0pO1xyXG4gICAgaWYodGhpcy4kaGFzU2VsZWN0Q29sdW1uKCkpe1xyXG4gICAgICBrZXlzLnVuc2hpZnQoJ3NlbGVjdCcpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy4kaGFzSW5kZXhDb2x1bW4oKSkge1xyXG4gICAgICBrZXlzLnVuc2hpZnQoJ2luZGV4Jyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9KVxyXG4gIGtleXMkID0gdG9PYnNlcnZhYmxlKHRoaXMuJGtleXMpO1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5vbih0aGlzLmtleXMkLCBrZXlzID0+IHtcclxuICAgICAgdGhpcy5yb3dEZWZBcnI/LmZvckVhY2gocm93ID0+IHJvdy5jb2x1bW5zID0ga2V5cylcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5zZWxlY3RhYmxlRGF0YSQsIChkYXRhKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCl7XHJcbiAgICAgICAgY29uc3QgdHJhY2tCeUZ1bmN0aW9uID0gdGhpcy50cmFja0J5ID8gKHMpID0+IGRhdGEuZXZlcnkoZCA9PiAgZFt0aGlzLnRyYWNrQnkhXSAhPT0gc1t0aGlzLnRyYWNrQnkhXSkgOiBzID0+ICFkYXRhLmluY2x1ZGVzKHMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5maWx0ZXIodHJhY2tCeUZ1bmN0aW9uKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdCguLi5yZW1vdmVkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYodGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzKCkudXNlUGFnaW5hdG9yIHx8IHRoaXMuc3RhdGUudGFibGVTZXR0aW5ncygpLnVzZVZpcnR1YWxTY3JvbGwpIHtcclxuICAgICAgdGhpcy5zdGF0ZS5vbihjb21iaW5lTGF0ZXN0KFt0aGlzLnN0YXRlLnN0YXRlJCwgdGhpcy5kYXRhU3RvcmUuc3RhdGUkXSksIChbc3RhdGUsIGRhdGFdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vZmZzZXRJbmRleCA9IGRhdGEudmlydHVhbEVuZHMuc3RhcnQ7XHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzKCkudXNlUGFnaW5hdG9yKSB7XHJcbiAgICAgICAgICB0aGlzLm9mZnNldEluZGV4ICs9IChzdGF0ZS5wYWdlU2l6ZSAqIHN0YXRlLmN1cnJlbnRQYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGlzR3JvdXBIZWFkZXIoXzogbnVtYmVyLCByb3c6IHsgaXNHcm91cEhlYWRlcjogYm9vbGVhbiB9KSB7XHJcbiAgICByZXR1cm4gcm93LmlzR3JvdXBIZWFkZXI7XHJcbiAgfVxyXG5cclxuICBzZXRFeHBhbmRlZChrZXk6IHN0cmluZywgZ3JvdXBLZXk6IHN0cmluZywgaXNFeHBhbmRlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0ZS51cGRhdGVFeHBhbmRlZEdyb3Vwcyh7IGtleSAsIGlzRXhwYW5kZWQsIGdyb3VwS2V5IH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkTWV0YURhdGEoY29sdW1uOiBDb2x1bW5JbmZvKSB7XHJcbiAgICBjb25zdCBjb2x1bW5CdWlsZGVyID0gdGhpcy5teUNvbHVtbnMoKVtjb2x1bW4ubWV0YURhdGEua2V5XTtcclxuICAgIGlmKGNvbHVtbkJ1aWxkZXIpIHtcclxuICAgICAgY29sdW1uQnVpbGRlci5tZXRhRGF0YSA9IGNvbHVtbi5tZXRhRGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoQ29sdW1uQnVpbGRlckNvbXBvbmVudCwge1xyXG4gICAgICAgIGluZGV4OiAwLFxyXG4gICAgICAgIGluamVjdG9yOiB0aGlzLmluamVjdG9yXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb21wb25lbnQuaW5zdGFuY2UuY3VzdG9tQ2VsbCA9IGNvbHVtbi5jdXN0b21DZWxsO1xyXG4gICAgICBjb21wb25lbnQuaW5zdGFuY2UubWV0YURhdGEgPSBjb2x1bW4ubWV0YURhdGE7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5kYXRhJCA9IHRoaXMuZGF0YSQ7XHJcbiAgICAgIHRoaXMubXlDb2x1bW5zLnVwZGF0ZShtYyA9PiAoey4uLm1jLCBbY29sdW1uLm1ldGFEYXRhLmtleV06IGNvbXBvbmVudC5pbnN0YW5jZX0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVSb3dEZWZzID0gKGRlZnM6TWF0Um93RGVmPGFueT5bXSk9PntcclxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy4kdGFibGUoKTtcclxuICAgIGlmKCF0YWJsZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5yb3dEZWZBcnIuZm9yRWFjaChyPT4gdGFibGUucmVtb3ZlUm93RGVmKHIpKTtcclxuICAgIHRoaXMucm93RGVmQXJyID0gZGVmcztcclxuICAgIGRlZnMuZm9yRWFjaChyID0+IHtcclxuICAgICAgci5jb2x1bW5zID0gdGhpcy4ka2V5cygpLmNvbmNhdChPYmplY3QudmFsdWVzKHRoaXMubXlDb2x1bW5zKCkpLmZpbHRlcihjID0+IGMubWV0YURhdGEuZmllbGRUeXBlICE9PSBGaWVsZFR5cGUuSGlkZGVuKS5tYXAoYyA9PiBjLm1ldGFEYXRhLmtleSkpO1xyXG4gICAgICB0YWJsZS5hZGRSb3dEZWYocilcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0aW9uISA6IFNlbGVjdGlvbk1vZGVsPGFueT47XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbiQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGlvbkNoYW5nZTxhbnk+PigpO1xyXG4gIG1hc3RlclRvZ2dsZUNoZWNrZWQkID0gdGhpcy5zZWxlY3Rpb24kLnBpcGUobWFwKCgpPT50aGlzLnNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIHRoaXMuaXNBbGxTZWxlY3RlZCgpKSk7XHJcbiAgbWFzdGVyVG9nZ2xlSW5kZXRlcm1pbmF0ZSQgPSB0aGlzLnNlbGVjdGlvbiQucGlwZShtYXAoKCk9PnRoaXMuc2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIXRoaXMuaXNBbGxTZWxlY3RlZCgpKSk7XHJcbiAgc2V0VXBTZWxlY3Rpb25zKHRyYWNrQnk/OiBzdHJpbmcpe1xyXG4gICAgdGhpcy5zZWxlY3Rpb24gPSB0cmFja0J5ID8gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10sIHRydWUsIChhLCBiKSA9PiBhW3RyYWNrQnldID09PSBiW3RyYWNrQnldKSA6IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5zZWxlY3Rpb24uY2hhbmdlZCwgYyA9PiB0aGlzLnNlbGVjdGlvbiQuZW1pdChjKSk7XHJcbiAgfVxyXG4gICRzZWxlY3RhYmxlRGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGlmKHRoaXMuc3RhdGUuJHZpZXdUeXBlKCkgPT09ICdwYWdpbmF0b3InKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLnByb3BzKCkuZGF0YVNvdXJjZSEuZGF0YTtcclxuICAgIH0gZWxzZSBpZih0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAndmlydHVhbCBwYWdpbmF0b3InKXtcclxuICAgICAgY29uc3QgcHJldmlvdXNQYWdlUmVjb3JkcyA9IHRoaXMuc3RhdGUuc3RhdGUoKS5jdXJyZW50UGFnZSAqIHRoaXMuc3RhdGUuc3RhdGUoKS5wYWdlU2l6ZTtcclxuICAgICAgcmV0dXJuIHRoaXMuJGRhdGEoKS5zbGljZShwcmV2aW91c1BhZ2VSZWNvcmRzLCBwcmV2aW91c1BhZ2VSZWNvcmRzICsgdGhpcy5zdGF0ZS5zdGF0ZSgpLnBhZ2VTaXplKTtcclxuICAgIH1lbHNlIGlmKHRoaXMuc3RhdGUuJHZpZXdUeXBlKCkgPT09ICdhbGwnKXtcclxuICAgICAgcmV0dXJuIHRoaXMuJGRhdGEoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9KTtcclxuICBzZWxlY3RhYmxlRGF0YSQgPSB0b09ic2VydmFibGUodGhpcy4kc2VsZWN0YWJsZURhdGEpO1xyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLiRzZWxlY3RhYmxlRGF0YSgpPy5sZW5ndGggfHwgMDtcclxuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcclxuICB9XHJcblxyXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXHJcbiAgbWFzdGVyVG9nZ2xlKCkge1xyXG4gICAgaWYodGhpcy5pc0FsbFNlbGVjdGVkKCkpe1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoLi4udGhpcy4kc2VsZWN0YWJsZURhdGEoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0YWJsZVdpZHRoID0gdGhpcy5zdGF0ZS5nZXRVc2VyRGVmaW5lZFRhYmxlU2l6ZSQucGlwZShcclxuICAgIHByZXZpb3VzQW5kQ3VycmVudDxudW1iZXIgfCB1bmRlZmluZWQ+KDApLFxyXG4gICAgbWFwKChbcHJldmlvdXNVc2VyRGVmaW5lZFdpZHRoLCBjdXJyZW50VXNlckRlZmluZWRXaWR0aF0pID0+IHtcclxuICAgICAgaWYoIGN1cnJlbnRVc2VyRGVmaW5lZFdpZHRoKXtcclxuICAgICAgICByZXR1cm4gKHt3aWR0aDpgJHtjdXJyZW50VXNlckRlZmluZWRXaWR0aH1weGB9KTtcclxuICAgICAgfSBpZiggd2FzUmVzZXQoKSApe1xyXG4gICAgICAgIHJldHVybiAoe3dpZHRoOidpbml0aWFsJ30pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoe30pO1xyXG5cclxuICAgICAgZnVuY3Rpb24gd2FzUmVzZXQoKXtcclxuICAgICAgICByZXR1cm4gKHByZXZpb3VzVXNlckRlZmluZWRXaWR0aCA/PyAwKSA+PTAgJiYgY3VycmVudFVzZXJEZWZpbmVkV2lkdGggPT0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBnZXRUcmFuc2Zvcm0gPSAoa2V5OiBzdHJpbmcsIHZhbDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZih2YWwgPT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJ251bGwnKSByZXR1cm4gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1DcmVhdG9yLmNyZWF0ZVRyYW5zZm9ybWVyKHRoaXMubXlDb2x1bW5zW2tleV0ubWV0YURhdGEsIHRydWUpKHsgW2tleV06IHZhbH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICRyb3dIZWlnaHQgPSB0aGlzLnN0YXRlLnNlbGVjdFNpZ25hbChzID0+IHtcclxuICAgICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZVJvd0hlaWdodCl7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKSEucm93SGVpZ2h0O1xyXG4gICAgICAgIHJldHVybiBoZWlnaHQgKyAncHgnIDtcclxuICAgICAgfVxyXG4gICAgICBpZih0eXBlb2Ygcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnJvd0hlaWdodCA9PT0gJ251bWJlcicpe1xyXG4gICAgICAgIHJldHVybiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3Mucm93SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnJvd0hlaWdodDtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgJGhlYWRlckhlaWdodCA9IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHMgPT4ge1xyXG4gICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZUhlYWRlckhlaWdodCl7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IChzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MudXNlVmlydHVhbFNjcm9sbCBhcyBWaXJ0dWFsU2Nyb2xsT3B0aW9ucykhLmhlYWRlckhlaWdodDtcclxuICAgICAgcmV0dXJuIGhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICBpZih0eXBlb2Ygcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodCA9PT0gJ251bWJlcicpe1xyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodDtcclxuICB9KTtcclxuXHJcbiAgJGdyb3VwSGVhZGVySGVpZ2h0ID0gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwocyA9PiB7XHJcbiAgICBpZihzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuZ3JvdXBIZWFkZXJIZWlnaHQpe1xyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLiRyb3dIZWlnaHQoKTtcclxuICB9KTtcclxuXHJcbiAgJHN0aWNreUZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUucHJvcHMoKS5zdGlja3lGb290ZXIgfHwgdGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkpO1xyXG59XHJcbiIsIjxtYXQtdGFibGVcclxuICBjZGtEcm9wTGlzdFxyXG4gIGNka0Ryb3BMaXN0TG9ja0F4aXM9J3gnXHJcbiAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxyXG4gIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcclxuICBjbGFzcz1cInRhYmxlLWRyYWctbGlzdFwiXHJcbiAgW2NsYXNzXT1cIigkZm9vdGVyUm93U3R5bGUoKSlcIlxyXG4gICN0YWJsZVxyXG4gIFtkYXRhU291cmNlXT1cInN0YXRlLnByb3BzKCkuZGF0YVNvdXJjZSFcIlxyXG4gIFt0cmFja0J5XT1cInRyYWNrQnlGdW5jdGlvblwiXHJcbiAgW3N0eWxlXT1cInRhYmxlV2lkdGggfCBhc3luYyBcIlxyXG4+XHJcblxyXG4gIDwhLS0gc2VsZWN0IGNvbHVtbiAtLT5cclxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxyXG5cclxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgIGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxyXG4gICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIShtYXN0ZXJUb2dnbGVDaGVja2VkJCB8IGFzeW5jKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwibWFzdGVyVG9nZ2xlSW5kZXRlcm1pbmF0ZSQgfCBhc3luY1wiPlxyXG4gICAgICA8L21hdC1jaGVja2JveD5cclxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG5cclxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cclxuICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiLz5cclxuICAgIDwvbWF0LWNlbGw+XHJcblxyXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cclxuICAgICAge3sgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCB9fVxyXG4gICAgPC9tYXQtZm9vdGVyLWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICA8IS0tIGluZGV4IGNvbHVtbiAtLT5cclxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XHJcbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiZi1tYXQtaGVhZGVyLWNlbGxcIiBjbGFzcz1cImluZGV4LWNvbHVtblwiPiNcclxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cImluZGV4LWNvbHVtblwiPlxyXG4gICAgICB7eyAxICsgaSArIG9mZnNldEluZGV4IH19XHJcbiAgICA8L21hdC1jZWxsPlxyXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cImluZGV4LWNvbHVtblwiPjwvbWF0LWZvb3Rlci1jZWxsPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEdyb3VwaW5nIC0tPlxyXG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cclxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgQGxldCBleHBhbmRlZCA9IChzdGF0ZS5nZXRJc0V4cGFuZGVkIHwgZnVuYyA6IHJvdy5rZXkgOiByb3cuZ3JvdXBOYW1lICk7XHJcbiAgICAgIDxkaXYgW3N0eWxlLnBhZGRpbmdMZWZ0XT1cInJvdy5wYWRkaW5nICsgJ3B4ICFpbXBvcnRhbnQnXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNldEV4cGFuZGVkKHJvdy5rZXksIHJvdy5ncm91cE5hbWUsICFleHBhbmRlZCgpKTtcIj5cclxuICAgICAgICAgIEBpZiAoIWV4cGFuZGVkKCkpIHtcclxuICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAge3sgZ2V0VHJhbnNmb3JtIHwgZnVuYyA6IHJvdy5rZXkgOiAgcm93Lmdyb3VwSGVhZGVyRGlzcGxheSB9fSAoe3sgcm93Lmxlbmd0aCB9fSlcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWdyb3c6IDFcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhdGUucHJvcHMoKS5ncm91cEhlYWRlclRlbXBsYXRlITsgY29udGV4dDogeyBlbGVtZW50OiByb3cgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxtYXQtcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogJGtleXMoKTsgbGV0IGkgPSBpbmRleFwiLz5cclxuICA8bWF0LXJvdyBbc3R5bGUuaGVpZ2h0XT1cInN0YXRlLnByb3BzKCkuZ3JvdXBIZWFkZXJIZWlnaHQgPyBzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JyA6ICRncm91cEhlYWRlckhlaWdodCgpXCJcclxuICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodF09XCJzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ID8gc3RhdGUucHJvcHMoKS5ncm91cEhlYWRlckhlaWdodCArICdweCcgOiAkZ3JvdXBIZWFkZXJIZWlnaHQoKVwiXHJcbiAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cEhlYWRlclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIvPlxyXG48L21hdC10YWJsZT5cclxuXHJcbjxtYXQtaGVhZGVyLXJvdyBbc3R5bGUuaGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiIFtzdHlsZS5taW4taGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiXHJcbiAgKm1hdEhlYWRlclJvd0RlZj1cIiRrZXlzKCk7IHN0aWNreTogc3RhdGUucHJvcHMoKS5pc1N0aWNreVwiIFtzdHlsZS50b3AucHhdPVwiKChvZmZzZXQkIHwgYXN5bmMpISAqIC0xKVwiLz5cclxuPG1hdC1mb290ZXItcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAqbWF0Rm9vdGVyUm93RGVmPVwiJGtleXMoKTsgc3RpY2t5OiAkc3RpY2t5Rm9vdGVyKCkgXCJcclxuICBbc3R5bGUuYm90dG9tLnB4XT1cIiRzdGlja3lGb290ZXIoKSA/IChvZmZzZXQkIHwgYXN5bmMpIDogdW5kZWZpbmVkXCIvPiJdfQ==
|
|
301
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXV0aWxpdGllcy9zcmMvdGFibGUtYnVpbGRlci9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFvQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4TyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBYSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEgsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXBGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVsRSxPQUFPLEVBQWUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdC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aUJBQWlCLG9ZQUFFLGVBQWUsMklBQUUsYUFBYSxvTEFBRSxnQkFBZ0IsbUpBQ25HLGdCQUFnQiwwQkFBRSxTQUFTLHlDQUFFLFlBQVk7OzJGQUdoQyxxQkFBcUI7a0JBWGpDLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLGNBQWMsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0I7d0JBQ25HLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxZQUFZO3FCQUMxQzt3REFnQlksT0FBTztzQkFBbkIsS0FBSztnQkFhRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFHb0MsUUFBUTtzQkFBakQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQXNKOUIsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDb250YWluZXJSZWYsIEluamVjdG9yLCBFdmVudEVtaXR0ZXIsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCB2aWV3Q2hpbGQsIGVmZmVjdCwgdW50cmFja2VkLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9vdGVyUm93RGVmLCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvd0RlZiwgTWF0VGFibGUsIE1hdFRhYmxlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNlbGVjdGlvbkNoYW5nZSwgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBUYWJsZVN0b3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90YWJsZS1zdG9yZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uQnVpbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbi1idWlsZGVyL2NvbHVtbi1idWlsZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpY3Rpb25hcnknO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1kZWYnO1xyXG5pbXBvcnQgeyBwcmV2aW91c0FuZEN1cnJlbnQgfSBmcm9tICcuLi8uLi8uLi9yeGpzL3J4anMtb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvQ29sdW1uSW5mbyc7XHJcbmltcG9ydCB7IENka0RyYWdEcm9wLCBDZGtEcm9wTGlzdCwgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgRnVuY3Rpb25QaXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5pbXBvcnQgeyBUcmFuc2Zvcm1DcmVhdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNmb3JtLWNyZWF0b3InO1xyXG5pbXBvcnQgeyBpbml0SW5kZXhTeW1ib2wgfSBmcm9tICcuLi90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmhlbHBlcnMvc29ydC1zdGF0ZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgVmlydHVhbFNjcm9sbE9wdGlvbnMgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLWJ1aWxkZXItZ2VuZXJhbC1zZXR0aW5ncyc7XHJcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgRGF0YVN0b3JlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9kYXRhLXN0b3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGItZ2VuZXJpYy10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdFRhYmxlTW9kdWxlLCBEcmFnRHJvcE1vZHVsZSwgTWF0Q2hlY2tib3hNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsIEFzeW5jUGlwZSwgRnVuY3Rpb25QaXBlLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHByb3RlY3RlZCBzdGF0ZSA9IGluamVjdChUYWJsZVN0b3JlKTtcclxuICBwcml2YXRlIGRhdGFTdG9yZSA9IGluamVjdChEYXRhU3RvcmUpO1xyXG4gIHByaXZhdGUgdmlld0NvbnRhaW5lciA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcclxuICBwcml2YXRlIHRyYW5zZm9ybUNyZWF0b3IgPSBpbmplY3QoVHJhbnNmb3JtQ3JlYXRvcik7XHJcblxyXG4gICRoZWFkZXJSb3cgPSB2aWV3Q2hpbGQoTWF0SGVhZGVyUm93RGVmKTtcclxuICAkZm9vdGVyUm93ID0gdmlld0NoaWxkKE1hdEZvb3RlclJvd0RlZik7XHJcbiAgJHRhYmxlID0gdmlld0NoaWxkKE1hdFRhYmxlKTtcclxuXHJcbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KSB7XHJcbiAgICB0aGlzLnN0YXRlLnNldFVzZXJEZWZpbmVkT3JkZXIoeyBuZXdPcmRlcjpldmVudC5jdXJyZW50SW5kZXgsIG9sZE9yZGVyOmV2ZW50LnByZXZpb3VzSW5kZXggfSlcclxuICB9XHJcbiAgX3RyYWNrQnk/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2V0IHRyYWNrQnkodHJhY2tCeTogc3RyaW5nKXtcclxuICAgIGlmKHRyYWNrQnkpe1xyXG4gICAgICB0aGlzLl90cmFja0J5ID0gdHJhY2tCeTtcclxuICAgICAgdGhpcy50cmFja0J5RnVuY3Rpb24gPSAoaW5kZXg6bnVtYmVyLCBpdGVtOiBhbnkpID0+IGl0ZW1bdHJhY2tCeV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFVwU2VsZWN0aW9ucyh0cmFja0J5KTtcclxuICB9XHJcbiAgZ2V0IHRyYWNrQnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3RyYWNrQnkgfVxyXG4gICRkaXNwbGF5RGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGlzcGxheURhdGEnIH0pO1xyXG4gICRkaXNwbGF5RGF0YUxlbmd0aCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuJGRpc3BsYXlEYXRhKCk/Lmxlbmd0aCB8fCAwKTtcclxuICAkaGFzRm9vdGVyTWV0YSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUuJG1ldGFEYXRhQXJyYXkoKS5zb21lKG1kID0+ICEhbWQuYWRkaXRpb25hbD8uZm9vdGVyKSlcclxuICAkZGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPih7IGFsaWFzOiAnZGF0YScgfSlcclxuICBkYXRhJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLiRkYXRhKTtcclxuICBASW5wdXQoKSByb3dzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxhbnk+PjtcclxuICBASW5wdXQoKSBjb2x1bW5CdWlsZGVycyE6IENvbHVtbkJ1aWxkZXJDb21wb25lbnRbXTtcclxuICAkY29sdW1uSW5mb3MgPSBpbnB1dC5yZXF1aXJlZDxDb2x1bW5JbmZvW10+KHsgYWxpYXM6ICdjb2x1bW5JbmZvcycgfSk7XHJcbiAgJGhhc0N1c3RvbUZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuJGNvbHVtbkluZm9zKCk/LnNvbWUoY2kgPT4gISFjaS5jdXN0b21DZWxsPy5jb2x1bW5EZWY/LmZvb3RlckNlbGwpKVxyXG4gIEBWaWV3Q2hpbGQoQ2RrRHJvcExpc3QsIHsgc3RhdGljOiB0cnVlIH0pIGRyb3BMaXN0ITogQ2RrRHJvcExpc3Q7XHJcbiAgJGZvb3RlclJvd1N0eWxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgaGFzRGF0YSA9ICEhdGhpcy4kZGlzcGxheURhdGFMZW5ndGgoKTtcclxuICAgIGNvbnN0IG1ldGFGb290ZXIgPSB0aGlzLiRoYXNGb290ZXJNZXRhKCk7XHJcbiAgICBjb25zdCBjdXN0b21Gb290ZXIgPSB0aGlzLiRoYXNDdXN0b21Gb290ZXIoKTtcclxuICAgIGNvbnN0IGhhc1NlbGVjdGlvbkNvbHVtbiA9IHRoaXMuc3RhdGUucHJvcHMoKS5zZWxlY3Rpb25Db2x1bW47XHJcbiAgICByZXR1cm4gY3VzdG9tRm9vdGVyIHx8IChoYXNEYXRhICYmIChtZXRhRm9vdGVyIHx8IGhhc1NlbGVjdGlvbkNvbHVtbikpID8gJ3JlZ3VsYXItZm9vdGVyJyA6IGhhc0RhdGEgPyAnbm8tZm9vdGVyJyA6ICdzbWFsbC1mb290ZXInO1xyXG4gIH0pO1xyXG4gICRzaG93Rm9vdGVyUm93ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4kZm9vdGVyUm93U3R5bGUoKSAhPT0gJ25vLWZvb3RlcicpO1xyXG4gIGN1cnJlbnRDb2x1bW5zITogc3RyaW5nW107XHJcbiAgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcclxuICBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAge3Byb3ZpZGU6IE1hdFRhYmxlLCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuJHRhYmxlKCkgfSxcclxuICAgICAge3Byb3ZpZGU6IENka0Ryb3BMaXN0LCB1c2VGYWN0b3J5OiAoKT0+IHRoaXMuZHJvcExpc3QgfSxcclxuICAgIF0sXHJcbiAgICBwYXJlbnQ6IHRoaXMuX2luamVjdG9yXHJcbiAgfSk7XHJcbiAgcm93RGVmQXJyIDpNYXRSb3dEZWY8YW55PltdID0gW107XHJcbiAgJGhhc1NlbGVjdENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHN0YXRlID0+IHN0YXRlLnByb3BzLnNlbGVjdGlvbkNvbHVtbikoKSk7XHJcbiAgJGhhc0luZGV4Q29sdW1uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwoc3RhdGUgPT4gc3RhdGUucHJvcHMuaW5kZXhDb2x1bW4pKCkpO1xyXG4gIG15Q29sdW1ucyA9IHNpZ25hbDxEaWN0aW9uYXJ5PENvbHVtbkJ1aWxkZXJDb21wb25lbnQ+Pih7fSk7XHJcbiAgJHNob3dIZWFkZXIgPSBjb21wdXRlZCgoKSA9PiAhdGhpcy5zdGF0ZS50YWJsZVNldHRpbmdzKCkuaGlkZUNvbHVtbkhlYWRlcilcclxuICBvZmZzZXQkID0gdGhpcy5kYXRhU3RvcmUuc2VsZWN0KCBzID0+IHMudmlydHVhbFNjcm9sbE9mZnNldCApO1xyXG4gIGRhdGFWaWV3ITogT2JzZXJ2YWJsZTxhbnlbXT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5zZXRVcFNlbGVjdGlvbnMoKTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkluZm9zID0gdGhpcy4kY29sdW1uSW5mb3MoKSB8fCBbXTtcclxuICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLm15Q29sdW1ucygpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbHVtbkluZm8gPSBjb2x1bW5JbmZvcy5maW5kKGNpID0+IGNpLm1ldGFEYXRhLmtleSA9PT0ga2V5KTtcclxuICAgICAgICAgIGlmKCFjb2x1bW5JbmZvIHx8IGNvbHVtbkluZm8uY3VzdG9tQ2VsbCAhPT0gdmFsdWUuY3VzdG9tQ2VsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5teUNvbHVtbnMoKVtrZXldO1xyXG4gICAgICAgICAgICB0aGlzLiR0YWJsZSgpPy5yZW1vdmVDb2x1bW5EZWYodmFsdWUuY29sdW1uRGVmKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbHVtbkluZm9zLmZvckVhY2goY2kgPT4gdGhpcy5hZGRNZXRhRGF0YShjaSkpXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMuJGhlYWRlclJvdygpO1xyXG4gICAgICBjb25zdCBzaG93SGVhZGVyID0gdGhpcy4kc2hvd0hlYWRlcigpO1xyXG4gICAgICBjb25zdCB0YWJsZSA9IHRoaXMuJHRhYmxlKCk7XHJcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XHJcbiAgICAgICAgaWYoaGVhZGVyUm93ICYmIHNob3dIZWFkZXIgJiYgdGFibGUpIHRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3cpO1xyXG4gICAgICAgIGVsc2UgaWYoaGVhZGVyUm93ICYmIHRhYmxlKSB0YWJsZS5yZW1vdmVIZWFkZXJSb3dEZWYoaGVhZGVyUm93KTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgY29uc3QgZm9vdGVyUm93ID0gdGhpcy4kZm9vdGVyUm93KCk7XHJcbiAgICAgIGNvbnN0IHNob3dGb290ZXIgPSB0aGlzLiRzaG93Rm9vdGVyUm93KCk7XHJcbiAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy4kdGFibGUoKTtcclxuICAgICAgdW50cmFja2VkKCgpID0+IHtcclxuICAgICAgICBpZihmb290ZXJSb3cgJiYgc2hvd0Zvb3RlciAmJiB0YWJsZSkgdGFibGUuYWRkRm9vdGVyUm93RGVmKGZvb3RlclJvdyk7XHJcbiAgICAgICAgZWxzZSBpZihmb290ZXJSb3cgJiYgdGFibGUpIHRhYmxlLnJlbW92ZUZvb3RlclJvd0RlZihmb290ZXJSb3cpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0VHJhY2tCeSA9IChpbmRleDpudW1iZXIsIGl0ZW06IGFueSkgPT4gaXRlbVtpbml0SW5kZXhTeW1ib2xdO1xyXG4gIHRyYWNrQnlGdW5jdGlvbiA9IHRoaXMuZGVmYXVsdFRyYWNrQnk7XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMucm93cyAmJiB0aGlzLnJvd3MgJiYgdGhpcy5teUNvbHVtbnMoKS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gICRrZXlzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgY29uc3QgZGlzcGxheWVkID0gdGhpcy5zdGF0ZS4kb3JkZXJlZFZpc2libGVDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBidWlsdCA9IHRoaXMubXlDb2x1bW5zKCk7XHJcbiAgICBjb25zdCBrZXlzID0gZGlzcGxheWVkLmZpbHRlcihkID0+ICEhYnVpbHRbZF0pO1xyXG4gICAgaWYodGhpcy4kaGFzU2VsZWN0Q29sdW1uKCkpe1xyXG4gICAgICBrZXlzLnVuc2hpZnQoJ3NlbGVjdCcpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy4kaGFzSW5kZXhDb2x1bW4oKSkge1xyXG4gICAgICBrZXlzLnVuc2hpZnQoJ2luZGV4Jyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ga2V5cztcclxuICB9KVxyXG4gIGtleXMkID0gdG9PYnNlcnZhYmxlKHRoaXMuJGtleXMpO1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplUm93RGVmcyhbLi4udGhpcy5yb3dzXSk7XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5vbih0aGlzLmtleXMkLCBrZXlzID0+IHtcclxuICAgICAgdGhpcy5yb3dEZWZBcnI/LmZvckVhY2gocm93ID0+IHJvdy5jb2x1bW5zID0ga2V5cylcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3RhdGUub24odGhpcy5zZWxlY3RhYmxlRGF0YSQsIChkYXRhKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCl7XHJcbiAgICAgICAgY29uc3QgdHJhY2tCeUZ1bmN0aW9uID0gdGhpcy50cmFja0J5ID8gKHMpID0+IGRhdGEuZXZlcnkoZCA9PiAgZFt0aGlzLnRyYWNrQnkhXSAhPT0gc1t0aGlzLnRyYWNrQnkhXSkgOiBzID0+ICFkYXRhLmluY2x1ZGVzKHMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5maWx0ZXIodHJhY2tCeUZ1bmN0aW9uKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXNlbGVjdCguLi5yZW1vdmVkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgJHVzZVBhZ2luYXRvciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUudGFibGVTZXR0aW5ncygpLnVzZVBhZ2luYXRvcik7XHJcbiAgJHVzZVZpcnR1YWxTY3JvbGwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpLmluY2x1ZGVzKCd2aXJ0dWFsJykpO1xyXG4gICRvZmZzZXRJbmRleCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IHZpcnR1YWxTdGFydCA9IHRoaXMuZGF0YVN0b3JlLnNlbGVjdFNpZ25hbChkID0+IGQudmlydHVhbEVuZHMuc3RhcnQpKCk7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMuc3RhdGUuJHBhZ2VTaXplKCk7XHJcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IHRoaXMuc3RhdGUuJGN1cnJlbnRQYWdlKCk7XHJcbiAgICBpZih0aGlzLiR1c2VWaXJ0dWFsU2Nyb2xsKCkpe1xyXG4gICAgICByZXR1cm4gdmlydHVhbFN0YXJ0O1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy4kdXNlUGFnaW5hdG9yKCkpe1xyXG4gICAgICByZXR1cm4gcGFnZVNpemUgKiBjdXJyZW50UGFnZTtcclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH0pO1xyXG5cclxuXHJcbiAgaXNHcm91cEhlYWRlcihfOiBudW1iZXIsIHJvdzogeyBpc0dyb3VwSGVhZGVyOiBib29sZWFuIH0pIHtcclxuICAgIHJldHVybiByb3cuaXNHcm91cEhlYWRlcjtcclxuICB9XHJcblxyXG4gIHNldEV4cGFuZGVkKGtleTogc3RyaW5nLCBncm91cEtleTogc3RyaW5nLCBpc0V4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZUV4cGFuZGVkR3JvdXBzKHsga2V5ICwgaXNFeHBhbmRlZCwgZ3JvdXBLZXkgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRNZXRhRGF0YShjb2x1bW46IENvbHVtbkluZm8pIHtcclxuICAgIGNvbnN0IGNvbHVtbkJ1aWxkZXIgPSB0aGlzLm15Q29sdW1ucygpW2NvbHVtbi5tZXRhRGF0YS5rZXldO1xyXG4gICAgaWYoY29sdW1uQnVpbGRlcikge1xyXG4gICAgICBjb2x1bW5CdWlsZGVyLm1ldGFEYXRhID0gY29sdW1uLm1ldGFEYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChDb2x1bW5CdWlsZGVyQ29tcG9uZW50LCB7XHJcbiAgICAgICAgaW5kZXg6IDAsXHJcbiAgICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3JcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5jdXN0b21DZWxsID0gY29sdW1uLmN1c3RvbUNlbGw7XHJcbiAgICAgIGNvbXBvbmVudC5pbnN0YW5jZS5tZXRhRGF0YSA9IGNvbHVtbi5tZXRhRGF0YTtcclxuICAgICAgY29tcG9uZW50Lmluc3RhbmNlLmRhdGEkID0gdGhpcy5kYXRhJDtcclxuICAgICAgdGhpcy5teUNvbHVtbnMudXBkYXRlKG1jID0+ICh7Li4ubWMsIFtjb2x1bW4ubWV0YURhdGEua2V5XTogY29tcG9uZW50Lmluc3RhbmNlfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZVJvd0RlZnMgPSAoZGVmczpNYXRSb3dEZWY8YW55PltdKT0+e1xyXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLiR0YWJsZSgpO1xyXG4gICAgaWYoIXRhYmxlKSByZXR1cm47XHJcbiAgICB0aGlzLnJvd0RlZkFyci5mb3JFYWNoKHI9PiB0YWJsZS5yZW1vdmVSb3dEZWYocikpO1xyXG4gICAgdGhpcy5yb3dEZWZBcnIgPSBkZWZzO1xyXG4gICAgZGVmcy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICByLmNvbHVtbnMgPSB0aGlzLiRrZXlzKCkuY29uY2F0KE9iamVjdC52YWx1ZXModGhpcy5teUNvbHVtbnMoKSkuZmlsdGVyKGMgPT4gYy5tZXRhRGF0YS5maWVsZFR5cGUgIT09IEZpZWxkVHlwZS5IaWRkZW4pLm1hcChjID0+IGMubWV0YURhdGEua2V5KSk7XHJcbiAgICAgIHRhYmxlLmFkZFJvd0RlZihyKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb24hIDogU2VsZWN0aW9uTW9kZWw8YW55PjtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uJCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uQ2hhbmdlPGFueT4+KCk7XHJcbiAgbWFzdGVyVG9nZ2xlQ2hlY2tlZCQgPSB0aGlzLnNlbGVjdGlvbiQucGlwZShtYXAoKCk9PnRoaXMuc2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgdGhpcy5pc0FsbFNlbGVjdGVkKCkpKTtcclxuICBtYXN0ZXJUb2dnbGVJbmRldGVybWluYXRlJCA9IHRoaXMuc2VsZWN0aW9uJC5waXBlKG1hcCgoKT0+dGhpcy5zZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhdGhpcy5pc0FsbFNlbGVjdGVkKCkpKTtcclxuICBzZXRVcFNlbGVjdGlvbnModHJhY2tCeT86IHN0cmluZyl7XHJcbiAgICB0aGlzLnNlbGVjdGlvbiA9IHRyYWNrQnkgPyBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSwgdHJ1ZSwgKGEsIGIpID0+IGFbdHJhY2tCeV0gPT09IGJbdHJhY2tCeV0pIDogbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xyXG4gICAgdGhpcy5zdGF0ZS5vbih0aGlzLnNlbGVjdGlvbi5jaGFuZ2VkLCBjID0+IHRoaXMuc2VsZWN0aW9uJC5lbWl0KGMpKTtcclxuICB9XHJcbiAgJHNlbGVjdGFibGVEYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYodGhpcy5zdGF0ZS4kdmlld1R5cGUoKSA9PT0gJ3ZpcnR1YWwgcGFnaW5hdG9yJyB8fCB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAncGFnaW5hdG9yJyl7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzUGFnZVJlY29yZHMgPSB0aGlzLnN0YXRlLiRjdXJyZW50UGFnZSgpICogdGhpcy5zdGF0ZS4kcGFnZVNpemUoKTtcclxuICAgICAgcmV0dXJuIHRoaXMuJGRhdGEoKS5zbGljZShwcmV2aW91c1BhZ2VSZWNvcmRzLCBwcmV2aW91c1BhZ2VSZWNvcmRzICsgdGhpcy5zdGF0ZS4kcGFnZVNpemUoKSk7XHJcbiAgICB9ZWxzZSBpZih0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAnYWxsJyB8fCB0aGlzLnN0YXRlLiR2aWV3VHlwZSgpID09PSAndmlydHVhbCBhbGwnKXtcclxuICAgICAgcmV0dXJuIHRoaXMuJGRhdGEoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9KTtcclxuICBzZWxlY3RhYmxlRGF0YSQgPSB0b09ic2VydmFibGUodGhpcy4kc2VsZWN0YWJsZURhdGEpO1xyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLiRzZWxlY3RhYmxlRGF0YSgpPy5sZW5ndGggfHwgMDtcclxuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcclxuICB9XHJcblxyXG4gIC8qKiBTZWxlY3RzIGFsbCByb3dzIGlmIHRoZXkgYXJlIG5vdCBhbGwgc2VsZWN0ZWQ7IG90aGVyd2lzZSBjbGVhciBzZWxlY3Rpb24uICovXHJcbiAgbWFzdGVyVG9nZ2xlKCkge1xyXG4gICAgaWYodGhpcy5pc0FsbFNlbGVjdGVkKCkpe1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QoLi4udGhpcy4kc2VsZWN0YWJsZURhdGEoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0YWJsZVdpZHRoID0gdGhpcy5zdGF0ZS5nZXRVc2VyRGVmaW5lZFRhYmxlU2l6ZSQucGlwZShcclxuICAgIHByZXZpb3VzQW5kQ3VycmVudDxudW1iZXIgfCB1bmRlZmluZWQ+KDApLFxyXG4gICAgbWFwKChbcHJldmlvdXNVc2VyRGVmaW5lZFdpZHRoLCBjdXJyZW50VXNlckRlZmluZWRXaWR0aF0pID0+IHtcclxuICAgICAgaWYoIGN1cnJlbnRVc2VyRGVmaW5lZFdpZHRoKXtcclxuICAgICAgICByZXR1cm4gKHt3aWR0aDpgJHtjdXJyZW50VXNlckRlZmluZWRXaWR0aH1weGB9KTtcclxuICAgICAgfSBpZiggd2FzUmVzZXQoKSApe1xyXG4gICAgICAgIHJldHVybiAoe3dpZHRoOidpbml0aWFsJ30pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoe30pO1xyXG5cclxuICAgICAgZnVuY3Rpb24gd2FzUmVzZXQoKXtcclxuICAgICAgICByZXR1cm4gKHByZXZpb3VzVXNlckRlZmluZWRXaWR0aCA/PyAwKSA+PTAgJiYgY3VycmVudFVzZXJEZWZpbmVkV2lkdGggPT0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBnZXRUcmFuc2Zvcm0gPSAoa2V5OiBzdHJpbmcsIHZhbDogc3RyaW5nKSA9PiB7XHJcbiAgICBpZih2YWwgPT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gJ251bGwnKSByZXR1cm4gJyc7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1DcmVhdG9yLmNyZWF0ZVRyYW5zZm9ybWVyKHRoaXMubXlDb2x1bW5zW2tleV0ubWV0YURhdGEsIHRydWUpKHsgW2tleV06IHZhbH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICRyb3dIZWlnaHQgPSB0aGlzLnN0YXRlLnNlbGVjdFNpZ25hbChzID0+IHtcclxuICAgICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZVJvd0hlaWdodCl7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKSEucm93SGVpZ2h0O1xyXG4gICAgICAgIHJldHVybiBoZWlnaHQgKyAncHgnIDtcclxuICAgICAgfVxyXG4gICAgICBpZih0eXBlb2Ygcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnJvd0hlaWdodCA9PT0gJ251bWJlcicpe1xyXG4gICAgICAgIHJldHVybiBzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3Mucm93SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLnJvd0hlaWdodDtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgJGhlYWRlckhlaWdodCA9IHRoaXMuc3RhdGUuc2VsZWN0U2lnbmFsKHMgPT4ge1xyXG4gICAgaWYodGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkgJiYgKHMubm90UGVyc2lzdGVkVGFibGVTZXR0aW5ncy51c2VWaXJ0dWFsU2Nyb2xsIGFzIFZpcnR1YWxTY3JvbGxPcHRpb25zKT8uZW5mb3JjZUhlYWRlckhlaWdodCl7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IChzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MudXNlVmlydHVhbFNjcm9sbCBhcyBWaXJ0dWFsU2Nyb2xsT3B0aW9ucykhLmhlYWRlckhlaWdodDtcclxuICAgICAgcmV0dXJuIGhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICBpZih0eXBlb2Ygcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodCA9PT0gJ251bWJlcicpe1xyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodCArICdweCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmhlYWRlckhlaWdodDtcclxuICB9KTtcclxuXHJcbiAgJGdyb3VwSGVhZGVySGVpZ2h0ID0gdGhpcy5zdGF0ZS5zZWxlY3RTaWduYWwocyA9PiB7XHJcbiAgICBpZihzLm5vdFBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuZ3JvdXBIZWFkZXJIZWlnaHQpe1xyXG4gICAgICByZXR1cm4gcy5ub3RQZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLiRyb3dIZWlnaHQoKTtcclxuICB9KTtcclxuXHJcbiAgJHN0aWNreUZvb3RlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUucHJvcHMoKS5zdGlja3lGb290ZXIgfHwgdGhpcy5zdGF0ZS4kaXNWaXJ0dWFsKCkpO1xyXG59XHJcbiIsIjxtYXQtdGFibGVcclxuICBjZGtEcm9wTGlzdFxyXG4gIGNka0Ryb3BMaXN0TG9ja0F4aXM9J3gnXHJcbiAgY2RrRHJvcExpc3RPcmllbnRhdGlvbj1cImhvcml6b250YWxcIlxyXG4gIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCJcclxuICBjbGFzcz1cInRhYmxlLWRyYWctbGlzdFwiXHJcbiAgW2NsYXNzXT1cIigkZm9vdGVyUm93U3R5bGUoKSlcIlxyXG4gICN0YWJsZVxyXG4gIFtkYXRhU291cmNlXT1cInN0YXRlLnByb3BzKCkuZGF0YVNvdXJjZSFcIlxyXG4gIFt0cmFja0J5XT1cInRyYWNrQnlGdW5jdGlvblwiXHJcbiAgW3N0eWxlXT1cInRhYmxlV2lkdGggfCBhc3luYyBcIlxyXG4+XHJcblxyXG4gIDwhLS0gc2VsZWN0IGNvbHVtbiAtLT5cclxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxyXG5cclxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgIGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxyXG4gICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIShtYXN0ZXJUb2dnbGVDaGVja2VkJCB8IGFzeW5jKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwibWFzdGVyVG9nZ2xlSW5kZXRlcm1pbmF0ZSQgfCBhc3luY1wiPlxyXG4gICAgICA8L21hdC1jaGVja2JveD5cclxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG5cclxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cclxuICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiLz5cclxuICAgIDwvbWF0LWNlbGw+XHJcblxyXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cclxuICAgICAge3sgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCB9fVxyXG4gICAgPC9tYXQtZm9vdGVyLWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICA8IS0tIGluZGV4IGNvbHVtbiAtLT5cclxuICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImluZGV4XCI+XHJcbiAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiZi1tYXQtaGVhZGVyLWNlbGxcIiBjbGFzcz1cImluZGV4LWNvbHVtblwiPiNcclxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxyXG4gICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cImluZGV4LWNvbHVtblwiPlxyXG4gICAgICB7eyAxICsgaSArICRvZmZzZXRJbmRleCgpIH19XHJcbiAgICA8L21hdC1jZWxsPlxyXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cImluZGV4LWNvbHVtblwiPjwvbWF0LWZvb3Rlci1jZWxsPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEdyb3VwaW5nIC0tPlxyXG4gIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZ3JvdXBIZWFkZXJcIj5cclxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgQGxldCBleHBhbmRlZCA9IChzdGF0ZS5nZXRJc0V4cGFuZGVkIHwgZnVuYyA6IHJvdy5rZXkgOiByb3cuZ3JvdXBOYW1lICk7XHJcbiAgICAgIDxkaXYgW3N0eWxlLnBhZGRpbmdMZWZ0XT1cInJvdy5wYWRkaW5nICsgJ3B4ICFpbXBvcnRhbnQnXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNldEV4cGFuZGVkKHJvdy5rZXksIHJvdy5ncm91cE5hbWUsICFleHBhbmRlZCgpKTtcIj5cclxuICAgICAgICAgIEBpZiAoIWV4cGFuZGVkKCkpIHtcclxuICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAge3sgZ2V0VHJhbnNmb3JtIHwgZnVuYyA6IHJvdy5rZXkgOiAgcm93Lmdyb3VwSGVhZGVyRGlzcGxheSB9fSAoe3sgcm93Lmxlbmd0aCB9fSlcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWdyb3c6IDFcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhdGUucHJvcHMoKS5ncm91cEhlYWRlclRlbXBsYXRlITsgY29udGV4dDogeyBlbGVtZW50OiByb3cgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LWNlbGw+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxtYXQtcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogJGtleXMoKTsgbGV0IGkgPSBpbmRleFwiLz5cclxuICA8bWF0LXJvdyBbc3R5bGUuaGVpZ2h0XT1cInN0YXRlLnByb3BzKCkuZ3JvdXBIZWFkZXJIZWlnaHQgPyBzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ICsgJ3B4JyA6ICRncm91cEhlYWRlckhlaWdodCgpXCJcclxuICAgICAgICAgICBbc3R5bGUubWluLWhlaWdodF09XCJzdGF0ZS5wcm9wcygpLmdyb3VwSGVhZGVySGVpZ2h0ID8gc3RhdGUucHJvcHMoKS5ncm91cEhlYWRlckhlaWdodCArICdweCcgOiAkZ3JvdXBIZWFkZXJIZWlnaHQoKVwiXHJcbiAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZ3JvdXBIZWFkZXInXTsgd2hlbjogaXNHcm91cEhlYWRlclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XCIvPlxyXG48L21hdC10YWJsZT5cclxuXHJcbjxtYXQtaGVhZGVyLXJvdyBbc3R5bGUuaGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiIFtzdHlsZS5taW4taGVpZ2h0XT1cIiRoZWFkZXJIZWlnaHQoKVwiXHJcbiAgKm1hdEhlYWRlclJvd0RlZj1cIiRrZXlzKCk7IHN0aWNreTogc3RhdGUucHJvcHMoKS5pc1N0aWNreVwiIFtzdHlsZS50b3AucHhdPVwiKChvZmZzZXQkIHwgYXN5bmMpISAqIC0xKVwiLz5cclxuPG1hdC1mb290ZXItcm93IFtzdHlsZS5oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCIgW3N0eWxlLm1pbi1oZWlnaHRdPVwiJHJvd0hlaWdodCgpXCJcclxuICAqbWF0Rm9vdGVyUm93RGVmPVwiJGtleXMoKTsgc3RpY2t5OiAkc3RpY2t5Rm9vdGVyKCkgXCJcclxuICBbc3R5bGUuYm90dG9tLnB4XT1cIiRzdGlja3lGb290ZXIoKSA/IChvZmZzZXQkIHwgYXN5bmMpIDogdW5kZWZpbmVkXCIvPiJdfQ==
|