@smartbit4all/ng-client 6.0.10 → 6.0.12

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.
Files changed (37) hide show
  1. package/esm2022/lib/smart-grid/smart-grid-toolbar-util.mjs +13 -9
  2. package/esm2022/lib/smart-grid/smart-grid.component.mjs +36 -3
  3. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +2 -2
  4. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +7 -11
  5. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +5 -5
  6. package/esm2022/lib/smart-table/tables/table.mjs +53 -59
  7. package/esm2022/lib/smart-tree/smarttree.component.mjs +2 -2
  8. package/esm2022/lib/view-context/api/model/menuDescriptor.mjs +2 -0
  9. package/esm2022/lib/view-context/api/model/menuOpenDirection.mjs +23 -0
  10. package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +1 -1
  11. package/esm2022/lib/view-context/api/model/models.mjs +3 -1
  12. package/esm2022/lib/view-context/api/model/shellProperty.mjs +1 -1
  13. package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +1 -1
  14. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +1 -1
  15. package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +38 -6
  16. package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +31 -6
  17. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +58 -68
  18. package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +3 -3
  19. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +18 -10
  20. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +19 -11
  21. package/fesm2022/smartbit4all-ng-client.mjs +287 -174
  22. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  23. package/lib/smart-grid/smart-grid.component.d.ts +3 -0
  24. package/lib/smart-table/tables/material-table/material-table.component.d.ts +0 -1
  25. package/lib/smart-table/tables/table.d.ts +6 -5
  26. package/lib/view-context/api/model/menuDescriptor.d.ts +17 -0
  27. package/lib/view-context/api/model/menuOpenDirection.d.ts +21 -0
  28. package/lib/view-context/api/model/models.d.ts +2 -0
  29. package/lib/view-context/api/model/uiActionDescriptor.d.ts +2 -2
  30. package/lib/view-context/smart-ui-action/components/menu/click/menu.component.d.ts +5 -2
  31. package/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.d.ts +4 -2
  32. package/lib/view-context/smart-ui-action/components/menu/menu.constants.d.ts +4 -0
  33. package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +1 -0
  34. package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +1 -1
  35. package/package.json +1 -1
  36. package/smartbit4all-ng-client-6.0.12.tgz +0 -0
  37. package/smartbit4all-ng-client-6.0.10.tgz +0 -0
@@ -76,11 +76,11 @@ export class SmartIconComponent {
76
76
  return Object.assign({}, ...styles.filter(Boolean));
77
77
  }
78
78
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartIconComponent, deps: [{ token: i1.SmartIconService }, { token: i0.ChangeDetectorRef }, { token: i2.DomSanitizer }, { token: COMPONENT_LIBRARY }], target: i0.ɵɵFactoryTarget.Component }); }
79
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartIconComponent, selector: "smart-icon", inputs: { iconWithoutNamespace: ["icon", "iconWithoutNamespace"], color: "color", imageResource: "imageResource" }, usesOnChanges: true, ngImport: i0, template: "@if(imageResource){\r\n<ng-container *ngTemplateOutlet=\"imageResourceIcon\" />\r\n} @else if(iconWithoutNamespace){\r\n<ng-container *ngTemplateOutlet=\"normalIcon\" />\r\n}\r\n\r\n<ng-template #imageResourceIcon>\r\n @if(imageResource){\r\n <div\r\n class=\"imageResourceIcon\"\r\n [smartTooltip]=\"imageResource.tooltip\"\r\n [uiBadge]=\"imageResource.badge\"\r\n >\r\n @if(imageResource.kind === imageResourceKind.URL){\r\n <img\r\n [ngStyle]=\"getImageResourceStyle(imageResource)\"\r\n class=\"imageIcon\"\r\n [src]=\"imageResource.source\"\r\n [alt]=\"imageResource.identifier\"\r\n />\r\n } @else if(imageResource.identifier){\r\n <ng-container *ngTemplateOutlet=\"normalIcon\"></ng-container>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #normalIcon>\r\n @if(compLib === componentLibrary.PRIMENG){\r\n <ng-container *ngTemplateOutlet=\"primeIcon\" />\r\n }@else {\r\n <ng-container *ngTemplateOutlet=\"materialIcon\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #primeIcon>\r\n @if (isCustom) {\r\n <i\r\n class=\"pi custom-prime-icon\"\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n >\r\n @if(iconHtml){\r\n <span\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n [innerHTML]=\"iconHtml\"\r\n ></span>\r\n }\r\n </i>\r\n }@else if(icon) {\r\n <i\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n [ngClass]=\"getIcon(icon)\"\r\n ></i>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #materialIcon>\r\n @if (isCustom) {\r\n <mat-icon\r\n [ngStyle]=\"getImageResourceStyle(imageResource)\"\r\n [color]=\"color ?? 'primary'\"\r\n svgIcon=\"{{ icon }}\"\r\n ></mat-icon>\r\n }@else if(icon) {\r\n <mat-icon [ngStyle]=\"getImageResourceStyle(imageResource)\" [color]=\"color ?? 'primary'\">\r\n {{ icon }}\r\n </mat-icon>\r\n }\r\n</ng-template>\r\n", styles: [".custom-prime-icon{height:1rem;width:auto}:host ::ng-deep .p-badge{background-color:var(--accent-color);color:#fff;font-size:.5rem;min-width:1rem;height:1rem;line-height:1rem}:host ::ng-deep .p-overlay-badge .p-badge{transform:translate(80%,-70%)}.imageIcon{height:1rem;max-width:1rem;border-radius:.3rem}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.SmartTooltipDirective, selector: "[smartTooltip]", inputs: ["smartTooltip"] }, { kind: "directive", type: i6.UiBadgeDirective, selector: "[uiBadge], [uiBadgeValue]", inputs: ["uiBadge", "uiBadgeValue"] }] }); }
79
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartIconComponent, selector: "smart-icon", inputs: { iconWithoutNamespace: ["icon", "iconWithoutNamespace"], color: "color", imageResource: "imageResource" }, usesOnChanges: true, ngImport: i0, template: "@if(imageResource){\r\n<ng-container *ngTemplateOutlet=\"imageResourceIcon\" />\r\n} @else if(iconWithoutNamespace){\r\n<ng-container *ngTemplateOutlet=\"normalIcon\" />\r\n}\r\n\r\n<ng-template #imageResourceIcon>\r\n @if(imageResource){\r\n <div\r\n class=\"imageResourceIcon\"\r\n [smartTooltip]=\"imageResource.tooltip\"\r\n [uiBadge]=\"imageResource.badge\"\r\n >\r\n @if(imageResource.kind === imageResourceKind.URL){\r\n <img\r\n [ngStyle]=\"getImageResourceStyle(imageResource)\"\r\n class=\"imageIcon\"\r\n [src]=\"imageResource.source\"\r\n [alt]=\"imageResource.identifier\"\r\n />\r\n } @else if(imageResource.identifier){\r\n <ng-container *ngTemplateOutlet=\"normalIcon\"></ng-container>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #normalIcon>\r\n @if(compLib === componentLibrary.PRIMENG){\r\n <ng-container *ngTemplateOutlet=\"primeIcon\" />\r\n }@else {\r\n <ng-container *ngTemplateOutlet=\"materialIcon\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #primeIcon>\r\n @if (isCustom) {\r\n <i\r\n class=\"pi custom-prime-icon\"\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n >\r\n @if(iconHtml){\r\n <span\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n [innerHTML]=\"iconHtml\"\r\n ></span>\r\n }\r\n </i>\r\n }@else if(icon) {\r\n <i\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n [ngClass]=\"getIcon(icon)\"\r\n ></i>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #materialIcon>\r\n @if (isCustom) {\r\n <mat-icon\r\n [ngStyle]=\"getImageResourceStyle(imageResource)\"\r\n [color]=\"color ?? 'primary'\"\r\n svgIcon=\"{{ icon }}\"\r\n ></mat-icon>\r\n }@else if(icon) {\r\n <mat-icon [ngStyle]=\"getImageResourceStyle(imageResource)\" [color]=\"color ?? 'primary'\">\r\n {{ icon }}\r\n </mat-icon>\r\n }\r\n</ng-template>\r\n", styles: [":host{display:inline-flex;min-width:1rem;width:1rem}.custom-prime-icon{height:1rem;width:auto}:host ::ng-deep .p-badge{background-color:var(--accent-color);color:#fff;font-size:.5rem;min-width:1rem;height:1rem;line-height:1rem}:host ::ng-deep .p-overlay-badge .p-badge{transform:translate(80%,-70%)}.imageIcon{height:1rem;max-width:1rem;border-radius:.3rem}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.SmartTooltipDirective, selector: "[smartTooltip]", inputs: ["smartTooltip"] }, { kind: "directive", type: i6.UiBadgeDirective, selector: "[uiBadge], [uiBadgeValue]", inputs: ["uiBadge", "uiBadgeValue"] }] }); }
80
80
  }
81
81
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartIconComponent, decorators: [{
82
82
  type: Component,
83
- args: [{ selector: 'smart-icon', template: "@if(imageResource){\r\n<ng-container *ngTemplateOutlet=\"imageResourceIcon\" />\r\n} @else if(iconWithoutNamespace){\r\n<ng-container *ngTemplateOutlet=\"normalIcon\" />\r\n}\r\n\r\n<ng-template #imageResourceIcon>\r\n @if(imageResource){\r\n <div\r\n class=\"imageResourceIcon\"\r\n [smartTooltip]=\"imageResource.tooltip\"\r\n [uiBadge]=\"imageResource.badge\"\r\n >\r\n @if(imageResource.kind === imageResourceKind.URL){\r\n <img\r\n [ngStyle]=\"getImageResourceStyle(imageResource)\"\r\n class=\"imageIcon\"\r\n [src]=\"imageResource.source\"\r\n [alt]=\"imageResource.identifier\"\r\n />\r\n } @else if(imageResource.identifier){\r\n <ng-container *ngTemplateOutlet=\"normalIcon\"></ng-container>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #normalIcon>\r\n @if(compLib === componentLibrary.PRIMENG){\r\n <ng-container *ngTemplateOutlet=\"primeIcon\" />\r\n }@else {\r\n <ng-container *ngTemplateOutlet=\"materialIcon\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #primeIcon>\r\n @if (isCustom) {\r\n <i\r\n class=\"pi custom-prime-icon\"\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n >\r\n @if(iconHtml){\r\n <span\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n [innerHTML]=\"iconHtml\"\r\n ></span>\r\n }\r\n </i>\r\n }@else if(icon) {\r\n <i\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n [ngClass]=\"getIcon(icon)\"\r\n ></i>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #materialIcon>\r\n @if (isCustom) {\r\n <mat-icon\r\n [ngStyle]=\"getImageResourceStyle(imageResource)\"\r\n [color]=\"color ?? 'primary'\"\r\n svgIcon=\"{{ icon }}\"\r\n ></mat-icon>\r\n }@else if(icon) {\r\n <mat-icon [ngStyle]=\"getImageResourceStyle(imageResource)\" [color]=\"color ?? 'primary'\">\r\n {{ icon }}\r\n </mat-icon>\r\n }\r\n</ng-template>\r\n", styles: [".custom-prime-icon{height:1rem;width:auto}:host ::ng-deep .p-badge{background-color:var(--accent-color);color:#fff;font-size:.5rem;min-width:1rem;height:1rem;line-height:1rem}:host ::ng-deep .p-overlay-badge .p-badge{transform:translate(80%,-70%)}.imageIcon{height:1rem;max-width:1rem;border-radius:.3rem}\n"] }]
83
+ args: [{ selector: 'smart-icon', template: "@if(imageResource){\r\n<ng-container *ngTemplateOutlet=\"imageResourceIcon\" />\r\n} @else if(iconWithoutNamespace){\r\n<ng-container *ngTemplateOutlet=\"normalIcon\" />\r\n}\r\n\r\n<ng-template #imageResourceIcon>\r\n @if(imageResource){\r\n <div\r\n class=\"imageResourceIcon\"\r\n [smartTooltip]=\"imageResource.tooltip\"\r\n [uiBadge]=\"imageResource.badge\"\r\n >\r\n @if(imageResource.kind === imageResourceKind.URL){\r\n <img\r\n [ngStyle]=\"getImageResourceStyle(imageResource)\"\r\n class=\"imageIcon\"\r\n [src]=\"imageResource.source\"\r\n [alt]=\"imageResource.identifier\"\r\n />\r\n } @else if(imageResource.identifier){\r\n <ng-container *ngTemplateOutlet=\"normalIcon\"></ng-container>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #normalIcon>\r\n @if(compLib === componentLibrary.PRIMENG){\r\n <ng-container *ngTemplateOutlet=\"primeIcon\" />\r\n }@else {\r\n <ng-container *ngTemplateOutlet=\"materialIcon\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #primeIcon>\r\n @if (isCustom) {\r\n <i\r\n class=\"pi custom-prime-icon\"\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n >\r\n @if(iconHtml){\r\n <span\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n [innerHTML]=\"iconHtml\"\r\n ></span>\r\n }\r\n </i>\r\n }@else if(icon) {\r\n <i\r\n [ngStyle]=\"mergeStyles(getImageResourceStyle(imageResource), getStyle(color))\"\r\n [ngClass]=\"getIcon(icon)\"\r\n ></i>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #materialIcon>\r\n @if (isCustom) {\r\n <mat-icon\r\n [ngStyle]=\"getImageResourceStyle(imageResource)\"\r\n [color]=\"color ?? 'primary'\"\r\n svgIcon=\"{{ icon }}\"\r\n ></mat-icon>\r\n }@else if(icon) {\r\n <mat-icon [ngStyle]=\"getImageResourceStyle(imageResource)\" [color]=\"color ?? 'primary'\">\r\n {{ icon }}\r\n </mat-icon>\r\n }\r\n</ng-template>\r\n", styles: [":host{display:inline-flex;min-width:1rem;width:1rem}.custom-prime-icon{height:1rem;width:auto}:host ::ng-deep .p-badge{background-color:var(--accent-color);color:#fff;font-size:.5rem;min-width:1rem;height:1rem;line-height:1rem}:host ::ng-deep .p-overlay-badge .p-badge{transform:translate(80%,-70%)}.imageIcon{height:1rem;max-width:1rem;border-radius:.3rem}\n"] }]
84
84
  }], ctorParameters: () => [{ type: i1.SmartIconService }, { type: i0.ChangeDetectorRef }, { type: i2.DomSanitizer }, { type: i7.ComponentLibrary, decorators: [{
85
85
  type: Inject,
86
86
  args: [COMPONENT_LIBRARY]
@@ -1,7 +1,6 @@
1
1
  import { Component } from '@angular/core';
2
2
  import { Table } from '../table';
3
3
  import { trigger, state, style, transition, animate } from '@angular/animations';
4
- import { SmartGridToolbarActionsUtil } from '../../../smart-grid/smart-grid-toolbar-util';
5
4
  import * as i0 from "@angular/core";
6
5
  import * as i1 from "../../../component-factory-service/projects";
7
6
  import * as i2 from "../../../shared/smart-tooltip.directive";
@@ -9,19 +8,16 @@ import * as i3 from "@angular/common";
9
8
  import * as i4 from "@angular/material/checkbox";
10
9
  import * as i5 from "@angular/material/button";
11
10
  import * as i6 from "@angular/material/table";
12
- import * as i7 from "@angular/material/menu";
13
- import * as i8 from "../../../smart-icon/smart-icon/smart-icon.component";
14
- import * as i9 from "@angular/material/divider";
15
- import * as i10 from "../../../view-context/smart-ui-action/ui-action-toolbar.component";
16
- import * as i11 from "../../components/default-actions-popup/default-actions-popup.component";
17
- import * as i12 from "../../../shared/smarttable.date-pipe";
11
+ import * as i7 from "../../../smart-icon/smart-icon/smart-icon.component";
12
+ import * as i8 from "../../../view-context/smart-ui-action/ui-action-toolbar.component";
13
+ import * as i9 from "../../components/default-actions-popup/default-actions-popup.component";
14
+ import * as i10 from "../../../shared/smarttable.date-pipe";
18
15
  export class MaterialTableComponent extends Table {
19
16
  constructor(cfService) {
20
17
  super(cfService);
21
- this.defaultActionToolbarId = SmartGridToolbarActionsUtil.defaultActionToolbarId;
22
18
  }
23
19
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: MaterialTableComponent, deps: [{ token: i1.ComponentFactoryService }], target: i0.ɵɵFactoryTarget.Component }); }
24
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: MaterialTableComponent, selector: "lib-material-table", usesInheritance: true, ngImport: i0, template: "<table\r\n #myTable\r\n mat-table\r\n [dataSource]=\"smartTable.tableRows\"\r\n class=\"full-width\"\r\n multiTemplateDataRows\r\n>\r\n <!-- Column Descriptor -->\r\n @if(smartTable.title){\r\n <caption *ngIf=\"smartTable.title\" class=\"captionTitle\">\r\n {{ smartTable.title }}\r\n </caption>\r\n\r\n }\r\n <ng-container\r\n *ngFor=\"let header of smartTable.tableHeaders; let i = index\"\r\n matColumnDef=\"{{ header }}\"\r\n >\r\n <!-- my_menu is the implicit action column present on all tables: -->\r\n @if ('my_menu' === header) {\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [ngClass]=\"getColumnClasses(smartTable.customSmartTableHeaders![i])\"\r\n [ngStyle]=\"getColumnStyles(smartTable.customSmartTableHeaders![i])\"\r\n [attr.data-testid]=\"smartTable.customSmartTableHeaders![i].propertyName\"\r\n >\r\n <smart-ui-action-toolbar\r\n #headerToolbar\r\n [id]=\"\r\n smartTable.getGridId()\r\n ? smartTable.getGridId() + '_headerToolbar'\r\n : 'grid_not_initialized'\r\n \"\r\n >\r\n </smart-ui-action-toolbar>\r\n </th>\r\n } @else {\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [ngClass]=\"getColumnClasses(smartTable.customSmartTableHeaders![i])\"\r\n [ngStyle]=\"getColumnStyles(smartTable.customSmartTableHeaders![i])\"\r\n [attr.data-testid]=\"smartTable.customSmartTableHeaders![i].propertyName\"\r\n >\r\n <div\r\n *ngIf=\"header === 'icon' || header === 'img' || header === 'options' || header === 'button'\"\r\n ></div>\r\n <div *ngIf=\"header === 'select'\">\r\n <mat-checkbox\r\n *ngIf=\"smartTable.customSmartTableHeaders![i].showCheckboxInHeader\"\r\n (change)=\"$event ? toggleAllRows() : null\"\r\n [checked]=\"smartTable.selection!.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"smartTable.selection!.hasValue() && !isAllSelected()\"\r\n [aria-label]=\"checkboxLabel()\"\r\n >\r\n </mat-checkbox>\r\n <div *ngIf=\"!smartTable.customSmartTableHeaders![i].showCheckboxInHeader\">\r\n {{ smartTable.customTableHeaders[i] }}\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n header !== 'icon' &&\r\n header !== 'img' &&\r\n header !== 'options' &&\r\n header !== 'button' &&\r\n header !== 'select' &&\r\n header !== 'expand' &&\r\n header !== 'actions'\r\n \"\r\n >\r\n <div *ngIf=\"smartTable.sortable; then sortable; else notSortable\"></div>\r\n <ng-template #sortable>\r\n <button\r\n (click)=\"sortButtonClicked($event, smartTable.customSmartTableHeaders![i])\"\r\n *ngIf=\"smartTable.sortable && isSortable(smartTable.customSmartTableHeaders![i])\"\r\n mat-button\r\n class=\"sortableHeaderButton\"\r\n >\r\n {{ smartTable.customTableHeaders[i] }}\r\n <smart-icon\r\n class=\"sortableHeaderButtonIcon\"\r\n *ngIf=\"getSortIcon(header)\"\r\n title=\"sort\"\r\n [icon]=\"getSortIcon(header)!\"\r\n ></smart-icon>\r\n <smart-icon\r\n class=\"sortableHeaderButtonIcon\"\r\n *ngIf=\"hasSortNumIcon(header)\"\r\n title=\"sort\"\r\n [icon]=\"getSortNumIcon(header)\"\r\n ></smart-icon>\r\n </button>\r\n </ng-template>\r\n <ng-template #notSortable>\r\n {{ smartTable.customTableHeaders[i] }}\r\n </ng-template>\r\n </div>\r\n </th>\r\n }\r\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"isDisabled(element) ? 'disabledRow' : ''\">\r\n <mat-checkbox\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].propertyName === 'select' &&\r\n !isDisabled(element)\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n $event\r\n ? setSelection(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n : null\r\n \"\r\n [disabled]=\"isDisabled(element)\"\r\n [checked]=\"\r\n smartTable.selection!.isSelected(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n \"\r\n [aria-label]=\"\r\n checkboxLabel(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n \"\r\n >\r\n </mat-checkbox>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].properties\r\n \"\r\n >\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().DATETIME\">\r\n {{\r\n getValue(element, header)\r\n | smartDateTime : smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().DATE\">\r\n {{\r\n getValue(element, header)\r\n | smartDate : smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().TIME\">\r\n {{\r\n getValue(element, header)\r\n | smartTime : smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().CHECKBOX\">\r\n <mat-checkbox [disabled]=\"true\" [checked]=\"getValue(element, header)\"></mat-checkbox>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders[i].properties?.type === type().ICON &&\r\n smartTable.customSmartTableHeaders[i].properties?.icons?.length\r\n \"\r\n >\r\n <smart-icon\r\n [smartTooltip]=\"getToolTip(element, i)\"\r\n [icon]=\"getIcon(getValue(element, header), i)!\"\r\n [color]=\"getColor(getValue(element, header), i)\"\r\n >\r\n </smart-icon>\r\n </div>\r\n </div>\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(element, header)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].buttons\"\r\n class=\"smart-table-buttons-col\"\r\n >\r\n <div *ngFor=\"let button of smartTable.customSmartTableHeaders[i].buttons\">\r\n <div *ngIf=\"showButton(button, element)\" [ngSwitch]=\"button.type\">\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.ICON\"\r\n mat-icon-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon title=\"{{ button.label }}\" [icon]=\"button.icon!\"></smart-icon>\r\n </button>\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.NORMAL\"\r\n mat-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n {{ button.label ?? (button.translator ? button.translator(element).title : '') }}\r\n </button>\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.RAISED\"\r\n mat-raised-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n {{ button.label ?? (button.translator ? button.translator(element).title : '') }}\r\n </button>\r\n <div *ngSwitchCase=\"smartTableButtonType.MENU\" class=\"menu-button\">\r\n <!------ TOOLBAR ------>\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(element, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n <!------ TOOLBAR ------>\r\n <button\r\n *ngIf=\"showMenuButton(element, button)\"\r\n mat-button\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"customButtonClicked($event, button, element, undefined, true)\"\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n <!-- {{ button.label ?? (button.translator ? button.translator(element).title : '') }} -->\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <div *ngIf=\"button.menuItemButtons\">\r\n <button\r\n *ngFor=\"let btn of getMenuButtons(element, button)\"\r\n (click)=\"customButtonClicked($event, btn, element, undefined, true)\"\r\n mat-menu-item\r\n >\r\n <smart-icon\r\n *ngIf=\"btn?.translator(btn)?.icon\"\r\n [icon]=\"btn!.translator!(btn)!.icon!\"\r\n ></smart-icon>\r\n {{ btn?.translator(btn)?.title }}\r\n </button>\r\n </div>\r\n <div *ngIf=\"button.menuItemButtonsPropertyName\">\r\n <div *ngFor=\"let btn of getMenuItemButtonsPropertyName(element, button)\">\r\n <button\r\n *ngIf=\"btn.code !== ACTION_SEPERATOR\"\r\n (click)=\"customButtonClicked($event, button, element, btn, true)\"\r\n mat-menu-item\r\n [disabled]=\"btn.disabled\"\r\n [smartTooltip]=\"\r\n btn?.descriptor?.tooltip\r\n ? btn?.descriptor?.tooltip\r\n : button.translator!(btn).tooltip\r\n \"\r\n >\r\n <div\r\n class=\"smart-table-icon-container\"\r\n [ngClass]=\"\r\n button.translator!(btn).iconPosition === 'POST' ? 'reversed' : ''\r\n \"\r\n ><smart-icon\r\n *ngIf=\"button.translator!(btn).icon\"\r\n [icon]=\"button.translator!(btn).icon!\"\r\n ></smart-icon>\r\n {{ button.translator!(btn).title }}</div\r\n >\r\n </button>\r\n <mat-divider *ngIf=\"btn.code === ACTION_SEPERATOR\"></mat-divider>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].icon\">\r\n <smart-icon\r\n *ngIf=\"smartTable.customSmartTableHeaders[i].icon?.icon\"\r\n [ngClass]=\"smartTable.customSmartTableHeaders[i].icon?.cssClass ?? ''\"\r\n [color]=\"smartTable.customSmartTableHeaders[i].icon?.color\"\r\n [icon]=\"smartTable.customSmartTableHeaders[i].icon!.icon\"\r\n >\r\n </smart-icon>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].translator !== undefined\r\n \"\r\n >\r\n {{ smartTable.customSmartTableHeaders[i].translator!(getValue(element, header)) }}\r\n </div>\r\n <button\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].propertyName === 'expand'\r\n \"\r\n mat-icon-button\r\n aria-label=\"expand row\"\r\n (click)=\"onToggle(element, $event)\"\r\n >\r\n <smart-icon *ngIf=\"expandedElement !== element\" [icon]=\"'keyboard_arrow_down'\"></smart-icon>\r\n <smart-icon *ngIf=\"expandedElement === element\" [icon]=\"'keyboard_arrow_up'\"></smart-icon>\r\n </button>\r\n <div\r\n *ngIf=\"\r\n !smartTable.customSmartTableHeaders ||\r\n (smartTable.customSmartTableHeaders &&\r\n !smartTable.customSmartTableHeaders[i].properties &&\r\n !smartTable.customSmartTableHeaders[i].icon &&\r\n !smartTable.customSmartTableHeaders[i].buttons &&\r\n !smartTable.customSmartTableHeaders[i].translator &&\r\n !(smartTable.customSmartTableHeaders[i].propertyName === 'select') &&\r\n !(smartTable.customSmartTableHeaders[i].propertyName === 'expand'))\r\n \"\r\n >\r\n <smart-icon *ngIf=\"header === 'icon'\" [icon]=\"getValue(element, header)!\"> </smart-icon>\r\n <img\r\n *ngIf=\"header === 'img'\"\r\n [src]=\"getValue(element, header)\"\r\n alt=\"\"\r\n class=\"smarttableImg\"\r\n />\r\n <!------ TOOLBAR ------>\r\n <ng-container *ngIf=\"showCellToolbar(element, header)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(element, header)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n <!------ TOOLBAR ------>\r\n <div\r\n *ngIf=\"\r\n header !== 'icon' &&\r\n header !== 'img' &&\r\n header !== 'option' &&\r\n header !== 'button' &&\r\n !isImageResource(element, header)\r\n \"\r\n [innerHtml]=\"getValue(element, header)\"\r\n ></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"expandedDetail\">\r\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"smartTable.tableHeaders.length\">\r\n <div\r\n class=\"example-element-detail\"\r\n [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\"\r\n >\r\n <ng-template #expandedArea></ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"smartTable.tableHeaders; sticky: true\"></tr>\r\n <ng-container *matRowDef=\"let element; columns: smartTable.tableHeaders\">\r\n <tr\r\n mat-row\r\n class=\"example-element-row\"\r\n [class.example-expanded-row]=\"expandedElement === element\"\r\n [ngClass]=\"getRowClasses(element)\"\r\n [ngStyle]=\"getRowStyles(element)\"\r\n (click)=\"handleOnRowClick(element)\"\r\n (dblclick)=\"handleOnRowDoubleClick($event, element)\"\r\n [attr.data-testid]=\"element?.id ?? null\"\r\n ></tr>\r\n <lib-default-actions-popup\r\n *ngIf=\"smartTable.defaultActionCodes && smartTable.defaultActionCodes.length > 0\"\r\n #defaultActionMenu\r\n [buttons]=\"getDefaultActionsForRow(element)!\"\r\n [row]=\"element\"\r\n ></lib-default-actions-popup>\r\n </ng-container>\r\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"example-detail-row\"></tr>\r\n</table>\r\n", styles: [".full-width{width:100%}.smarttableImg{width:25px}.smartTableRowHover:hover{cursor:pointer}tr.example-detail-row{height:0}tr.example-element-row:not(.example-expanded-row):hover{background:#f5f5f5}tr.example-element-row:not(.example-expanded-row):active{background:#efefef}.example-element-row td{border-bottom-width:0}.example-element-detail{overflow:hidden;display:flex;flex-direction:column}.example-element-diagram{min-width:80px;border:2px solid black;padding:8px;font-weight:lighter;margin:8px 0;height:104px}.example-element-symbol{font-weight:700;font-size:40px;line-height:normal}.example-element-description{padding:16px}.example-element-description-attribution{opacity:.5}.disabledRow{color:var(--disabled)}.disabledRow:hover{cursor:default}.smart-table-buttons-col{display:flex;flex-direction:row;justify-content:flex-end}.sortableHeaderButton{margin:0!important;padding:0!important;text-align:left!important}.selected{background-color:var(--primary-light-color)}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.reversed{flex-direction:row-reverse;gap:1rem}:host ::ng-deep .mat-mdc-menu-item{line-height:normal!important}.mat-mdc-menu-item[disabled]{cursor:default!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.captionTitle{font-size:1.5rem;align-content:center;padding:.5rem .75rem;text-align:start;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);background:#f5f5f5}\n"], dependencies: [{ kind: "directive", type: i2.SmartTooltipDirective, selector: "[smartTooltip]", inputs: ["smartTooltip"] }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.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: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i9.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i10.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: i11.DefaultActionsPopupComponent, selector: "lib-default-actions-popup", inputs: ["buttons", "row", "colIdx"] }, { kind: "pipe", type: i12.SmartDateTimePipe, name: "smartDateTime" }, { kind: "pipe", type: i12.SmartDatePipe, name: "smartDate" }, { kind: "pipe", type: i12.SmartTimePipe, name: "smartTime" }], animations: [
20
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: MaterialTableComponent, selector: "lib-material-table", usesInheritance: true, ngImport: i0, template: "<table\r\n #myTable\r\n mat-table\r\n [dataSource]=\"smartTable.tableRows\"\r\n class=\"full-width\"\r\n multiTemplateDataRows\r\n>\r\n <!-- Column Descriptor -->\r\n @if (smartTable.title) {\r\n <caption *ngIf=\"smartTable.title\" class=\"captionTitle\">\r\n {{ smartTable.title }}\r\n </caption>\r\n }\r\n <ng-container\r\n *ngFor=\"let header of smartTable.tableHeaders; let i = index\"\r\n matColumnDef=\"{{ header }}\"\r\n >\r\n <!-- my_menu is the implicit action column present on all tables: -->\r\n @if ('my_menu' === header) {\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [ngClass]=\"getColumnClasses(smartTable.customSmartTableHeaders![i])\"\r\n [ngStyle]=\"getColumnStyles(smartTable.customSmartTableHeaders![i])\"\r\n [attr.data-testid]=\"smartTable.customSmartTableHeaders![i].propertyName\"\r\n >\r\n <smart-ui-action-toolbar\r\n #headerToolbar\r\n [id]=\"\r\n smartTable.getGridId()\r\n ? smartTable.getGridId() + '_headerToolbar'\r\n : 'grid_not_initialized'\r\n \"\r\n >\r\n </smart-ui-action-toolbar>\r\n </th>\r\n } @else {\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [ngClass]=\"getColumnClasses(smartTable.customSmartTableHeaders![i])\"\r\n [ngStyle]=\"getColumnStyles(smartTable.customSmartTableHeaders![i])\"\r\n [attr.data-testid]=\"smartTable.customSmartTableHeaders![i].propertyName\"\r\n >\r\n <div\r\n *ngIf=\"\r\n header === 'icon' || header === 'img' || header === 'options' || header === 'button'\r\n \"\r\n ></div>\r\n <div *ngIf=\"header === 'select'\">\r\n <mat-checkbox\r\n *ngIf=\"smartTable.customSmartTableHeaders![i].showCheckboxInHeader\"\r\n (change)=\"$event ? toggleAllRows() : null\"\r\n [checked]=\"smartTable.selection!.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"smartTable.selection!.hasValue() && !isAllSelected()\"\r\n [aria-label]=\"checkboxLabel()\"\r\n >\r\n </mat-checkbox>\r\n <div *ngIf=\"!smartTable.customSmartTableHeaders![i].showCheckboxInHeader\">\r\n {{ smartTable.customTableHeaders[i] }}\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n header !== 'icon' &&\r\n header !== 'img' &&\r\n header !== 'options' &&\r\n header !== 'button' &&\r\n header !== 'select' &&\r\n header !== 'expand' &&\r\n header !== 'actions'\r\n \"\r\n >\r\n <div *ngIf=\"smartTable.sortable; then sortable; else notSortable\"></div>\r\n <ng-template #sortable>\r\n <button\r\n (click)=\"sortButtonClicked($event, smartTable.customSmartTableHeaders![i])\"\r\n *ngIf=\"smartTable.sortable && isSortable(smartTable.customSmartTableHeaders![i])\"\r\n mat-button\r\n class=\"sortableHeaderButton\"\r\n >\r\n {{ smartTable.customTableHeaders[i] }}\r\n <smart-icon\r\n class=\"sortableHeaderButtonIcon\"\r\n *ngIf=\"getSortIcon(header)\"\r\n title=\"sort\"\r\n [icon]=\"getSortIcon(header)!\"\r\n ></smart-icon>\r\n <smart-icon\r\n class=\"sortableHeaderButtonIcon\"\r\n *ngIf=\"hasSortNumIcon(header)\"\r\n title=\"sort\"\r\n [icon]=\"getSortNumIcon(header)\"\r\n ></smart-icon>\r\n </button>\r\n </ng-template>\r\n <ng-template #notSortable>\r\n {{ smartTable.customTableHeaders[i] }}\r\n </ng-template>\r\n </div>\r\n </th>\r\n }\r\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"isDisabled(element) ? 'disabledRow' : ''\">\r\n <mat-checkbox\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].propertyName === 'select' &&\r\n !isDisabled(element)\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n $event\r\n ? setSelection(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n : null\r\n \"\r\n [disabled]=\"isDisabled(element)\"\r\n [checked]=\"\r\n smartTable.selection!.isSelected(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n \"\r\n [aria-label]=\"\r\n checkboxLabel(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n \"\r\n >\r\n </mat-checkbox>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].properties\r\n \"\r\n >\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().DATETIME\">\r\n {{\r\n getValue(element, header)\r\n | smartDateTime: smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().DATE\">\r\n {{\r\n getValue(element, header)\r\n | smartDate: smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().TIME\">\r\n {{\r\n getValue(element, header)\r\n | smartTime: smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().CHECKBOX\">\r\n <mat-checkbox [disabled]=\"true\" [checked]=\"getValue(element, header)\"></mat-checkbox>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders[i].properties?.type === type().ICON &&\r\n smartTable.customSmartTableHeaders[i].properties?.icons?.length\r\n \"\r\n >\r\n <smart-icon\r\n [smartTooltip]=\"getToolTip(element, i)\"\r\n [icon]=\"getIcon(getValue(element, header), i)!\"\r\n [color]=\"getColor(getValue(element, header), i)\"\r\n >\r\n </smart-icon>\r\n </div>\r\n </div>\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(element, header)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].buttons\"\r\n class=\"smart-table-buttons-col\"\r\n >\r\n <div *ngFor=\"let button of smartTable.customSmartTableHeaders[i].buttons\">\r\n <div *ngIf=\"showButton(button, element)\" [ngSwitch]=\"button.type\">\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.ICON\"\r\n mat-icon-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon title=\"{{ button.label }}\" [icon]=\"button.icon!\"></smart-icon>\r\n </button>\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.NORMAL\"\r\n mat-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n {{ button.label ?? (button.translator ? button.translator(element).title : '') }}\r\n </button>\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.RAISED\"\r\n mat-raised-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n {{ button.label ?? (button.translator ? button.translator(element).title : '') }}\r\n </button>\r\n <!------ MENU ------>\r\n <div *ngSwitchCase=\"smartTableButtonType.MENU\" class=\"menu-button\">\r\n <!------ DEFAULT_ACTION_COLUMN ID TOOLBAR ------>\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(element, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n\r\n <!------ GENERIC HAMBURGER ------>\r\n @if (shouldShowMenuButton(element)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowMenuActionModelArray(element)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </div>\r\n\r\n <!------ MENU ------>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].icon\">\r\n <smart-icon\r\n *ngIf=\"smartTable.customSmartTableHeaders[i].icon?.icon\"\r\n [ngClass]=\"smartTable.customSmartTableHeaders[i].icon?.cssClass ?? ''\"\r\n [color]=\"smartTable.customSmartTableHeaders[i].icon?.color\"\r\n [icon]=\"smartTable.customSmartTableHeaders[i].icon!.icon\"\r\n >\r\n </smart-icon>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].translator !== undefined\r\n \"\r\n >\r\n {{ smartTable.customSmartTableHeaders[i].translator!(getValue(element, header)) }}\r\n </div>\r\n <button\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].propertyName === 'expand'\r\n \"\r\n mat-icon-button\r\n aria-label=\"expand row\"\r\n (click)=\"onToggle(element, $event)\"\r\n >\r\n <smart-icon *ngIf=\"expandedElement !== element\" [icon]=\"'keyboard_arrow_down'\"></smart-icon>\r\n <smart-icon *ngIf=\"expandedElement === element\" [icon]=\"'keyboard_arrow_up'\"></smart-icon>\r\n </button>\r\n <div\r\n *ngIf=\"\r\n !smartTable.customSmartTableHeaders ||\r\n (smartTable.customSmartTableHeaders &&\r\n !smartTable.customSmartTableHeaders[i].properties &&\r\n !smartTable.customSmartTableHeaders[i].icon &&\r\n !smartTable.customSmartTableHeaders[i].buttons &&\r\n !smartTable.customSmartTableHeaders[i].translator &&\r\n !(smartTable.customSmartTableHeaders[i].propertyName === 'select') &&\r\n !(smartTable.customSmartTableHeaders[i].propertyName === 'expand'))\r\n \"\r\n >\r\n <smart-icon *ngIf=\"header === 'icon'\" [icon]=\"getValue(element, header)!\"> </smart-icon>\r\n <img\r\n *ngIf=\"header === 'img'\"\r\n [src]=\"getValue(element, header)\"\r\n alt=\"\"\r\n class=\"smarttableImg\"\r\n />\r\n <!------ TOOLBAR ------>\r\n <ng-container *ngIf=\"showCellToolbar(element, header)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(element, header)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n <!------ TOOLBAR ------>\r\n <div\r\n *ngIf=\"\r\n header !== 'icon' &&\r\n header !== 'img' &&\r\n header !== 'option' &&\r\n header !== 'button' &&\r\n !isImageResource(element, header)\r\n \"\r\n [innerHtml]=\"getValue(element, header)\"\r\n ></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"expandedDetail\">\r\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"smartTable.tableHeaders.length\">\r\n <div\r\n class=\"example-element-detail\"\r\n [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\"\r\n >\r\n <ng-template #expandedArea></ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"smartTable.tableHeaders; sticky: true\"></tr>\r\n <ng-container *matRowDef=\"let element; columns: smartTable.tableHeaders\">\r\n <tr\r\n mat-row\r\n class=\"example-element-row\"\r\n [class.example-expanded-row]=\"expandedElement === element\"\r\n [ngClass]=\"getRowClasses(element)\"\r\n [ngStyle]=\"getRowStyles(element)\"\r\n (click)=\"handleOnRowClick(element)\"\r\n (dblclick)=\"handleOnRowDoubleClick($event, element)\"\r\n [attr.data-testid]=\"element?.id ?? null\"\r\n ></tr>\r\n <lib-default-actions-popup\r\n *ngIf=\"smartTable.defaultActionCodes && smartTable.defaultActionCodes.length > 0\"\r\n #defaultActionMenu\r\n [buttons]=\"getDefaultActionsForRow(element)!\"\r\n [row]=\"element\"\r\n ></lib-default-actions-popup>\r\n </ng-container>\r\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"example-detail-row\"></tr>\r\n</table>\r\n", styles: [".full-width{width:100%}.smarttableImg{width:25px}.smartTableRowHover:hover{cursor:pointer}tr.example-detail-row{height:0}tr.example-element-row:not(.example-expanded-row):hover{background:#f5f5f5}tr.example-element-row:not(.example-expanded-row):active{background:#efefef}.example-element-row td{border-bottom-width:0}.example-element-detail{overflow:hidden;display:flex;flex-direction:column}.example-element-diagram{min-width:80px;border:2px solid black;padding:8px;font-weight:lighter;margin:8px 0;height:104px}.example-element-symbol{font-weight:700;font-size:40px;line-height:normal}.example-element-description{padding:16px}.example-element-description-attribution{opacity:.5}.disabledRow{color:var(--disabled)}.disabledRow:hover{cursor:default}.smart-table-buttons-col{display:flex;flex-direction:row;justify-content:flex-end}.sortableHeaderButton{margin:0!important;padding:0!important;text-align:left!important}.selected{background-color:var(--primary-light-color)}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.reversed{flex-direction:row-reverse;gap:1rem}:host ::ng-deep .mat-mdc-menu-item{line-height:normal!important}.mat-mdc-menu-item[disabled]{cursor:default!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.captionTitle{font-size:1.5rem;align-content:center;padding:.5rem .75rem;text-align:start;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);background:#f5f5f5}\n"], dependencies: [{ kind: "directive", type: i2.SmartTooltipDirective, selector: "[smartTooltip]", inputs: ["smartTooltip"] }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i8.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: i9.DefaultActionsPopupComponent, selector: "lib-default-actions-popup", inputs: ["buttons", "row", "colIdx"] }, { kind: "pipe", type: i10.SmartDateTimePipe, name: "smartDateTime" }, { kind: "pipe", type: i10.SmartDatePipe, name: "smartDate" }, { kind: "pipe", type: i10.SmartTimePipe, name: "smartTime" }], animations: [
25
21
  trigger('detailExpand', [
26
22
  state('collapsed', style({ height: '0px', minHeight: '0' })),
27
23
  state('expanded', style({ height: '*' })),
@@ -37,6 +33,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
37
33
  state('expanded', style({ height: '*' })),
38
34
  transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
39
35
  ]),
40
- ], template: "<table\r\n #myTable\r\n mat-table\r\n [dataSource]=\"smartTable.tableRows\"\r\n class=\"full-width\"\r\n multiTemplateDataRows\r\n>\r\n <!-- Column Descriptor -->\r\n @if(smartTable.title){\r\n <caption *ngIf=\"smartTable.title\" class=\"captionTitle\">\r\n {{ smartTable.title }}\r\n </caption>\r\n\r\n }\r\n <ng-container\r\n *ngFor=\"let header of smartTable.tableHeaders; let i = index\"\r\n matColumnDef=\"{{ header }}\"\r\n >\r\n <!-- my_menu is the implicit action column present on all tables: -->\r\n @if ('my_menu' === header) {\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [ngClass]=\"getColumnClasses(smartTable.customSmartTableHeaders![i])\"\r\n [ngStyle]=\"getColumnStyles(smartTable.customSmartTableHeaders![i])\"\r\n [attr.data-testid]=\"smartTable.customSmartTableHeaders![i].propertyName\"\r\n >\r\n <smart-ui-action-toolbar\r\n #headerToolbar\r\n [id]=\"\r\n smartTable.getGridId()\r\n ? smartTable.getGridId() + '_headerToolbar'\r\n : 'grid_not_initialized'\r\n \"\r\n >\r\n </smart-ui-action-toolbar>\r\n </th>\r\n } @else {\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [ngClass]=\"getColumnClasses(smartTable.customSmartTableHeaders![i])\"\r\n [ngStyle]=\"getColumnStyles(smartTable.customSmartTableHeaders![i])\"\r\n [attr.data-testid]=\"smartTable.customSmartTableHeaders![i].propertyName\"\r\n >\r\n <div\r\n *ngIf=\"header === 'icon' || header === 'img' || header === 'options' || header === 'button'\"\r\n ></div>\r\n <div *ngIf=\"header === 'select'\">\r\n <mat-checkbox\r\n *ngIf=\"smartTable.customSmartTableHeaders![i].showCheckboxInHeader\"\r\n (change)=\"$event ? toggleAllRows() : null\"\r\n [checked]=\"smartTable.selection!.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"smartTable.selection!.hasValue() && !isAllSelected()\"\r\n [aria-label]=\"checkboxLabel()\"\r\n >\r\n </mat-checkbox>\r\n <div *ngIf=\"!smartTable.customSmartTableHeaders![i].showCheckboxInHeader\">\r\n {{ smartTable.customTableHeaders[i] }}\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n header !== 'icon' &&\r\n header !== 'img' &&\r\n header !== 'options' &&\r\n header !== 'button' &&\r\n header !== 'select' &&\r\n header !== 'expand' &&\r\n header !== 'actions'\r\n \"\r\n >\r\n <div *ngIf=\"smartTable.sortable; then sortable; else notSortable\"></div>\r\n <ng-template #sortable>\r\n <button\r\n (click)=\"sortButtonClicked($event, smartTable.customSmartTableHeaders![i])\"\r\n *ngIf=\"smartTable.sortable && isSortable(smartTable.customSmartTableHeaders![i])\"\r\n mat-button\r\n class=\"sortableHeaderButton\"\r\n >\r\n {{ smartTable.customTableHeaders[i] }}\r\n <smart-icon\r\n class=\"sortableHeaderButtonIcon\"\r\n *ngIf=\"getSortIcon(header)\"\r\n title=\"sort\"\r\n [icon]=\"getSortIcon(header)!\"\r\n ></smart-icon>\r\n <smart-icon\r\n class=\"sortableHeaderButtonIcon\"\r\n *ngIf=\"hasSortNumIcon(header)\"\r\n title=\"sort\"\r\n [icon]=\"getSortNumIcon(header)\"\r\n ></smart-icon>\r\n </button>\r\n </ng-template>\r\n <ng-template #notSortable>\r\n {{ smartTable.customTableHeaders[i] }}\r\n </ng-template>\r\n </div>\r\n </th>\r\n }\r\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"isDisabled(element) ? 'disabledRow' : ''\">\r\n <mat-checkbox\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].propertyName === 'select' &&\r\n !isDisabled(element)\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n $event\r\n ? setSelection(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n : null\r\n \"\r\n [disabled]=\"isDisabled(element)\"\r\n [checked]=\"\r\n smartTable.selection!.isSelected(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n \"\r\n [aria-label]=\"\r\n checkboxLabel(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n \"\r\n >\r\n </mat-checkbox>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].properties\r\n \"\r\n >\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().DATETIME\">\r\n {{\r\n getValue(element, header)\r\n | smartDateTime : smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().DATE\">\r\n {{\r\n getValue(element, header)\r\n | smartDate : smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().TIME\">\r\n {{\r\n getValue(element, header)\r\n | smartTime : smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().CHECKBOX\">\r\n <mat-checkbox [disabled]=\"true\" [checked]=\"getValue(element, header)\"></mat-checkbox>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders[i].properties?.type === type().ICON &&\r\n smartTable.customSmartTableHeaders[i].properties?.icons?.length\r\n \"\r\n >\r\n <smart-icon\r\n [smartTooltip]=\"getToolTip(element, i)\"\r\n [icon]=\"getIcon(getValue(element, header), i)!\"\r\n [color]=\"getColor(getValue(element, header), i)\"\r\n >\r\n </smart-icon>\r\n </div>\r\n </div>\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(element, header)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].buttons\"\r\n class=\"smart-table-buttons-col\"\r\n >\r\n <div *ngFor=\"let button of smartTable.customSmartTableHeaders[i].buttons\">\r\n <div *ngIf=\"showButton(button, element)\" [ngSwitch]=\"button.type\">\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.ICON\"\r\n mat-icon-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon title=\"{{ button.label }}\" [icon]=\"button.icon!\"></smart-icon>\r\n </button>\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.NORMAL\"\r\n mat-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n {{ button.label ?? (button.translator ? button.translator(element).title : '') }}\r\n </button>\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.RAISED\"\r\n mat-raised-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n {{ button.label ?? (button.translator ? button.translator(element).title : '') }}\r\n </button>\r\n <div *ngSwitchCase=\"smartTableButtonType.MENU\" class=\"menu-button\">\r\n <!------ TOOLBAR ------>\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(element, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n <!------ TOOLBAR ------>\r\n <button\r\n *ngIf=\"showMenuButton(element, button)\"\r\n mat-button\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"customButtonClicked($event, button, element, undefined, true)\"\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n <!-- {{ button.label ?? (button.translator ? button.translator(element).title : '') }} -->\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <div *ngIf=\"button.menuItemButtons\">\r\n <button\r\n *ngFor=\"let btn of getMenuButtons(element, button)\"\r\n (click)=\"customButtonClicked($event, btn, element, undefined, true)\"\r\n mat-menu-item\r\n >\r\n <smart-icon\r\n *ngIf=\"btn?.translator(btn)?.icon\"\r\n [icon]=\"btn!.translator!(btn)!.icon!\"\r\n ></smart-icon>\r\n {{ btn?.translator(btn)?.title }}\r\n </button>\r\n </div>\r\n <div *ngIf=\"button.menuItemButtonsPropertyName\">\r\n <div *ngFor=\"let btn of getMenuItemButtonsPropertyName(element, button)\">\r\n <button\r\n *ngIf=\"btn.code !== ACTION_SEPERATOR\"\r\n (click)=\"customButtonClicked($event, button, element, btn, true)\"\r\n mat-menu-item\r\n [disabled]=\"btn.disabled\"\r\n [smartTooltip]=\"\r\n btn?.descriptor?.tooltip\r\n ? btn?.descriptor?.tooltip\r\n : button.translator!(btn).tooltip\r\n \"\r\n >\r\n <div\r\n class=\"smart-table-icon-container\"\r\n [ngClass]=\"\r\n button.translator!(btn).iconPosition === 'POST' ? 'reversed' : ''\r\n \"\r\n ><smart-icon\r\n *ngIf=\"button.translator!(btn).icon\"\r\n [icon]=\"button.translator!(btn).icon!\"\r\n ></smart-icon>\r\n {{ button.translator!(btn).title }}</div\r\n >\r\n </button>\r\n <mat-divider *ngIf=\"btn.code === ACTION_SEPERATOR\"></mat-divider>\r\n </div>\r\n </div>\r\n </mat-menu>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].icon\">\r\n <smart-icon\r\n *ngIf=\"smartTable.customSmartTableHeaders[i].icon?.icon\"\r\n [ngClass]=\"smartTable.customSmartTableHeaders[i].icon?.cssClass ?? ''\"\r\n [color]=\"smartTable.customSmartTableHeaders[i].icon?.color\"\r\n [icon]=\"smartTable.customSmartTableHeaders[i].icon!.icon\"\r\n >\r\n </smart-icon>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].translator !== undefined\r\n \"\r\n >\r\n {{ smartTable.customSmartTableHeaders[i].translator!(getValue(element, header)) }}\r\n </div>\r\n <button\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].propertyName === 'expand'\r\n \"\r\n mat-icon-button\r\n aria-label=\"expand row\"\r\n (click)=\"onToggle(element, $event)\"\r\n >\r\n <smart-icon *ngIf=\"expandedElement !== element\" [icon]=\"'keyboard_arrow_down'\"></smart-icon>\r\n <smart-icon *ngIf=\"expandedElement === element\" [icon]=\"'keyboard_arrow_up'\"></smart-icon>\r\n </button>\r\n <div\r\n *ngIf=\"\r\n !smartTable.customSmartTableHeaders ||\r\n (smartTable.customSmartTableHeaders &&\r\n !smartTable.customSmartTableHeaders[i].properties &&\r\n !smartTable.customSmartTableHeaders[i].icon &&\r\n !smartTable.customSmartTableHeaders[i].buttons &&\r\n !smartTable.customSmartTableHeaders[i].translator &&\r\n !(smartTable.customSmartTableHeaders[i].propertyName === 'select') &&\r\n !(smartTable.customSmartTableHeaders[i].propertyName === 'expand'))\r\n \"\r\n >\r\n <smart-icon *ngIf=\"header === 'icon'\" [icon]=\"getValue(element, header)!\"> </smart-icon>\r\n <img\r\n *ngIf=\"header === 'img'\"\r\n [src]=\"getValue(element, header)\"\r\n alt=\"\"\r\n class=\"smarttableImg\"\r\n />\r\n <!------ TOOLBAR ------>\r\n <ng-container *ngIf=\"showCellToolbar(element, header)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(element, header)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n <!------ TOOLBAR ------>\r\n <div\r\n *ngIf=\"\r\n header !== 'icon' &&\r\n header !== 'img' &&\r\n header !== 'option' &&\r\n header !== 'button' &&\r\n !isImageResource(element, header)\r\n \"\r\n [innerHtml]=\"getValue(element, header)\"\r\n ></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"expandedDetail\">\r\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"smartTable.tableHeaders.length\">\r\n <div\r\n class=\"example-element-detail\"\r\n [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\"\r\n >\r\n <ng-template #expandedArea></ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"smartTable.tableHeaders; sticky: true\"></tr>\r\n <ng-container *matRowDef=\"let element; columns: smartTable.tableHeaders\">\r\n <tr\r\n mat-row\r\n class=\"example-element-row\"\r\n [class.example-expanded-row]=\"expandedElement === element\"\r\n [ngClass]=\"getRowClasses(element)\"\r\n [ngStyle]=\"getRowStyles(element)\"\r\n (click)=\"handleOnRowClick(element)\"\r\n (dblclick)=\"handleOnRowDoubleClick($event, element)\"\r\n [attr.data-testid]=\"element?.id ?? null\"\r\n ></tr>\r\n <lib-default-actions-popup\r\n *ngIf=\"smartTable.defaultActionCodes && smartTable.defaultActionCodes.length > 0\"\r\n #defaultActionMenu\r\n [buttons]=\"getDefaultActionsForRow(element)!\"\r\n [row]=\"element\"\r\n ></lib-default-actions-popup>\r\n </ng-container>\r\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"example-detail-row\"></tr>\r\n</table>\r\n", styles: [".full-width{width:100%}.smarttableImg{width:25px}.smartTableRowHover:hover{cursor:pointer}tr.example-detail-row{height:0}tr.example-element-row:not(.example-expanded-row):hover{background:#f5f5f5}tr.example-element-row:not(.example-expanded-row):active{background:#efefef}.example-element-row td{border-bottom-width:0}.example-element-detail{overflow:hidden;display:flex;flex-direction:column}.example-element-diagram{min-width:80px;border:2px solid black;padding:8px;font-weight:lighter;margin:8px 0;height:104px}.example-element-symbol{font-weight:700;font-size:40px;line-height:normal}.example-element-description{padding:16px}.example-element-description-attribution{opacity:.5}.disabledRow{color:var(--disabled)}.disabledRow:hover{cursor:default}.smart-table-buttons-col{display:flex;flex-direction:row;justify-content:flex-end}.sortableHeaderButton{margin:0!important;padding:0!important;text-align:left!important}.selected{background-color:var(--primary-light-color)}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.reversed{flex-direction:row-reverse;gap:1rem}:host ::ng-deep .mat-mdc-menu-item{line-height:normal!important}.mat-mdc-menu-item[disabled]{cursor:default!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.captionTitle{font-size:1.5rem;align-content:center;padding:.5rem .75rem;text-align:start;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);background:#f5f5f5}\n"] }]
36
+ ], template: "<table\r\n #myTable\r\n mat-table\r\n [dataSource]=\"smartTable.tableRows\"\r\n class=\"full-width\"\r\n multiTemplateDataRows\r\n>\r\n <!-- Column Descriptor -->\r\n @if (smartTable.title) {\r\n <caption *ngIf=\"smartTable.title\" class=\"captionTitle\">\r\n {{ smartTable.title }}\r\n </caption>\r\n }\r\n <ng-container\r\n *ngFor=\"let header of smartTable.tableHeaders; let i = index\"\r\n matColumnDef=\"{{ header }}\"\r\n >\r\n <!-- my_menu is the implicit action column present on all tables: -->\r\n @if ('my_menu' === header) {\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [ngClass]=\"getColumnClasses(smartTable.customSmartTableHeaders![i])\"\r\n [ngStyle]=\"getColumnStyles(smartTable.customSmartTableHeaders![i])\"\r\n [attr.data-testid]=\"smartTable.customSmartTableHeaders![i].propertyName\"\r\n >\r\n <smart-ui-action-toolbar\r\n #headerToolbar\r\n [id]=\"\r\n smartTable.getGridId()\r\n ? smartTable.getGridId() + '_headerToolbar'\r\n : 'grid_not_initialized'\r\n \"\r\n >\r\n </smart-ui-action-toolbar>\r\n </th>\r\n } @else {\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [ngClass]=\"getColumnClasses(smartTable.customSmartTableHeaders![i])\"\r\n [ngStyle]=\"getColumnStyles(smartTable.customSmartTableHeaders![i])\"\r\n [attr.data-testid]=\"smartTable.customSmartTableHeaders![i].propertyName\"\r\n >\r\n <div\r\n *ngIf=\"\r\n header === 'icon' || header === 'img' || header === 'options' || header === 'button'\r\n \"\r\n ></div>\r\n <div *ngIf=\"header === 'select'\">\r\n <mat-checkbox\r\n *ngIf=\"smartTable.customSmartTableHeaders![i].showCheckboxInHeader\"\r\n (change)=\"$event ? toggleAllRows() : null\"\r\n [checked]=\"smartTable.selection!.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"smartTable.selection!.hasValue() && !isAllSelected()\"\r\n [aria-label]=\"checkboxLabel()\"\r\n >\r\n </mat-checkbox>\r\n <div *ngIf=\"!smartTable.customSmartTableHeaders![i].showCheckboxInHeader\">\r\n {{ smartTable.customTableHeaders[i] }}\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n header !== 'icon' &&\r\n header !== 'img' &&\r\n header !== 'options' &&\r\n header !== 'button' &&\r\n header !== 'select' &&\r\n header !== 'expand' &&\r\n header !== 'actions'\r\n \"\r\n >\r\n <div *ngIf=\"smartTable.sortable; then sortable; else notSortable\"></div>\r\n <ng-template #sortable>\r\n <button\r\n (click)=\"sortButtonClicked($event, smartTable.customSmartTableHeaders![i])\"\r\n *ngIf=\"smartTable.sortable && isSortable(smartTable.customSmartTableHeaders![i])\"\r\n mat-button\r\n class=\"sortableHeaderButton\"\r\n >\r\n {{ smartTable.customTableHeaders[i] }}\r\n <smart-icon\r\n class=\"sortableHeaderButtonIcon\"\r\n *ngIf=\"getSortIcon(header)\"\r\n title=\"sort\"\r\n [icon]=\"getSortIcon(header)!\"\r\n ></smart-icon>\r\n <smart-icon\r\n class=\"sortableHeaderButtonIcon\"\r\n *ngIf=\"hasSortNumIcon(header)\"\r\n title=\"sort\"\r\n [icon]=\"getSortNumIcon(header)\"\r\n ></smart-icon>\r\n </button>\r\n </ng-template>\r\n <ng-template #notSortable>\r\n {{ smartTable.customTableHeaders[i] }}\r\n </ng-template>\r\n </div>\r\n </th>\r\n }\r\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"isDisabled(element) ? 'disabledRow' : ''\">\r\n <mat-checkbox\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].propertyName === 'select' &&\r\n !isDisabled(element)\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n $event\r\n ? setSelection(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n : null\r\n \"\r\n [disabled]=\"isDisabled(element)\"\r\n [checked]=\"\r\n smartTable.selection!.isSelected(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n \"\r\n [aria-label]=\"\r\n checkboxLabel(\r\n smartTable.selectionProperty\r\n ? smartTable.getValueDeeply(element, smartTable.selectionProperty)\r\n : element\r\n )\r\n \"\r\n >\r\n </mat-checkbox>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].properties\r\n \"\r\n >\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().DATETIME\">\r\n {{\r\n getValue(element, header)\r\n | smartDateTime: smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().DATE\">\r\n {{\r\n getValue(element, header)\r\n | smartDate: smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().TIME\">\r\n {{\r\n getValue(element, header)\r\n | smartTime: smartTable.customSmartTableHeaders[i].properties?.dateFormat\r\n }}\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders[i].properties?.type === type().CHECKBOX\">\r\n <mat-checkbox [disabled]=\"true\" [checked]=\"getValue(element, header)\"></mat-checkbox>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders[i].properties?.type === type().ICON &&\r\n smartTable.customSmartTableHeaders[i].properties?.icons?.length\r\n \"\r\n >\r\n <smart-icon\r\n [smartTooltip]=\"getToolTip(element, i)\"\r\n [icon]=\"getIcon(getValue(element, header), i)!\"\r\n [color]=\"getColor(getValue(element, header), i)\"\r\n >\r\n </smart-icon>\r\n </div>\r\n </div>\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(element, header)\">\r\n <smart-icon [imageResource]=\"ir\"> </smart-icon>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].buttons\"\r\n class=\"smart-table-buttons-col\"\r\n >\r\n <div *ngFor=\"let button of smartTable.customSmartTableHeaders[i].buttons\">\r\n <div *ngIf=\"showButton(button, element)\" [ngSwitch]=\"button.type\">\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.ICON\"\r\n mat-icon-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon title=\"{{ button.label }}\" [icon]=\"button.icon!\"></smart-icon>\r\n </button>\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.NORMAL\"\r\n mat-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n {{ button.label ?? (button.translator ? button.translator(element).title : '') }}\r\n </button>\r\n <button\r\n (click)=\"customButtonClicked($event, button, element)\"\r\n *ngSwitchCase=\"smartTableButtonType.RAISED\"\r\n mat-raised-button\r\n color=\"{{ button.color }}\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon>\r\n {{ button.label ?? (button.translator ? button.translator(element).title : '') }}\r\n </button>\r\n <!------ MENU ------>\r\n <div *ngSwitchCase=\"smartTableButtonType.MENU\" class=\"menu-button\">\r\n <!------ DEFAULT_ACTION_COLUMN ID TOOLBAR ------>\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(element, defaultActionToolbarId)\"\r\n ></smart-ui-action-toolbar>\r\n\r\n <!------ GENERIC HAMBURGER ------>\r\n @if (shouldShowMenuButton(element)) {\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowMenuActionModelArray(element)\"\r\n ></smart-ui-action-toolbar>\r\n }\r\n </div>\r\n\r\n <!------ MENU ------>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"smartTable.customSmartTableHeaders && smartTable.customSmartTableHeaders[i].icon\">\r\n <smart-icon\r\n *ngIf=\"smartTable.customSmartTableHeaders[i].icon?.icon\"\r\n [ngClass]=\"smartTable.customSmartTableHeaders[i].icon?.cssClass ?? ''\"\r\n [color]=\"smartTable.customSmartTableHeaders[i].icon?.color\"\r\n [icon]=\"smartTable.customSmartTableHeaders[i].icon!.icon\"\r\n >\r\n </smart-icon>\r\n </div>\r\n <div\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].translator !== undefined\r\n \"\r\n >\r\n {{ smartTable.customSmartTableHeaders[i].translator!(getValue(element, header)) }}\r\n </div>\r\n <button\r\n *ngIf=\"\r\n smartTable.customSmartTableHeaders &&\r\n smartTable.customSmartTableHeaders[i].propertyName === 'expand'\r\n \"\r\n mat-icon-button\r\n aria-label=\"expand row\"\r\n (click)=\"onToggle(element, $event)\"\r\n >\r\n <smart-icon *ngIf=\"expandedElement !== element\" [icon]=\"'keyboard_arrow_down'\"></smart-icon>\r\n <smart-icon *ngIf=\"expandedElement === element\" [icon]=\"'keyboard_arrow_up'\"></smart-icon>\r\n </button>\r\n <div\r\n *ngIf=\"\r\n !smartTable.customSmartTableHeaders ||\r\n (smartTable.customSmartTableHeaders &&\r\n !smartTable.customSmartTableHeaders[i].properties &&\r\n !smartTable.customSmartTableHeaders[i].icon &&\r\n !smartTable.customSmartTableHeaders[i].buttons &&\r\n !smartTable.customSmartTableHeaders[i].translator &&\r\n !(smartTable.customSmartTableHeaders[i].propertyName === 'select') &&\r\n !(smartTable.customSmartTableHeaders[i].propertyName === 'expand'))\r\n \"\r\n >\r\n <smart-icon *ngIf=\"header === 'icon'\" [icon]=\"getValue(element, header)!\"> </smart-icon>\r\n <img\r\n *ngIf=\"header === 'img'\"\r\n [src]=\"getValue(element, header)\"\r\n alt=\"\"\r\n class=\"smarttableImg\"\r\n />\r\n <!------ TOOLBAR ------>\r\n <ng-container *ngIf=\"showCellToolbar(element, header)\">\r\n <smart-ui-action-toolbar\r\n [uiActionModels]=\"getRowColumnAction(element, header)\"\r\n ></smart-ui-action-toolbar>\r\n </ng-container>\r\n <!------ TOOLBAR ------>\r\n <div\r\n *ngIf=\"\r\n header !== 'icon' &&\r\n header !== 'img' &&\r\n header !== 'option' &&\r\n header !== 'button' &&\r\n !isImageResource(element, header)\r\n \"\r\n [innerHtml]=\"getValue(element, header)\"\r\n ></div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->\r\n <ng-container matColumnDef=\"expandedDetail\">\r\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"smartTable.tableHeaders.length\">\r\n <div\r\n class=\"example-element-detail\"\r\n [@detailExpand]=\"element == expandedElement ? 'expanded' : 'collapsed'\"\r\n >\r\n <ng-template #expandedArea></ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"smartTable.tableHeaders; sticky: true\"></tr>\r\n <ng-container *matRowDef=\"let element; columns: smartTable.tableHeaders\">\r\n <tr\r\n mat-row\r\n class=\"example-element-row\"\r\n [class.example-expanded-row]=\"expandedElement === element\"\r\n [ngClass]=\"getRowClasses(element)\"\r\n [ngStyle]=\"getRowStyles(element)\"\r\n (click)=\"handleOnRowClick(element)\"\r\n (dblclick)=\"handleOnRowDoubleClick($event, element)\"\r\n [attr.data-testid]=\"element?.id ?? null\"\r\n ></tr>\r\n <lib-default-actions-popup\r\n *ngIf=\"smartTable.defaultActionCodes && smartTable.defaultActionCodes.length > 0\"\r\n #defaultActionMenu\r\n [buttons]=\"getDefaultActionsForRow(element)!\"\r\n [row]=\"element\"\r\n ></lib-default-actions-popup>\r\n </ng-container>\r\n <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"example-detail-row\"></tr>\r\n</table>\r\n", styles: [".full-width{width:100%}.smarttableImg{width:25px}.smartTableRowHover:hover{cursor:pointer}tr.example-detail-row{height:0}tr.example-element-row:not(.example-expanded-row):hover{background:#f5f5f5}tr.example-element-row:not(.example-expanded-row):active{background:#efefef}.example-element-row td{border-bottom-width:0}.example-element-detail{overflow:hidden;display:flex;flex-direction:column}.example-element-diagram{min-width:80px;border:2px solid black;padding:8px;font-weight:lighter;margin:8px 0;height:104px}.example-element-symbol{font-weight:700;font-size:40px;line-height:normal}.example-element-description{padding:16px}.example-element-description-attribution{opacity:.5}.disabledRow{color:var(--disabled)}.disabledRow:hover{cursor:default}.smart-table-buttons-col{display:flex;flex-direction:row;justify-content:flex-end}.sortableHeaderButton{margin:0!important;padding:0!important;text-align:left!important}.selected{background-color:var(--primary-light-color)}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.reversed{flex-direction:row-reverse;gap:1rem}:host ::ng-deep .mat-mdc-menu-item{line-height:normal!important}.mat-mdc-menu-item[disabled]{cursor:default!important}.menu-button{display:flex;flex-direction:row;justify-content:flex-end;text-align:-webkit-right;align-items:center}.captionTitle{font-size:1.5rem;align-content:center;padding:.5rem .75rem;text-align:start;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);background:#f5f5f5}\n"] }]
41
37
  }], ctorParameters: () => [{ type: i1.ComponentFactoryService }] });
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtdGFibGUvdGFibGVzL21hdGVyaWFsLXRhYmxlL21hdGVyaWFsLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LXRhYmxlL3RhYmxlcy9tYXRlcmlhbC10YWJsZS9tYXRlcmlhbC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFjMUYsTUFBTSxPQUFPLHNCQUF1QixTQUFRLEtBQUs7SUFHL0MsWUFBWSxTQUFrQztRQUM1QyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFIbkIsMkJBQXNCLEdBQVcsMkJBQTJCLENBQUMsc0JBQXNCLENBQUM7SUFJcEYsQ0FBQzsrR0FMVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixpRkNsQm5DLHl6ZkF5WEEsb3lLRC9XYztZQUNWLE9BQU8sQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDekMsVUFBVSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2FBQ3RGLENBQUM7U0FDSDs7NEZBRVUsc0JBQXNCO2tCQVpsQyxTQUFTOytCQUNFLG9CQUFvQixjQUdsQjt3QkFDVixPQUFPLENBQUMsY0FBYyxFQUFFOzRCQUN0QixLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7NEJBQzVELEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7NEJBQ3pDLFVBQVUsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsc0NBQXNDLENBQUMsQ0FBQzt5QkFDdEYsQ0FBQztxQkFDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJy4uL3RhYmxlJztcclxuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50LWZhY3Rvcnktc2VydmljZS9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbCB9IGZyb20gJy4uLy4uLy4uL3NtYXJ0LWdyaWQvc21hcnQtZ3JpZC10b29sYmFyLXV0aWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbWF0ZXJpYWwtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRlcmlhbC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbWF0ZXJpYWwtdGFibGUuY29tcG9uZW50LmNzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcclxuICAgICAgc3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxyXG4gICAgICBzdGF0ZSgnZXhwYW5kZWQnLCBzdHlsZSh7IGhlaWdodDogJyonIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuICAgIF0pLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbFRhYmxlQ29tcG9uZW50IGV4dGVuZHMgVGFibGUge1xyXG4gIGRlZmF1bHRBY3Rpb25Ub29sYmFySWQ6IHN0cmluZyA9IFNtYXJ0R3JpZFRvb2xiYXJBY3Rpb25zVXRpbC5kZWZhdWx0QWN0aW9uVG9vbGJhcklkO1xyXG5cclxuICBjb25zdHJ1Y3RvcihjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihjZlNlcnZpY2UpO1xyXG4gIH1cclxufVxyXG4iLCI8dGFibGVcclxuICAjbXlUYWJsZVxyXG4gIG1hdC10YWJsZVxyXG4gIFtkYXRhU291cmNlXT1cInNtYXJ0VGFibGUudGFibGVSb3dzXCJcclxuICBjbGFzcz1cImZ1bGwtd2lkdGhcIlxyXG4gIG11bHRpVGVtcGxhdGVEYXRhUm93c1xyXG4+XHJcbiAgPCEtLSBDb2x1bW4gRGVzY3JpcHRvciAtLT5cclxuICBAaWYoc21hcnRUYWJsZS50aXRsZSl7XHJcbiAgPGNhcHRpb24gKm5nSWY9XCJzbWFydFRhYmxlLnRpdGxlXCIgY2xhc3M9XCJjYXB0aW9uVGl0bGVcIj5cclxuICAgIHt7IHNtYXJ0VGFibGUudGl0bGUgfX1cclxuICA8L2NhcHRpb24+XHJcblxyXG4gIH1cclxuICA8bmctY29udGFpbmVyXHJcbiAgICAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIHNtYXJ0VGFibGUudGFibGVIZWFkZXJzOyBsZXQgaSA9IGluZGV4XCJcclxuICAgIG1hdENvbHVtbkRlZj1cInt7IGhlYWRlciB9fVwiXHJcbiAgPlxyXG4gICAgPCEtLSBteV9tZW51IGlzIHRoZSBpbXBsaWNpdCBhY3Rpb24gY29sdW1uIHByZXNlbnQgb24gYWxsIHRhYmxlczogLS0+XHJcbiAgICBAaWYgKCdteV9tZW51JyA9PT0gaGVhZGVyKSB7XHJcbiAgICA8dGhcclxuICAgICAgbWF0LWhlYWRlci1jZWxsXHJcbiAgICAgICptYXRIZWFkZXJDZWxsRGVmXHJcbiAgICAgIFtuZ0NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyFbaV0pXCJcclxuICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sdW1uU3R5bGVzKHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMhW2ldKVwiXHJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMhW2ldLnByb3BlcnR5TmFtZVwiXHJcbiAgICA+XHJcbiAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICNoZWFkZXJUb29sYmFyXHJcbiAgICAgICAgW2lkXT1cIlxyXG4gICAgICAgICAgc21hcnRUYWJsZS5nZXRHcmlkSWQoKVxyXG4gICAgICAgICAgICA/IHNtYXJ0VGFibGUuZ2V0R3JpZElkKCkgKyAnX2hlYWRlclRvb2xiYXInXHJcbiAgICAgICAgICAgIDogJ2dyaWRfbm90X2luaXRpYWxpemVkJ1xyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgPC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgIDwvdGg+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgIDx0aFxyXG4gICAgICBtYXQtaGVhZGVyLWNlbGxcclxuICAgICAgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3NlcyhzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzIVtpXSlcIlxyXG4gICAgICBbbmdTdHlsZV09XCJnZXRDb2x1bW5TdHlsZXMoc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyFbaV0pXCJcclxuICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwic21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyFbaV0ucHJvcGVydHlOYW1lXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwiaGVhZGVyID09PSAnaWNvbicgfHwgaGVhZGVyID09PSAnaW1nJyB8fCBoZWFkZXIgPT09ICdvcHRpb25zJyB8fCBoZWFkZXIgPT09ICdidXR0b24nXCJcclxuICAgICAgPjwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiaGVhZGVyID09PSAnc2VsZWN0J1wiPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICpuZ0lmPVwic21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyFbaV0uc2hvd0NoZWNrYm94SW5IZWFkZXJcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyB0b2dnbGVBbGxSb3dzKCkgOiBudWxsXCJcclxuICAgICAgICAgIFtjaGVja2VkXT1cInNtYXJ0VGFibGUuc2VsZWN0aW9uIS5oYXNWYWx1ZSgpICYmIGlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzbWFydFRhYmxlLnNlbGVjdGlvbiEuaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFthcmlhLWxhYmVsXT1cImNoZWNrYm94TGFiZWwoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyFbaV0uc2hvd0NoZWNrYm94SW5IZWFkZXJcIj5cclxuICAgICAgICAgIHt7IHNtYXJ0VGFibGUuY3VzdG9tVGFibGVIZWFkZXJzW2ldIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgIGhlYWRlciAhPT0gJ2ljb24nICYmXHJcbiAgICAgICAgICBoZWFkZXIgIT09ICdpbWcnICYmXHJcbiAgICAgICAgICBoZWFkZXIgIT09ICdvcHRpb25zJyAmJlxyXG4gICAgICAgICAgaGVhZGVyICE9PSAnYnV0dG9uJyAmJlxyXG4gICAgICAgICAgaGVhZGVyICE9PSAnc2VsZWN0JyAmJlxyXG4gICAgICAgICAgaGVhZGVyICE9PSAnZXhwYW5kJyAmJlxyXG4gICAgICAgICAgaGVhZGVyICE9PSAnYWN0aW9ucydcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0VGFibGUuc29ydGFibGU7IHRoZW4gc29ydGFibGU7IGVsc2Ugbm90U29ydGFibGVcIj48L2Rpdj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3NvcnRhYmxlPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAoY2xpY2spPVwic29ydEJ1dHRvbkNsaWNrZWQoJGV2ZW50LCBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzIVtpXSlcIlxyXG4gICAgICAgICAgICAqbmdJZj1cInNtYXJ0VGFibGUuc29ydGFibGUgJiYgaXNTb3J0YWJsZShzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzIVtpXSlcIlxyXG4gICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwic29ydGFibGVIZWFkZXJCdXR0b25cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBzbWFydFRhYmxlLmN1c3RvbVRhYmxlSGVhZGVyc1tpXSB9fVxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic29ydGFibGVIZWFkZXJCdXR0b25JY29uXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImdldFNvcnRJY29uKGhlYWRlcilcIlxyXG4gICAgICAgICAgICAgIHRpdGxlPVwic29ydFwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwiZ2V0U29ydEljb24oaGVhZGVyKSFcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic29ydGFibGVIZWFkZXJCdXR0b25JY29uXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImhhc1NvcnROdW1JY29uKGhlYWRlcilcIlxyXG4gICAgICAgICAgICAgIHRpdGxlPVwic29ydFwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwiZ2V0U29ydE51bUljb24oaGVhZGVyKVwiXHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90U29ydGFibGU+XHJcbiAgICAgICAgICB7eyBzbWFydFRhYmxlLmN1c3RvbVRhYmxlSGVhZGVyc1tpXSB9fVxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90aD5cclxuICAgIH1cclxuICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgW25nQ2xhc3NdPVwiaXNEaXNhYmxlZChlbGVtZW50KSA/ICdkaXNhYmxlZFJvdycgOiAnJ1wiPlxyXG4gICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgIHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMgJiZcclxuICAgICAgICAgIHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydHlOYW1lID09PSAnc2VsZWN0JyAmJlxyXG4gICAgICAgICAgIWlzRGlzYWJsZWQoZWxlbWVudClcclxuICAgICAgICBcIlxyXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwiXHJcbiAgICAgICAgICAkZXZlbnRcclxuICAgICAgICAgICAgPyBzZXRTZWxlY3Rpb24oXHJcbiAgICAgICAgICAgICAgICBzbWFydFRhYmxlLnNlbGVjdGlvblByb3BlcnR5XHJcbiAgICAgICAgICAgICAgICAgID8gc21hcnRUYWJsZS5nZXRWYWx1ZURlZXBseShlbGVtZW50LCBzbWFydFRhYmxlLnNlbGVjdGlvblByb3BlcnR5KVxyXG4gICAgICAgICAgICAgICAgICA6IGVsZW1lbnRcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoZWxlbWVudClcIlxyXG4gICAgICAgIFtjaGVja2VkXT1cIlxyXG4gICAgICAgICAgc21hcnRUYWJsZS5zZWxlY3Rpb24hLmlzU2VsZWN0ZWQoXHJcbiAgICAgICAgICAgIHNtYXJ0VGFibGUuc2VsZWN0aW9uUHJvcGVydHlcclxuICAgICAgICAgICAgICA/IHNtYXJ0VGFibGUuZ2V0VmFsdWVEZWVwbHkoZWxlbWVudCwgc21hcnRUYWJsZS5zZWxlY3Rpb25Qcm9wZXJ0eSlcclxuICAgICAgICAgICAgICA6IGVsZW1lbnRcclxuICAgICAgICAgIClcclxuICAgICAgICBcIlxyXG4gICAgICAgIFthcmlhLWxhYmVsXT1cIlxyXG4gICAgICAgICAgY2hlY2tib3hMYWJlbChcclxuICAgICAgICAgICAgc21hcnRUYWJsZS5zZWxlY3Rpb25Qcm9wZXJ0eVxyXG4gICAgICAgICAgICAgID8gc21hcnRUYWJsZS5nZXRWYWx1ZURlZXBseShlbGVtZW50LCBzbWFydFRhYmxlLnNlbGVjdGlvblByb3BlcnR5KVxyXG4gICAgICAgICAgICAgIDogZWxlbWVudFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyAmJiBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnRpZXNcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydGllcz8udHlwZSA9PT0gdHlwZSgpLkRBVEVUSU1FXCI+XHJcbiAgICAgICAgICB7e1xyXG4gICAgICAgICAgICBnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpXHJcbiAgICAgICAgICAgICAgfCBzbWFydERhdGVUaW1lIDogc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzPy5kYXRlRm9ybWF0XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnRpZXM/LnR5cGUgPT09IHR5cGUoKS5EQVRFXCI+XHJcbiAgICAgICAgICB7e1xyXG4gICAgICAgICAgICBnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpXHJcbiAgICAgICAgICAgICAgfCBzbWFydERhdGUgOiBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnRpZXM/LmRhdGVGb3JtYXRcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydGllcz8udHlwZSA9PT0gdHlwZSgpLlRJTUVcIj5cclxuICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgIGdldFZhbHVlKGVsZW1lbnQsIGhlYWRlcilcclxuICAgICAgICAgICAgICB8IHNtYXJ0VGltZSA6IHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydGllcz8uZGF0ZUZvcm1hdFxyXG4gICAgICAgICAgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzPy50eXBlID09PSB0eXBlKCkuQ0hFQ0tCT1hcIj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2Rpc2FibGVkXT1cInRydWVcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpXCI+PC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzPy50eXBlID09PSB0eXBlKCkuSUNPTiAmJlxyXG4gICAgICAgICAgICBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnRpZXM/Lmljb25zPy5sZW5ndGhcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgW3NtYXJ0VG9vbHRpcF09XCJnZXRUb29sVGlwKGVsZW1lbnQsIGkpXCJcclxuICAgICAgICAgICAgW2ljb25dPVwiZ2V0SWNvbihnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpLCBpKSFcIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwiZ2V0Q29sb3IoZ2V0VmFsdWUoZWxlbWVudCwgaGVhZGVyKSwgaSlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtYXJ0LXRhYmxlLWljb24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXIgb2YgZ2V0SW1hZ2VSZXNvdXJjZUljb25zKGVsZW1lbnQsIGhlYWRlcilcIj5cclxuICAgICAgICAgIDxzbWFydC1pY29uIFtpbWFnZVJlc291cmNlXT1cImlyXCI+IDwvc21hcnQtaWNvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMgJiYgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5idXR0b25zXCJcclxuICAgICAgICBjbGFzcz1cInNtYXJ0LXRhYmxlLWJ1dHRvbnMtY29sXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLmJ1dHRvbnNcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QnV0dG9uKGJ1dHRvbiwgZWxlbWVudClcIiBbbmdTd2l0Y2hdPVwiYnV0dG9uLnR5cGVcIj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJjdXN0b21CdXR0b25DbGlja2VkKCRldmVudCwgYnV0dG9uLCBlbGVtZW50KVwiXHJcbiAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cInNtYXJ0VGFibGVCdXR0b25UeXBlLklDT05cIlxyXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgIGNvbG9yPVwie3sgYnV0dG9uLmNvbG9yIH19XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uIHRpdGxlPVwie3sgYnV0dG9uLmxhYmVsIH19XCIgW2ljb25dPVwiYnV0dG9uLmljb24hXCI+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJjdXN0b21CdXR0b25DbGlja2VkKCRldmVudCwgYnV0dG9uLCBlbGVtZW50KVwiXHJcbiAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cInNtYXJ0VGFibGVCdXR0b25UeXBlLk5PUk1BTFwiXHJcbiAgICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgIGNvbG9yPVwie3sgYnV0dG9uLmNvbG9yIH19XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uICpuZ0lmPVwiYnV0dG9uLmljb25cIiBbaWNvbl09XCJidXR0b24uaWNvblwiPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgICB7eyBidXR0b24ubGFiZWwgPz8gKGJ1dHRvbi50cmFuc2xhdG9yID8gYnV0dG9uLnRyYW5zbGF0b3IoZWxlbWVudCkudGl0bGUgOiAnJykgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY3VzdG9tQnV0dG9uQ2xpY2tlZCgkZXZlbnQsIGJ1dHRvbiwgZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJzbWFydFRhYmxlQnV0dG9uVHlwZS5SQUlTRURcIlxyXG4gICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgY29sb3I9XCJ7eyBidXR0b24uY29sb3IgfX1cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb24gKm5nSWY9XCJidXR0b24uaWNvblwiIFtpY29uXT1cImJ1dHRvbi5pY29uXCI+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICAgIHt7IGJ1dHRvbi5sYWJlbCA/PyAoYnV0dG9uLnRyYW5zbGF0b3IgPyBidXR0b24udHJhbnNsYXRvcihlbGVtZW50KS50aXRsZSA6ICcnKSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwic21hcnRUYWJsZUJ1dHRvblR5cGUuTUVOVVwiIGNsYXNzPVwibWVudS1idXR0b25cIj5cclxuICAgICAgICAgICAgICA8IS0tLS0tLSBUT09MQkFSIC0tLS0tLT5cclxuICAgICAgICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcclxuICAgICAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dDb2x1bW5BY3Rpb24oZWxlbWVudCwgZGVmYXVsdEFjdGlvblRvb2xiYXJJZClcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgICAgIDwhLS0tLS0tIFRPT0xCQVIgLS0tLS0tPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd01lbnVCdXR0b24oZWxlbWVudCwgYnV0dG9uKVwiXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3VzdG9tQnV0dG9uQ2xpY2tlZCgkZXZlbnQsIGJ1dHRvbiwgZWxlbWVudCwgdW5kZWZpbmVkLCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInt7IGJ1dHRvbi5jb2xvciB9fVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPHNtYXJ0LWljb24gKm5nSWY9XCJidXR0b24uaWNvblwiIFtpY29uXT1cImJ1dHRvbi5pY29uXCI+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPCEtLSB7eyBidXR0b24ubGFiZWwgPz8gKGJ1dHRvbi50cmFuc2xhdG9yID8gYnV0dG9uLnRyYW5zbGF0b3IoZWxlbWVudCkudGl0bGUgOiAnJykgfX0gLS0+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImJ1dHRvbi5tZW51SXRlbUJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBidG4gb2YgZ2V0TWVudUJ1dHRvbnMoZWxlbWVudCwgYnV0dG9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImN1c3RvbUJ1dHRvbkNsaWNrZWQoJGV2ZW50LCBidG4sIGVsZW1lbnQsIHVuZGVmaW5lZCwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImJ0bj8udHJhbnNsYXRvcihidG4pPy5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImJ0biEudHJhbnNsYXRvciEoYnRuKSEuaWNvbiFcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgYnRuPy50cmFuc2xhdG9yKGJ0bik/LnRpdGxlIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYnV0dG9uLm1lbnVJdGVtQnV0dG9uc1Byb3BlcnR5TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBidG4gb2YgZ2V0TWVudUl0ZW1CdXR0b25zUHJvcGVydHlOYW1lKGVsZW1lbnQsIGJ1dHRvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImJ0bi5jb2RlICE9PSBBQ1RJT05fU0VQRVJBVE9SXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjdXN0b21CdXR0b25DbGlja2VkKCRldmVudCwgYnV0dG9uLCBlbGVtZW50LCBidG4sIHRydWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3NtYXJ0VG9vbHRpcF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnRuPy5kZXNjcmlwdG9yPy50b29sdGlwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBidG4/LmRlc2NyaXB0b3I/LnRvb2x0aXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1dHRvbi50cmFuc2xhdG9yIShidG4pLnRvb2x0aXBcclxuICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtYXJ0LXRhYmxlLWljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnRyYW5zbGF0b3IhKGJ0bikuaWNvblBvc2l0aW9uID09PSAnUE9TVCcgPyAncmV2ZXJzZWQnIDogJydcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPjxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJidXR0b24udHJhbnNsYXRvciEoYnRuKS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJidXR0b24udHJhbnNsYXRvciEoYnRuKS5pY29uIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGJ1dHRvbi50cmFuc2xhdG9yIShidG4pLnRpdGxlIH19PC9kaXZcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJidG4uY29kZSA9PT0gQUNUSU9OX1NFUEVSQVRPUlwiPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9tYXQtbWVudT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzICYmIHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uaWNvblwiPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uaWNvbj8uaWNvblwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLmljb24/LmNzc0NsYXNzID8/ICcnXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLmljb24/LmNvbG9yXCJcclxuICAgICAgICAgIFtpY29uXT1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uaWNvbiEuaWNvblwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyAmJlxyXG4gICAgICAgICAgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS50cmFuc2xhdG9yICE9PSB1bmRlZmluZWRcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS50cmFuc2xhdG9yIShnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpKSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzICYmXHJcbiAgICAgICAgICBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnR5TmFtZSA9PT0gJ2V4cGFuZCdcclxuICAgICAgICBcIlxyXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJleHBhbmQgcm93XCJcclxuICAgICAgICAoY2xpY2spPVwib25Ub2dnbGUoZWxlbWVudCwgJGV2ZW50KVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cImV4cGFuZGVkRWxlbWVudCAhPT0gZWxlbWVudFwiIFtpY29uXT1cIidrZXlib2FyZF9hcnJvd19kb3duJ1wiPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cImV4cGFuZGVkRWxlbWVudCA9PT0gZWxlbWVudFwiIFtpY29uXT1cIidrZXlib2FyZF9hcnJvd191cCdcIj48L3NtYXJ0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICFzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzIHx8XHJcbiAgICAgICAgICAoc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyAmJlxyXG4gICAgICAgICAgICAhc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzICYmXHJcbiAgICAgICAgICAgICFzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLmljb24gJiZcclxuICAgICAgICAgICAgIXNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uYnV0dG9ucyAmJlxyXG4gICAgICAgICAgICAhc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS50cmFuc2xhdG9yICYmXHJcbiAgICAgICAgICAgICEoc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0eU5hbWUgPT09ICdzZWxlY3QnKSAmJlxyXG4gICAgICAgICAgICAhKHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydHlOYW1lID09PSAnZXhwYW5kJykpXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzbWFydC1pY29uICpuZ0lmPVwiaGVhZGVyID09PSAnaWNvbidcIiBbaWNvbl09XCJnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpIVwiPiA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPGltZ1xyXG4gICAgICAgICAgKm5nSWY9XCJoZWFkZXIgPT09ICdpbWcnXCJcclxuICAgICAgICAgIFtzcmNdPVwiZ2V0VmFsdWUoZWxlbWVudCwgaGVhZGVyKVwiXHJcbiAgICAgICAgICBhbHQ9XCJcIlxyXG4gICAgICAgICAgY2xhc3M9XCJzbWFydHRhYmxlSW1nXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDwhLS0tLS0tIFRPT0xCQVIgLS0tLS0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Q2VsbFRvb2xiYXIoZWxlbWVudCwgaGVhZGVyKVwiPlxyXG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dDb2x1bW5BY3Rpb24oZWxlbWVudCwgaGVhZGVyKVwiXHJcbiAgICAgICAgICA+PC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tLS0tLSBUT09MQkFSIC0tLS0tLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICBoZWFkZXIgIT09ICdpY29uJyAmJlxyXG4gICAgICAgICAgICBoZWFkZXIgIT09ICdpbWcnICYmXHJcbiAgICAgICAgICAgIGhlYWRlciAhPT0gJ29wdGlvbicgJiZcclxuICAgICAgICAgICAgaGVhZGVyICE9PSAnYnV0dG9uJyAmJlxyXG4gICAgICAgICAgICAhaXNJbWFnZVJlc291cmNlKGVsZW1lbnQsIGhlYWRlcilcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbaW5uZXJIdG1sXT1cImdldFZhbHVlKGVsZW1lbnQsIGhlYWRlcilcIlxyXG4gICAgICAgID48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RkPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgQ29sdW1uIC0gVGhlIGRldGFpbCByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJleHBhbmRlZERldGFpbFwiPlxyXG4gICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBbYXR0ci5jb2xzcGFuXT1cInNtYXJ0VGFibGUudGFibGVIZWFkZXJzLmxlbmd0aFwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJleGFtcGxlLWVsZW1lbnQtZGV0YWlsXCJcclxuICAgICAgICBbQGRldGFpbEV4cGFuZF09XCJlbGVtZW50ID09IGV4cGFuZGVkRWxlbWVudCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2V4cGFuZGVkQXJlYT48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGQ+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwic21hcnRUYWJsZS50YWJsZUhlYWRlcnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IHNtYXJ0VGFibGUudGFibGVIZWFkZXJzXCI+XHJcbiAgICA8dHJcclxuICAgICAgbWF0LXJvd1xyXG4gICAgICBjbGFzcz1cImV4YW1wbGUtZWxlbWVudC1yb3dcIlxyXG4gICAgICBbY2xhc3MuZXhhbXBsZS1leHBhbmRlZC1yb3ddPVwiZXhwYW5kZWRFbGVtZW50ID09PSBlbGVtZW50XCJcclxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Um93Q2xhc3NlcyhlbGVtZW50KVwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cImdldFJvd1N0eWxlcyhlbGVtZW50KVwiXHJcbiAgICAgIChjbGljayk9XCJoYW5kbGVPblJvd0NsaWNrKGVsZW1lbnQpXCJcclxuICAgICAgKGRibGNsaWNrKT1cImhhbmRsZU9uUm93RG91YmxlQ2xpY2soJGV2ZW50LCBlbGVtZW50KVwiXHJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cImVsZW1lbnQ/LmlkID8/IG51bGxcIlxyXG4gICAgPjwvdHI+XHJcbiAgICA8bGliLWRlZmF1bHQtYWN0aW9ucy1wb3B1cFxyXG4gICAgICAqbmdJZj1cInNtYXJ0VGFibGUuZGVmYXVsdEFjdGlvbkNvZGVzICYmIHNtYXJ0VGFibGUuZGVmYXVsdEFjdGlvbkNvZGVzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAjZGVmYXVsdEFjdGlvbk1lbnVcclxuICAgICAgW2J1dHRvbnNdPVwiZ2V0RGVmYXVsdEFjdGlvbnNGb3JSb3coZWxlbWVudCkhXCJcclxuICAgICAgW3Jvd109XCJlbGVtZW50XCJcclxuICAgID48L2xpYi1kZWZhdWx0LWFjdGlvbnMtcG9wdXA+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiZXhhbXBsZS1kZXRhaWwtcm93XCI+PC90cj5cclxuPC90YWJsZT5cclxuIl19
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtdGFibGUvdGFibGVzL21hdGVyaWFsLXRhYmxlL21hdGVyaWFsLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LXRhYmxlL3RhYmxlcy9tYXRlcmlhbC10YWJsZS9tYXRlcmlhbC10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBZ0JqRixNQUFNLE9BQU8sc0JBQXVCLFNBQVEsS0FBSztJQUMvQyxZQUFZLFNBQWtDO1FBQzVDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQixDQUFDOytHQUhVLHNCQUFzQjttR0FBdEIsc0JBQXNCLGlGQ2xCbkMseXJiQThVQSwrOUlEcFVjO1lBQ1YsT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDdEIsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QyxVQUFVLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7YUFDdEYsQ0FBQztTQUNIOzs0RkFFVSxzQkFBc0I7a0JBWmxDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBR2xCO3dCQUNWLE9BQU8sQ0FBQyxjQUFjLEVBQUU7NEJBQ3RCLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs0QkFDNUQsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs0QkFDekMsVUFBVSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO3lCQUN0RixDQUFDO3FCQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAnLi4vdGFibGUnO1xyXG5pbXBvcnQgeyB0cmlnZ2VyLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIGFuaW1hdGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnRHcmlkVG9vbGJhckFjdGlvbnNVdGlsIH0gZnJvbSAnLi4vLi4vLi4vc21hcnQtZ3JpZC9zbWFydC1ncmlkLXRvb2xiYXItdXRpbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1tYXRlcmlhbC10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC10YWJsZS5jb21wb25lbnQuY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnLCBtaW5IZWlnaHQ6ICcwJyB9KSksXHJcbiAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxyXG4gICAgXSksXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsVGFibGVDb21wb25lbnQgZXh0ZW5kcyBUYWJsZSB7XHJcbiAgY29uc3RydWN0b3IoY2ZTZXJ2aWNlOiBDb21wb25lbnRGYWN0b3J5U2VydmljZSkge1xyXG4gICAgc3VwZXIoY2ZTZXJ2aWNlKTtcclxuICB9XHJcbn1cclxuIiwiPHRhYmxlXHJcbiAgI215VGFibGVcclxuICBtYXQtdGFibGVcclxuICBbZGF0YVNvdXJjZV09XCJzbWFydFRhYmxlLnRhYmxlUm93c1wiXHJcbiAgY2xhc3M9XCJmdWxsLXdpZHRoXCJcclxuICBtdWx0aVRlbXBsYXRlRGF0YVJvd3NcclxuPlxyXG4gIDwhLS0gQ29sdW1uIERlc2NyaXB0b3IgLS0+XHJcbiAgQGlmIChzbWFydFRhYmxlLnRpdGxlKSB7XHJcbiAgICA8Y2FwdGlvbiAqbmdJZj1cInNtYXJ0VGFibGUudGl0bGVcIiBjbGFzcz1cImNhcHRpb25UaXRsZVwiPlxyXG4gICAgICB7eyBzbWFydFRhYmxlLnRpdGxlIH19XHJcbiAgICA8L2NhcHRpb24+XHJcbiAgfVxyXG4gIDxuZy1jb250YWluZXJcclxuICAgICpuZ0Zvcj1cImxldCBoZWFkZXIgb2Ygc21hcnRUYWJsZS50YWJsZUhlYWRlcnM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgbWF0Q29sdW1uRGVmPVwie3sgaGVhZGVyIH19XCJcclxuICA+XHJcbiAgICA8IS0tIG15X21lbnUgaXMgdGhlIGltcGxpY2l0IGFjdGlvbiBjb2x1bW4gcHJlc2VudCBvbiBhbGwgdGFibGVzOiAtLT5cclxuICAgIEBpZiAoJ215X21lbnUnID09PSBoZWFkZXIpIHtcclxuICAgICAgPHRoXHJcbiAgICAgICAgbWF0LWhlYWRlci1jZWxsXHJcbiAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgICBbbmdDbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMhW2ldKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sdW1uU3R5bGVzKHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMhW2ldKVwiXHJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwic21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyFbaV0ucHJvcGVydHlOYW1lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgI2hlYWRlclRvb2xiYXJcclxuICAgICAgICAgIFtpZF09XCJcclxuICAgICAgICAgICAgc21hcnRUYWJsZS5nZXRHcmlkSWQoKVxyXG4gICAgICAgICAgICAgID8gc21hcnRUYWJsZS5nZXRHcmlkSWQoKSArICdfaGVhZGVyVG9vbGJhcidcclxuICAgICAgICAgICAgICA6ICdncmlkX25vdF9pbml0aWFsaXplZCdcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgIDwvdGg+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgICAgPHRoXHJcbiAgICAgICAgbWF0LWhlYWRlci1jZWxsXHJcbiAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgICBbbmdDbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMhW2ldKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q29sdW1uU3R5bGVzKHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMhW2ldKVwiXHJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwic21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyFbaV0ucHJvcGVydHlOYW1lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIGhlYWRlciA9PT0gJ2ljb24nIHx8IGhlYWRlciA9PT0gJ2ltZycgfHwgaGVhZGVyID09PSAnb3B0aW9ucycgfHwgaGVhZGVyID09PSAnYnV0dG9uJ1xyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImhlYWRlciA9PT0gJ3NlbGVjdCdcIj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgKm5nSWY9XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzIVtpXS5zaG93Q2hlY2tib3hJbkhlYWRlclwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gdG9nZ2xlQWxsUm93cygpIDogbnVsbFwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInNtYXJ0VGFibGUuc2VsZWN0aW9uIS5oYXNWYWx1ZSgpICYmIGlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNtYXJ0VGFibGUuc2VsZWN0aW9uIS5oYXNWYWx1ZSgpICYmICFpc0FsbFNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICBbYXJpYS1sYWJlbF09XCJjaGVja2JveExhYmVsKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMhW2ldLnNob3dDaGVja2JveEluSGVhZGVyXCI+XHJcbiAgICAgICAgICAgIHt7IHNtYXJ0VGFibGUuY3VzdG9tVGFibGVIZWFkZXJzW2ldIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICBoZWFkZXIgIT09ICdpY29uJyAmJlxyXG4gICAgICAgICAgICBoZWFkZXIgIT09ICdpbWcnICYmXHJcbiAgICAgICAgICAgIGhlYWRlciAhPT0gJ29wdGlvbnMnICYmXHJcbiAgICAgICAgICAgIGhlYWRlciAhPT0gJ2J1dHRvbicgJiZcclxuICAgICAgICAgICAgaGVhZGVyICE9PSAnc2VsZWN0JyAmJlxyXG4gICAgICAgICAgICBoZWFkZXIgIT09ICdleHBhbmQnICYmXHJcbiAgICAgICAgICAgIGhlYWRlciAhPT0gJ2FjdGlvbnMnXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydFRhYmxlLnNvcnRhYmxlOyB0aGVuIHNvcnRhYmxlOyBlbHNlIG5vdFNvcnRhYmxlXCI+PC9kaXY+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3NvcnRhYmxlPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRCdXR0b25DbGlja2VkKCRldmVudCwgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyFbaV0pXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cInNtYXJ0VGFibGUuc29ydGFibGUgJiYgaXNTb3J0YWJsZShzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzIVtpXSlcIlxyXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICBjbGFzcz1cInNvcnRhYmxlSGVhZGVyQnV0dG9uXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IHNtYXJ0VGFibGUuY3VzdG9tVGFibGVIZWFkZXJzW2ldIH19XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic29ydGFibGVIZWFkZXJCdXR0b25JY29uXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0U29ydEljb24oaGVhZGVyKVwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInNvcnRcIlxyXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiZ2V0U29ydEljb24oaGVhZGVyKSFcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic29ydGFibGVIZWFkZXJCdXR0b25JY29uXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaGFzU29ydE51bUljb24oaGVhZGVyKVwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInNvcnRcIlxyXG4gICAgICAgICAgICAgICAgW2ljb25dPVwiZ2V0U29ydE51bUljb24oaGVhZGVyKVwiXHJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNub3RTb3J0YWJsZT5cclxuICAgICAgICAgICAge3sgc21hcnRUYWJsZS5jdXN0b21UYWJsZUhlYWRlcnNbaV0gfX1cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGg+XHJcbiAgICB9XHJcbiAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFtuZ0NsYXNzXT1cImlzRGlzYWJsZWQoZWxlbWVudCkgPyAnZGlzYWJsZWRSb3cnIDogJydcIj5cclxuICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzICYmXHJcbiAgICAgICAgICBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnR5TmFtZSA9PT0gJ3NlbGVjdCcgJiZcclxuICAgICAgICAgICFpc0Rpc2FibGVkKGVsZW1lbnQpXHJcbiAgICAgICAgXCJcclxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAoY2hhbmdlKT1cIlxyXG4gICAgICAgICAgJGV2ZW50XHJcbiAgICAgICAgICAgID8gc2V0U2VsZWN0aW9uKFxyXG4gICAgICAgICAgICAgICAgc21hcnRUYWJsZS5zZWxlY3Rpb25Qcm9wZXJ0eVxyXG4gICAgICAgICAgICAgICAgICA/IHNtYXJ0VGFibGUuZ2V0VmFsdWVEZWVwbHkoZWxlbWVudCwgc21hcnRUYWJsZS5zZWxlY3Rpb25Qcm9wZXJ0eSlcclxuICAgICAgICAgICAgICAgICAgOiBlbGVtZW50XHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICA6IG51bGxcclxuICAgICAgICBcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKGVsZW1lbnQpXCJcclxuICAgICAgICBbY2hlY2tlZF09XCJcclxuICAgICAgICAgIHNtYXJ0VGFibGUuc2VsZWN0aW9uIS5pc1NlbGVjdGVkKFxyXG4gICAgICAgICAgICBzbWFydFRhYmxlLnNlbGVjdGlvblByb3BlcnR5XHJcbiAgICAgICAgICAgICAgPyBzbWFydFRhYmxlLmdldFZhbHVlRGVlcGx5KGVsZW1lbnQsIHNtYXJ0VGFibGUuc2VsZWN0aW9uUHJvcGVydHkpXHJcbiAgICAgICAgICAgICAgOiBlbGVtZW50XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgXCJcclxuICAgICAgICBbYXJpYS1sYWJlbF09XCJcclxuICAgICAgICAgIGNoZWNrYm94TGFiZWwoXHJcbiAgICAgICAgICAgIHNtYXJ0VGFibGUuc2VsZWN0aW9uUHJvcGVydHlcclxuICAgICAgICAgICAgICA/IHNtYXJ0VGFibGUuZ2V0VmFsdWVEZWVwbHkoZWxlbWVudCwgc21hcnRUYWJsZS5zZWxlY3Rpb25Qcm9wZXJ0eSlcclxuICAgICAgICAgICAgICA6IGVsZW1lbnRcclxuICAgICAgICAgIClcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgIHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnMgJiYgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnRpZXM/LnR5cGUgPT09IHR5cGUoKS5EQVRFVElNRVwiPlxyXG4gICAgICAgICAge3tcclxuICAgICAgICAgICAgZ2V0VmFsdWUoZWxlbWVudCwgaGVhZGVyKVxyXG4gICAgICAgICAgICAgIHwgc21hcnREYXRlVGltZTogc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzPy5kYXRlRm9ybWF0XHJcbiAgICAgICAgICB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnRpZXM/LnR5cGUgPT09IHR5cGUoKS5EQVRFXCI+XHJcbiAgICAgICAgICB7e1xyXG4gICAgICAgICAgICBnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpXHJcbiAgICAgICAgICAgICAgfCBzbWFydERhdGU6IHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydGllcz8uZGF0ZUZvcm1hdFxyXG4gICAgICAgICAgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzPy50eXBlID09PSB0eXBlKCkuVElNRVwiPlxyXG4gICAgICAgICAge3tcclxuICAgICAgICAgICAgZ2V0VmFsdWUoZWxlbWVudCwgaGVhZGVyKVxyXG4gICAgICAgICAgICAgIHwgc21hcnRUaW1lOiBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnRpZXM/LmRhdGVGb3JtYXRcclxuICAgICAgICAgIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydGllcz8udHlwZSA9PT0gdHlwZSgpLkNIRUNLQk9YXCI+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IFtkaXNhYmxlZF09XCJ0cnVlXCIgW2NoZWNrZWRdPVwiZ2V0VmFsdWUoZWxlbWVudCwgaGVhZGVyKVwiPjwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgIHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydGllcz8udHlwZSA9PT0gdHlwZSgpLklDT04gJiZcclxuICAgICAgICAgICAgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzPy5pY29ucz8ubGVuZ3RoXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgIFtzbWFydFRvb2x0aXBdPVwiZ2V0VG9vbFRpcChlbGVtZW50LCBpKVwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cImdldEljb24oZ2V0VmFsdWUoZWxlbWVudCwgaGVhZGVyKSwgaSkhXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cImdldENvbG9yKGdldFZhbHVlKGVsZW1lbnQsIGhlYWRlciksIGkpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWFydC10YWJsZS1pY29uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGlyIG9mIGdldEltYWdlUmVzb3VyY2VJY29ucyhlbGVtZW50LCBoZWFkZXIpXCI+XHJcbiAgICAgICAgICA8c21hcnQtaWNvbiBbaW1hZ2VSZXNvdXJjZV09XCJpclwiPiA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzICYmIHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uYnV0dG9uc1wiXHJcbiAgICAgICAgY2xhc3M9XCJzbWFydC10YWJsZS1idXR0b25zLWNvbFwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBidXR0b24gb2Ygc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5idXR0b25zXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0J1dHRvbihidXR0b24sIGVsZW1lbnQpXCIgW25nU3dpdGNoXT1cImJ1dHRvbi50eXBlXCI+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY3VzdG9tQnV0dG9uQ2xpY2tlZCgkZXZlbnQsIGJ1dHRvbiwgZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJzbWFydFRhYmxlQnV0dG9uVHlwZS5JQ09OXCJcclxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICBjb2xvcj1cInt7IGJ1dHRvbi5jb2xvciB9fVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c21hcnQtaWNvbiB0aXRsZT1cInt7IGJ1dHRvbi5sYWJlbCB9fVwiIFtpY29uXT1cImJ1dHRvbi5pY29uIVwiPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAoY2xpY2spPVwiY3VzdG9tQnV0dG9uQ2xpY2tlZCgkZXZlbnQsIGJ1dHRvbiwgZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJzbWFydFRhYmxlQnV0dG9uVHlwZS5OT1JNQUxcIlxyXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICBjb2xvcj1cInt7IGJ1dHRvbi5jb2xvciB9fVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cImJ1dHRvbi5pY29uXCIgW2ljb25dPVwiYnV0dG9uLmljb25cIj48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgICAge3sgYnV0dG9uLmxhYmVsID8/IChidXR0b24udHJhbnNsYXRvciA/IGJ1dHRvbi50cmFuc2xhdG9yKGVsZW1lbnQpLnRpdGxlIDogJycpIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImN1c3RvbUJ1dHRvbkNsaWNrZWQoJGV2ZW50LCBidXR0b24sIGVsZW1lbnQpXCJcclxuICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwic21hcnRUYWJsZUJ1dHRvblR5cGUuUkFJU0VEXCJcclxuICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgICAgICAgICAgIGNvbG9yPVwie3sgYnV0dG9uLmNvbG9yIH19XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uICpuZ0lmPVwiYnV0dG9uLmljb25cIiBbaWNvbl09XCJidXR0b24uaWNvblwiPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgICB7eyBidXR0b24ubGFiZWwgPz8gKGJ1dHRvbi50cmFuc2xhdG9yID8gYnV0dG9uLnRyYW5zbGF0b3IoZWxlbWVudCkudGl0bGUgOiAnJykgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwhLS0tLS0tIE1FTlUgLS0tLS0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJzbWFydFRhYmxlQnV0dG9uVHlwZS5NRU5VXCIgY2xhc3M9XCJtZW51LWJ1dHRvblwiPlxyXG4gICAgICAgICAgICAgIDwhLS0tLS0tIERFRkFVTFRfQUNUSU9OX0NPTFVNTiBJRCBUT09MQkFSIC0tLS0tLT5cclxuICAgICAgICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcclxuICAgICAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dDb2x1bW5BY3Rpb24oZWxlbWVudCwgZGVmYXVsdEFjdGlvblRvb2xiYXJJZClcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tLS0tLSBHRU5FUklDIEhBTUJVUkdFUiAtLS0tLS0+XHJcbiAgICAgICAgICAgICAgQGlmIChzaG91bGRTaG93TWVudUJ1dHRvbihlbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dNZW51QWN0aW9uTW9kZWxBcnJheShlbGVtZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+PC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLS0tLS0gTUVOVSAtLS0tLS0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzICYmIHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uaWNvblwiPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uaWNvbj8uaWNvblwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLmljb24/LmNzc0NsYXNzID8/ICcnXCJcclxuICAgICAgICAgIFtjb2xvcl09XCJzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLmljb24/LmNvbG9yXCJcclxuICAgICAgICAgIFtpY29uXT1cInNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uaWNvbiEuaWNvblwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvc21hcnQtaWNvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyAmJlxyXG4gICAgICAgICAgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS50cmFuc2xhdG9yICE9PSB1bmRlZmluZWRcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS50cmFuc2xhdG9yIShnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpKSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzICYmXHJcbiAgICAgICAgICBzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLnByb3BlcnR5TmFtZSA9PT0gJ2V4cGFuZCdcclxuICAgICAgICBcIlxyXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJleHBhbmQgcm93XCJcclxuICAgICAgICAoY2xpY2spPVwib25Ub2dnbGUoZWxlbWVudCwgJGV2ZW50KVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cImV4cGFuZGVkRWxlbWVudCAhPT0gZWxlbWVudFwiIFtpY29uXT1cIidrZXlib2FyZF9hcnJvd19kb3duJ1wiPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cImV4cGFuZGVkRWxlbWVudCA9PT0gZWxlbWVudFwiIFtpY29uXT1cIidrZXlib2FyZF9hcnJvd191cCdcIj48L3NtYXJ0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICFzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzIHx8XHJcbiAgICAgICAgICAoc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVycyAmJlxyXG4gICAgICAgICAgICAhc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0aWVzICYmXHJcbiAgICAgICAgICAgICFzbWFydFRhYmxlLmN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzW2ldLmljb24gJiZcclxuICAgICAgICAgICAgIXNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0uYnV0dG9ucyAmJlxyXG4gICAgICAgICAgICAhc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS50cmFuc2xhdG9yICYmXHJcbiAgICAgICAgICAgICEoc21hcnRUYWJsZS5jdXN0b21TbWFydFRhYmxlSGVhZGVyc1tpXS5wcm9wZXJ0eU5hbWUgPT09ICdzZWxlY3QnKSAmJlxyXG4gICAgICAgICAgICAhKHNtYXJ0VGFibGUuY3VzdG9tU21hcnRUYWJsZUhlYWRlcnNbaV0ucHJvcGVydHlOYW1lID09PSAnZXhwYW5kJykpXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzbWFydC1pY29uICpuZ0lmPVwiaGVhZGVyID09PSAnaWNvbidcIiBbaWNvbl09XCJnZXRWYWx1ZShlbGVtZW50LCBoZWFkZXIpIVwiPiA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPGltZ1xyXG4gICAgICAgICAgKm5nSWY9XCJoZWFkZXIgPT09ICdpbWcnXCJcclxuICAgICAgICAgIFtzcmNdPVwiZ2V0VmFsdWUoZWxlbWVudCwgaGVhZGVyKVwiXHJcbiAgICAgICAgICBhbHQ9XCJcIlxyXG4gICAgICAgICAgY2xhc3M9XCJzbWFydHRhYmxlSW1nXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDwhLS0tLS0tIFRPT0xCQVIgLS0tLS0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Q2VsbFRvb2xiYXIoZWxlbWVudCwgaGVhZGVyKVwiPlxyXG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgIFt1aUFjdGlvbk1vZGVsc109XCJnZXRSb3dDb2x1bW5BY3Rpb24oZWxlbWVudCwgaGVhZGVyKVwiXHJcbiAgICAgICAgICA+PC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tLS0tLSBUT09MQkFSIC0tLS0tLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICBoZWFkZXIgIT09ICdpY29uJyAmJlxyXG4gICAgICAgICAgICBoZWFkZXIgIT09ICdpbWcnICYmXHJcbiAgICAgICAgICAgIGhlYWRlciAhPT0gJ29wdGlvbicgJiZcclxuICAgICAgICAgICAgaGVhZGVyICE9PSAnYnV0dG9uJyAmJlxyXG4gICAgICAgICAgICAhaXNJbWFnZVJlc291cmNlKGVsZW1lbnQsIGhlYWRlcilcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbaW5uZXJIdG1sXT1cImdldFZhbHVlKGVsZW1lbnQsIGhlYWRlcilcIlxyXG4gICAgICAgID48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RkPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIEV4cGFuZGVkIENvbnRlbnQgQ29sdW1uIC0gVGhlIGRldGFpbCByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJleHBhbmRlZERldGFpbFwiPlxyXG4gICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBbYXR0ci5jb2xzcGFuXT1cInNtYXJ0VGFibGUudGFibGVIZWFkZXJzLmxlbmd0aFwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJleGFtcGxlLWVsZW1lbnQtZGV0YWlsXCJcclxuICAgICAgICBbQGRldGFpbEV4cGFuZF09XCJlbGVtZW50ID09IGV4cGFuZGVkRWxlbWVudCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2V4cGFuZGVkQXJlYT48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGQ+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwic21hcnRUYWJsZS50YWJsZUhlYWRlcnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IHNtYXJ0VGFibGUudGFibGVIZWFkZXJzXCI+XHJcbiAgICA8dHJcclxuICAgICAgbWF0LXJvd1xyXG4gICAgICBjbGFzcz1cImV4YW1wbGUtZWxlbWVudC1yb3dcIlxyXG4gICAgICBbY2xhc3MuZXhhbXBsZS1leHBhbmRlZC1yb3ddPVwiZXhwYW5kZWRFbGVtZW50ID09PSBlbGVtZW50XCJcclxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Um93Q2xhc3NlcyhlbGVtZW50KVwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cImdldFJvd1N0eWxlcyhlbGVtZW50KVwiXHJcbiAgICAgIChjbGljayk9XCJoYW5kbGVPblJvd0NsaWNrKGVsZW1lbnQpXCJcclxuICAgICAgKGRibGNsaWNrKT1cImhhbmRsZU9uUm93RG91YmxlQ2xpY2soJGV2ZW50LCBlbGVtZW50KVwiXHJcbiAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cImVsZW1lbnQ/LmlkID8/IG51bGxcIlxyXG4gICAgPjwvdHI+XHJcbiAgICA8bGliLWRlZmF1bHQtYWN0aW9ucy1wb3B1cFxyXG4gICAgICAqbmdJZj1cInNtYXJ0VGFibGUuZGVmYXVsdEFjdGlvbkNvZGVzICYmIHNtYXJ0VGFibGUuZGVmYXVsdEFjdGlvbkNvZGVzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAjZGVmYXVsdEFjdGlvbk1lbnVcclxuICAgICAgW2J1dHRvbnNdPVwiZ2V0RGVmYXVsdEFjdGlvbnNGb3JSb3coZWxlbWVudCkhXCJcclxuICAgICAgW3Jvd109XCJlbGVtZW50XCJcclxuICAgID48L2xpYi1kZWZhdWx0LWFjdGlvbnMtcG9wdXA+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiZXhhbXBsZS1kZXRhaWwtcm93XCI+PC90cj5cclxuPC90YWJsZT5cclxuIl19