cps-ui-kit 0.165.0 → 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +824 -0
- package/esm2022/lib/components/cps-button/cps-button.component.mjs +190 -0
- package/esm2022/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +235 -0
- package/esm2022/lib/components/cps-checkbox/cps-checkbox.component.mjs +149 -0
- package/esm2022/lib/components/cps-chip/cps-chip.component.mjs +94 -0
- package/esm2022/lib/components/cps-datepicker/cps-datepicker.component.mjs +382 -0
- package/esm2022/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +209 -0
- package/esm2022/lib/components/cps-file-upload/cps-file-upload.component.mjs +138 -0
- package/esm2022/lib/components/cps-icon/cps-icon.component.mjs +193 -0
- package/esm2022/lib/components/cps-info-circle/cps-info-circle.component.mjs +61 -0
- package/esm2022/lib/components/cps-input/cps-input.component.mjs +386 -0
- package/{esm2020 → esm2022}/lib/components/cps-loader/cps-loader.component.mjs +5 -5
- package/esm2022/lib/components/cps-menu/cps-menu.component.mjs +552 -0
- package/esm2022/lib/components/cps-paginator/cps-paginator.component.mjs +114 -0
- package/esm2022/lib/components/cps-paginator/pipes/cps-paginate.pipe.mjs +30 -0
- package/{esm2020 → esm2022}/lib/components/cps-progress-circular/cps-progress-circular.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/cps-progress-linear/cps-progress-linear.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/components/cps-radio-group/cps-radio/cps-radio.component.mjs +7 -7
- package/esm2022/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.mjs +55 -0
- package/esm2022/lib/components/cps-radio-group/cps-radio-group.component.mjs +158 -0
- package/esm2022/lib/components/cps-select/cps-select.component.mjs +615 -0
- package/esm2022/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +110 -0
- package/{esm2020 → esm2022}/lib/components/cps-tab-group/cps-tab/cps-tab.component.mjs +4 -4
- package/esm2022/lib/components/cps-tab-group/cps-tab-group.component.mjs +303 -0
- package/esm2022/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.mjs +79 -0
- package/esm2022/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.mjs +408 -0
- package/esm2022/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +149 -0
- package/esm2022/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.mjs +88 -0
- package/esm2022/lib/components/cps-table/cps-table.component.mjs +941 -0
- package/esm2022/lib/components/cps-table/directives/cps-table-column-filter.directive.mjs +181 -0
- package/{esm2020 → esm2022}/lib/components/cps-table/directives/cps-table-column-sortable.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/cps-table/directives/cps-table-header-selectable.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/cps-table/directives/cps-table-row-selectable.directive.mjs +5 -5
- package/esm2022/lib/components/cps-table/directives/internal/table-unsort.directive.mjs +220 -0
- package/esm2022/lib/components/cps-tag/cps-tag.component.mjs +136 -0
- package/esm2022/lib/components/cps-textarea/cps-textarea.component.mjs +291 -0
- package/esm2022/lib/components/cps-timepicker/cps-timepicker.component.mjs +351 -0
- package/esm2022/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +251 -0
- package/esm2022/lib/components/cps-tree-select/cps-tree-select.component.mjs +87 -0
- package/esm2022/lib/components/cps-tree-table/cps-tree-table.component.mjs +1196 -0
- package/{esm2020 → esm2022}/lib/components/cps-tree-table/directives/cps-tree-table-column-filter.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable.directive.mjs +5 -5
- package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.mjs +43 -0
- package/esm2022/lib/components/cps-tree-table/directives/internal/tree-table-unsort.directive.mjs +354 -0
- package/esm2022/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +619 -0
- package/esm2022/lib/directives/cps-tooltip/cps-tooltip.directive.mjs +257 -0
- package/{esm2020 → esm2022}/lib/pipes/internal/check-option-selected.pipe.mjs +4 -4
- package/esm2022/lib/pipes/internal/combine-labels.pipe.mjs +25 -0
- package/{esm2020 → esm2022}/lib/pipes/internal/label-by-value.pipe.mjs +4 -4
- package/esm2022/lib/services/cps-dialog/cps-dialog.service.mjs +99 -0
- package/{esm2020 → esm2022}/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.mjs +5 -5
- package/esm2022/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +470 -0
- package/{esm2020 → esm2022}/lib/services/cps-dialog/internal/directives/cps-dialog-content.directive.mjs +5 -5
- package/esm2022/lib/services/cps-dialog/utils/cps-dialog-config.mjs +3 -0
- package/esm2022/lib/services/cps-notification/cps-notification.service.mjs +126 -0
- package/esm2022/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +91 -0
- package/{esm2020 → esm2022}/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.mjs +23 -23
- package/esm2022/lib/utils/colors-utils.mjs +57 -0
- package/esm2022/lib/utils/internal/size-utils.mjs +24 -0
- package/{esm2020 → esm2022}/public-api.mjs +2 -2
- package/{fesm2020 → fesm2022}/cps-ui-kit.mjs +481 -391
- package/fesm2022/cps-ui-kit.mjs.map +1 -0
- package/lib/components/cps-autocomplete/cps-autocomplete.component.d.ts +2 -2
- package/lib/components/cps-button/cps-button.component.d.ts +1 -1
- package/lib/components/cps-button-toggle/cps-button-toggle.component.d.ts +2 -2
- package/lib/components/cps-checkbox/cps-checkbox.component.d.ts +2 -2
- package/lib/components/cps-chip/cps-chip.component.d.ts +1 -1
- package/lib/components/cps-datepicker/cps-datepicker.component.d.ts +2 -2
- package/lib/components/cps-expansion-panel/cps-expansion-panel.component.d.ts +1 -1
- package/lib/components/cps-file-upload/cps-file-upload.component.d.ts +1 -1
- package/lib/components/cps-icon/cps-icon.component.d.ts +1 -1
- package/lib/components/cps-info-circle/cps-info-circle.component.d.ts +2 -2
- package/lib/components/cps-input/cps-input.component.d.ts +2 -2
- package/lib/components/cps-loader/cps-loader.component.d.ts +1 -1
- package/lib/components/cps-menu/cps-menu.component.d.ts +1 -1
- package/lib/components/cps-paginator/cps-paginator.component.d.ts +1 -1
- package/lib/components/cps-progress-circular/cps-progress-circular.component.d.ts +1 -1
- package/lib/components/cps-progress-linear/cps-progress-linear.component.d.ts +1 -1
- package/lib/components/cps-radio-group/cps-radio/cps-radio.component.d.ts +1 -1
- package/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.d.ts +1 -1
- package/lib/components/cps-radio-group/cps-radio-group.component.d.ts +2 -2
- package/lib/components/cps-select/cps-select.component.d.ts +2 -2
- package/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.d.ts +1 -1
- package/lib/components/cps-tab-group/cps-tab/cps-tab.component.d.ts +1 -1
- package/lib/components/cps-tab-group/cps-tab-group.component.d.ts +1 -1
- package/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.d.ts +1 -1
- package/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.d.ts +1 -1
- package/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.d.ts +1 -1
- package/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.d.ts +1 -1
- package/lib/components/cps-table/cps-table.component.d.ts +1 -1
- package/lib/components/cps-table/directives/cps-table-column-filter.directive.d.ts +1 -1
- package/lib/components/cps-table/directives/cps-table-column-sortable.directive.d.ts +1 -1
- package/lib/components/cps-table/directives/cps-table-row-selectable.directive.d.ts +1 -1
- package/lib/components/cps-tag/cps-tag.component.d.ts +1 -1
- package/lib/components/cps-textarea/cps-textarea.component.d.ts +2 -2
- package/lib/components/cps-timepicker/cps-timepicker.component.d.ts +2 -2
- package/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.d.ts +1 -1
- package/lib/components/cps-tree-select/cps-tree-select.component.d.ts +1 -1
- package/lib/components/cps-tree-table/cps-tree-table.component.d.ts +4 -4
- package/lib/components/cps-tree-table/directives/cps-tree-table-column-filter.directive.d.ts +1 -1
- package/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable.directive.d.ts +1 -1
- package/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable.directive.d.ts +1 -1
- package/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.d.ts +1 -1
- package/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.d.ts +2 -2
- package/lib/directives/{cps-tooltip.directive.d.ts → cps-tooltip/cps-tooltip.directive.d.ts} +2 -2
- package/lib/services/cps-dialog/cps-dialog.service.d.ts +13 -0
- package/lib/services/cps-dialog/utils/cps-dialog-config.d.ts +1 -1
- package/lib/services/cps-notification/cps-notification.service.d.ts +32 -0
- package/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.d.ts +1 -1
- package/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.d.ts +1 -1
- package/package.json +12 -18
- package/public-api.d.ts +1 -1
- package/esm2020/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +0 -824
- package/esm2020/lib/components/cps-button/cps-button.component.mjs +0 -190
- package/esm2020/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +0 -235
- package/esm2020/lib/components/cps-checkbox/cps-checkbox.component.mjs +0 -149
- package/esm2020/lib/components/cps-chip/cps-chip.component.mjs +0 -94
- package/esm2020/lib/components/cps-datepicker/cps-datepicker.component.mjs +0 -382
- package/esm2020/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +0 -209
- package/esm2020/lib/components/cps-file-upload/cps-file-upload.component.mjs +0 -138
- package/esm2020/lib/components/cps-icon/cps-icon.component.mjs +0 -193
- package/esm2020/lib/components/cps-info-circle/cps-info-circle.component.mjs +0 -61
- package/esm2020/lib/components/cps-input/cps-input.component.mjs +0 -386
- package/esm2020/lib/components/cps-menu/cps-menu.component.mjs +0 -552
- package/esm2020/lib/components/cps-paginator/cps-paginator.component.mjs +0 -113
- package/esm2020/lib/components/cps-paginator/pipes/cps-paginate.pipe.mjs +0 -30
- package/esm2020/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.mjs +0 -55
- package/esm2020/lib/components/cps-radio-group/cps-radio-group.component.mjs +0 -158
- package/esm2020/lib/components/cps-select/cps-select.component.mjs +0 -615
- package/esm2020/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +0 -110
- package/esm2020/lib/components/cps-tab-group/cps-tab-group.component.mjs +0 -299
- package/esm2020/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.mjs +0 -79
- package/esm2020/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.mjs +0 -408
- package/esm2020/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +0 -148
- package/esm2020/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.mjs +0 -88
- package/esm2020/lib/components/cps-table/cps-table.component.mjs +0 -940
- package/esm2020/lib/components/cps-table/directives/cps-table-column-filter.directive.mjs +0 -181
- package/esm2020/lib/components/cps-table/directives/internal/table-unsort.directive.mjs +0 -210
- package/esm2020/lib/components/cps-tag/cps-tag.component.mjs +0 -136
- package/esm2020/lib/components/cps-textarea/cps-textarea.component.mjs +0 -291
- package/esm2020/lib/components/cps-timepicker/cps-timepicker.component.mjs +0 -351
- package/esm2020/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +0 -250
- package/esm2020/lib/components/cps-tree-select/cps-tree-select.component.mjs +0 -87
- package/esm2020/lib/components/cps-tree-table/cps-tree-table.component.mjs +0 -1192
- package/esm2020/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.mjs +0 -43
- package/esm2020/lib/components/cps-tree-table/directives/internal/tree-table-unsort.directive.mjs +0 -334
- package/esm2020/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +0 -616
- package/esm2020/lib/directives/cps-tooltip.directive.mjs +0 -257
- package/esm2020/lib/pipes/internal/combine-labels.pipe.mjs +0 -25
- package/esm2020/lib/services/cps-dialog/cps-dialog.service.mjs +0 -86
- package/esm2020/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +0 -470
- package/esm2020/lib/services/cps-dialog/utils/cps-dialog-config.mjs +0 -3
- package/esm2020/lib/services/cps-notification/cps-notification.service.mjs +0 -94
- package/esm2020/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +0 -91
- package/esm2020/lib/utils/colors-utils.mjs +0 -57
- package/esm2020/lib/utils/internal/size-utils.mjs +0 -24
- package/fesm2015/cps-ui-kit.mjs +0 -12086
- package/fesm2015/cps-ui-kit.mjs.map +0 -1
- package/fesm2020/cps-ui-kit.mjs.map +0 -1
- /package/{esm2020 → esm2022}/cps-ui-kit.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/components/cps-table/cps-column-filter-types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/cps-dialog/utils/cps-dialog-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/cps-notification/utils/cps-notification-config.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/cps-notification/utils/internal/cps-notification-data.mjs +0 -0
|
@@ -0,0 +1,1196 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, RendererStyleFlags2, ViewChild } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { TreeTable, TreeTableService, TreeTableModule } from 'primeng/treetable';
|
|
5
|
+
import { DomHandler } from 'primeng/dom';
|
|
6
|
+
import { AngleDoubleLeftIcon } from 'primeng/icons/angledoubleleft';
|
|
7
|
+
import { AngleLeftIcon } from 'primeng/icons/angleleft';
|
|
8
|
+
import { AngleRightIcon } from 'primeng/icons/angleright';
|
|
9
|
+
import { AngleDoubleRightIcon } from 'primeng/icons/angledoubleright';
|
|
10
|
+
import { cloneDeep, isEqual } from 'lodash-es';
|
|
11
|
+
import { CpsInputComponent } from '../cps-input/cps-input.component';
|
|
12
|
+
import { CpsButtonComponent } from '../cps-button/cps-button.component';
|
|
13
|
+
import { CpsMenuComponent } from '../cps-menu/cps-menu.component';
|
|
14
|
+
import { CpsIconComponent } from '../cps-icon/cps-icon.component';
|
|
15
|
+
import { CpsSelectComponent } from '../cps-select/cps-select.component';
|
|
16
|
+
import { CpsLoaderComponent } from '../cps-loader/cps-loader.component';
|
|
17
|
+
import { CpsTreeTableColumnSortableDirective } from './directives/cps-tree-table-column-sortable.directive';
|
|
18
|
+
import { TreeTableUnsortDirective } from './directives/internal/tree-table-unsort.directive';
|
|
19
|
+
import { TableRowMenuComponent } from '../cps-table/components/internal/table-row-menu/table-row-menu.component';
|
|
20
|
+
import { convertSize } from '../../utils/internal/size-utils';
|
|
21
|
+
import { CpsTreeTableHeaderSelectableDirective } from './directives/cps-tree-table-header-selectable.directive';
|
|
22
|
+
import { CpsTreeTableRowSelectableDirective } from './directives/cps-tree-table-row-selectable.directive';
|
|
23
|
+
import { CpsTreetableRowTogglerDirective } from './directives/cps-tree-table-row-toggler.directive';
|
|
24
|
+
import { fromEvent } from 'rxjs';
|
|
25
|
+
import * as i0 from "@angular/core";
|
|
26
|
+
import * as i1 from "@angular/forms";
|
|
27
|
+
import * as i2 from "@angular/common";
|
|
28
|
+
import * as i3 from "primeng/treetable";
|
|
29
|
+
import * as i4 from "primeng/api";
|
|
30
|
+
export function treeTableFactory(tableComponent) {
|
|
31
|
+
return tableComponent.primengTreeTable;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* CpsTreeTableComponent is used to display hierarchical data in tabular format.
|
|
35
|
+
* @group Components
|
|
36
|
+
*/
|
|
37
|
+
export class CpsTreeTableComponent {
|
|
38
|
+
/**
|
|
39
|
+
* An array of objects to display.
|
|
40
|
+
* @group Props
|
|
41
|
+
*/
|
|
42
|
+
set data(value) {
|
|
43
|
+
const clone = cloneDeep(value);
|
|
44
|
+
if (clone && clone.length > 0) {
|
|
45
|
+
let i = 0;
|
|
46
|
+
clone.forEach((v) => {
|
|
47
|
+
v._defaultSortOrder = i++;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
this._data = clone;
|
|
51
|
+
}
|
|
52
|
+
get data() {
|
|
53
|
+
return this._data;
|
|
54
|
+
}
|
|
55
|
+
// eslint-disable-next-line no-useless-constructor
|
|
56
|
+
constructor(cdRef, renderer, ngZone) {
|
|
57
|
+
this.cdRef = cdRef;
|
|
58
|
+
this.renderer = renderer;
|
|
59
|
+
this.ngZone = ngZone;
|
|
60
|
+
/**
|
|
61
|
+
* An array of objects to represent dynamic columns.
|
|
62
|
+
* @group Props
|
|
63
|
+
*/
|
|
64
|
+
this.columns = [];
|
|
65
|
+
/**
|
|
66
|
+
* A key used to retrieve the header from columns.
|
|
67
|
+
* @group Props
|
|
68
|
+
*/
|
|
69
|
+
this.colHeaderName = 'header';
|
|
70
|
+
/**
|
|
71
|
+
* A key used to retrieve the field from columns.
|
|
72
|
+
* @group Props
|
|
73
|
+
*/
|
|
74
|
+
this.colFieldName = 'field';
|
|
75
|
+
/**
|
|
76
|
+
* Treetable min width of type number denoting pixels or string.
|
|
77
|
+
* @group Props
|
|
78
|
+
*/
|
|
79
|
+
this.minWidth = '';
|
|
80
|
+
/**
|
|
81
|
+
* Determines whether minWidth prop is used for treetable body only, excluding toolbar and paginator.
|
|
82
|
+
* @group Props
|
|
83
|
+
*/
|
|
84
|
+
this.minWidthForBodyOnly = true;
|
|
85
|
+
/**
|
|
86
|
+
* Determines whether the cell widths scale according to their content or not.
|
|
87
|
+
* @group Props
|
|
88
|
+
*/
|
|
89
|
+
this.autoLayout = true;
|
|
90
|
+
/**
|
|
91
|
+
* Determines whether the treetable should have alternating stripes.
|
|
92
|
+
* @group Props
|
|
93
|
+
*/
|
|
94
|
+
this.striped = true;
|
|
95
|
+
/**
|
|
96
|
+
* Determines whether the treetable should have borders.
|
|
97
|
+
* @group Props
|
|
98
|
+
*/
|
|
99
|
+
this.bordered = true;
|
|
100
|
+
/**
|
|
101
|
+
* Size of treetable cells, it can be "small", "normal" or "large".
|
|
102
|
+
* @group Props
|
|
103
|
+
*/
|
|
104
|
+
this.size = 'normal';
|
|
105
|
+
/**
|
|
106
|
+
* Determines whether the treetable should have row selection.
|
|
107
|
+
* @group Props
|
|
108
|
+
*/
|
|
109
|
+
this.selectable = false;
|
|
110
|
+
/**
|
|
111
|
+
* Determines whether the treetable should have rows highlighting on hover.
|
|
112
|
+
* @group Props
|
|
113
|
+
*/
|
|
114
|
+
this.rowHover = true;
|
|
115
|
+
/**
|
|
116
|
+
* Determines whether the treetable should show row menus.
|
|
117
|
+
* @group Props
|
|
118
|
+
*/
|
|
119
|
+
this.showRowMenu = false;
|
|
120
|
+
/**
|
|
121
|
+
* Determines whether the 'Remove' button should be displayed in the row menu.
|
|
122
|
+
* Note: This setting only takes effect if 'showRowMenu' is true.
|
|
123
|
+
* @group Props
|
|
124
|
+
*/
|
|
125
|
+
this.showRowRemoveButton = true;
|
|
126
|
+
/**
|
|
127
|
+
* Determines whether the 'Edit' button should be displayed in the row menu.
|
|
128
|
+
* Note: This setting only takes effect if 'showRowMenu' is true.
|
|
129
|
+
* @group Props
|
|
130
|
+
*/
|
|
131
|
+
this.showRowEditButton = true;
|
|
132
|
+
/**
|
|
133
|
+
* When enabled, a loader component is displayed.
|
|
134
|
+
* @group Props
|
|
135
|
+
*/
|
|
136
|
+
this.loading = false;
|
|
137
|
+
/**
|
|
138
|
+
* Inline style of the treetable.
|
|
139
|
+
* @group Props
|
|
140
|
+
*/
|
|
141
|
+
this.tableStyle = undefined;
|
|
142
|
+
/**
|
|
143
|
+
* Style class of the treetable.
|
|
144
|
+
* @group Props
|
|
145
|
+
*/
|
|
146
|
+
this.tableStyleClass = '';
|
|
147
|
+
/**
|
|
148
|
+
* Makes all columns sortable if columns prop is provided.
|
|
149
|
+
* @group Props
|
|
150
|
+
*/
|
|
151
|
+
this.sortable = false;
|
|
152
|
+
/**
|
|
153
|
+
* Determines whether sorting works on single column or on multiple columns.
|
|
154
|
+
* @group Props
|
|
155
|
+
*/
|
|
156
|
+
this.sortMode = 'single';
|
|
157
|
+
/**
|
|
158
|
+
* Determines whether to use the default sorting or a custom one using sortFunction.
|
|
159
|
+
* @group Props
|
|
160
|
+
*/
|
|
161
|
+
this.customSort = false;
|
|
162
|
+
/**
|
|
163
|
+
* Determines whether the treetable has a toolbar.
|
|
164
|
+
* @group Props
|
|
165
|
+
*/
|
|
166
|
+
this.hasToolbar = true;
|
|
167
|
+
/**
|
|
168
|
+
* Toolbar size, it can be "small" or "normal".
|
|
169
|
+
* @group Props
|
|
170
|
+
*/
|
|
171
|
+
this.toolbarSize = 'normal';
|
|
172
|
+
/**
|
|
173
|
+
* Toolbar title.
|
|
174
|
+
* @group Props
|
|
175
|
+
*/
|
|
176
|
+
this.toolbarTitle = '';
|
|
177
|
+
/**
|
|
178
|
+
* Toolbar icon name.
|
|
179
|
+
* @group Props
|
|
180
|
+
*/
|
|
181
|
+
this.toolbarIcon = '';
|
|
182
|
+
/**
|
|
183
|
+
* Toolbar icon color.
|
|
184
|
+
* @group Props
|
|
185
|
+
*/
|
|
186
|
+
this.toolbarIconColor = '';
|
|
187
|
+
/**
|
|
188
|
+
* Makes treetable scrollable.
|
|
189
|
+
* @group Props
|
|
190
|
+
*/
|
|
191
|
+
this.scrollable = true;
|
|
192
|
+
/**
|
|
193
|
+
* Height of the scroll viewport in fixed pixels or the "flex" keyword for a dynamic size.
|
|
194
|
+
* @group Props
|
|
195
|
+
*/
|
|
196
|
+
this.scrollHeight = '';
|
|
197
|
+
/**
|
|
198
|
+
* Determines whether only the elements within scrollable area should be added into the DOM. Works only if scrollable prop is true.
|
|
199
|
+
* @group Props
|
|
200
|
+
*/
|
|
201
|
+
this.virtualScroll = false;
|
|
202
|
+
/**
|
|
203
|
+
* Height of a virtual scroll item in fixed pixels.
|
|
204
|
+
* @group Props
|
|
205
|
+
*/
|
|
206
|
+
this.virtualScrollItemHeight = 0;
|
|
207
|
+
/**
|
|
208
|
+
* Determines how many additional elements to add to the DOM outside of the view.
|
|
209
|
+
* @group Props
|
|
210
|
+
*/
|
|
211
|
+
this.numToleratedItems = 10;
|
|
212
|
+
/**
|
|
213
|
+
* Determines whether the treetable should have paginator.
|
|
214
|
+
* @group Props
|
|
215
|
+
*/
|
|
216
|
+
this.paginator = false;
|
|
217
|
+
/**
|
|
218
|
+
* Determines whether to show paginator even there is only one page.
|
|
219
|
+
* @group Props
|
|
220
|
+
*/
|
|
221
|
+
this.alwaysShowPaginator = true;
|
|
222
|
+
/**
|
|
223
|
+
* Array of integer values to display inside rows per page dropdown of paginator.
|
|
224
|
+
* @group Props
|
|
225
|
+
*/
|
|
226
|
+
this.rowsPerPageOptions = [];
|
|
227
|
+
/**
|
|
228
|
+
* Index of the first row to be displayed.
|
|
229
|
+
* @group Props
|
|
230
|
+
*/
|
|
231
|
+
this.first = 0;
|
|
232
|
+
/**
|
|
233
|
+
* Number of rows to display per page.
|
|
234
|
+
* @group Props
|
|
235
|
+
*/
|
|
236
|
+
this.rows = 0;
|
|
237
|
+
/**
|
|
238
|
+
* Determines whether to reset page on rows change.
|
|
239
|
+
* @group Props
|
|
240
|
+
*/
|
|
241
|
+
this.resetPageOnRowsChange = false;
|
|
242
|
+
/**
|
|
243
|
+
* Determines whether to reset page on treetable data sorting.
|
|
244
|
+
* @group Props
|
|
245
|
+
*/
|
|
246
|
+
this.resetPageOnSort = true;
|
|
247
|
+
/**
|
|
248
|
+
* Number of total records.
|
|
249
|
+
* @group Props
|
|
250
|
+
*/
|
|
251
|
+
this.totalRecords = 0;
|
|
252
|
+
/**
|
|
253
|
+
* Text to display when there is no data.
|
|
254
|
+
* @group Props
|
|
255
|
+
*/
|
|
256
|
+
this.emptyMessage = 'No data';
|
|
257
|
+
/**
|
|
258
|
+
* Height of treetable's body when there is no data, of type number denoting pixels or string.
|
|
259
|
+
* @group Props
|
|
260
|
+
*/
|
|
261
|
+
this.emptyBodyHeight = '';
|
|
262
|
+
/**
|
|
263
|
+
* Defines if data is loaded and interacted with in lazy manner.
|
|
264
|
+
* @group Props
|
|
265
|
+
*/
|
|
266
|
+
this.lazy = false;
|
|
267
|
+
/**
|
|
268
|
+
* Determines whether to call lazy loading on initialization.
|
|
269
|
+
* @group Props
|
|
270
|
+
*/
|
|
271
|
+
this.lazyLoadOnInit = true;
|
|
272
|
+
/**
|
|
273
|
+
* Determines whether to show global filter in the toolbar.
|
|
274
|
+
* @group Props
|
|
275
|
+
*/
|
|
276
|
+
this.showGlobalFilter = false;
|
|
277
|
+
/**
|
|
278
|
+
* Global filter placeholder.
|
|
279
|
+
* @group Props
|
|
280
|
+
*/
|
|
281
|
+
this.globalFilterPlaceholder = 'Search';
|
|
282
|
+
/**
|
|
283
|
+
* An array of fields to use in global filtering.
|
|
284
|
+
* @group Props
|
|
285
|
+
*/
|
|
286
|
+
this.globalFilterFields = [];
|
|
287
|
+
/**
|
|
288
|
+
* Determines whether to clear global filter on data loading.
|
|
289
|
+
* @group Props
|
|
290
|
+
*/
|
|
291
|
+
this.clearGlobalFilterOnLoading = false;
|
|
292
|
+
/**
|
|
293
|
+
* Determines whether to show remove button in the toolbar when rows are selected.
|
|
294
|
+
* @group Props
|
|
295
|
+
*/
|
|
296
|
+
this.showRemoveBtnOnSelect = true;
|
|
297
|
+
/**
|
|
298
|
+
* Determines whether removeBtnOnSelect is disabled.
|
|
299
|
+
* @group Props
|
|
300
|
+
*/
|
|
301
|
+
this.removeBtnOnSelectDisabled = false;
|
|
302
|
+
/**
|
|
303
|
+
* Determines whether to show additional button in the toolbar when rows are selected.
|
|
304
|
+
* @group Props
|
|
305
|
+
*/
|
|
306
|
+
this.showAdditionalBtnOnSelect = false;
|
|
307
|
+
/**
|
|
308
|
+
* AdditionalBtnOnSelect title.
|
|
309
|
+
* @group Props
|
|
310
|
+
*/
|
|
311
|
+
this.additionalBtnOnSelectTitle = 'Select action';
|
|
312
|
+
/**
|
|
313
|
+
* Determines whether additionalBtnOnSelect is disabled.
|
|
314
|
+
* @group Props
|
|
315
|
+
*/
|
|
316
|
+
this.additionalBtnOnSelectDisabled = false;
|
|
317
|
+
/**
|
|
318
|
+
* Determines whether to show action button in the toolbar.
|
|
319
|
+
* @group Props
|
|
320
|
+
*/
|
|
321
|
+
this.showActionBtn = false;
|
|
322
|
+
/**
|
|
323
|
+
* Action button title.
|
|
324
|
+
* @group Props
|
|
325
|
+
*/
|
|
326
|
+
this.actionBtnTitle = 'Action';
|
|
327
|
+
/**
|
|
328
|
+
* Determines whether actionBtn is disabled.
|
|
329
|
+
* @group Props
|
|
330
|
+
*/
|
|
331
|
+
this.actionBtnDisabled = false;
|
|
332
|
+
/**
|
|
333
|
+
* Determines whether to show data reload button in the toolbar.
|
|
334
|
+
* @group Props
|
|
335
|
+
*/
|
|
336
|
+
this.showDataReloadBtn = false;
|
|
337
|
+
/**
|
|
338
|
+
* Determines whether dataReloadBtn is disabled.
|
|
339
|
+
* @group Props
|
|
340
|
+
*/
|
|
341
|
+
this.dataReloadBtnDisabled = false;
|
|
342
|
+
/**
|
|
343
|
+
* Determines whether the treetable should show columnsToggle menu, where you can choose which columns to be displayed. If external body template is provided, use columnsSelected event emitter.
|
|
344
|
+
* @group Props
|
|
345
|
+
*/
|
|
346
|
+
this.showColumnsToggleBtn = false;
|
|
347
|
+
/**
|
|
348
|
+
* Determines whether columnsToggle button is disabled.
|
|
349
|
+
* @group Props
|
|
350
|
+
*/
|
|
351
|
+
this.columnsToggleBtnDisabled = false;
|
|
352
|
+
/**
|
|
353
|
+
* Array of initial columns to show in the treetable. If not provided, all columns are initially visible.
|
|
354
|
+
* @group Props
|
|
355
|
+
*/
|
|
356
|
+
this.initialColumns = [];
|
|
357
|
+
/**
|
|
358
|
+
* Callback to invoke on selected rows change.
|
|
359
|
+
* @param {any[]} any[] - selected rows.
|
|
360
|
+
* @group Emits
|
|
361
|
+
*/
|
|
362
|
+
this.rowsSelected = new EventEmitter();
|
|
363
|
+
/**
|
|
364
|
+
* Callback to invoke when action button is clicked.
|
|
365
|
+
* @param {void} void - action button clicked.
|
|
366
|
+
* @group Emits
|
|
367
|
+
*/
|
|
368
|
+
this.actionBtnClicked = new EventEmitter();
|
|
369
|
+
/**
|
|
370
|
+
* Callback to invoke when additional button on select is clicked.
|
|
371
|
+
* @param {any[]} any[] - selected data.
|
|
372
|
+
* @group Emits
|
|
373
|
+
*/
|
|
374
|
+
this.additionalBtnOnSelectClicked = new EventEmitter();
|
|
375
|
+
/**
|
|
376
|
+
* Callback to invoke when edit-row button is clicked.
|
|
377
|
+
* @param {any} any - button clicked.
|
|
378
|
+
* @group Emits
|
|
379
|
+
*/
|
|
380
|
+
this.editRowBtnClicked = new EventEmitter();
|
|
381
|
+
/**
|
|
382
|
+
* Callback to invoke when rows are removed.
|
|
383
|
+
* @param {any[]} any[] - array of rows to remove.
|
|
384
|
+
* @group Emits
|
|
385
|
+
*/
|
|
386
|
+
this.rowsToRemove = new EventEmitter();
|
|
387
|
+
/**
|
|
388
|
+
* Callback to invoke when page is changed.
|
|
389
|
+
* @param {any} any - page changed.
|
|
390
|
+
* @group Emits
|
|
391
|
+
*/
|
|
392
|
+
this.pageChanged = new EventEmitter();
|
|
393
|
+
/**
|
|
394
|
+
* Callback to invoke when data is sorted.
|
|
395
|
+
* @param {any} any - Sort data.
|
|
396
|
+
* @group Emits
|
|
397
|
+
*/
|
|
398
|
+
this.sorted = new EventEmitter();
|
|
399
|
+
/**
|
|
400
|
+
* Callback to invoke when data is filtered.
|
|
401
|
+
* @param {any} any - Custom filter event.
|
|
402
|
+
* @group Emits
|
|
403
|
+
*/
|
|
404
|
+
this.filtered = new EventEmitter();
|
|
405
|
+
/**
|
|
406
|
+
* Callback to invoke on selected columns.
|
|
407
|
+
* @param {any[]} object[] - selection changed.
|
|
408
|
+
* @group Emits
|
|
409
|
+
*/
|
|
410
|
+
this.columnsSelected = new EventEmitter();
|
|
411
|
+
/**
|
|
412
|
+
* Callback to invoke when paging, sorting or filtering happens in lazy mode.
|
|
413
|
+
* @param {any} any - Custom lazy load event.
|
|
414
|
+
* @group Emits
|
|
415
|
+
*/
|
|
416
|
+
this.lazyLoaded = new EventEmitter();
|
|
417
|
+
/**
|
|
418
|
+
* Callback to invoke when data reload button is clicked.
|
|
419
|
+
* @param {any} any - data reload button clicked.
|
|
420
|
+
* @group Emits
|
|
421
|
+
*/
|
|
422
|
+
this.dataReloadBtnClicked = new EventEmitter();
|
|
423
|
+
/**
|
|
424
|
+
* Callback to invoke when a node is expanded.
|
|
425
|
+
* @param {any} any - Node instance.
|
|
426
|
+
* @group Emits
|
|
427
|
+
*/
|
|
428
|
+
this.nodeExpanded = new EventEmitter();
|
|
429
|
+
/**
|
|
430
|
+
* Callback to invoke when a node is collapsed.
|
|
431
|
+
* @param {any} any - Node collapse event.
|
|
432
|
+
* @group Emits
|
|
433
|
+
*/
|
|
434
|
+
this.nodeCollapsed = new EventEmitter();
|
|
435
|
+
/**
|
|
436
|
+
* Callback to invoke when a node is selected.
|
|
437
|
+
* @param {any} any - Node instance.
|
|
438
|
+
* @group Emits
|
|
439
|
+
*/
|
|
440
|
+
this.nodeSelected = new EventEmitter();
|
|
441
|
+
/**
|
|
442
|
+
* Callback to invoke when a node is unselected.
|
|
443
|
+
* @param {any} any - Custom node unselect event.
|
|
444
|
+
* @group Emits
|
|
445
|
+
*/
|
|
446
|
+
this.nodeUnselected = new EventEmitter();
|
|
447
|
+
/**
|
|
448
|
+
* A function to implement custom sorting. customSort must be true.
|
|
449
|
+
* @param {any} any - sort meta.
|
|
450
|
+
* @group Emits
|
|
451
|
+
*/
|
|
452
|
+
this.customSortFunction = new EventEmitter();
|
|
453
|
+
this.selectedColumns = [];
|
|
454
|
+
this.rowOptions = [];
|
|
455
|
+
// Todo: Add explicit type
|
|
456
|
+
this.selectedRows = [];
|
|
457
|
+
this.virtualScrollItemSize = 0;
|
|
458
|
+
this.defScrollHeight = '';
|
|
459
|
+
this._defScrollHeightPx = 0;
|
|
460
|
+
this._defScrollHeightPxInitial = 0;
|
|
461
|
+
this._scrollbarWidth = 0;
|
|
462
|
+
this._scrollbarVisible = true;
|
|
463
|
+
this._needRecalcAutoLayout = true;
|
|
464
|
+
this._data = [];
|
|
465
|
+
this._resizeObserver = new ResizeObserver((entries) => {
|
|
466
|
+
entries.forEach((entry) => {
|
|
467
|
+
const body = entry.target;
|
|
468
|
+
this._scrollbarVisible = body.scrollHeight > body.clientHeight;
|
|
469
|
+
if (this._scrollbarVisible && this.virtualScroll)
|
|
470
|
+
this.renderer.setStyle(this._scrollableBody, 'overflow', 'auto', RendererStyleFlags2.Important);
|
|
471
|
+
let wScroll = this._scrollbarVisible ? this._scrollbarWidth : 0;
|
|
472
|
+
if (wScroll > 0)
|
|
473
|
+
wScroll -= 1;
|
|
474
|
+
this.renderer.setStyle(this._headerBox, 'padding-right', `${wScroll}px`);
|
|
475
|
+
this.renderer.setStyle(this._headerBox, 'border-right', wScroll > 0 ? '1px solid #d7d5d5' : 'unset');
|
|
476
|
+
this._calcAutoLayoutHeaderWidths();
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
ngOnInit() {
|
|
481
|
+
if (!this.scrollable)
|
|
482
|
+
this.virtualScroll = false;
|
|
483
|
+
this.emptyBodyHeight = convertSize(this.emptyBodyHeight);
|
|
484
|
+
this.minWidth = convertSize(this.minWidth);
|
|
485
|
+
if (this.showAdditionalBtnOnSelect)
|
|
486
|
+
this.showRemoveBtnOnSelect = false;
|
|
487
|
+
this.defScrollHeight = this.scrollHeight;
|
|
488
|
+
if (this.virtualScroll) {
|
|
489
|
+
window.addEventListener('resize', this._onWindowResize.bind(this));
|
|
490
|
+
if (this.defScrollHeight && this.defScrollHeight !== 'flex') {
|
|
491
|
+
this._defScrollHeightPx = parseInt(this.scrollHeight, 10);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
if (this.paginator) {
|
|
495
|
+
if (this.rowsPerPageOptions.length < 1)
|
|
496
|
+
this.rowsPerPageOptions = [5, 10, 25, 50];
|
|
497
|
+
if (!this.rows)
|
|
498
|
+
this.rows = this.rowsPerPageOptions[0];
|
|
499
|
+
else {
|
|
500
|
+
if (!this.rowsPerPageOptions.includes(this.rows)) {
|
|
501
|
+
throw new Error('rowsPerPageOptions must include rows');
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
this.rowOptions = this.rowsPerPageOptions.map((v) => ({
|
|
505
|
+
label: '' + v,
|
|
506
|
+
value: v
|
|
507
|
+
}));
|
|
508
|
+
}
|
|
509
|
+
if (this.showGlobalFilter &&
|
|
510
|
+
this.globalFilterFields?.length < 1 &&
|
|
511
|
+
this.data?.length > 0) {
|
|
512
|
+
this.globalFilterFields = Object.keys(this.data[0].data);
|
|
513
|
+
}
|
|
514
|
+
this.selectedColumns =
|
|
515
|
+
this.initialColumns.length > 0 ? this.initialColumns : this.columns;
|
|
516
|
+
}
|
|
517
|
+
ngAfterViewInit() {
|
|
518
|
+
this._setMinWidthOverall();
|
|
519
|
+
this._scrollableBody = this.primengTreeTable.el.nativeElement.querySelector('.p-treetable-scrollable-body');
|
|
520
|
+
if (this._scrollableBody) {
|
|
521
|
+
if (this.minWidthForBodyOnly && this.minWidth) {
|
|
522
|
+
const table = this._scrollableBody.querySelector('table');
|
|
523
|
+
if (table)
|
|
524
|
+
this.renderer.setStyle(table, 'min-width', this.minWidth);
|
|
525
|
+
}
|
|
526
|
+
if (this.virtualScroll) {
|
|
527
|
+
if (this.defScrollHeight === 'flex') {
|
|
528
|
+
this._defScrollHeightPx = this._scrollableBody.clientHeight;
|
|
529
|
+
this._defScrollHeightPxInitial = this._defScrollHeightPx;
|
|
530
|
+
}
|
|
531
|
+
if (this.autoLayout) {
|
|
532
|
+
this._scrollSubscription = fromEvent(this._scrollableBody, 'scroll').subscribe(() => {
|
|
533
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
this._headerBox = this.primengTreeTable.el.nativeElement.querySelector('.p-treetable-scrollable-header-box');
|
|
538
|
+
if (this._headerBox) {
|
|
539
|
+
if (this.minWidthForBodyOnly && this.minWidth) {
|
|
540
|
+
const table = this._headerBox.querySelector('table');
|
|
541
|
+
if (table)
|
|
542
|
+
this.renderer.setStyle(table, 'min-width', this.minWidth);
|
|
543
|
+
}
|
|
544
|
+
this._scrollbarWidth = DomHandler.calculateScrollbarWidth();
|
|
545
|
+
this._resizeObserver.observe(this._scrollableBody);
|
|
546
|
+
}
|
|
547
|
+
if (this._needRecalcAutoLayout) {
|
|
548
|
+
this._calcAutoLayoutHeaderWidths();
|
|
549
|
+
this.cdRef.detectChanges();
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
if (!this.scrollable) {
|
|
553
|
+
const tableWrapper = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable-wrapper');
|
|
554
|
+
if (tableWrapper && this.minWidthForBodyOnly && this.minWidth) {
|
|
555
|
+
const table = tableWrapper.querySelector('table');
|
|
556
|
+
if (table)
|
|
557
|
+
this.renderer.setStyle(table, 'min-width', this.minWidth);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
ngAfterViewChecked() {
|
|
562
|
+
if (this._needRecalcAutoLayout) {
|
|
563
|
+
this._calcAutoLayoutHeaderWidths();
|
|
564
|
+
this.cdRef.detectChanges();
|
|
565
|
+
}
|
|
566
|
+
if (!this.virtualScroll)
|
|
567
|
+
return;
|
|
568
|
+
if (!this._defScrollHeightPx && this.defScrollHeight === 'flex') {
|
|
569
|
+
this._defScrollHeightPx = this._scrollableBody.clientHeight;
|
|
570
|
+
this._defScrollHeightPxInitial = this._defScrollHeightPx;
|
|
571
|
+
this.cdRef.detectChanges();
|
|
572
|
+
}
|
|
573
|
+
if (!this.virtualScrollItemSize) {
|
|
574
|
+
setTimeout(() => {
|
|
575
|
+
this._recalcVirtualHeight();
|
|
576
|
+
this.cdRef.detectChanges();
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
ngOnChanges(changes) {
|
|
581
|
+
if (this.loading) {
|
|
582
|
+
this.clearSelection();
|
|
583
|
+
if (this.clearGlobalFilterOnLoading)
|
|
584
|
+
this.clearGlobalFilter();
|
|
585
|
+
}
|
|
586
|
+
if (this.virtualScrollItemHeight)
|
|
587
|
+
this.virtualScrollItemSize = this.virtualScrollItemHeight;
|
|
588
|
+
this._setMinWidthOverall();
|
|
589
|
+
const dataChanges = changes?.data;
|
|
590
|
+
if (dataChanges?.previousValue !== dataChanges?.currentValue) {
|
|
591
|
+
this.clearSelection();
|
|
592
|
+
setTimeout(() => {
|
|
593
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
597
|
+
this._recalcVirtualHeight();
|
|
598
|
+
}
|
|
599
|
+
ngOnDestroy() {
|
|
600
|
+
this._resizeObserver?.disconnect();
|
|
601
|
+
if (this.virtualScroll) {
|
|
602
|
+
if (this.autoLayout)
|
|
603
|
+
this._scrollSubscription?.unsubscribe();
|
|
604
|
+
window.removeEventListener('resize', this._onWindowResize.bind(this));
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
_calcAutoLayoutHeaderWidths(forced = false) {
|
|
608
|
+
this.ngZone.runOutsideAngular(() => {
|
|
609
|
+
if (!this.autoLayout || !this.scrollable)
|
|
610
|
+
return;
|
|
611
|
+
if (!this._needRecalcAutoLayout && !forced)
|
|
612
|
+
return;
|
|
613
|
+
const headerRows = this._headerBox?.querySelectorAll('tr');
|
|
614
|
+
if (!headerRows?.length)
|
|
615
|
+
return;
|
|
616
|
+
const headerCells = headerRows[headerRows.length - 1]?.querySelectorAll('th');
|
|
617
|
+
if (!headerCells?.length)
|
|
618
|
+
return;
|
|
619
|
+
let hasSelectableCell = false;
|
|
620
|
+
let hasRowMenuCell = false;
|
|
621
|
+
const ths = Array.from(headerCells);
|
|
622
|
+
if (ths.every((th) => th.offsetWidth === 0))
|
|
623
|
+
return;
|
|
624
|
+
const thWidths = ths.map((th) => {
|
|
625
|
+
const wprev = th.style.width;
|
|
626
|
+
const isSelectableCell = th.classList.contains('cps-treetable-selectable-cell');
|
|
627
|
+
const isRowCell = th.classList.contains('cps-treetable-row-menu-cell');
|
|
628
|
+
if (isSelectableCell)
|
|
629
|
+
hasSelectableCell = true;
|
|
630
|
+
if (isRowCell)
|
|
631
|
+
hasRowMenuCell = true;
|
|
632
|
+
let thWidth = 55;
|
|
633
|
+
if (!isSelectableCell && !isRowCell) {
|
|
634
|
+
this.renderer.setStyle(th, 'width', 'min-content');
|
|
635
|
+
this.renderer.setStyle(th, 'display', 'block');
|
|
636
|
+
this.renderer.setStyle(th, 'text-wrap', 'nowrap');
|
|
637
|
+
thWidth = th.offsetWidth;
|
|
638
|
+
this.renderer.setStyle(th, 'width', wprev);
|
|
639
|
+
this.renderer.removeStyle(th, 'display');
|
|
640
|
+
this.renderer.removeStyle(th, 'text-wrap');
|
|
641
|
+
}
|
|
642
|
+
return thWidth;
|
|
643
|
+
});
|
|
644
|
+
const bodyRows = this._scrollableBody?.querySelectorAll('tr');
|
|
645
|
+
if (!bodyRows?.length)
|
|
646
|
+
return;
|
|
647
|
+
const tdWidths = [];
|
|
648
|
+
const fragment = document.createDocumentFragment();
|
|
649
|
+
const hiddenDiv = document.createElement('div');
|
|
650
|
+
hiddenDiv.style.visibility = 'hidden';
|
|
651
|
+
hiddenDiv.style.position = 'absolute';
|
|
652
|
+
hiddenDiv.style.whiteSpace = 'nowrap';
|
|
653
|
+
document.body.appendChild(hiddenDiv);
|
|
654
|
+
bodyRows.forEach((tr) => {
|
|
655
|
+
const tds = tr?.querySelectorAll('td');
|
|
656
|
+
tds?.forEach((td, idx) => {
|
|
657
|
+
const isSelectableOrRowMenuCell = td.classList.contains('cps-treetable-selectable-cell') ||
|
|
658
|
+
td.classList.contains('cps-treetable-row-menu-cell');
|
|
659
|
+
let tdWidth = 55;
|
|
660
|
+
if (!isSelectableOrRowMenuCell) {
|
|
661
|
+
const clonedTd = td.cloneNode(true);
|
|
662
|
+
fragment.appendChild(clonedTd);
|
|
663
|
+
this.renderer.setStyle(clonedTd, 'width', 'min-content');
|
|
664
|
+
this.renderer.setStyle(clonedTd, 'display', 'block');
|
|
665
|
+
hiddenDiv.innerHTML = clonedTd.innerHTML;
|
|
666
|
+
hiddenDiv.style.width = 'auto';
|
|
667
|
+
tdWidth = hiddenDiv.offsetWidth;
|
|
668
|
+
fragment.removeChild(clonedTd);
|
|
669
|
+
}
|
|
670
|
+
if (!tdWidths[idx])
|
|
671
|
+
tdWidths[idx] = 0;
|
|
672
|
+
tdWidths[idx] = Math.max(tdWidths[idx], tdWidth);
|
|
673
|
+
});
|
|
674
|
+
});
|
|
675
|
+
document.body.removeChild(hiddenDiv);
|
|
676
|
+
if (thWidths.length !== tdWidths.length)
|
|
677
|
+
return;
|
|
678
|
+
const maxWidths = thWidths.map((v, idx) => Math.max(v, tdWidths[idx]));
|
|
679
|
+
let sum = maxWidths.reduce((a, b) => a + b, 0);
|
|
680
|
+
if (hasSelectableCell) {
|
|
681
|
+
sum -= 55;
|
|
682
|
+
maxWidths.shift();
|
|
683
|
+
}
|
|
684
|
+
if (hasRowMenuCell) {
|
|
685
|
+
sum -= 55;
|
|
686
|
+
maxWidths.pop();
|
|
687
|
+
}
|
|
688
|
+
const percentages = maxWidths.map((v) => (v / sum) * 100);
|
|
689
|
+
headerCells.forEach((th, idx) => {
|
|
690
|
+
if ((hasSelectableCell && idx === 0) ||
|
|
691
|
+
(hasRowMenuCell && idx === headerCells.length - 1)) {
|
|
692
|
+
this.renderer.setStyle(th, 'width', '55px');
|
|
693
|
+
}
|
|
694
|
+
else
|
|
695
|
+
this.renderer.setStyle(th, 'width', percentages[hasSelectableCell ? idx - 1 : idx] + '%');
|
|
696
|
+
});
|
|
697
|
+
bodyRows.forEach((tr) => {
|
|
698
|
+
const tds = tr?.querySelectorAll('td');
|
|
699
|
+
tds?.forEach((td, idx) => {
|
|
700
|
+
if ((hasSelectableCell && idx === 0) ||
|
|
701
|
+
(hasRowMenuCell && idx === tds.length - 1)) {
|
|
702
|
+
this.renderer.setStyle(td, 'width', '55px');
|
|
703
|
+
}
|
|
704
|
+
else {
|
|
705
|
+
this.renderer.setStyle(td, 'width', percentages[hasSelectableCell ? idx - 1 : idx] + '%');
|
|
706
|
+
}
|
|
707
|
+
this.renderer.setStyle(td, 'opacity', '1');
|
|
708
|
+
this.renderer.setStyle(td, 'overflow', 'hidden');
|
|
709
|
+
if (this.bordered)
|
|
710
|
+
this.renderer.setStyle(td, 'border-left-color', 'var(--cps-color-line-mid)');
|
|
711
|
+
});
|
|
712
|
+
});
|
|
713
|
+
this._needRecalcAutoLayout = false;
|
|
714
|
+
});
|
|
715
|
+
}
|
|
716
|
+
_updateVirtualScrollItemSize() {
|
|
717
|
+
if (!this.virtualScroll || this.virtualScrollItemHeight)
|
|
718
|
+
return;
|
|
719
|
+
const trs = this.primengTreeTable?.el?.nativeElement
|
|
720
|
+
?.querySelector('.p-treetable-tbody')
|
|
721
|
+
?.querySelectorAll('tr');
|
|
722
|
+
if (!trs?.length)
|
|
723
|
+
return;
|
|
724
|
+
if (!trs[0]?.offsetHeight)
|
|
725
|
+
return;
|
|
726
|
+
let h = 0;
|
|
727
|
+
trs.forEach((tr, idx) => {
|
|
728
|
+
let rh = 0;
|
|
729
|
+
const tds = tr?.querySelectorAll('td');
|
|
730
|
+
tds?.forEach((td) => {
|
|
731
|
+
const wprev = td.style.width;
|
|
732
|
+
this.renderer.setStyle(td, 'display', 'block');
|
|
733
|
+
this.renderer.removeStyle(td, 'width');
|
|
734
|
+
if (td.offsetHeight)
|
|
735
|
+
rh = Math.max(rh, td.offsetHeight);
|
|
736
|
+
this.renderer.removeStyle(td, 'display');
|
|
737
|
+
this.renderer.setStyle(td, 'width', wprev);
|
|
738
|
+
});
|
|
739
|
+
if (rh) {
|
|
740
|
+
h = idx === 0 ? rh : Math.min(h, rh);
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
this.virtualScrollItemSize = h;
|
|
744
|
+
}
|
|
745
|
+
_setMinWidthOverall() {
|
|
746
|
+
if (this.minWidthForBodyOnly || !this.minWidth || !this.primengTreeTable)
|
|
747
|
+
return;
|
|
748
|
+
const treeTableMain = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable');
|
|
749
|
+
if (treeTableMain) {
|
|
750
|
+
this.renderer.setStyle(treeTableMain, 'overflow', 'auto');
|
|
751
|
+
const paginatorEl = treeTableMain.querySelector('.p-paginator');
|
|
752
|
+
if (paginatorEl)
|
|
753
|
+
this.renderer.setStyle(paginatorEl, 'min-width', this.minWidth);
|
|
754
|
+
const loadingOverlay = treeTableMain.querySelector('.p-treetable-loading-overlay');
|
|
755
|
+
if (loadingOverlay)
|
|
756
|
+
this.renderer.setStyle(loadingOverlay, 'min-width', this.minWidth);
|
|
757
|
+
}
|
|
758
|
+
const scrollableWrapper = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable-scrollable-wrapper');
|
|
759
|
+
if (scrollableWrapper)
|
|
760
|
+
this.renderer.setStyle(scrollableWrapper, 'min-width', this.minWidth);
|
|
761
|
+
if (!this.scrollable) {
|
|
762
|
+
const tableWrapper = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable-wrapper');
|
|
763
|
+
if (tableWrapper)
|
|
764
|
+
this.renderer.setStyle(tableWrapper, 'min-width', this.minWidth);
|
|
765
|
+
}
|
|
766
|
+
const treeTableHeader = this.primengTreeTable.el?.nativeElement?.querySelector('.p-treetable-header');
|
|
767
|
+
if (treeTableHeader)
|
|
768
|
+
this.renderer.setStyle(treeTableHeader, 'min-width', this.minWidth);
|
|
769
|
+
}
|
|
770
|
+
_onWindowResize() {
|
|
771
|
+
// if (this.defScrollHeight === 'flex')
|
|
772
|
+
// this.defScrollHeightPx = this.scrollableBody.clientHeight;
|
|
773
|
+
clearTimeout(this._windowResizeDebouncer);
|
|
774
|
+
this._windowResizeDebouncer = setTimeout(() => {
|
|
775
|
+
this._recalcVirtualHeight();
|
|
776
|
+
}, 100);
|
|
777
|
+
}
|
|
778
|
+
get styleClass() {
|
|
779
|
+
const classesList = [];
|
|
780
|
+
switch (this.size) {
|
|
781
|
+
case 'small':
|
|
782
|
+
classesList.push('p-treetable-sm');
|
|
783
|
+
break;
|
|
784
|
+
case 'large':
|
|
785
|
+
classesList.push('p-treetable-lg');
|
|
786
|
+
break;
|
|
787
|
+
}
|
|
788
|
+
if (this.hasToolbar) {
|
|
789
|
+
switch (this.toolbarSize) {
|
|
790
|
+
case 'small':
|
|
791
|
+
classesList.push('cps-tbar-small');
|
|
792
|
+
break;
|
|
793
|
+
case 'normal':
|
|
794
|
+
classesList.push('cps-tbar-normal');
|
|
795
|
+
break;
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
if (this.striped) {
|
|
799
|
+
classesList.push('p-treetable-striped');
|
|
800
|
+
}
|
|
801
|
+
if (this.bordered) {
|
|
802
|
+
classesList.push('p-treetable-gridlines');
|
|
803
|
+
}
|
|
804
|
+
return classesList.join(' ');
|
|
805
|
+
}
|
|
806
|
+
_recalcVirtualHeight() {
|
|
807
|
+
if (!this._scrollbarVisible && this.virtualScroll)
|
|
808
|
+
this.renderer.setStyle(this._scrollableBody, 'overflow', 'hidden', RendererStyleFlags2.Important);
|
|
809
|
+
setTimeout(() => {
|
|
810
|
+
if (this.virtualScroll && this.defScrollHeight) {
|
|
811
|
+
this._updateVirtualScrollItemSize();
|
|
812
|
+
// Todo: Add explicit type
|
|
813
|
+
const itemsLen = this.primengTreeTable.serializedValue.length;
|
|
814
|
+
if (itemsLen < 1) {
|
|
815
|
+
this.scrollHeight = this.emptyBodyHeight
|
|
816
|
+
? `calc(${this.emptyBodyHeight} + 1px)`
|
|
817
|
+
: this.virtualScrollItemSize + 1 + 'px';
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
const curHeight = this.virtualScrollItemSize * itemsLen + 2;
|
|
821
|
+
if (this.defScrollHeight === 'flex') {
|
|
822
|
+
if (curHeight >= this._defScrollHeightPxInitial) {
|
|
823
|
+
this.scrollHeight = 'flex';
|
|
824
|
+
this.renderer.setStyle(this._scrollableBody, 'height', '100%');
|
|
825
|
+
this.cdRef.markForCheck();
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
this.scrollHeight =
|
|
830
|
+
Math.min(this._defScrollHeightPx, curHeight) + 'px';
|
|
831
|
+
}
|
|
832
|
+
this.cdRef.markForCheck();
|
|
833
|
+
}
|
|
834
|
+
});
|
|
835
|
+
}
|
|
836
|
+
clearGlobalFilter() {
|
|
837
|
+
this.globalFilterComp?.clear();
|
|
838
|
+
}
|
|
839
|
+
// Todo: Use explicit type
|
|
840
|
+
onSortFunction(event) {
|
|
841
|
+
this.customSortFunction.emit(event);
|
|
842
|
+
}
|
|
843
|
+
onFilterGlobal(value) {
|
|
844
|
+
this.primengTreeTable.filterGlobal(value, 'contains');
|
|
845
|
+
}
|
|
846
|
+
onClickAdditionalBtnOnSelect() {
|
|
847
|
+
this.additionalBtnOnSelectClicked.emit(this.selectedRows);
|
|
848
|
+
}
|
|
849
|
+
onClickActionBtn() {
|
|
850
|
+
this.actionBtnClicked.emit();
|
|
851
|
+
}
|
|
852
|
+
onReloadData() {
|
|
853
|
+
if (this.dataReloadBtnDisabled)
|
|
854
|
+
return;
|
|
855
|
+
this.dataReloadBtnClicked.emit();
|
|
856
|
+
}
|
|
857
|
+
onColumnsToggle(event) {
|
|
858
|
+
if (this.columnsToggleBtnDisabled)
|
|
859
|
+
return;
|
|
860
|
+
this.colToggleMenu?.toggle(event);
|
|
861
|
+
}
|
|
862
|
+
removeSelected() {
|
|
863
|
+
this.rowsToRemove.emit(this.selectedRows);
|
|
864
|
+
}
|
|
865
|
+
clearSelection() {
|
|
866
|
+
this.selectedRows = [];
|
|
867
|
+
}
|
|
868
|
+
onEditRowClicked(node) {
|
|
869
|
+
this.editRowBtnClicked.emit(node);
|
|
870
|
+
}
|
|
871
|
+
onRemoveRowClicked(node) {
|
|
872
|
+
this.rowsToRemove.emit([node]);
|
|
873
|
+
}
|
|
874
|
+
toggleAllColumns() {
|
|
875
|
+
this.selectedColumns =
|
|
876
|
+
this.selectedColumns.length < this.columns.length ? this.columns : [];
|
|
877
|
+
this.columnsSelected.emit(this.selectedColumns);
|
|
878
|
+
setTimeout(() => {
|
|
879
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
880
|
+
});
|
|
881
|
+
}
|
|
882
|
+
isColumnSelected(col) {
|
|
883
|
+
return this.selectedColumns.some((item) => isEqual(item, col));
|
|
884
|
+
}
|
|
885
|
+
onRowsPerPageChanged() {
|
|
886
|
+
if (this.resetPageOnRowsChange) {
|
|
887
|
+
this.primengTreeTable.first = 0;
|
|
888
|
+
}
|
|
889
|
+
this.changePage(this.getPage());
|
|
890
|
+
}
|
|
891
|
+
getPageCount() {
|
|
892
|
+
return Math.ceil(this.primengTreeTable.totalRecords / this.rows);
|
|
893
|
+
}
|
|
894
|
+
getPage() {
|
|
895
|
+
return Math.floor(this.primengTreeTable.first / this.rows);
|
|
896
|
+
}
|
|
897
|
+
changePage(p) {
|
|
898
|
+
const pc = Math.ceil(this.getPageCount());
|
|
899
|
+
if (p >= 0 && p < pc) {
|
|
900
|
+
this.first = this.rows * p;
|
|
901
|
+
this.primengTreeTable.onPageChange({
|
|
902
|
+
first: this.first,
|
|
903
|
+
rows: this.rows
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
onPageChange(event) {
|
|
908
|
+
this.first = event.first;
|
|
909
|
+
this.rows = event.rows;
|
|
910
|
+
const state = {
|
|
911
|
+
page: this.getPage(),
|
|
912
|
+
first: this.first,
|
|
913
|
+
rows: this.rows,
|
|
914
|
+
pageCount: Math.ceil(this.getPageCount())
|
|
915
|
+
};
|
|
916
|
+
this.pageChanged.emit(state);
|
|
917
|
+
setTimeout(() => {
|
|
918
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
919
|
+
});
|
|
920
|
+
}
|
|
921
|
+
onLazyLoaded(event) {
|
|
922
|
+
this.lazyLoaded.emit(event);
|
|
923
|
+
}
|
|
924
|
+
onNodeExpanded(event) {
|
|
925
|
+
this.nodeExpanded.emit(event);
|
|
926
|
+
setTimeout(() => {
|
|
927
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
928
|
+
});
|
|
929
|
+
this._recalcVirtualHeight();
|
|
930
|
+
}
|
|
931
|
+
onNodeCollapsed(event) {
|
|
932
|
+
this.nodeCollapsed.emit(event);
|
|
933
|
+
setTimeout(() => {
|
|
934
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
935
|
+
});
|
|
936
|
+
this._recalcVirtualHeight();
|
|
937
|
+
}
|
|
938
|
+
onNodeSelected(event) {
|
|
939
|
+
this.nodeSelected.emit(event);
|
|
940
|
+
}
|
|
941
|
+
onNodeUnselected(event) {
|
|
942
|
+
this.nodeUnselected.emit(event);
|
|
943
|
+
}
|
|
944
|
+
onSort(event) {
|
|
945
|
+
this.sorted.emit(event);
|
|
946
|
+
setTimeout(() => {
|
|
947
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
948
|
+
});
|
|
949
|
+
}
|
|
950
|
+
onFilter(event) {
|
|
951
|
+
this.filtered.emit(event);
|
|
952
|
+
setTimeout(() => {
|
|
953
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
954
|
+
});
|
|
955
|
+
this._recalcVirtualHeight();
|
|
956
|
+
}
|
|
957
|
+
onSelectColumn(col) {
|
|
958
|
+
let res = [];
|
|
959
|
+
if (this.isColumnSelected(col)) {
|
|
960
|
+
res = this.selectedColumns.filter((v) => !isEqual(v, col));
|
|
961
|
+
}
|
|
962
|
+
else {
|
|
963
|
+
this.columns.forEach((o) => {
|
|
964
|
+
if (this.selectedColumns.some((v) => isEqual(v, o)) ||
|
|
965
|
+
isEqual(col, o)) {
|
|
966
|
+
res.push(o);
|
|
967
|
+
}
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
this.selectedColumns = res;
|
|
971
|
+
this.columnsSelected.emit(this.selectedColumns);
|
|
972
|
+
setTimeout(() => {
|
|
973
|
+
this._calcAutoLayoutHeaderWidths(true);
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
// Replace with explicit type
|
|
977
|
+
onSelectionChanged(selection) {
|
|
978
|
+
this.rowsSelected.emit(selection);
|
|
979
|
+
}
|
|
980
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CpsTreeTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
981
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: CpsTreeTableComponent, isStandalone: true, selector: "cps-tree-table", inputs: { columns: "columns", colHeaderName: "colHeaderName", colFieldName: "colFieldName", minWidth: "minWidth", minWidthForBodyOnly: "minWidthForBodyOnly", autoLayout: "autoLayout", striped: "striped", bordered: "bordered", size: "size", selectable: "selectable", rowHover: "rowHover", showRowMenu: "showRowMenu", showRowRemoveButton: "showRowRemoveButton", showRowEditButton: "showRowEditButton", loading: "loading", tableStyle: "tableStyle", tableStyleClass: "tableStyleClass", sortable: "sortable", sortMode: "sortMode", customSort: "customSort", hasToolbar: "hasToolbar", toolbarSize: "toolbarSize", toolbarTitle: "toolbarTitle", toolbarIcon: "toolbarIcon", toolbarIconColor: "toolbarIconColor", scrollable: "scrollable", scrollHeight: "scrollHeight", virtualScroll: "virtualScroll", virtualScrollItemHeight: "virtualScrollItemHeight", numToleratedItems: "numToleratedItems", paginator: "paginator", alwaysShowPaginator: "alwaysShowPaginator", rowsPerPageOptions: "rowsPerPageOptions", first: "first", rows: "rows", resetPageOnRowsChange: "resetPageOnRowsChange", resetPageOnSort: "resetPageOnSort", totalRecords: "totalRecords", emptyMessage: "emptyMessage", emptyBodyHeight: "emptyBodyHeight", lazy: "lazy", lazyLoadOnInit: "lazyLoadOnInit", showGlobalFilter: "showGlobalFilter", globalFilterPlaceholder: "globalFilterPlaceholder", globalFilterFields: "globalFilterFields", clearGlobalFilterOnLoading: "clearGlobalFilterOnLoading", showRemoveBtnOnSelect: "showRemoveBtnOnSelect", removeBtnOnSelectDisabled: "removeBtnOnSelectDisabled", showAdditionalBtnOnSelect: "showAdditionalBtnOnSelect", additionalBtnOnSelectTitle: "additionalBtnOnSelectTitle", additionalBtnOnSelectDisabled: "additionalBtnOnSelectDisabled", showActionBtn: "showActionBtn", actionBtnTitle: "actionBtnTitle", actionBtnDisabled: "actionBtnDisabled", showDataReloadBtn: "showDataReloadBtn", dataReloadBtnDisabled: "dataReloadBtnDisabled", showColumnsToggleBtn: "showColumnsToggleBtn", columnsToggleBtnDisabled: "columnsToggleBtnDisabled", initialColumns: "initialColumns", data: "data" }, outputs: { rowsSelected: "rowsSelected", actionBtnClicked: "actionBtnClicked", additionalBtnOnSelectClicked: "additionalBtnOnSelectClicked", editRowBtnClicked: "editRowBtnClicked", rowsToRemove: "rowsToRemove", pageChanged: "pageChanged", sorted: "sorted", filtered: "filtered", columnsSelected: "columnsSelected", lazyLoaded: "lazyLoaded", dataReloadBtnClicked: "dataReloadBtnClicked", nodeExpanded: "nodeExpanded", nodeCollapsed: "nodeCollapsed", nodeSelected: "nodeSelected", nodeUnselected: "nodeUnselected", customSortFunction: "customSortFunction" }, providers: [
|
|
982
|
+
TreeTableService,
|
|
983
|
+
{
|
|
984
|
+
provide: TreeTable,
|
|
985
|
+
useFactory: treeTableFactory,
|
|
986
|
+
// eslint-disable-next-line no-use-before-define
|
|
987
|
+
deps: [CpsTreeTableComponent]
|
|
988
|
+
}
|
|
989
|
+
], queries: [{ propertyName: "toolbarTemplate", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "nestedHeaderTemplate", first: true, predicate: ["nestedHeader"], descendants: true }, { propertyName: "bodyTemplate", first: true, predicate: ["body"], descendants: true }], viewQueries: [{ propertyName: "primengTreeTable", first: true, predicate: ["primengTreeTable"], descendants: true, static: true }, { propertyName: "globalFilterComp", first: true, predicate: ["globalFilterComp"], descendants: true }, { propertyName: "colToggleMenu", first: true, predicate: ["colToggleMenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<p-treeTable\n #primengTreeTable\n ttWithUnsort\n [ngClass]=\"{\n 'cps-treetable-loading': loading,\n 'cps-treetable-flex': defScrollHeight === 'flex',\n 'cps-treetable-nonvirtual': !virtualScroll,\n 'cps-treetable-autolayout-calced': autoLayout && scrollable,\n }\"\n [value]=\"data\"\n [autoLayout]=\"autoLayout && !scrollable\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [virtualScroll]=\"virtualScroll\"\n [virtualScrollItemSize]=\"virtualScrollItemSize\"\n [virtualScrollOptions]=\"{\n numToleratedItems: numToleratedItems,\n autoSize: false\n }\"\n [columns]=\"selectedColumns\"\n [loading]=\"loading\"\n [rowHover]=\"rowHover\"\n [lazy]=\"lazy\"\n [(selection)]=\"selectedRows\"\n (selectionChange)=\"onSelectionChanged($event)\"\n compareSelectionBy=\"deepEquals\"\n [lazyLoadOnInit]=\"lazyLoadOnInit\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [tableStyleClass]=\"tableStyleClass\"\n [customSort]=\"customSort\"\n [sortMode]=\"sortMode\"\n [globalFilterFields]=\"globalFilterFields\"\n [paginator]=\"paginator\"\n [showCurrentPageReport]=\"true\"\n [alwaysShowPaginator]=\"alwaysShowPaginator\"\n [rows]=\"rows\"\n [first]=\"first\"\n [totalRecords]=\"totalRecords\"\n [resetPageOnSort]=\"resetPageOnSort\"\n currentPageReportTemplate=\"{first} - {last} of {totalRecords}\"\n (onPage)=\"onPageChange($event)\"\n (onSort)=\"onSort($event)\"\n (onFilter)=\"onFilter($event)\"\n (onLazyLoad)=\"onLazyLoaded($event)\"\n (sortFunction)=\"onSortFunction($event)\"\n (onNodeExpand)=\"onNodeExpanded($event)\"\n (onNodeCollapse)=\"onNodeCollapsed($event)\"\n (onNodeSelect)=\"onNodeSelected($event)\"\n (onNodeUnselect)=\"onNodeUnselected($event)\">\n <ng-template pTemplate=\"caption\" *ngIf=\"hasToolbar\">\n <ng-container *ngIf=\"toolbarTemplate\">\n <ng-container *ngTemplateOutlet=\"toolbarTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!toolbarTemplate\">\n <div class=\"cps-treetable-tbar-left\">\n <div *ngIf=\"toolbarIcon\" class=\"cps-treetable-tbar-icon\">\n <cps-icon [icon]=\"toolbarIcon\" [color]=\"toolbarIconColor\"></cps-icon>\n </div>\n <div class=\"cps-treetable-tbar-title\">{{ toolbarTitle }}</div>\n <div *ngIf=\"showGlobalFilter\" class=\"cps-treetable-tbar-global-filter\">\n <cps-input\n #globalFilterComp\n prefixIcon=\"search\"\n [placeholder]=\"globalFilterPlaceholder\"\n (valueChanged)=\"onFilterGlobal($event)\"\n [clearable]=\"true\"\n [disabled]=\"loading\"\n [appearance]=\"toolbarSize === 'small' ? 'underlined' : 'outlined'\"\n [hideDetails]=\"true\">\n </cps-input>\n </div>\n </div>\n <div class=\"cps-treetable-tbar-right\">\n <div\n *ngIf=\"showRemoveBtnOnSelect && selectedRows.length > 0\"\n class=\"cps-treetable-tbar-btn-on-select\">\n <cps-button\n label=\"Remove\"\n [disabled]=\"removeBtnOnSelectDisabled\"\n color=\"prepared\"\n type=\"borderless\"\n icon=\"remove\"\n [size]=\"toolbarSize\"\n (clicked)=\"removeSelected()\">\n </cps-button>\n </div>\n <div\n *ngIf=\"showAdditionalBtnOnSelect && selectedRows.length > 0\"\n class=\"cps-treetable-tbar-btn-on-select\">\n <cps-button\n [label]=\"additionalBtnOnSelectTitle\"\n [disabled]=\"additionalBtnOnSelectDisabled\"\n color=\"prepared\"\n type=\"borderless\"\n [size]=\"toolbarSize\"\n (clicked)=\"onClickAdditionalBtnOnSelect()\">\n </cps-button>\n </div>\n <div *ngIf=\"showActionBtn\" class=\"cps-treetable-tbar-action-btn\">\n <cps-button\n [label]=\"actionBtnTitle\"\n [disabled]=\"actionBtnDisabled\"\n color=\"prepared\"\n type=\"outlined\"\n [size]=\"toolbarSize\"\n (clicked)=\"onClickActionBtn()\">\n </cps-button>\n </div>\n <div\n *ngIf=\"showColumnsToggleBtn && columns.length > 0\"\n class=\"cps-treetable-tbar-coltoggle-btn\"\n [ngClass]=\"{ 'btn-disabled': columnsToggleBtnDisabled }\">\n <cps-icon\n icon=\"columns\"\n size=\"normal\"\n [color]=\"\n columnsToggleBtnDisabled ? 'text-lightest' : 'prepared-lighten1'\n \"\n (click)=\"onColumnsToggle($event)\"></cps-icon>\n <cps-menu #colToggleMenu [withArrow]=\"false\">\n <div class=\"cps-treetable-coltoggle-menu\">\n <div\n class=\"cps-treetable-coltoggle-menu-item select-all-option\"\n [class.allselected]=\"selectedColumns.length === columns.length\"\n (click)=\"toggleAllColumns()\">\n <span class=\"cps-treetable-coltoggle-menu-item-left\">\n <span class=\"cps-treetable-coltoggle-menu-item-check\"> </span>\n <span class=\"cps-treetable-coltoggle-menu-item-label\"\n >Show all columns</span\n >\n </span>\n </div>\n <div\n *ngFor=\"let col of columns\"\n class=\"cps-treetable-coltoggle-menu-item\"\n (click)=\"onSelectColumn(col)\"\n [class.selected]=\"isColumnSelected(col)\">\n <span class=\"cps-treetable-coltoggle-menu-item-left\">\n <span class=\"cps-treetable-coltoggle-menu-item-check\"></span>\n <span class=\"cps-treetable-coltoggle-menu-item-label\">{{\n col[colHeaderName]\n }}</span>\n </span>\n </div>\n </div>\n </cps-menu>\n </div>\n <div\n *ngIf=\"showDataReloadBtn\"\n class=\"cps-treetable-tbar-reload-btn\"\n [ngClass]=\"{ 'btn-disabled': dataReloadBtnDisabled }\">\n <cps-icon\n icon=\"refresh\"\n size=\"18\"\n [color]=\"dataReloadBtnDisabled ? 'text-light' : 'prepared-lighten1'\"\n (click)=\"onReloadData()\">\n </cps-icon>\n </div>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\" *ngIf=\"nestedHeaderTemplate\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"\n nestedHeaderTemplate;\n context: {\n $implicit: columns,\n }\n \"></ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\" *ngIf=\"!nestedHeaderTemplate\" let-columns>\n <tr>\n <!-- <th style=\"width: 3rem\" *ngIf=\"reorderableRows\"></th> -->\n <th *ngIf=\"selectable\" cpsTTHdrSelectable></th>\n <ng-container *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n headerTemplate;\n context: {\n $implicit: columns,\n }\n \"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!headerTemplate && columns.length > 0\">\n <ng-container *ngIf=\"sortable\">\n <th\n *ngFor=\"let col of columns\"\n [cpsTTColSortable]=\"col[colFieldName]\">\n {{ col[colHeaderName] }}\n </th>\n </ng-container>\n <ng-container *ngIf=\"!sortable\">\n <th *ngFor=\"let col of columns\">\n {{ col[colHeaderName] }}\n </th>\n </ng-container>\n </ng-container>\n <th\n class=\"cps-treetable-row-menu-cell\"\n *ngIf=\"showRowMenu && (showRowRemoveButton || showRowEditButton)\"></th>\n </tr>\n </ng-template>\n\n <ng-template\n pTemplate=\"body\"\n let-rowData=\"rowData\"\n let-columns=\"columns\"\n let-rowNode\n let-rowIndex=\"rowIndex\">\n <tr\n [ttRow]=\"rowNode\"\n [ngClass]=\"{\n 'cps-treetable-row-selected':\n selectable && primengTreeTable.isSelected(rowNode.node)\n }\">\n <!-- <td *ngIf=\"reorderableRows\" class=\"cps-table-row-drag-handle-cell\">\n <span class=\"cps-table-row-drag-handle\" pReorderableRowHandle>\u2630</span>\n </td> -->\n <td [cpsTTRowSelectable]=\"rowNode\" *ngIf=\"selectable\"></td>\n <ng-container *ngIf=\"bodyTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n bodyTemplate;\n context: {\n $implicit: rowNode,\n rowIndex: rowIndex,\n columns: columns,\n rowData: rowData\n }\n \">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!bodyTemplate\">\n <ng-container *ngIf=\"columns.length > 0\">\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <td *ngIf=\"i === 0\" [cpsTTRowToggler]=\"rowNode\">\n {{ rowData[col[colFieldName]] }}\n </td>\n <td *ngIf=\"i > 0\">{{ rowData[col[colFieldName]] }}</td>\n </ng-container>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"showRowMenu && (showRowRemoveButton || showRowEditButton)\"\n class=\"cps-treetable-row-menu-cell\">\n <table-row-menu\n (editRowBtnClicked)=\"onEditRowClicked(rowNode.node)\"\n (removeRowBtnClicked)=\"onRemoveRowClicked(rowNode.node)\"\n [showRowRemoveButton]=\"showRowRemoveButton\"\n [showRowEditButton]=\"showRowEditButton\">\n </table-row-menu>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td\n colspan=\"100\"\n class=\"cps-treetable-empty-message-td\"\n [ngStyle]=\"{ height: emptyBodyHeight }\">\n {{ emptyMessage }}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <cps-loader [fullScreen]=\"false\" opacity=\"0\"></cps-loader>\n </ng-template>\n <ng-template pTemplate=\"paginatorleft\">\n <div class=\"cps-table-paginator-itms-per-page\">\n <span class=\"cps-table-paginator-items-per-page-title\"\n >Rows per page:\n </span>\n <cps-select\n [options]=\"rowOptions\"\n [hideDetails]=\"true\"\n [(ngModel)]=\"rows\"\n (valueChanged)=\"onRowsPerPageChanged()\"\n [returnObject]=\"false\"\n optionsClass=\"cps-paginator-page-options\">\n </cps-select>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"paginatorfirstpagelinkicon\">\n <AngleDoubleLeftIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatorpreviouspagelinkicon\">\n <AngleLeftIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatornextpagelinkicon\">\n <AngleRightIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatorlastpagelinkicon\">\n <AngleDoubleRightIcon />\n </ng-template>\n</p-treeTable>\n", styles: [":host ::ng-deep .p-treetable{position:relative}:host ::ng-deep .p-component,:host ::ng-deep .p-component *{box-sizing:border-box}:host ::ng-deep .p-component{font-family:Source Sans Pro,sans-serif;font-size:14px;font-weight:400}:host ::ng-deep .p-treetable-scrollable-wrapper{position:relative;background:#fff}:host ::ng-deep .p-treetable-wrapper{background:#fff}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable.cps-tbar-normal .p-treetable-scrollable-wrapper{height:calc(100% - 72px)}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable.cps-tbar-small .p-treetable-scrollable-wrapper{height:calc(100% - 43px)}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable .p-treetable-scrollable-wrapper .p-treetable-scrollable-view .p-treetable-scrollable-header{display:contents}:host ::ng-deep .p-treetable .p-treetable-scrollable-header,:host ::ng-deep .p-treetable .p-treetable-scrollable-footer{background:#fff}:host ::ng-deep .p-treetable-scrollable-header,:host ::ng-deep .p-treetable-scrollable-footer{overflow:hidden}:host ::ng-deep .p-treetable table{border-collapse:collapse;width:100%;table-layout:fixed}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th{text-align:left;padding:1rem;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 1px;font-weight:400;color:var(--cps-color-text-mild);background:#fff;transition:box-shadow .2s;overflow:hidden}:host ::ng-deep .p-treetable-scrollable-body{overflow:auto!important;position:relative}:host ::ng-deep .cps-treetable-flex .p-treetable-scrollable-body{height:100%}:host ::ng-deep .p-treetable .p-treetable-tbody{background:#fff}:host ::ng-deep .p-treetable .p-treetable-tbody>tr{background:#fff;color:var(--cps-color-text-dark);transition:box-shadow .2s}:host ::ng-deep .p-treetable .p-treetable-tbody>tr.cps-treetable-row-selected{background-color:var(--cps-color-highlight-active)!important}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td{text-align:left;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;padding:1rem}:host ::ng-deep p-treetable:not(.cps-treetable-autolayout-calced) .p-treetable .p-treetable-tbody>tr>td{overflow:hidden}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable .p-treetable-scrollable-body .p-treetable-tbody>tr>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){opacity:0;border-left-color:#fff}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable.p-treetable-striped .p-treetable-scrollable-body .p-treetable-tbody>tr:nth-child(odd)>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){border-left-color:var(--cps-color-bg-light)}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable .p-treetable-scrollable-body .p-treetable-tbody>tr:hover>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){border-left-color:var(--cps-color-highlight-hover)}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:first-child{border-width:0 0 1px 1px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:last-child{border-width:0 1px 1px 0}:host ::ng-deep .p-treetable-auto-layout table{table-layout:auto}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:1rem;height:1rem;color:var(--cps-color-text-dark);border:0 none;background:transparent;border-radius:50%;margin-right:.5rem}:host ::ng-deep .p-treetable-toggler{cursor:pointer;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;overflow:hidden;position:relative}:host ::ng-deep .p-ripple{overflow:hidden;position:relative}:host ::ng-deep .p-link:focus{outline:0 none;outline-offset:0;box-shadow:unset}:host ::ng-deep .p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:14px;font-family:Source Sans Pro,sans-serif;border-radius:6px}:host ::ng-deep input[type=button],:host ::ng-deep input[type=submit],:host ::ng-deep input[type=reset],:host ::ng-deep input[type=file]::-webkit-file-upload-button,:host ::ng-deep button{border-radius:0}:host ::ng-deep .p-treetable .p-treetable-tbody>tr:focus{outline:0 none;outline-offset:-.15rem}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:enabled:hover{color:var(--cps-color-calm);border-color:transparent;background:unset}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:focus{outline:0 none;outline-offset:0;box-shadow:unset}:host ::ng-deep .p-treetable .p-paginator{border-width:0 1px 1px 1px;border-radius:0}:host ::ng-deep .p-paginator{background:#fff;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;color:var(--cps-color-text-dark);padding:1rem;border:1px solid var(--cps-color-line-mid)}:host ::ng-deep .p-paginator-left-content{margin-right:auto}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page{display:inline-flex;align-items:center}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-table-paginator-items-per-page-title{font-family:Source Sans Pro,sans-serif;font-size:14px;margin-right:12px;cursor:default}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box{min-height:32px!important;background:transparent!important}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box .cps-select-box-items{font-size:14px!important}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box .cps-select-box-chevron .cps-icon{width:14px;height:14px}:host ::ng-deep .p-paginator .p-paginator-current{background-color:transparent;border:0 none;color:var(--cps-color-text-dark);min-width:3rem;margin:.143rem;padding:0 .5rem;font-family:Source Sans Pro,sans-serif;font-size:14px;height:unset}:host ::ng-deep .p-paginator-page,:host ::ng-deep .p-paginator-next,:host ::ng-deep .p-paginator-last,:host ::ng-deep .p-paginator-first,:host ::ng-deep .p-paginator-prev,:host ::ng-deep .p-paginator-current{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1;-webkit-user-select:none;user-select:none;overflow:hidden;position:relative}:host ::ng-deep .p-paginator-current{cursor:default}:host ::ng-deep .p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):hover{background:var(--cps-color-highlight-hover);border-color:unset}:host ::ng-deep .p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):active{background:var(--cps-color-highlight-active)}:host ::ng-deep .p-paginator .p-paginator-first,:host ::ng-deep .p-paginator .p-paginator-prev,:host ::ng-deep .p-paginator .p-paginator-next,:host ::ng-deep .p-paginator .p-paginator-last{background-color:transparent;border:1px solid var(--cps-color-text-dark);border-radius:4px;color:var(--cps-color-text-dark);min-width:32px;height:32px;margin:.143rem;transition:box-shadow .2s}:host ::ng-deep .p-disabled,:host ::ng-deep .p-disabled *{cursor:default!important;pointer-events:none}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page.p-highlight{background:var(--cps-color-calm);border-color:var(--cps-color-calm);color:#fff}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):hover{background:var(--cps-color-highlight-hover);border-color:unset}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):active{background:var(--cps-color-highlight-active)}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page{background-color:transparent;border:1px solid var(--cps-color-text-dark);border-radius:4px;color:var(--cps-color-text-dark);min-width:32px;height:32px;margin:.143rem;transition:box-shadow .2s}:host ::ng-deep .p-paginator-element:focus{z-index:1;position:relative}:host ::ng-deep span.p-paginator-icon{display:contents}:host ::ng-deep .p-disabled,:host ::ng-deep .p-component:disabled{opacity:.4}:host ::ng-deep .cps-treetable-empty-message-td{text-align:center!important;font-weight:600;background:#fff}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-header{border-width:1px 1px 0 1px}:host ::ng-deep .p-treetable .p-treetable-header{font-weight:600;display:flex;justify-content:space-between;align-items:center;padding:0 10px;border:unset;background:unset;border-top:1px solid var(--cps-color-line-mid);border-right:1px solid var(--cps-color-line-mid);border-left:4px solid var(--cps-color-surprise)!important;border-radius:4px 4px 0 0;font-size:16px;line-height:150%;background-color:#fff;color:var(--cps-color-text-darkest);overflow:auto}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left{display:flex;align-items:center}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-global-filter{margin-left:12px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-icon{display:flex;margin-right:8px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-title{cursor:default}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right{display:flex;align-items:center}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-btn-on-select{margin-right:4px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-action-btn{margin-right:4px;margin-left:8px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn{display:contents}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn cps-icon{margin-left:12px;margin-right:4px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn:not(.btn-disabled) cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn:not(.btn-disabled) cps-icon{cursor:pointer}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn:not(.btn-disabled) cps-icon:hover .cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn:not(.btn-disabled) cps-icon:hover .cps-icon{color:var(--cps-color-prepared)!important}:host ::ng-deep .cps-tbar-small.p-treetable .p-treetable-header{height:43px}:host ::ng-deep .cps-tbar-normal.p-treetable .p-treetable-header{height:72px}:host ::ng-deep .p-treetable .p-treetable-footer{background:#fff;color:#343a40;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;padding:1rem;font-weight:700}:host ::ng-deep .p-treetable .p-treetable-tfoot>tr>td{text-align:left;padding:1rem;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;font-weight:700;color:#343a40;background:#fff}:host ::ng-deep .p-treetable .p-sortable-column:not(.p-highlight):hover .cps-sortable-column-icon.sort-unsorted .sort-unsorted-arrow-up{border-bottom-color:var(--cps-color-text-mild)}:host ::ng-deep .p-treetable .p-sortable-column:not(.p-highlight):hover .cps-sortable-column-icon.sort-unsorted .sort-unsorted-arrow-down{border-top-color:var(--cps-color-text-mild)}:host ::ng-deep .p-icon-wrapper{display:inline-flex}:host ::ng-deep .p-icon{display:inline-block;width:1rem;height:1rem}:host ::ng-deep .p-treetable .p-sortable-column .cps-sortable-column-badge{display:inline-flex;align-items:center;justify-content:center;font-size:12px;vertical-align:top;color:var(--cps-color-calm);margin-left:.25rem}:host ::ng-deep .p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none}:host ::ng-deep .p-treetable .p-sortable-column{cursor:pointer;-webkit-user-select:none;user-select:none}:host ::ng-deep .p-treetable .p-sortable-column:focus{box-shadow:none;outline:0 none}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler.p-icon{width:2rem;height:2rem}:host ::ng-deep .p-treetable .p-treetable-tbody>tr.p-highlight{background:#eff6ff;color:#1d4ed8}:host ::ng-deep .p-treetable.p-treetable-hoverable-rows .p-treetable-tbody>tr:not(.p-highlight):hover{background:var(--cps-color-highlight-hover)}:host ::ng-deep .p-treetable-hoverable-rows .p-treetable-tbody>tr{cursor:auto}:host ::ng-deep .p-treetable .p-column-resizer-helper{background:#3b82f6}:host ::ng-deep .p-treetable .p-treetable-loading-overlay{position:absolute;display:flex;align-items:center;justify-content:center;z-index:1001;top:0;left:0;width:100%;height:100%;background-color:#fff;transition-duration:.2s;border:1px solid var(--cps-color-line-mid)}:host ::ng-deep .p-treetable.cps-tbar-small .p-treetable-loading-overlay{top:43px;height:calc(100% - 43px)}:host ::ng-deep .p-treetable.cps-tbar-normal .p-treetable-loading-overlay{top:72px;height:calc(100% - 72px)}:host ::ng-deep .cps-treetable-loading .p-treetable{min-height:200px}:host ::ng-deep .cps-treetable-loading .p-treetable.cps-tbar-normal{min-height:272px}:host ::ng-deep .cps-treetable-loading .p-treetable.cps-tbar-small{min-height:243px}:host ::ng-deep .cps-table-col-filter-menu-open .cps-table-col-filter-menu-button{color:var(--cps-color-text-dark)}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-footer{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-top{border-width:0 1px 0 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-bottom{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th{border-width:1px 0 1px 1px}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th:last-child{border-width:1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td{border-width:0 0 1px 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tfoot>tr>td{border-width:1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td:last-child{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:only-child{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-thead>tr>th{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-tbody>tr>td{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-tfoot>tr>td{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-footer{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-thead>tr>th{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-tbody>tr>td{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-tfoot>tr>td{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-footer{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-striped .p-treetable-tbody>tr:nth-child(odd){background:var(--cps-color-bg-light)}:host ::ng-deep .p-treetable.p-treetable-striped .p-treetable-tbody>tr:nth-child(2n){background:#fff}:host ::ng-deep .cps-treetable-row-menu-cell{width:55px;border-left:none!important}:host ::ng-deep .cps-treetable-selectable-cell{width:55px;text-align:center!important}:host ::ng-deep .p-checkbox{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;vertical-align:bottom;position:relative;width:18px;height:18px}:host ::ng-deep .p-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}:host ::ng-deep .p-hidden-accessible input,:host ::ng-deep .p-hidden-accessible select{transform:scale(0)}:host ::ng-deep .p-checkbox .p-checkbox-box{background:#fff;width:18px;height:18px;color:var(--cps-color-text-dark);border:2px solid var(--cps-color-text-mild);border-radius:2px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}:host ::ng-deep .p-checkbox-box{display:flex;justify-content:center;align-items:center}:host ::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:var(--cps-color-calm);background:var(--cps-color-calm)}:host ::ng-deep .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box.p-highlight:hover{border-color:var(--cps-color-calm);background:var(--cps-color-calm);color:#fff}:host ::ng-deep .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover{border-color:var(--cps-color-calm)}:host ::ng-deep .p-checkbox .p-checkbox-box .p-icon{width:14px;height:14px}:host ::ng-deep .p-checkbox .p-checkbox-box .p-checkbox-icon{transition-duration:.2s;color:#fff;font-size:14px}:host ::ng-deep .p-checkbox .p-checkbox-box minusicon .p-checkbox-icon{color:var(--cps-color-calm);width:12px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td p-treetablecheckbox .p-checkbox{margin-right:0}::ng-deep .p-scrollbar-measure{width:100px;height:100px;overflow:scroll;position:absolute;top:-9999px}.cps-treetable-coltoggle-menu{display:block;max-height:242px;overflow-x:hidden;background:#fff}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item{padding:12px;justify-content:space-between;display:flex;cursor:pointer}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item:hover{background:var(--cps-color-highlight-hover)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-label{color:var(--cps-color-text-dark)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-left{display:flex;align-items:center;margin-right:8px}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-check{background-color:transparent;border:0;width:16px;height:16px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1);margin-right:8px;opacity:0}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-check:after{color:var(--cps-color-calm);top:4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box;position:absolute;content:\"\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected{font-weight:600}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected .cps-treetable-coltoggle-menu-item-label,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected .cps-treetable-coltoggle-menu-item-label{color:var(--cps-color-calm)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected .cps-treetable-coltoggle-menu-item-check,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected .cps-treetable-coltoggle-menu-item-check{opacity:1}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected{background:var(--cps-color-highlight-selected)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.highlighten{background:var(--cps-color-highlight-active)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected.highlighten{background:var(--cps-color-highlight-selected-dark)}.cps-treetable-coltoggle-menu .select-all-option{border-bottom:1px solid lightgrey;font-weight:600}::ng-deep .cps-select-options-menu.cps-paginator-page-options .cps-select-options-option{font-size:14px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TreeTableModule }, { kind: "component", type: i3.TreeTable, selector: "p-treeTable", inputs: ["columns", "style", "styleClass", "tableStyle", "tableStyleClass", "autoLayout", "lazy", "lazyLoadOnInit", "paginator", "rows", "first", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "customSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "compareSelectionBy", "rowHover", "loading", "loadingIcon", "showLoader", "scrollable", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "frozenColumns", "resizableColumns", "columnResizeMode", "reorderableColumns", "contextMenu", "rowTrackBy", "filters", "globalFilterFields", "filterDelay", "filterMode", "filterLocale", "paginatorLocale", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "value", "virtualRowHeight"], outputs: ["selectionChange", "contextMenuSelectionChange", "onFilter", "onNodeExpand", "onNodeCollapse", "onPage", "onSort", "onLazyLoad", "sortFunction", "onColResize", "onColReorder", "onNodeSelect", "onNodeUnselect", "onContextMenuSelect", "onHeaderCheckboxToggle", "onEditInit", "onEditComplete", "onEditCancel"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.TTRow, selector: "[ttRow]", inputs: ["ttRow"] }, { kind: "component", type: CpsInputComponent, selector: "cps-input", inputs: ["label", "hint", "placeholder", "disabled", "readonly", "width", "type", "loading", "clearable", "prefixIcon", "prefixIconClickable", "prefixIconSize", "prefixText", "hideDetails", "persistentClear", "error", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "valueToDisplay", "value"], outputs: ["valueChanged", "focused", "prefixIconClicked", "blurred", "cleared", "enterClicked"] }, { kind: "component", type: CpsButtonComponent, selector: "cps-button", inputs: ["color", "contentColor", "type", "label", "icon", "iconPosition", "size", "width", "height", "disabled", "loading"], outputs: ["clicked"] }, { kind: "component", type: CpsMenuComponent, selector: "cps-menu", inputs: ["header", "items", "withArrow", "compressed", "focusOnShow", "persistent", "containerClass", "showTransitionOptions", "hideTransitionOptions"], outputs: ["menuShown", "menuHidden", "beforeMenuHidden", "contentClicked"] }, { kind: "component", type: CpsIconComponent, selector: "cps-icon", inputs: ["icon", "size", "color"] }, { kind: "component", type: CpsSelectComponent, selector: "cps-select", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "chips", "closableChips", "clearable", "openOnClear", "options", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "virtualScroll", "numToleratedItems", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "optionsClass", "appearance", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsLoaderComponent, selector: "cps-loader", inputs: ["fullScreen", "opacity", "labelColor", "showLabel"] }, { kind: "component", type: AngleDoubleLeftIcon, selector: "AngleDoubleLeftIcon" }, { kind: "component", type: AngleLeftIcon, selector: "AngleLeftIcon" }, { kind: "component", type: AngleRightIcon, selector: "AngleRightIcon" }, { kind: "component", type: AngleDoubleRightIcon, selector: "AngleDoubleRightIcon" }, { kind: "directive", type: CpsTreeTableColumnSortableDirective, selector: "[cpsTTColSortable]", inputs: ["cpsTTColSortable"] }, { kind: "directive", type: CpsTreeTableHeaderSelectableDirective, selector: "[cpsTTHdrSelectable]" }, { kind: "directive", type: CpsTreeTableRowSelectableDirective, selector: "[cpsTTRowSelectable]", inputs: ["cpsTTRowSelectable"] }, { kind: "directive", type: CpsTreetableRowTogglerDirective, selector: "[cpsTTRowToggler]", inputs: ["cpsTTRowToggler"] }, { kind: "directive", type: TreeTableUnsortDirective, selector: "[ttWithUnsort]" }, { kind: "component", type: TableRowMenuComponent, selector: "table-row-menu", inputs: ["showRowRemoveButton", "showRowEditButton"], outputs: ["editRowBtnClicked", "removeRowBtnClicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
990
|
+
}
|
|
991
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CpsTreeTableComponent, decorators: [{
|
|
992
|
+
type: Component,
|
|
993
|
+
args: [{ selector: 'cps-tree-table', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
994
|
+
FormsModule,
|
|
995
|
+
CommonModule,
|
|
996
|
+
TreeTableModule,
|
|
997
|
+
CpsInputComponent,
|
|
998
|
+
CpsButtonComponent,
|
|
999
|
+
CpsMenuComponent,
|
|
1000
|
+
CpsIconComponent,
|
|
1001
|
+
CpsSelectComponent,
|
|
1002
|
+
CpsLoaderComponent,
|
|
1003
|
+
AngleDoubleLeftIcon,
|
|
1004
|
+
AngleLeftIcon,
|
|
1005
|
+
AngleRightIcon,
|
|
1006
|
+
AngleDoubleRightIcon,
|
|
1007
|
+
CpsTreeTableColumnSortableDirective,
|
|
1008
|
+
CpsTreeTableHeaderSelectableDirective,
|
|
1009
|
+
CpsTreeTableRowSelectableDirective,
|
|
1010
|
+
CpsTreetableRowTogglerDirective,
|
|
1011
|
+
TreeTableUnsortDirective,
|
|
1012
|
+
TableRowMenuComponent
|
|
1013
|
+
], providers: [
|
|
1014
|
+
TreeTableService,
|
|
1015
|
+
{
|
|
1016
|
+
provide: TreeTable,
|
|
1017
|
+
useFactory: treeTableFactory,
|
|
1018
|
+
// eslint-disable-next-line no-use-before-define
|
|
1019
|
+
deps: [CpsTreeTableComponent]
|
|
1020
|
+
}
|
|
1021
|
+
], template: "<p-treeTable\n #primengTreeTable\n ttWithUnsort\n [ngClass]=\"{\n 'cps-treetable-loading': loading,\n 'cps-treetable-flex': defScrollHeight === 'flex',\n 'cps-treetable-nonvirtual': !virtualScroll,\n 'cps-treetable-autolayout-calced': autoLayout && scrollable,\n }\"\n [value]=\"data\"\n [autoLayout]=\"autoLayout && !scrollable\"\n [scrollable]=\"scrollable\"\n [scrollHeight]=\"scrollHeight\"\n [virtualScroll]=\"virtualScroll\"\n [virtualScrollItemSize]=\"virtualScrollItemSize\"\n [virtualScrollOptions]=\"{\n numToleratedItems: numToleratedItems,\n autoSize: false\n }\"\n [columns]=\"selectedColumns\"\n [loading]=\"loading\"\n [rowHover]=\"rowHover\"\n [lazy]=\"lazy\"\n [(selection)]=\"selectedRows\"\n (selectionChange)=\"onSelectionChanged($event)\"\n compareSelectionBy=\"deepEquals\"\n [lazyLoadOnInit]=\"lazyLoadOnInit\"\n [styleClass]=\"styleClass\"\n [tableStyle]=\"tableStyle\"\n [tableStyleClass]=\"tableStyleClass\"\n [customSort]=\"customSort\"\n [sortMode]=\"sortMode\"\n [globalFilterFields]=\"globalFilterFields\"\n [paginator]=\"paginator\"\n [showCurrentPageReport]=\"true\"\n [alwaysShowPaginator]=\"alwaysShowPaginator\"\n [rows]=\"rows\"\n [first]=\"first\"\n [totalRecords]=\"totalRecords\"\n [resetPageOnSort]=\"resetPageOnSort\"\n currentPageReportTemplate=\"{first} - {last} of {totalRecords}\"\n (onPage)=\"onPageChange($event)\"\n (onSort)=\"onSort($event)\"\n (onFilter)=\"onFilter($event)\"\n (onLazyLoad)=\"onLazyLoaded($event)\"\n (sortFunction)=\"onSortFunction($event)\"\n (onNodeExpand)=\"onNodeExpanded($event)\"\n (onNodeCollapse)=\"onNodeCollapsed($event)\"\n (onNodeSelect)=\"onNodeSelected($event)\"\n (onNodeUnselect)=\"onNodeUnselected($event)\">\n <ng-template pTemplate=\"caption\" *ngIf=\"hasToolbar\">\n <ng-container *ngIf=\"toolbarTemplate\">\n <ng-container *ngTemplateOutlet=\"toolbarTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!toolbarTemplate\">\n <div class=\"cps-treetable-tbar-left\">\n <div *ngIf=\"toolbarIcon\" class=\"cps-treetable-tbar-icon\">\n <cps-icon [icon]=\"toolbarIcon\" [color]=\"toolbarIconColor\"></cps-icon>\n </div>\n <div class=\"cps-treetable-tbar-title\">{{ toolbarTitle }}</div>\n <div *ngIf=\"showGlobalFilter\" class=\"cps-treetable-tbar-global-filter\">\n <cps-input\n #globalFilterComp\n prefixIcon=\"search\"\n [placeholder]=\"globalFilterPlaceholder\"\n (valueChanged)=\"onFilterGlobal($event)\"\n [clearable]=\"true\"\n [disabled]=\"loading\"\n [appearance]=\"toolbarSize === 'small' ? 'underlined' : 'outlined'\"\n [hideDetails]=\"true\">\n </cps-input>\n </div>\n </div>\n <div class=\"cps-treetable-tbar-right\">\n <div\n *ngIf=\"showRemoveBtnOnSelect && selectedRows.length > 0\"\n class=\"cps-treetable-tbar-btn-on-select\">\n <cps-button\n label=\"Remove\"\n [disabled]=\"removeBtnOnSelectDisabled\"\n color=\"prepared\"\n type=\"borderless\"\n icon=\"remove\"\n [size]=\"toolbarSize\"\n (clicked)=\"removeSelected()\">\n </cps-button>\n </div>\n <div\n *ngIf=\"showAdditionalBtnOnSelect && selectedRows.length > 0\"\n class=\"cps-treetable-tbar-btn-on-select\">\n <cps-button\n [label]=\"additionalBtnOnSelectTitle\"\n [disabled]=\"additionalBtnOnSelectDisabled\"\n color=\"prepared\"\n type=\"borderless\"\n [size]=\"toolbarSize\"\n (clicked)=\"onClickAdditionalBtnOnSelect()\">\n </cps-button>\n </div>\n <div *ngIf=\"showActionBtn\" class=\"cps-treetable-tbar-action-btn\">\n <cps-button\n [label]=\"actionBtnTitle\"\n [disabled]=\"actionBtnDisabled\"\n color=\"prepared\"\n type=\"outlined\"\n [size]=\"toolbarSize\"\n (clicked)=\"onClickActionBtn()\">\n </cps-button>\n </div>\n <div\n *ngIf=\"showColumnsToggleBtn && columns.length > 0\"\n class=\"cps-treetable-tbar-coltoggle-btn\"\n [ngClass]=\"{ 'btn-disabled': columnsToggleBtnDisabled }\">\n <cps-icon\n icon=\"columns\"\n size=\"normal\"\n [color]=\"\n columnsToggleBtnDisabled ? 'text-lightest' : 'prepared-lighten1'\n \"\n (click)=\"onColumnsToggle($event)\"></cps-icon>\n <cps-menu #colToggleMenu [withArrow]=\"false\">\n <div class=\"cps-treetable-coltoggle-menu\">\n <div\n class=\"cps-treetable-coltoggle-menu-item select-all-option\"\n [class.allselected]=\"selectedColumns.length === columns.length\"\n (click)=\"toggleAllColumns()\">\n <span class=\"cps-treetable-coltoggle-menu-item-left\">\n <span class=\"cps-treetable-coltoggle-menu-item-check\"> </span>\n <span class=\"cps-treetable-coltoggle-menu-item-label\"\n >Show all columns</span\n >\n </span>\n </div>\n <div\n *ngFor=\"let col of columns\"\n class=\"cps-treetable-coltoggle-menu-item\"\n (click)=\"onSelectColumn(col)\"\n [class.selected]=\"isColumnSelected(col)\">\n <span class=\"cps-treetable-coltoggle-menu-item-left\">\n <span class=\"cps-treetable-coltoggle-menu-item-check\"></span>\n <span class=\"cps-treetable-coltoggle-menu-item-label\">{{\n col[colHeaderName]\n }}</span>\n </span>\n </div>\n </div>\n </cps-menu>\n </div>\n <div\n *ngIf=\"showDataReloadBtn\"\n class=\"cps-treetable-tbar-reload-btn\"\n [ngClass]=\"{ 'btn-disabled': dataReloadBtnDisabled }\">\n <cps-icon\n icon=\"refresh\"\n size=\"18\"\n [color]=\"dataReloadBtnDisabled ? 'text-light' : 'prepared-lighten1'\"\n (click)=\"onReloadData()\">\n </cps-icon>\n </div>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\" *ngIf=\"nestedHeaderTemplate\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"\n nestedHeaderTemplate;\n context: {\n $implicit: columns,\n }\n \"></ng-container>\n </ng-template>\n\n <ng-template pTemplate=\"header\" *ngIf=\"!nestedHeaderTemplate\" let-columns>\n <tr>\n <!-- <th style=\"width: 3rem\" *ngIf=\"reorderableRows\"></th> -->\n <th *ngIf=\"selectable\" cpsTTHdrSelectable></th>\n <ng-container *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n headerTemplate;\n context: {\n $implicit: columns,\n }\n \"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!headerTemplate && columns.length > 0\">\n <ng-container *ngIf=\"sortable\">\n <th\n *ngFor=\"let col of columns\"\n [cpsTTColSortable]=\"col[colFieldName]\">\n {{ col[colHeaderName] }}\n </th>\n </ng-container>\n <ng-container *ngIf=\"!sortable\">\n <th *ngFor=\"let col of columns\">\n {{ col[colHeaderName] }}\n </th>\n </ng-container>\n </ng-container>\n <th\n class=\"cps-treetable-row-menu-cell\"\n *ngIf=\"showRowMenu && (showRowRemoveButton || showRowEditButton)\"></th>\n </tr>\n </ng-template>\n\n <ng-template\n pTemplate=\"body\"\n let-rowData=\"rowData\"\n let-columns=\"columns\"\n let-rowNode\n let-rowIndex=\"rowIndex\">\n <tr\n [ttRow]=\"rowNode\"\n [ngClass]=\"{\n 'cps-treetable-row-selected':\n selectable && primengTreeTable.isSelected(rowNode.node)\n }\">\n <!-- <td *ngIf=\"reorderableRows\" class=\"cps-table-row-drag-handle-cell\">\n <span class=\"cps-table-row-drag-handle\" pReorderableRowHandle>\u2630</span>\n </td> -->\n <td [cpsTTRowSelectable]=\"rowNode\" *ngIf=\"selectable\"></td>\n <ng-container *ngIf=\"bodyTemplate\">\n <ng-container\n *ngTemplateOutlet=\"\n bodyTemplate;\n context: {\n $implicit: rowNode,\n rowIndex: rowIndex,\n columns: columns,\n rowData: rowData\n }\n \">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!bodyTemplate\">\n <ng-container *ngIf=\"columns.length > 0\">\n <ng-container *ngFor=\"let col of columns; let i = index\">\n <td *ngIf=\"i === 0\" [cpsTTRowToggler]=\"rowNode\">\n {{ rowData[col[colFieldName]] }}\n </td>\n <td *ngIf=\"i > 0\">{{ rowData[col[colFieldName]] }}</td>\n </ng-container>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"showRowMenu && (showRowRemoveButton || showRowEditButton)\"\n class=\"cps-treetable-row-menu-cell\">\n <table-row-menu\n (editRowBtnClicked)=\"onEditRowClicked(rowNode.node)\"\n (removeRowBtnClicked)=\"onRemoveRowClicked(rowNode.node)\"\n [showRowRemoveButton]=\"showRowRemoveButton\"\n [showRowEditButton]=\"showRowEditButton\">\n </table-row-menu>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td\n colspan=\"100\"\n class=\"cps-treetable-empty-message-td\"\n [ngStyle]=\"{ height: emptyBodyHeight }\">\n {{ emptyMessage }}\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"loadingicon\">\n <cps-loader [fullScreen]=\"false\" opacity=\"0\"></cps-loader>\n </ng-template>\n <ng-template pTemplate=\"paginatorleft\">\n <div class=\"cps-table-paginator-itms-per-page\">\n <span class=\"cps-table-paginator-items-per-page-title\"\n >Rows per page:\n </span>\n <cps-select\n [options]=\"rowOptions\"\n [hideDetails]=\"true\"\n [(ngModel)]=\"rows\"\n (valueChanged)=\"onRowsPerPageChanged()\"\n [returnObject]=\"false\"\n optionsClass=\"cps-paginator-page-options\">\n </cps-select>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"paginatorfirstpagelinkicon\">\n <AngleDoubleLeftIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatorpreviouspagelinkicon\">\n <AngleLeftIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatornextpagelinkicon\">\n <AngleRightIcon />\n </ng-template>\n <ng-template pTemplate=\"paginatorlastpagelinkicon\">\n <AngleDoubleRightIcon />\n </ng-template>\n</p-treeTable>\n", styles: [":host ::ng-deep .p-treetable{position:relative}:host ::ng-deep .p-component,:host ::ng-deep .p-component *{box-sizing:border-box}:host ::ng-deep .p-component{font-family:Source Sans Pro,sans-serif;font-size:14px;font-weight:400}:host ::ng-deep .p-treetable-scrollable-wrapper{position:relative;background:#fff}:host ::ng-deep .p-treetable-wrapper{background:#fff}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable.cps-tbar-normal .p-treetable-scrollable-wrapper{height:calc(100% - 72px)}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable.cps-tbar-small .p-treetable-scrollable-wrapper{height:calc(100% - 43px)}:host ::ng-deep .cps-treetable-nonvirtual.cps-treetable-flex .p-treetable-flex-scrollable .p-treetable-scrollable-wrapper .p-treetable-scrollable-view .p-treetable-scrollable-header{display:contents}:host ::ng-deep .p-treetable .p-treetable-scrollable-header,:host ::ng-deep .p-treetable .p-treetable-scrollable-footer{background:#fff}:host ::ng-deep .p-treetable-scrollable-header,:host ::ng-deep .p-treetable-scrollable-footer{overflow:hidden}:host ::ng-deep .p-treetable table{border-collapse:collapse;width:100%;table-layout:fixed}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th{text-align:left;padding:1rem;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 1px;font-weight:400;color:var(--cps-color-text-mild);background:#fff;transition:box-shadow .2s;overflow:hidden}:host ::ng-deep .p-treetable-scrollable-body{overflow:auto!important;position:relative}:host ::ng-deep .cps-treetable-flex .p-treetable-scrollable-body{height:100%}:host ::ng-deep .p-treetable .p-treetable-tbody{background:#fff}:host ::ng-deep .p-treetable .p-treetable-tbody>tr{background:#fff;color:var(--cps-color-text-dark);transition:box-shadow .2s}:host ::ng-deep .p-treetable .p-treetable-tbody>tr.cps-treetable-row-selected{background-color:var(--cps-color-highlight-active)!important}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td{text-align:left;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;padding:1rem}:host ::ng-deep p-treetable:not(.cps-treetable-autolayout-calced) .p-treetable .p-treetable-tbody>tr>td{overflow:hidden}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable .p-treetable-scrollable-body .p-treetable-tbody>tr>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){opacity:0;border-left-color:#fff}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable.p-treetable-striped .p-treetable-scrollable-body .p-treetable-tbody>tr:nth-child(odd)>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){border-left-color:var(--cps-color-bg-light)}:host ::ng-deep .cps-treetable-autolayout-calced .p-treetable .p-treetable-scrollable-body .p-treetable-tbody>tr:hover>td:not(.cps-treetable-row-toggler-cell):not(.cps-treetable-selectable-cell):not(.cps-treetable-row-menu-cell):not(.cps-treetable-empty-message-td){border-left-color:var(--cps-color-highlight-hover)}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:first-child{border-width:0 0 1px 1px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:last-child{border-width:0 1px 1px 0}:host ::ng-deep .p-treetable-auto-layout table{table-layout:auto}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:1rem;height:1rem;color:var(--cps-color-text-dark);border:0 none;background:transparent;border-radius:50%;margin-right:.5rem}:host ::ng-deep .p-treetable-toggler{cursor:pointer;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;overflow:hidden;position:relative}:host ::ng-deep .p-ripple{overflow:hidden;position:relative}:host ::ng-deep .p-link:focus{outline:0 none;outline-offset:0;box-shadow:unset}:host ::ng-deep .p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:14px;font-family:Source Sans Pro,sans-serif;border-radius:6px}:host ::ng-deep input[type=button],:host ::ng-deep input[type=submit],:host ::ng-deep input[type=reset],:host ::ng-deep input[type=file]::-webkit-file-upload-button,:host ::ng-deep button{border-radius:0}:host ::ng-deep .p-treetable .p-treetable-tbody>tr:focus{outline:0 none;outline-offset:-.15rem}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:enabled:hover{color:var(--cps-color-calm);border-color:transparent;background:unset}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:focus{outline:0 none;outline-offset:0;box-shadow:unset}:host ::ng-deep .p-treetable .p-paginator{border-width:0 1px 1px 1px;border-radius:0}:host ::ng-deep .p-paginator{background:#fff;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;color:var(--cps-color-text-dark);padding:1rem;border:1px solid var(--cps-color-line-mid)}:host ::ng-deep .p-paginator-left-content{margin-right:auto}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page{display:inline-flex;align-items:center}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-table-paginator-items-per-page-title{font-family:Source Sans Pro,sans-serif;font-size:14px;margin-right:12px;cursor:default}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box{min-height:32px!important;background:transparent!important}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box .cps-select-box-items{font-size:14px!important}:host ::ng-deep .p-paginator-left-content .cps-table-paginator-itms-per-page .cps-select-box .cps-select-box-chevron .cps-icon{width:14px;height:14px}:host ::ng-deep .p-paginator .p-paginator-current{background-color:transparent;border:0 none;color:var(--cps-color-text-dark);min-width:3rem;margin:.143rem;padding:0 .5rem;font-family:Source Sans Pro,sans-serif;font-size:14px;height:unset}:host ::ng-deep .p-paginator-page,:host ::ng-deep .p-paginator-next,:host ::ng-deep .p-paginator-last,:host ::ng-deep .p-paginator-first,:host ::ng-deep .p-paginator-prev,:host ::ng-deep .p-paginator-current{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1;-webkit-user-select:none;user-select:none;overflow:hidden;position:relative}:host ::ng-deep .p-paginator-current{cursor:default}:host ::ng-deep .p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):hover,:host ::ng-deep .p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):hover{background:var(--cps-color-highlight-hover);border-color:unset}:host ::ng-deep .p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):active,:host ::ng-deep .p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):active{background:var(--cps-color-highlight-active)}:host ::ng-deep .p-paginator .p-paginator-first,:host ::ng-deep .p-paginator .p-paginator-prev,:host ::ng-deep .p-paginator .p-paginator-next,:host ::ng-deep .p-paginator .p-paginator-last{background-color:transparent;border:1px solid var(--cps-color-text-dark);border-radius:4px;color:var(--cps-color-text-dark);min-width:32px;height:32px;margin:.143rem;transition:box-shadow .2s}:host ::ng-deep .p-disabled,:host ::ng-deep .p-disabled *{cursor:default!important;pointer-events:none}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page.p-highlight{background:var(--cps-color-calm);border-color:var(--cps-color-calm);color:#fff}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):hover{background:var(--cps-color-highlight-hover);border-color:unset}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):active{background:var(--cps-color-highlight-active)}:host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page{background-color:transparent;border:1px solid var(--cps-color-text-dark);border-radius:4px;color:var(--cps-color-text-dark);min-width:32px;height:32px;margin:.143rem;transition:box-shadow .2s}:host ::ng-deep .p-paginator-element:focus{z-index:1;position:relative}:host ::ng-deep span.p-paginator-icon{display:contents}:host ::ng-deep .p-disabled,:host ::ng-deep .p-component:disabled{opacity:.4}:host ::ng-deep .cps-treetable-empty-message-td{text-align:center!important;font-weight:600;background:#fff}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-header{border-width:1px 1px 0 1px}:host ::ng-deep .p-treetable .p-treetable-header{font-weight:600;display:flex;justify-content:space-between;align-items:center;padding:0 10px;border:unset;background:unset;border-top:1px solid var(--cps-color-line-mid);border-right:1px solid var(--cps-color-line-mid);border-left:4px solid var(--cps-color-surprise)!important;border-radius:4px 4px 0 0;font-size:16px;line-height:150%;background-color:#fff;color:var(--cps-color-text-darkest);overflow:auto}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left{display:flex;align-items:center}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-global-filter{margin-left:12px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-icon{display:flex;margin-right:8px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-left .cps-treetable-tbar-title{cursor:default}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right{display:flex;align-items:center}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-btn-on-select{margin-right:4px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-action-btn{margin-right:4px;margin-left:8px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn{display:contents}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn cps-icon{margin-left:12px;margin-right:4px}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn:not(.btn-disabled) cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn:not(.btn-disabled) cps-icon{cursor:pointer}:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-coltoggle-btn:not(.btn-disabled) cps-icon:hover .cps-icon,:host ::ng-deep .p-treetable .p-treetable-header .cps-treetable-tbar-right .cps-treetable-tbar-reload-btn:not(.btn-disabled) cps-icon:hover .cps-icon{color:var(--cps-color-prepared)!important}:host ::ng-deep .cps-tbar-small.p-treetable .p-treetable-header{height:43px}:host ::ng-deep .cps-tbar-normal.p-treetable .p-treetable-header{height:72px}:host ::ng-deep .p-treetable .p-treetable-footer{background:#fff;color:#343a40;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;padding:1rem;font-weight:700}:host ::ng-deep .p-treetable .p-treetable-tfoot>tr>td{text-align:left;padding:1rem;border:1px solid var(--cps-color-line-mid);border-width:0 0 1px 0;font-weight:700;color:#343a40;background:#fff}:host ::ng-deep .p-treetable .p-sortable-column:not(.p-highlight):hover .cps-sortable-column-icon.sort-unsorted .sort-unsorted-arrow-up{border-bottom-color:var(--cps-color-text-mild)}:host ::ng-deep .p-treetable .p-sortable-column:not(.p-highlight):hover .cps-sortable-column-icon.sort-unsorted .sort-unsorted-arrow-down{border-top-color:var(--cps-color-text-mild)}:host ::ng-deep .p-icon-wrapper{display:inline-flex}:host ::ng-deep .p-icon{display:inline-block;width:1rem;height:1rem}:host ::ng-deep .p-treetable .p-sortable-column .cps-sortable-column-badge{display:inline-flex;align-items:center;justify-content:center;font-size:12px;vertical-align:top;color:var(--cps-color-calm);margin-left:.25rem}:host ::ng-deep .p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none}:host ::ng-deep .p-treetable .p-sortable-column{cursor:pointer;-webkit-user-select:none;user-select:none}:host ::ng-deep .p-treetable .p-sortable-column:focus{box-shadow:none;outline:0 none}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler.p-icon{width:2rem;height:2rem}:host ::ng-deep .p-treetable .p-treetable-tbody>tr.p-highlight{background:#eff6ff;color:#1d4ed8}:host ::ng-deep .p-treetable.p-treetable-hoverable-rows .p-treetable-tbody>tr:not(.p-highlight):hover{background:var(--cps-color-highlight-hover)}:host ::ng-deep .p-treetable-hoverable-rows .p-treetable-tbody>tr{cursor:auto}:host ::ng-deep .p-treetable .p-column-resizer-helper{background:#3b82f6}:host ::ng-deep .p-treetable .p-treetable-loading-overlay{position:absolute;display:flex;align-items:center;justify-content:center;z-index:1001;top:0;left:0;width:100%;height:100%;background-color:#fff;transition-duration:.2s;border:1px solid var(--cps-color-line-mid)}:host ::ng-deep .p-treetable.cps-tbar-small .p-treetable-loading-overlay{top:43px;height:calc(100% - 43px)}:host ::ng-deep .p-treetable.cps-tbar-normal .p-treetable-loading-overlay{top:72px;height:calc(100% - 72px)}:host ::ng-deep .cps-treetable-loading .p-treetable{min-height:200px}:host ::ng-deep .cps-treetable-loading .p-treetable.cps-tbar-normal{min-height:272px}:host ::ng-deep .cps-treetable-loading .p-treetable.cps-tbar-small{min-height:243px}:host ::ng-deep .cps-table-col-filter-menu-open .cps-table-col-filter-menu-button{color:var(--cps-color-text-dark)}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-footer{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-top{border-width:0 1px 0 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-bottom{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th{border-width:1px 0 1px 1px}:host ::ng-deep .p-treetable .p-treetable-thead>tr>th:last-child{border-width:1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td{border-width:0 0 1px 1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tfoot>tr>td{border-width:1px}:host ::ng-deep .p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td:last-child{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td:only-child{border-width:0 1px 1px 1px}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-thead>tr>th{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-tbody>tr>td{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-tfoot>tr>td{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-sm .p-treetable-footer{padding:.5rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-thead>tr>th{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-tbody>tr>td{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-tfoot>tr>td{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-lg .p-treetable-footer{padding:1.25rem}:host ::ng-deep .p-treetable.p-treetable-striped .p-treetable-tbody>tr:nth-child(odd){background:var(--cps-color-bg-light)}:host ::ng-deep .p-treetable.p-treetable-striped .p-treetable-tbody>tr:nth-child(2n){background:#fff}:host ::ng-deep .cps-treetable-row-menu-cell{width:55px;border-left:none!important}:host ::ng-deep .cps-treetable-selectable-cell{width:55px;text-align:center!important}:host ::ng-deep .p-checkbox{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;vertical-align:bottom;position:relative;width:18px;height:18px}:host ::ng-deep .p-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}:host ::ng-deep .p-hidden-accessible input,:host ::ng-deep .p-hidden-accessible select{transform:scale(0)}:host ::ng-deep .p-checkbox .p-checkbox-box{background:#fff;width:18px;height:18px;color:var(--cps-color-text-dark);border:2px solid var(--cps-color-text-mild);border-radius:2px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}:host ::ng-deep .p-checkbox-box{display:flex;justify-content:center;align-items:center}:host ::ng-deep .p-checkbox .p-checkbox-box.p-highlight{border-color:var(--cps-color-calm);background:var(--cps-color-calm)}:host ::ng-deep .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box.p-highlight:hover{border-color:var(--cps-color-calm);background:var(--cps-color-calm);color:#fff}:host ::ng-deep .p-checkbox:not(.p-checkbox-disabled) .p-checkbox-box:hover{border-color:var(--cps-color-calm)}:host ::ng-deep .p-checkbox .p-checkbox-box .p-icon{width:14px;height:14px}:host ::ng-deep .p-checkbox .p-checkbox-box .p-checkbox-icon{transition-duration:.2s;color:#fff;font-size:14px}:host ::ng-deep .p-checkbox .p-checkbox-box minusicon .p-checkbox-icon{color:var(--cps-color-calm);width:12px}:host ::ng-deep .p-treetable .p-treetable-tbody>tr>td p-treetablecheckbox .p-checkbox{margin-right:0}::ng-deep .p-scrollbar-measure{width:100px;height:100px;overflow:scroll;position:absolute;top:-9999px}.cps-treetable-coltoggle-menu{display:block;max-height:242px;overflow-x:hidden;background:#fff}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item{padding:12px;justify-content:space-between;display:flex;cursor:pointer}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item:hover{background:var(--cps-color-highlight-hover)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-label{color:var(--cps-color-text-dark)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-left{display:flex;align-items:center;margin-right:8px}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-check{background-color:transparent;border:0;width:16px;height:16px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1);margin-right:8px;opacity:0}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item-check:after{color:var(--cps-color-calm);top:4px;left:1px;width:8px;height:3px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box;position:absolute;content:\"\";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected{font-weight:600}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected .cps-treetable-coltoggle-menu-item-label,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected .cps-treetable-coltoggle-menu-item-label{color:var(--cps-color-calm)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected .cps-treetable-coltoggle-menu-item-check,.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.allselected .cps-treetable-coltoggle-menu-item-check{opacity:1}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected{background:var(--cps-color-highlight-selected)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.highlighten{background:var(--cps-color-highlight-active)}.cps-treetable-coltoggle-menu .cps-treetable-coltoggle-menu-item.selected.highlighten{background:var(--cps-color-highlight-selected-dark)}.cps-treetable-coltoggle-menu .select-all-option{border-bottom:1px solid lightgrey;font-weight:600}::ng-deep .cps-select-options-menu.cps-paginator-page-options .cps-select-options-option{font-size:14px}\n"] }]
|
|
1022
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.NgZone }], propDecorators: { columns: [{
|
|
1023
|
+
type: Input
|
|
1024
|
+
}], colHeaderName: [{
|
|
1025
|
+
type: Input
|
|
1026
|
+
}], colFieldName: [{
|
|
1027
|
+
type: Input
|
|
1028
|
+
}], minWidth: [{
|
|
1029
|
+
type: Input
|
|
1030
|
+
}], minWidthForBodyOnly: [{
|
|
1031
|
+
type: Input
|
|
1032
|
+
}], autoLayout: [{
|
|
1033
|
+
type: Input
|
|
1034
|
+
}], striped: [{
|
|
1035
|
+
type: Input
|
|
1036
|
+
}], bordered: [{
|
|
1037
|
+
type: Input
|
|
1038
|
+
}], size: [{
|
|
1039
|
+
type: Input
|
|
1040
|
+
}], selectable: [{
|
|
1041
|
+
type: Input
|
|
1042
|
+
}], rowHover: [{
|
|
1043
|
+
type: Input
|
|
1044
|
+
}], showRowMenu: [{
|
|
1045
|
+
type: Input
|
|
1046
|
+
}], showRowRemoveButton: [{
|
|
1047
|
+
type: Input
|
|
1048
|
+
}], showRowEditButton: [{
|
|
1049
|
+
type: Input
|
|
1050
|
+
}], loading: [{
|
|
1051
|
+
type: Input
|
|
1052
|
+
}], tableStyle: [{
|
|
1053
|
+
type: Input
|
|
1054
|
+
}], tableStyleClass: [{
|
|
1055
|
+
type: Input
|
|
1056
|
+
}], sortable: [{
|
|
1057
|
+
type: Input
|
|
1058
|
+
}], sortMode: [{
|
|
1059
|
+
type: Input
|
|
1060
|
+
}], customSort: [{
|
|
1061
|
+
type: Input
|
|
1062
|
+
}], hasToolbar: [{
|
|
1063
|
+
type: Input
|
|
1064
|
+
}], toolbarSize: [{
|
|
1065
|
+
type: Input
|
|
1066
|
+
}], toolbarTitle: [{
|
|
1067
|
+
type: Input
|
|
1068
|
+
}], toolbarIcon: [{
|
|
1069
|
+
type: Input
|
|
1070
|
+
}], toolbarIconColor: [{
|
|
1071
|
+
type: Input
|
|
1072
|
+
}], scrollable: [{
|
|
1073
|
+
type: Input
|
|
1074
|
+
}], scrollHeight: [{
|
|
1075
|
+
type: Input
|
|
1076
|
+
}], virtualScroll: [{
|
|
1077
|
+
type: Input
|
|
1078
|
+
}], virtualScrollItemHeight: [{
|
|
1079
|
+
type: Input
|
|
1080
|
+
}], numToleratedItems: [{
|
|
1081
|
+
type: Input
|
|
1082
|
+
}], paginator: [{
|
|
1083
|
+
type: Input
|
|
1084
|
+
}], alwaysShowPaginator: [{
|
|
1085
|
+
type: Input
|
|
1086
|
+
}], rowsPerPageOptions: [{
|
|
1087
|
+
type: Input
|
|
1088
|
+
}], first: [{
|
|
1089
|
+
type: Input
|
|
1090
|
+
}], rows: [{
|
|
1091
|
+
type: Input
|
|
1092
|
+
}], resetPageOnRowsChange: [{
|
|
1093
|
+
type: Input
|
|
1094
|
+
}], resetPageOnSort: [{
|
|
1095
|
+
type: Input
|
|
1096
|
+
}], totalRecords: [{
|
|
1097
|
+
type: Input
|
|
1098
|
+
}], emptyMessage: [{
|
|
1099
|
+
type: Input
|
|
1100
|
+
}], emptyBodyHeight: [{
|
|
1101
|
+
type: Input
|
|
1102
|
+
}], lazy: [{
|
|
1103
|
+
type: Input
|
|
1104
|
+
}], lazyLoadOnInit: [{
|
|
1105
|
+
type: Input
|
|
1106
|
+
}], showGlobalFilter: [{
|
|
1107
|
+
type: Input
|
|
1108
|
+
}], globalFilterPlaceholder: [{
|
|
1109
|
+
type: Input
|
|
1110
|
+
}], globalFilterFields: [{
|
|
1111
|
+
type: Input
|
|
1112
|
+
}], clearGlobalFilterOnLoading: [{
|
|
1113
|
+
type: Input
|
|
1114
|
+
}], showRemoveBtnOnSelect: [{
|
|
1115
|
+
type: Input
|
|
1116
|
+
}], removeBtnOnSelectDisabled: [{
|
|
1117
|
+
type: Input
|
|
1118
|
+
}], showAdditionalBtnOnSelect: [{
|
|
1119
|
+
type: Input
|
|
1120
|
+
}], additionalBtnOnSelectTitle: [{
|
|
1121
|
+
type: Input
|
|
1122
|
+
}], additionalBtnOnSelectDisabled: [{
|
|
1123
|
+
type: Input
|
|
1124
|
+
}], showActionBtn: [{
|
|
1125
|
+
type: Input
|
|
1126
|
+
}], actionBtnTitle: [{
|
|
1127
|
+
type: Input
|
|
1128
|
+
}], actionBtnDisabled: [{
|
|
1129
|
+
type: Input
|
|
1130
|
+
}], showDataReloadBtn: [{
|
|
1131
|
+
type: Input
|
|
1132
|
+
}], dataReloadBtnDisabled: [{
|
|
1133
|
+
type: Input
|
|
1134
|
+
}], showColumnsToggleBtn: [{
|
|
1135
|
+
type: Input
|
|
1136
|
+
}], columnsToggleBtnDisabled: [{
|
|
1137
|
+
type: Input
|
|
1138
|
+
}], initialColumns: [{
|
|
1139
|
+
type: Input
|
|
1140
|
+
}], data: [{
|
|
1141
|
+
type: Input
|
|
1142
|
+
}], rowsSelected: [{
|
|
1143
|
+
type: Output
|
|
1144
|
+
}], actionBtnClicked: [{
|
|
1145
|
+
type: Output
|
|
1146
|
+
}], additionalBtnOnSelectClicked: [{
|
|
1147
|
+
type: Output
|
|
1148
|
+
}], editRowBtnClicked: [{
|
|
1149
|
+
type: Output
|
|
1150
|
+
}], rowsToRemove: [{
|
|
1151
|
+
type: Output
|
|
1152
|
+
}], pageChanged: [{
|
|
1153
|
+
type: Output
|
|
1154
|
+
}], sorted: [{
|
|
1155
|
+
type: Output
|
|
1156
|
+
}], filtered: [{
|
|
1157
|
+
type: Output
|
|
1158
|
+
}], columnsSelected: [{
|
|
1159
|
+
type: Output
|
|
1160
|
+
}], lazyLoaded: [{
|
|
1161
|
+
type: Output
|
|
1162
|
+
}], dataReloadBtnClicked: [{
|
|
1163
|
+
type: Output
|
|
1164
|
+
}], nodeExpanded: [{
|
|
1165
|
+
type: Output
|
|
1166
|
+
}], nodeCollapsed: [{
|
|
1167
|
+
type: Output
|
|
1168
|
+
}], nodeSelected: [{
|
|
1169
|
+
type: Output
|
|
1170
|
+
}], nodeUnselected: [{
|
|
1171
|
+
type: Output
|
|
1172
|
+
}], customSortFunction: [{
|
|
1173
|
+
type: Output
|
|
1174
|
+
}], toolbarTemplate: [{
|
|
1175
|
+
type: ContentChild,
|
|
1176
|
+
args: ['toolbar', { static: false }]
|
|
1177
|
+
}], headerTemplate: [{
|
|
1178
|
+
type: ContentChild,
|
|
1179
|
+
args: ['header', { static: false }]
|
|
1180
|
+
}], nestedHeaderTemplate: [{
|
|
1181
|
+
type: ContentChild,
|
|
1182
|
+
args: ['nestedHeader', { static: false }]
|
|
1183
|
+
}], bodyTemplate: [{
|
|
1184
|
+
type: ContentChild,
|
|
1185
|
+
args: ['body', { static: false }]
|
|
1186
|
+
}], primengTreeTable: [{
|
|
1187
|
+
type: ViewChild,
|
|
1188
|
+
args: ['primengTreeTable', { static: true }]
|
|
1189
|
+
}], globalFilterComp: [{
|
|
1190
|
+
type: ViewChild,
|
|
1191
|
+
args: ['globalFilterComp']
|
|
1192
|
+
}], colToggleMenu: [{
|
|
1193
|
+
type: ViewChild,
|
|
1194
|
+
args: ['colToggleMenu']
|
|
1195
|
+
}] } });
|
|
1196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXRyZWUtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXRyZWUtdGFibGUvY3BzLXRyZWUtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXRyZWUtdGFibGUvY3BzLXRyZWUtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBS0wsTUFBTSxFQUVOLG1CQUFtQixFQUduQixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsU0FBUyxFQUNULGdCQUFnQixFQUNoQixlQUFlLEVBQ2hCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8s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O3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSXhDLFlBQVk7c0JBRGxCLFlBQVk7dUJBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJdkMsZ0JBQWdCO3NCQURmLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkvQyxnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBSTdCLGFBQWE7c0JBRFosU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgUmVuZGVyZXJTdHlsZUZsYWdzMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIFRyZWVUYWJsZSxcbiAgVHJlZVRhYmxlU2VydmljZSxcbiAgVHJlZVRhYmxlTW9kdWxlXG59IGZyb20gJ3ByaW1lbmcvdHJlZXRhYmxlJztcbmltcG9ydCB7IERvbUhhbmRsZXIgfSBmcm9tICdwcmltZW5nL2RvbSc7XG5pbXBvcnQgeyBBbmdsZURvdWJsZUxlZnRJY29uIH0gZnJvbSAncHJpbWVuZy9pY29ucy9hbmdsZWRvdWJsZWxlZnQnO1xuaW1wb3J0IHsgQW5nbGVMZWZ0SWNvbiB9IGZyb20gJ3ByaW1lbmcvaWNvbnMvYW5nbGVsZWZ0JztcbmltcG9ydCB7IEFuZ2xlUmlnaHRJY29uIH0gZnJvbSAncHJpbWVuZy9pY29ucy9hbmdsZXJpZ2h0JztcbmltcG9ydCB7IEFuZ2xlRG91YmxlUmlnaHRJY29uIH0gZnJvbSAncHJpbWVuZy9pY29ucy9hbmdsZWRvdWJsZXJpZ2h0JztcbmltcG9ydCB7IFNvcnRFdmVudCB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IGNsb25lRGVlcCwgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBDcHNJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1pbnB1dC9jcHMtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IENwc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1idXR0b24vY3BzLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3BzTWVudUNvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1tZW51L2Nwcy1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWljb24vY3BzLWljb24uY29tcG9uZW50JztcbmltcG9ydCB7IENwc1NlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1zZWxlY3QvY3BzLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3BzTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWxvYWRlci9jcHMtbG9hZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNUcmVlVGFibGVDb2x1bW5Tb3J0YWJsZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9jcHMtdHJlZS10YWJsZS1jb2x1bW4tc29ydGFibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IFRyZWVUYWJsZVVuc29ydERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9pbnRlcm5hbC90cmVlLXRhYmxlLXVuc29ydC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVGFibGVSb3dNZW51Q29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLXRhYmxlL2NvbXBvbmVudHMvaW50ZXJuYWwvdGFibGUtcm93LW1lbnUvdGFibGUtcm93LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IGNvbnZlcnRTaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvaW50ZXJuYWwvc2l6ZS11dGlscyc7XG5pbXBvcnQgeyBDcHNUcmVlVGFibGVIZWFkZXJTZWxlY3RhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2Nwcy10cmVlLXRhYmxlLWhlYWRlci1zZWxlY3RhYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDcHNUcmVlVGFibGVSb3dTZWxlY3RhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2Nwcy10cmVlLXRhYmxlLXJvdy1zZWxlY3RhYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDcHNUcmVldGFibGVSb3dUb2dnbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2Nwcy10cmVlLXRhYmxlLXJvdy10b2dnbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJlZVRhYmxlRmFjdG9yeSh0YWJsZUNvbXBvbmVudDogQ3BzVHJlZVRhYmxlQ29tcG9uZW50KSB7XG4gIHJldHVybiB0YWJsZUNvbXBvbmVudC5wcmltZW5nVHJlZVRhYmxlO1xufVxuXG5leHBvcnQgdHlwZSBDcHNUcmVlVGFibGVTaXplID0gJ3NtYWxsJyB8ICdub3JtYWwnIHwgJ2xhcmdlJztcbmV4cG9ydCB0eXBlIENwc1RyZWVUYWJsZVRvb2xiYXJTaXplID0gJ3NtYWxsJyB8ICdub3JtYWwnO1xuZXhwb3J0IHR5cGUgQ3BzVHJlZVRhYmxlU29ydE1vZGUgPSAnc2luZ2xlJyB8ICdtdWx0aXBsZSc7XG5cbi8qKlxuICogQ3BzVHJlZVRhYmxlQ29tcG9uZW50IGlzIHVzZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgZGF0YSBpbiB0YWJ1bGFyIGZvcm1hdC5cbiAqIEBncm91cCBDb21wb25lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nwcy10cmVlLXRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVHJlZVRhYmxlTW9kdWxlLFxuICAgIENwc0lucHV0Q29tcG9uZW50LFxuICAgIENwc0J1dHRvbkNvbXBvbmVudCxcbiAgICBDcHNNZW51Q29tcG9uZW50LFxuICAgIENwc0ljb25Db21wb25lbnQsXG4gICAgQ3BzU2VsZWN0Q29tcG9uZW50LFxuICAgIENwc0xvYWRlckNvbXBvbmVudCxcbiAgICBBbmdsZURvdWJsZUxlZnRJY29uLFxuICAgIEFuZ2xlTGVmdEljb24sXG4gICAgQW5nbGVSaWdodEljb24sXG4gICAgQW5nbGVEb3VibGVSaWdodEljb24sXG4gICAgQ3BzVHJlZVRhYmxlQ29sdW1uU29ydGFibGVEaXJlY3RpdmUsXG4gICAgQ3BzVHJlZVRhYmxlSGVhZGVyU2VsZWN0YWJsZURpcmVjdGl2ZSxcbiAgICBDcHNUcmVlVGFibGVSb3dTZWxlY3RhYmxlRGlyZWN0aXZlLFxuICAgIENwc1RyZWV0YWJsZVJvd1RvZ2dsZXJEaXJlY3RpdmUsXG4gICAgVHJlZVRhYmxlVW5zb3J0RGlyZWN0aXZlLFxuICAgIFRhYmxlUm93TWVudUNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY3BzLXRyZWUtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jcHMtdHJlZS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICBUcmVlVGFibGVTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRyZWVUYWJsZSxcbiAgICAgIHVzZUZhY3Rvcnk6IHRyZWVUYWJsZUZhY3RvcnksXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgIGRlcHM6IFtDcHNUcmVlVGFibGVDb21wb25lbnRdXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIENwc1RyZWVUYWJsZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXNcbntcbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcmVwcmVzZW50IGR5bmFtaWMgY29sdW1ucy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBjb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9W10gPSBbXTtcblxuICAvKipcbiAgICogQSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgaGVhZGVyIGZyb20gY29sdW1ucy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBjb2xIZWFkZXJOYW1lID0gJ2hlYWRlcic7XG5cbiAgLyoqXG4gICAqIEEga2V5IHVzZWQgdG8gcmV0cmlldmUgdGhlIGZpZWxkIGZyb20gY29sdW1ucy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBjb2xGaWVsZE5hbWUgPSAnZmllbGQnO1xuXG4gIC8qKlxuICAgKiBUcmVldGFibGUgbWluIHdpZHRoIG9mIHR5cGUgbnVtYmVyIGRlbm90aW5nIHBpeGVscyBvciBzdHJpbmcuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgbWluV2lkdGg6IG51bWJlciB8IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgbWluV2lkdGggcHJvcCBpcyB1c2VkIGZvciB0cmVldGFibGUgYm9keSBvbmx5LCBleGNsdWRpbmcgdG9vbGJhciBhbmQgcGFnaW5hdG9yLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIG1pbldpZHRoRm9yQm9keU9ubHkgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNlbGwgd2lkdGhzIHNjYWxlIGFjY29yZGluZyB0byB0aGVpciBjb250ZW50IG9yIG5vdC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBhdXRvTGF5b3V0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0cmVldGFibGUgc2hvdWxkIGhhdmUgYWx0ZXJuYXRpbmcgc3RyaXBlcy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzdHJpcGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0cmVldGFibGUgc2hvdWxkIGhhdmUgYm9yZGVycy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBib3JkZXJlZCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNpemUgb2YgdHJlZXRhYmxlIGNlbGxzLCBpdCBjYW4gYmUgXCJzbWFsbFwiLCBcIm5vcm1hbFwiIG9yIFwibGFyZ2VcIi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaXplOiBDcHNUcmVlVGFibGVTaXplID0gJ25vcm1hbCc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdHJlZXRhYmxlIHNob3VsZCBoYXZlIHJvdyBzZWxlY3Rpb24uXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0YWJsZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRyZWV0YWJsZSBzaG91bGQgaGF2ZSByb3dzIGhpZ2hsaWdodGluZyBvbiBob3Zlci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSByb3dIb3ZlciA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdHJlZXRhYmxlIHNob3VsZCBzaG93IHJvdyBtZW51cy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93Um93TWVudSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlICdSZW1vdmUnIGJ1dHRvbiBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSByb3cgbWVudS5cbiAgICogTm90ZTogVGhpcyBzZXR0aW5nIG9ubHkgdGFrZXMgZWZmZWN0IGlmICdzaG93Um93TWVudScgaXMgdHJ1ZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93Um93UmVtb3ZlQnV0dG9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSAnRWRpdCcgYnV0dG9uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHJvdyBtZW51LlxuICAgKiBOb3RlOiBUaGlzIHNldHRpbmcgb25seSB0YWtlcyBlZmZlY3QgaWYgJ3Nob3dSb3dNZW51JyBpcyB0cnVlLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dSb3dFZGl0QnV0dG9uID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBhIGxvYWRlciBjb21wb25lbnQgaXMgZGlzcGxheWVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5saW5lIHN0eWxlIG9mIHRoZSB0cmVldGFibGUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgdGFibGVTdHlsZSA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3R5bGUgY2xhc3Mgb2YgdGhlIHRyZWV0YWJsZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0YWJsZVN0eWxlQ2xhc3MgPSAnJztcblxuICAvKipcbiAgICogTWFrZXMgYWxsIGNvbHVtbnMgc29ydGFibGUgaWYgY29sdW1ucyBwcm9wIGlzIHByb3ZpZGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNvcnRhYmxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBzb3J0aW5nIHdvcmtzIG9uIHNpbmdsZSBjb2x1bW4gb3Igb24gbXVsdGlwbGUgY29sdW1ucy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzb3J0TW9kZTogQ3BzVHJlZVRhYmxlU29ydE1vZGUgPSAnc2luZ2xlJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgZGVmYXVsdCBzb3J0aW5nIG9yIGEgY3VzdG9tIG9uZSB1c2luZyBzb3J0RnVuY3Rpb24uXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgY3VzdG9tU29ydCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRyZWV0YWJsZSBoYXMgYSB0b29sYmFyLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGhhc1Rvb2xiYXIgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUb29sYmFyIHNpemUsIGl0IGNhbiBiZSBcInNtYWxsXCIgb3IgXCJub3JtYWxcIi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0b29sYmFyU2l6ZTogQ3BzVHJlZVRhYmxlVG9vbGJhclNpemUgPSAnbm9ybWFsJztcblxuICAvKipcbiAgICogVG9vbGJhciB0aXRsZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0b29sYmFyVGl0bGUgPSAnJztcblxuICAvKipcbiAgICogVG9vbGJhciBpY29uIG5hbWUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgdG9vbGJhckljb24gPSAnJztcblxuICAvKipcbiAgICogVG9vbGJhciBpY29uIGNvbG9yLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHRvb2xiYXJJY29uQ29sb3IgPSAnJztcblxuICAvKipcbiAgICogTWFrZXMgdHJlZXRhYmxlIHNjcm9sbGFibGUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2Nyb2xsYWJsZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEhlaWdodCBvZiB0aGUgc2Nyb2xsIHZpZXdwb3J0IGluIGZpeGVkIHBpeGVscyBvciB0aGUgXCJmbGV4XCIga2V5d29yZCBmb3IgYSBkeW5hbWljIHNpemUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0ID0gJyc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvbmx5IHRoZSBlbGVtZW50cyB3aXRoaW4gc2Nyb2xsYWJsZSBhcmVhIHNob3VsZCBiZSBhZGRlZCBpbnRvIHRoZSBET00uIFdvcmtzIG9ubHkgaWYgc2Nyb2xsYWJsZSBwcm9wIGlzIHRydWUuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgdmlydHVhbFNjcm9sbCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBIZWlnaHQgb2YgYSB2aXJ0dWFsIHNjcm9sbCBpdGVtIGluIGZpeGVkIHBpeGVscy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB2aXJ0dWFsU2Nyb2xsSXRlbUhlaWdodCA9IDA7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaG93IG1hbnkgYWRkaXRpb25hbCBlbGVtZW50cyB0byBhZGQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSB2aWV3LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIG51bVRvbGVyYXRlZEl0ZW1zID0gMTA7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdHJlZXRhYmxlIHNob3VsZCBoYXZlIHBhZ2luYXRvci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBwYWdpbmF0b3IgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgcGFnaW5hdG9yIGV2ZW4gdGhlcmUgaXMgb25seSBvbmUgcGFnZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBhbHdheXNTaG93UGFnaW5hdG9yID0gdHJ1ZTtcblxuICAvKipcbiAgICogQXJyYXkgb2YgaW50ZWdlciB2YWx1ZXMgdG8gZGlzcGxheSBpbnNpZGUgcm93cyBwZXIgcGFnZSBkcm9wZG93biBvZiBwYWdpbmF0b3IuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgcm93c1BlclBhZ2VPcHRpb25zOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBJbmRleCBvZiB0aGUgZmlyc3Qgcm93IHRvIGJlIGRpc3BsYXllZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBmaXJzdCA9IDA7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgcGVyIHBhZ2UuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgcm93cyA9IDA7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byByZXNldCBwYWdlIG9uIHJvd3MgY2hhbmdlLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHJlc2V0UGFnZU9uUm93c0NoYW5nZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gcmVzZXQgcGFnZSBvbiB0cmVldGFibGUgZGF0YSBzb3J0aW5nLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHJlc2V0UGFnZU9uU29ydCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiB0b3RhbCByZWNvcmRzLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkcyA9IDA7XG5cbiAgLyoqXG4gICAqIFRleHQgdG8gZGlzcGxheSB3aGVuIHRoZXJlIGlzIG5vIGRhdGEuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgZW1wdHlNZXNzYWdlID0gJ05vIGRhdGEnO1xuXG4gIC8qKlxuICAgKiBIZWlnaHQgb2YgdHJlZXRhYmxlJ3MgYm9keSB3aGVuIHRoZXJlIGlzIG5vIGRhdGEsIG9mIHR5cGUgbnVtYmVyIGRlbm90aW5nIHBpeGVscyBvciBzdHJpbmcuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgZW1wdHlCb2R5SGVpZ2h0OiBudW1iZXIgfCBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogRGVmaW5lcyBpZiBkYXRhIGlzIGxvYWRlZCBhbmQgaW50ZXJhY3RlZCB3aXRoIGluIGxhenkgbWFubmVyLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxhenkgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNhbGwgbGF6eSBsb2FkaW5nIG9uIGluaXRpYWxpemF0aW9uLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxhenlMb2FkT25Jbml0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgZ2xvYmFsIGZpbHRlciBpbiB0aGUgdG9vbGJhci5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93R2xvYmFsRmlsdGVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEdsb2JhbCBmaWx0ZXIgcGxhY2Vob2xkZXIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgZ2xvYmFsRmlsdGVyUGxhY2Vob2xkZXIgPSAnU2VhcmNoJztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgZmllbGRzIHRvIHVzZSBpbiBnbG9iYWwgZmlsdGVyaW5nLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGdsb2JhbEZpbHRlckZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNsZWFyIGdsb2JhbCBmaWx0ZXIgb24gZGF0YSBsb2FkaW5nLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGNsZWFyR2xvYmFsRmlsdGVyT25Mb2FkaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byBzaG93IHJlbW92ZSBidXR0b24gaW4gdGhlIHRvb2xiYXIgd2hlbiByb3dzIGFyZSBzZWxlY3RlZC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93UmVtb3ZlQnRuT25TZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgcmVtb3ZlQnRuT25TZWxlY3QgaXMgZGlzYWJsZWQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgcmVtb3ZlQnRuT25TZWxlY3REaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc2hvdyBhZGRpdGlvbmFsIGJ1dHRvbiBpbiB0aGUgdG9vbGJhciB3aGVuIHJvd3MgYXJlIHNlbGVjdGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dBZGRpdGlvbmFsQnRuT25TZWxlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbEJ0bk9uU2VsZWN0IHRpdGxlLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxCdG5PblNlbGVjdFRpdGxlID0gJ1NlbGVjdCBhY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYWRkaXRpb25hbEJ0bk9uU2VsZWN0IGlzIGRpc2FibGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxCdG5PblNlbGVjdERpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byBzaG93IGFjdGlvbiBidXR0b24gaW4gdGhlIHRvb2xiYXIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2hvd0FjdGlvbkJ0biA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBY3Rpb24gYnV0dG9uIHRpdGxlLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGFjdGlvbkJ0blRpdGxlID0gJ0FjdGlvbic7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBhY3Rpb25CdG4gaXMgZGlzYWJsZWQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgYWN0aW9uQnRuRGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgZGF0YSByZWxvYWQgYnV0dG9uIGluIHRoZSB0b29sYmFyLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNob3dEYXRhUmVsb2FkQnRuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBkYXRhUmVsb2FkQnRuIGlzIGRpc2FibGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGRhdGFSZWxvYWRCdG5EaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRyZWV0YWJsZSBzaG91bGQgc2hvdyBjb2x1bW5zVG9nZ2xlIG1lbnUsIHdoZXJlIHlvdSBjYW4gY2hvb3NlIHdoaWNoIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkLiBJZiBleHRlcm5hbCBib2R5IHRlbXBsYXRlIGlzIHByb3ZpZGVkLCB1c2UgY29sdW1uc1NlbGVjdGVkIGV2ZW50IGVtaXR0ZXIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2hvd0NvbHVtbnNUb2dnbGVCdG4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGNvbHVtbnNUb2dnbGUgYnV0dG9uIGlzIGRpc2FibGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGNvbHVtbnNUb2dnbGVCdG5EaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiBpbml0aWFsIGNvbHVtbnMgdG8gc2hvdyBpbiB0aGUgdHJlZXRhYmxlLiBJZiBub3QgcHJvdmlkZWQsIGFsbCBjb2x1bW5zIGFyZSBpbml0aWFsbHkgdmlzaWJsZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBpbml0aWFsQ29sdW1uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gZGlzcGxheS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZGF0YSh2YWx1ZTogYW55W10pIHtcbiAgICBjb25zdCBjbG9uZSA9IGNsb25lRGVlcCh2YWx1ZSk7XG4gICAgaWYgKGNsb25lICYmIGNsb25lLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGNsb25lLmZvckVhY2goKHY6IGFueSkgPT4ge1xuICAgICAgICB2Ll9kZWZhdWx0U29ydE9yZGVyID0gaSsrO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX2RhdGEgPSBjbG9uZTtcbiAgfVxuXG4gIGdldCBkYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugb24gc2VsZWN0ZWQgcm93cyBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7YW55W119IGFueVtdIC0gc2VsZWN0ZWQgcm93cy5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgcm93c1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYWN0aW9uIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKiBAcGFyYW0ge3ZvaWR9IHZvaWQgLSBhY3Rpb24gYnV0dG9uIGNsaWNrZWQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGFjdGlvbkJ0bkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGFkZGl0aW9uYWwgYnV0dG9uIG9uIHNlbGVjdCBpcyBjbGlja2VkLlxuICAgKiBAcGFyYW0ge2FueVtdfSBhbnlbXSAtIHNlbGVjdGVkIGRhdGEuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGFkZGl0aW9uYWxCdG5PblNlbGVjdENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBlZGl0LXJvdyBidXR0b24gaXMgY2xpY2tlZC5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIGJ1dHRvbiBjbGlja2VkLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBlZGl0Um93QnRuQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiByb3dzIGFyZSByZW1vdmVkLlxuICAgKiBAcGFyYW0ge2FueVtdfSBhbnlbXSAtIGFycmF5IG9mIHJvd3MgdG8gcmVtb3ZlLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSByb3dzVG9SZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBwYWdlIGlzIGNoYW5nZWQuXG4gICAqIEBwYXJhbSB7YW55fSBhbnkgLSBwYWdlIGNoYW5nZWQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGRhdGEgaXMgc29ydGVkLlxuICAgKiBAcGFyYW0ge2FueX0gYW55IC0gU29ydCBkYXRhLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBzb3J0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gZGF0YSBpcyBmaWx0ZXJlZC5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIEN1c3RvbSBmaWx0ZXIgZXZlbnQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGZpbHRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSBvbiBzZWxlY3RlZCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge2FueVtdfSBvYmplY3RbXSAtIHNlbGVjdGlvbiBjaGFuZ2VkLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBjb2x1bW5zU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgW2tleTogc3RyaW5nXTogYW55IH1bXT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gcGFnaW5nLCBzb3J0aW5nIG9yIGZpbHRlcmluZyBoYXBwZW5zIGluIGxhenkgbW9kZS5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIEN1c3RvbSBsYXp5IGxvYWQgZXZlbnQuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGxhenlMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gZGF0YSByZWxvYWQgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqIEBwYXJhbSB7YW55fSBhbnkgLSBkYXRhIHJlbG9hZCBidXR0b24gY2xpY2tlZC5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgZGF0YVJlbG9hZEJ0bkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSBub2RlIGlzIGV4cGFuZGVkLlxuICAgKiBAcGFyYW0ge2FueX0gYW55IC0gTm9kZSBpbnN0YW5jZS5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgbm9kZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgbm9kZSBpcyBjb2xsYXBzZWQuXG4gICAqIEBwYXJhbSB7YW55fSBhbnkgLSBOb2RlIGNvbGxhcHNlIGV2ZW50LlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBub2RlQ29sbGFwc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgbm9kZSBpcyBzZWxlY3RlZC5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIE5vZGUgaW5zdGFuY2UuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIG5vZGVTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiBhIG5vZGUgaXMgdW5zZWxlY3RlZC5cbiAgICogQHBhcmFtIHthbnl9IGFueSAtIEN1c3RvbSBub2RlIHVuc2VsZWN0IGV2ZW50LlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBub2RlVW5zZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIGltcGxlbWVudCBjdXN0b20gc29ydGluZy4gY3VzdG9tU29ydCBtdXN0IGJlIHRydWUuXG4gICAqIEBwYXJhbSB7YW55fSBhbnkgLSBzb3J0IG1ldGEuXG4gICAqIEBncm91cCBFbWl0c1xuICAgKi9cbiAgQE91dHB1dCgpIGN1c3RvbVNvcnRGdW5jdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAQ29udGVudENoaWxkKCd0b29sYmFyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHB1YmxpYyB0b29sYmFyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2hlYWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgaGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ25lc3RlZEhlYWRlcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgbmVzdGVkSGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2JvZHknLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHVibGljIGJvZHlUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQFZpZXdDaGlsZCgncHJpbWVuZ1RyZWVUYWJsZScsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaW1lbmdUcmVlVGFibGUhOiBUcmVlVGFibGU7XG5cbiAgQFZpZXdDaGlsZCgnZ2xvYmFsRmlsdGVyQ29tcCcpXG4gIGdsb2JhbEZpbHRlckNvbXAhOiBDcHNJbnB1dENvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCdjb2xUb2dnbGVNZW51JylcbiAgY29sVG9nZ2xlTWVudSE6IENwc01lbnVDb21wb25lbnQ7XG5cbiAgc2VsZWN0ZWRDb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9W10gPSBbXTtcblxuICByb3dPcHRpb25zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfVtdID0gW107XG5cbiAgLy8gVG9kbzogQWRkIGV4cGxpY2l0IHR5cGVcbiAgc2VsZWN0ZWRSb3dzOiBhbnkgPSBbXTtcblxuICB2aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSAwO1xuICBkZWZTY3JvbGxIZWlnaHQgPSAnJztcblxuICBwcml2YXRlIF9kZWZTY3JvbGxIZWlnaHRQeCA9IDA7XG4gIHByaXZhdGUgX2RlZlNjcm9sbEhlaWdodFB4SW5pdGlhbCA9IDA7XG5cbiAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIF93aW5kb3dSZXNpemVEZWJvdW5jZXI6IGFueTtcbiAgcHJpdmF0ZSBfc2Nyb2xsU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgX2hlYWRlckJveDogYW55O1xuICBwcml2YXRlIF9zY3JvbGxhYmxlQm9keTogYW55O1xuICBwcml2YXRlIF9zY3JvbGxiYXJXaWR0aCA9IDA7XG4gIHByaXZhdGUgX3Njcm9sbGJhclZpc2libGUgPSB0cnVlO1xuXG4gIHByaXZhdGUgX25lZWRSZWNhbGNBdXRvTGF5b3V0ID0gdHJ1ZTtcblxuICBfZGF0YTogYW55W10gPSBbXTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jb25zdHJ1Y3RvclxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHtcbiAgICB0aGlzLl9yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICBjb25zdCBib2R5ID0gZW50cnkudGFyZ2V0O1xuICAgICAgICB0aGlzLl9zY3JvbGxiYXJWaXNpYmxlID0gYm9keS5zY3JvbGxIZWlnaHQgPiBib2R5LmNsaWVudEhlaWdodDtcblxuICAgICAgICBpZiAodGhpcy5fc2Nyb2xsYmFyVmlzaWJsZSAmJiB0aGlzLnZpcnR1YWxTY3JvbGwpXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbGFibGVCb2R5LFxuICAgICAgICAgICAgJ292ZXJmbG93JyxcbiAgICAgICAgICAgICdhdXRvJyxcbiAgICAgICAgICAgIFJlbmRlcmVyU3R5bGVGbGFnczIuSW1wb3J0YW50XG4gICAgICAgICAgKTtcblxuICAgICAgICBsZXQgd1Njcm9sbCA9IHRoaXMuX3Njcm9sbGJhclZpc2libGUgPyB0aGlzLl9zY3JvbGxiYXJXaWR0aCA6IDA7XG4gICAgICAgIGlmICh3U2Nyb2xsID4gMCkgd1Njcm9sbCAtPSAxO1xuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgdGhpcy5faGVhZGVyQm94LFxuICAgICAgICAgICdwYWRkaW5nLXJpZ2h0JyxcbiAgICAgICAgICBgJHt3U2Nyb2xsfXB4YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIHRoaXMuX2hlYWRlckJveCxcbiAgICAgICAgICAnYm9yZGVyLXJpZ2h0JyxcbiAgICAgICAgICB3U2Nyb2xsID4gMCA/ICcxcHggc29saWQgI2Q3ZDVkNScgOiAndW5zZXQnXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fY2FsY0F1dG9MYXlvdXRIZWFkZXJXaWR0aHMoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbGFibGUpIHRoaXMudmlydHVhbFNjcm9sbCA9IGZhbHNlO1xuICAgIHRoaXMuZW1wdHlCb2R5SGVpZ2h0ID0gY29udmVydFNpemUodGhpcy5lbXB0eUJvZHlIZWlnaHQpO1xuICAgIHRoaXMubWluV2lkdGggPSBjb252ZXJ0U2l6ZSh0aGlzLm1pbldpZHRoKTtcblxuICAgIGlmICh0aGlzLnNob3dBZGRpdGlvbmFsQnRuT25TZWxlY3QpIHRoaXMuc2hvd1JlbW92ZUJ0bk9uU2VsZWN0ID0gZmFsc2U7XG5cbiAgICB0aGlzLmRlZlNjcm9sbEhlaWdodCA9IHRoaXMuc2Nyb2xsSGVpZ2h0O1xuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZS5iaW5kKHRoaXMpKTtcblxuICAgICAgaWYgKHRoaXMuZGVmU2Nyb2xsSGVpZ2h0ICYmIHRoaXMuZGVmU2Nyb2xsSGVpZ2h0ICE9PSAnZmxleCcpIHtcbiAgICAgICAgdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHggPSBwYXJzZUludCh0aGlzLnNjcm9sbEhlaWdodCwgMTApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgaWYgKHRoaXMucm93c1BlclBhZ2VPcHRpb25zLmxlbmd0aCA8IDEpXG4gICAgICAgIHRoaXMucm93c1BlclBhZ2VPcHRpb25zID0gWzUsIDEwLCAyNSwgNTBdO1xuXG4gICAgICBpZiAoIXRoaXMucm93cykgdGhpcy5yb3dzID0gdGhpcy5yb3dzUGVyUGFnZU9wdGlvbnNbMF07XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvd3NQZXJQYWdlT3B0aW9ucy5pbmNsdWRlcyh0aGlzLnJvd3MpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb3dzUGVyUGFnZU9wdGlvbnMgbXVzdCBpbmNsdWRlIHJvd3MnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnJvd09wdGlvbnMgPSB0aGlzLnJvd3NQZXJQYWdlT3B0aW9ucy5tYXAoKHYpID0+ICh7XG4gICAgICAgIGxhYmVsOiAnJyArIHYsXG4gICAgICAgIHZhbHVlOiB2XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zaG93R2xvYmFsRmlsdGVyICYmXG4gICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcz8ubGVuZ3RoIDwgMSAmJlxuICAgICAgdGhpcy5kYXRhPy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcyA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YVswXS5kYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9XG4gICAgICB0aGlzLmluaXRpYWxDb2x1bW5zLmxlbmd0aCA+IDAgPyB0aGlzLmluaXRpYWxDb2x1bW5zIDogdGhpcy5jb2x1bW5zO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldE1pbldpZHRoT3ZlcmFsbCgpO1xuXG4gICAgdGhpcy5fc2Nyb2xsYWJsZUJvZHkgPSB0aGlzLnByaW1lbmdUcmVlVGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJy5wLXRyZWV0YWJsZS1zY3JvbGxhYmxlLWJvZHknXG4gICAgKTtcbiAgICBpZiAodGhpcy5fc2Nyb2xsYWJsZUJvZHkpIHtcbiAgICAgIGlmICh0aGlzLm1pbldpZHRoRm9yQm9keU9ubHkgJiYgdGhpcy5taW5XaWR0aCkge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuX3Njcm9sbGFibGVCb2R5LnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0YWJsZSwgJ21pbi13aWR0aCcsIHRoaXMubWluV2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsKSB7XG4gICAgICAgIGlmICh0aGlzLmRlZlNjcm9sbEhlaWdodCA9PT0gJ2ZsZXgnKSB7XG4gICAgICAgICAgdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHggPSB0aGlzLl9zY3JvbGxhYmxlQm9keS5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHhJbml0aWFsID0gdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXV0b0xheW91dCkge1xuICAgICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiA9IGZyb21FdmVudChcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbGFibGVCb2R5LFxuICAgICAgICAgICAgJ3Njcm9sbCdcbiAgICAgICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9oZWFkZXJCb3ggPSB0aGlzLnByaW1lbmdUcmVlVGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLnAtdHJlZXRhYmxlLXNjcm9sbGFibGUtaGVhZGVyLWJveCdcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLl9oZWFkZXJCb3gpIHtcbiAgICAgICAgaWYgKHRoaXMubWluV2lkdGhGb3JCb2R5T25seSAmJiB0aGlzLm1pbldpZHRoKSB7XG4gICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLl9oZWFkZXJCb3gucXVlcnlTZWxlY3RvcigndGFibGUnKTtcbiAgICAgICAgICBpZiAodGFibGUpIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGFibGUsICdtaW4td2lkdGgnLCB0aGlzLm1pbldpZHRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gRG9tSGFuZGxlci5jYWxjdWxhdGVTY3JvbGxiYXJXaWR0aCgpO1xuICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuX3Njcm9sbGFibGVCb2R5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX25lZWRSZWNhbGNBdXRvTGF5b3V0KSB7XG4gICAgICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKCk7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zY3JvbGxhYmxlKSB7XG4gICAgICBjb25zdCB0YWJsZVdyYXBwZXIgPVxuICAgICAgICB0aGlzLnByaW1lbmdUcmVlVGFibGUuZWw/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgJy5wLXRyZWV0YWJsZS13cmFwcGVyJ1xuICAgICAgICApO1xuICAgICAgaWYgKHRhYmxlV3JhcHBlciAmJiB0aGlzLm1pbldpZHRoRm9yQm9keU9ubHkgJiYgdGhpcy5taW5XaWR0aCkge1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRhYmxlV3JhcHBlci5xdWVyeVNlbGVjdG9yKCd0YWJsZScpO1xuICAgICAgICBpZiAodGFibGUpIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGFibGUsICdtaW4td2lkdGgnLCB0aGlzLm1pbldpZHRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuX25lZWRSZWNhbGNBdXRvTGF5b3V0KSB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocygpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuX2RlZlNjcm9sbEhlaWdodFB4ICYmIHRoaXMuZGVmU2Nyb2xsSGVpZ2h0ID09PSAnZmxleCcpIHtcbiAgICAgIHRoaXMuX2RlZlNjcm9sbEhlaWdodFB4ID0gdGhpcy5fc2Nyb2xsYWJsZUJvZHkuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHhJbml0aWFsID0gdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHg7XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbEl0ZW1TaXplKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVjYWxjVmlydHVhbEhlaWdodCgpO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICBpZiAodGhpcy5jbGVhckdsb2JhbEZpbHRlck9uTG9hZGluZykgdGhpcy5jbGVhckdsb2JhbEZpbHRlcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxJdGVtSGVpZ2h0KVxuICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSB0aGlzLnZpcnR1YWxTY3JvbGxJdGVtSGVpZ2h0O1xuXG4gICAgdGhpcy5fc2V0TWluV2lkdGhPdmVyYWxsKCk7XG5cbiAgICBjb25zdCBkYXRhQ2hhbmdlcyA9IGNoYW5nZXM/LmRhdGE7XG5cbiAgICBpZiAoZGF0YUNoYW5nZXM/LnByZXZpb3VzVmFsdWUgIT09IGRhdGFDaGFuZ2VzPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKHRydWUpO1xuICAgIHRoaXMuX3JlY2FsY1ZpcnR1YWxIZWlnaHQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMudmlydHVhbFNjcm9sbCkge1xuICAgICAgaWYgKHRoaXMuYXV0b0xheW91dCkgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uV2luZG93UmVzaXplLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKGZvcmNlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmF1dG9MYXlvdXQgfHwgIXRoaXMuc2Nyb2xsYWJsZSkgcmV0dXJuO1xuXG4gICAgICBpZiAoIXRoaXMuX25lZWRSZWNhbGNBdXRvTGF5b3V0ICYmICFmb3JjZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgaGVhZGVyUm93cyA9IHRoaXMuX2hlYWRlckJveD8ucXVlcnlTZWxlY3RvckFsbCgndHInKTtcbiAgICAgIGlmICghaGVhZGVyUm93cz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGhlYWRlckNlbGxzID1cbiAgICAgICAgaGVhZGVyUm93c1toZWFkZXJSb3dzLmxlbmd0aCAtIDFdPy5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpO1xuICAgICAgaWYgKCFoZWFkZXJDZWxscz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGxldCBoYXNTZWxlY3RhYmxlQ2VsbCA9IGZhbHNlO1xuICAgICAgbGV0IGhhc1Jvd01lbnVDZWxsID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHRocyA9IEFycmF5LmZyb20oaGVhZGVyQ2VsbHMpO1xuICAgICAgaWYgKHRocy5ldmVyeSgodGg6IGFueSkgPT4gdGgub2Zmc2V0V2lkdGggPT09IDApKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRoV2lkdGhzID0gdGhzLm1hcCgodGg6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB3cHJldiA9IHRoLnN0eWxlLndpZHRoO1xuXG4gICAgICAgIGNvbnN0IGlzU2VsZWN0YWJsZUNlbGwgPSB0aC5jbGFzc0xpc3QuY29udGFpbnMoXG4gICAgICAgICAgJ2Nwcy10cmVldGFibGUtc2VsZWN0YWJsZS1jZWxsJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGlzUm93Q2VsbCA9IHRoLmNsYXNzTGlzdC5jb250YWlucygnY3BzLXRyZWV0YWJsZS1yb3ctbWVudS1jZWxsJyk7XG5cbiAgICAgICAgaWYgKGlzU2VsZWN0YWJsZUNlbGwpIGhhc1NlbGVjdGFibGVDZWxsID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlzUm93Q2VsbCkgaGFzUm93TWVudUNlbGwgPSB0cnVlO1xuXG4gICAgICAgIGxldCB0aFdpZHRoID0gNTU7XG4gICAgICAgIGlmICghaXNTZWxlY3RhYmxlQ2VsbCAmJiAhaXNSb3dDZWxsKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aCwgJ3dpZHRoJywgJ21pbi1jb250ZW50Jyk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoLCAndGV4dC13cmFwJywgJ25vd3JhcCcpO1xuICAgICAgICAgIHRoV2lkdGggPSB0aC5vZmZzZXRXaWR0aDtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoLCAnd2lkdGgnLCB3cHJldik7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0aCwgJ2Rpc3BsYXknKTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoLCAndGV4dC13cmFwJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoV2lkdGg7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYm9keVJvd3MgPSB0aGlzLl9zY3JvbGxhYmxlQm9keT8ucXVlcnlTZWxlY3RvckFsbCgndHInKTtcbiAgICAgIGlmICghYm9keVJvd3M/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0ZFdpZHRoczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgY29uc3QgaGlkZGVuRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBoaWRkZW5EaXYuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgaGlkZGVuRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgIGhpZGRlbkRpdi5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlkZGVuRGl2KTtcbiAgICAgIGJvZHlSb3dzLmZvckVhY2goKHRyOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCB0ZHMgPSB0cj8ucXVlcnlTZWxlY3RvckFsbCgndGQnKTtcbiAgICAgICAgdGRzPy5mb3JFYWNoKCh0ZDogSFRNTEVsZW1lbnQsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RhYmxlT3JSb3dNZW51Q2VsbCA9XG4gICAgICAgICAgICB0ZC5jbGFzc0xpc3QuY29udGFpbnMoJ2Nwcy10cmVldGFibGUtc2VsZWN0YWJsZS1jZWxsJykgfHxcbiAgICAgICAgICAgIHRkLmNsYXNzTGlzdC5jb250YWlucygnY3BzLXRyZWV0YWJsZS1yb3ctbWVudS1jZWxsJyk7XG5cbiAgICAgICAgICBsZXQgdGRXaWR0aCA9IDU1O1xuICAgICAgICAgIGlmICghaXNTZWxlY3RhYmxlT3JSb3dNZW51Q2VsbCkge1xuICAgICAgICAgICAgY29uc3QgY2xvbmVkVGQgPSB0ZC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjbG9uZWRUZCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNsb25lZFRkLCAnd2lkdGgnLCAnbWluLWNvbnRlbnQnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY2xvbmVkVGQsICdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgICAgICBoaWRkZW5EaXYuaW5uZXJIVE1MID0gY2xvbmVkVGQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgaGlkZGVuRGl2LnN0eWxlLndpZHRoID0gJ2F1dG8nO1xuICAgICAgICAgICAgdGRXaWR0aCA9IGhpZGRlbkRpdi5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIGZyYWdtZW50LnJlbW92ZUNoaWxkKGNsb25lZFRkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0ZFdpZHRoc1tpZHhdKSB0ZFdpZHRoc1tpZHhdID0gMDtcbiAgICAgICAgICB0ZFdpZHRoc1tpZHhdID0gTWF0aC5tYXgodGRXaWR0aHNbaWR4XSwgdGRXaWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGhpZGRlbkRpdik7XG5cbiAgICAgIGlmICh0aFdpZHRocy5sZW5ndGggIT09IHRkV2lkdGhzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBtYXhXaWR0aHMgPSB0aFdpZHRocy5tYXAoKHYsIGlkeCkgPT4gTWF0aC5tYXgodiwgdGRXaWR0aHNbaWR4XSkpO1xuICAgICAgbGV0IHN1bSA9IG1heFdpZHRocy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgIGlmIChoYXNTZWxlY3RhYmxlQ2VsbCkge1xuICAgICAgICBzdW0gLT0gNTU7XG4gICAgICAgIG1heFdpZHRocy5zaGlmdCgpO1xuICAgICAgfVxuICAgICAgaWYgKGhhc1Jvd01lbnVDZWxsKSB7XG4gICAgICAgIHN1bSAtPSA1NTtcbiAgICAgICAgbWF4V2lkdGhzLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwZXJjZW50YWdlcyA9IG1heFdpZHRocy5tYXAoKHYpID0+ICh2IC8gc3VtKSAqIDEwMCk7XG5cbiAgICAgIGhlYWRlckNlbGxzLmZvckVhY2goKHRoOiBhbnksIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoaGFzU2VsZWN0YWJsZUNlbGwgJiYgaWR4ID09PSAwKSB8fFxuICAgICAgICAgIChoYXNSb3dNZW51Q2VsbCAmJiBpZHggPT09IGhlYWRlckNlbGxzLmxlbmd0aCAtIDEpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGgsICd3aWR0aCcsICc1NXB4Jyk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICB0aCxcbiAgICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgICBwZXJjZW50YWdlc1toYXNTZWxlY3RhYmxlQ2VsbCA/IGlkeCAtIDEgOiBpZHhdICsgJyUnXG4gICAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBib2R5Um93cy5mb3JFYWNoKCh0cjogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGRzID0gdHI/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7XG4gICAgICAgIHRkcz8uZm9yRWFjaCgodGQ6IEhUTUxFbGVtZW50LCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChoYXNTZWxlY3RhYmxlQ2VsbCAmJiBpZHggPT09IDApIHx8XG4gICAgICAgICAgICAoaGFzUm93TWVudUNlbGwgJiYgaWR4ID09PSB0ZHMubGVuZ3RoIC0gMSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGQsICd3aWR0aCcsICc1NXB4Jyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgIHRkLFxuICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICBwZXJjZW50YWdlc1toYXNTZWxlY3RhYmxlQ2VsbCA/IGlkeCAtIDEgOiBpZHhdICsgJyUnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRkLCAnb3BhY2l0eScsICcxJyk7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0ZCwgJ292ZXJmbG93JywgJ2hpZGRlbicpO1xuICAgICAgICAgIGlmICh0aGlzLmJvcmRlcmVkKVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICAgICAgdGQsXG4gICAgICAgICAgICAgICdib3JkZXItbGVmdC1jb2xvcicsXG4gICAgICAgICAgICAgICd2YXIoLS1jcHMtY29sb3ItbGluZS1taWQpJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fbmVlZFJlY2FsY0F1dG9MYXlvdXQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMudmlydHVhbFNjcm9sbCB8fCB0aGlzLnZpcnR1YWxTY3JvbGxJdGVtSGVpZ2h0KSByZXR1cm47XG5cbiAgICBjb25zdCB0cnMgPSB0aGlzLnByaW1lbmdUcmVlVGFibGU/LmVsPy5uYXRpdmVFbGVtZW50XG4gICAgICA/LnF1ZXJ5U2VsZWN0b3IoJy5wLXRyZWV0YWJsZS10Ym9keScpXG4gICAgICA/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJyk7XG5cbiAgICBpZiAoIXRycz8ubGVuZ3RoKSByZXR1cm47XG4gICAgaWYgKCF0cnNbMF0/Lm9mZnNldEhlaWdodCkgcmV0dXJuO1xuXG4gICAgbGV0IGggPSAwO1xuICAgIHRycy5mb3JFYWNoKCh0cjogSFRNTEVsZW1lbnQsIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgcmggPSAwO1xuICAgICAgY29uc3QgdGRzID0gdHI/LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7XG4gICAgICB0ZHM/LmZvckVhY2goKHRkOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCB3cHJldiA9IHRkLnN0eWxlLndpZHRoO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRkLCAnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRkLCAnd2lkdGgnKTtcbiAgICAgICAgaWYgKHRkLm9mZnNldEhlaWdodCkgcmggPSBNYXRoLm1heChyaCwgdGQub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVTdHlsZSh0ZCwgJ2Rpc3BsYXknKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0ZCwgJ3dpZHRoJywgd3ByZXYpO1xuICAgICAgfSk7XG4gICAgICBpZiAocmgpIHtcbiAgICAgICAgaCA9IGlkeCA9PT0gMCA/IHJoIDogTWF0aC5taW4oaCwgcmgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy52aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSBoO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0TWluV2lkdGhPdmVyYWxsKCkge1xuICAgIGlmICh0aGlzLm1pbldpZHRoRm9yQm9keU9ubHkgfHwgIXRoaXMubWluV2lkdGggfHwgIXRoaXMucHJpbWVuZ1RyZWVUYWJsZSlcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IHRyZWVUYWJsZU1haW4gPVxuICAgICAgdGhpcy5wcmltZW5nVHJlZVRhYmxlLmVsPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCcucC10cmVldGFibGUnKTtcbiAgICBpZiAodHJlZVRhYmxlTWFpbikge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0cmVlVGFibGVNYWluLCAnb3ZlcmZsb3cnLCAnYXV0bycpO1xuICAgICAgY29uc3QgcGFnaW5hdG9yRWwgPSB0cmVlVGFibGVNYWluLnF1ZXJ5U2VsZWN0b3IoJy5wLXBhZ2luYXRvcicpO1xuICAgICAgaWYgKHBhZ2luYXRvckVsKVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHBhZ2luYXRvckVsLCAnbWluLXdpZHRoJywgdGhpcy5taW5XaWR0aCk7XG4gICAgICBjb25zdCBsb2FkaW5nT3ZlcmxheSA9IHRyZWVUYWJsZU1haW4ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJy5wLXRyZWV0YWJsZS1sb2FkaW5nLW92ZXJsYXknXG4gICAgICApO1xuICAgICAgaWYgKGxvYWRpbmdPdmVybGF5KVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGxvYWRpbmdPdmVybGF5LCAnbWluLXdpZHRoJywgdGhpcy5taW5XaWR0aCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsYWJsZVdyYXBwZXIgPVxuICAgICAgdGhpcy5wcmltZW5nVHJlZVRhYmxlLmVsPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLnAtdHJlZXRhYmxlLXNjcm9sbGFibGUtd3JhcHBlcidcbiAgICAgICk7XG4gICAgaWYgKHNjcm9sbGFibGVXcmFwcGVyKVxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShzY3JvbGxhYmxlV3JhcHBlciwgJ21pbi13aWR0aCcsIHRoaXMubWluV2lkdGgpO1xuXG4gICAgaWYgKCF0aGlzLnNjcm9sbGFibGUpIHtcbiAgICAgIGNvbnN0IHRhYmxlV3JhcHBlciA9XG4gICAgICAgIHRoaXMucHJpbWVuZ1RyZWVUYWJsZS5lbD8ubmF0aXZlRWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAnLnAtdHJlZXRhYmxlLXdyYXBwZXInXG4gICAgICAgICk7XG4gICAgICBpZiAodGFibGVXcmFwcGVyKVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRhYmxlV3JhcHBlciwgJ21pbi13aWR0aCcsIHRoaXMubWluV2lkdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyZWVUYWJsZUhlYWRlciA9XG4gICAgICB0aGlzLnByaW1lbmdUcmVlVGFibGUuZWw/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcucC10cmVldGFibGUtaGVhZGVyJ1xuICAgICAgKTtcbiAgICBpZiAodHJlZVRhYmxlSGVhZGVyKVxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0cmVlVGFibGVIZWFkZXIsICdtaW4td2lkdGgnLCB0aGlzLm1pbldpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uV2luZG93UmVzaXplKCkge1xuICAgIC8vIGlmICh0aGlzLmRlZlNjcm9sbEhlaWdodCA9PT0gJ2ZsZXgnKVxuICAgIC8vICAgdGhpcy5kZWZTY3JvbGxIZWlnaHRQeCA9IHRoaXMuc2Nyb2xsYWJsZUJvZHkuY2xpZW50SGVpZ2h0O1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3dpbmRvd1Jlc2l6ZURlYm91bmNlcik7XG4gICAgdGhpcy5fd2luZG93UmVzaXplRGVib3VuY2VyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9yZWNhbGNWaXJ0dWFsSGVpZ2h0KCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGdldCBzdHlsZUNsYXNzKCkge1xuICAgIGNvbnN0IGNsYXNzZXNMaXN0ID0gW107XG4gICAgc3dpdGNoICh0aGlzLnNpemUpIHtcbiAgICAgIGNhc2UgJ3NtYWxsJzpcbiAgICAgICAgY2xhc3Nlc0xpc3QucHVzaCgncC10cmVldGFibGUtc20nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsYXJnZSc6XG4gICAgICAgIGNsYXNzZXNMaXN0LnB1c2goJ3AtdHJlZXRhYmxlLWxnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNUb29sYmFyKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMudG9vbGJhclNpemUpIHtcbiAgICAgICAgY2FzZSAnc21hbGwnOlxuICAgICAgICAgIGNsYXNzZXNMaXN0LnB1c2goJ2Nwcy10YmFyLXNtYWxsJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ25vcm1hbCc6XG4gICAgICAgICAgY2xhc3Nlc0xpc3QucHVzaCgnY3BzLXRiYXItbm9ybWFsJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnN0cmlwZWQpIHtcbiAgICAgIGNsYXNzZXNMaXN0LnB1c2goJ3AtdHJlZXRhYmxlLXN0cmlwZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm9yZGVyZWQpIHtcbiAgICAgIGNsYXNzZXNMaXN0LnB1c2goJ3AtdHJlZXRhYmxlLWdyaWRsaW5lcycpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGFzc2VzTGlzdC5qb2luKCcgJyk7XG4gIH1cblxuICBwcml2YXRlIF9yZWNhbGNWaXJ0dWFsSGVpZ2h0KCkge1xuICAgIGlmICghdGhpcy5fc2Nyb2xsYmFyVmlzaWJsZSAmJiB0aGlzLnZpcnR1YWxTY3JvbGwpXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICB0aGlzLl9zY3JvbGxhYmxlQm9keSxcbiAgICAgICAgJ292ZXJmbG93JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgIFJlbmRlcmVyU3R5bGVGbGFnczIuSW1wb3J0YW50XG4gICAgICApO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsICYmIHRoaXMuZGVmU2Nyb2xsSGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVZpcnR1YWxTY3JvbGxJdGVtU2l6ZSgpO1xuICAgICAgICAvLyBUb2RvOiBBZGQgZXhwbGljaXQgdHlwZVxuICAgICAgICBjb25zdCBpdGVtc0xlbiA9ICh0aGlzLnByaW1lbmdUcmVlVGFibGUuc2VyaWFsaXplZFZhbHVlIGFzIGFueSkubGVuZ3RoO1xuICAgICAgICBpZiAoaXRlbXNMZW4gPCAxKSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxIZWlnaHQgPSB0aGlzLmVtcHR5Qm9keUhlaWdodFxuICAgICAgICAgICAgPyAoYGNhbGMoJHt0aGlzLmVtcHR5Qm9keUhlaWdodH0gKyAxcHgpYCBhcyBzdHJpbmcpXG4gICAgICAgICAgICA6IHRoaXMudmlydHVhbFNjcm9sbEl0ZW1TaXplICsgMSArICdweCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY3VySGVpZ2h0ID0gdGhpcy52aXJ0dWFsU2Nyb2xsSXRlbVNpemUgKiBpdGVtc0xlbiArIDI7XG4gICAgICAgICAgaWYgKHRoaXMuZGVmU2Nyb2xsSGVpZ2h0ID09PSAnZmxleCcpIHtcbiAgICAgICAgICAgIGlmIChjdXJIZWlnaHQgPj0gdGhpcy5fZGVmU2Nyb2xsSGVpZ2h0UHhJbml0aWFsKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gJ2ZsZXgnO1xuICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuX3Njcm9sbGFibGVCb2R5LCAnaGVpZ2h0JywgJzEwMCUnKTtcbiAgICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNjcm9sbEhlaWdodCA9XG4gICAgICAgICAgICBNYXRoLm1pbih0aGlzLl9kZWZTY3JvbGxIZWlnaHRQeCwgY3VySGVpZ2h0KSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyR2xvYmFsRmlsdGVyKCkge1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVyQ29tcD8uY2xlYXIoKTtcbiAgfVxuXG4gIC8vIFRvZG86IFVzZSBleHBsaWNpdCB0eXBlXG4gIG9uU29ydEZ1bmN0aW9uKGV2ZW50OiBTb3J0RXZlbnQgfCBhbnkpIHtcbiAgICB0aGlzLmN1c3RvbVNvcnRGdW5jdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uRmlsdGVyR2xvYmFsKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByaW1lbmdUcmVlVGFibGUuZmlsdGVyR2xvYmFsKHZhbHVlLCAnY29udGFpbnMnKTtcbiAgfVxuXG4gIG9uQ2xpY2tBZGRpdGlvbmFsQnRuT25TZWxlY3QoKSB7XG4gICAgdGhpcy5hZGRpdGlvbmFsQnRuT25TZWxlY3RDbGlja2VkLmVtaXQodGhpcy5zZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgb25DbGlja0FjdGlvbkJ0bigpIHtcbiAgICB0aGlzLmFjdGlvbkJ0bkNsaWNrZWQuZW1pdCgpO1xuICB9XG5cbiAgb25SZWxvYWREYXRhKCkge1xuICAgIGlmICh0aGlzLmRhdGFSZWxvYWRCdG5EaXNhYmxlZCkgcmV0dXJuO1xuICAgIHRoaXMuZGF0YVJlbG9hZEJ0bkNsaWNrZWQuZW1pdCgpO1xuICB9XG5cbiAgb25Db2x1bW5zVG9nZ2xlKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5jb2x1bW5zVG9nZ2xlQnRuRGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLmNvbFRvZ2dsZU1lbnU/LnRvZ2dsZShldmVudCk7XG4gIH1cblxuICByZW1vdmVTZWxlY3RlZCgpIHtcbiAgICB0aGlzLnJvd3NUb1JlbW92ZS5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gW107XG4gIH1cblxuICBvbkVkaXRSb3dDbGlja2VkKG5vZGU6IGFueSkge1xuICAgIHRoaXMuZWRpdFJvd0J0bkNsaWNrZWQuZW1pdChub2RlKTtcbiAgfVxuXG4gIG9uUmVtb3ZlUm93Q2xpY2tlZChub2RlOiBhbnkpIHtcbiAgICB0aGlzLnJvd3NUb1JlbW92ZS5lbWl0KFtub2RlXSk7XG4gIH1cblxuICB0b2dnbGVBbGxDb2x1bW5zKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID1cbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA8IHRoaXMuY29sdW1ucy5sZW5ndGggPyB0aGlzLmNvbHVtbnMgOiBbXTtcbiAgICB0aGlzLmNvbHVtbnNTZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0ZWRDb2x1bW5zKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgaXNDb2x1bW5TZWxlY3RlZChjb2w6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ29sdW1ucy5zb21lKChpdGVtKSA9PiBpc0VxdWFsKGl0ZW0sIGNvbCkpO1xuICB9XG5cbiAgb25Sb3dzUGVyUGFnZUNoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMucmVzZXRQYWdlT25Sb3dzQ2hhbmdlKSB7XG4gICAgICB0aGlzLnByaW1lbmdUcmVlVGFibGUuZmlyc3QgPSAwO1xuICAgIH1cbiAgICB0aGlzLmNoYW5nZVBhZ2UodGhpcy5nZXRQYWdlKCkpO1xuICB9XG5cbiAgZ2V0UGFnZUNvdW50KCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5wcmltZW5nVHJlZVRhYmxlLnRvdGFsUmVjb3JkcyAvIHRoaXMucm93cyk7XG4gIH1cblxuICBnZXRQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5wcmltZW5nVHJlZVRhYmxlLmZpcnN0IC8gdGhpcy5yb3dzKTtcbiAgfVxuXG4gIGNoYW5nZVBhZ2UocDogbnVtYmVyKSB7XG4gICAgY29uc3QgcGMgPSBNYXRoLmNlaWwodGhpcy5nZXRQYWdlQ291bnQoKSk7XG5cbiAgICBpZiAocCA+PSAwICYmIHAgPCBwYykge1xuICAgICAgdGhpcy5maXJzdCA9IHRoaXMucm93cyAqIHA7XG4gICAgICB0aGlzLnByaW1lbmdUcmVlVGFibGUub25QYWdlQ2hhbmdlKHtcbiAgICAgICAgZmlyc3Q6IHRoaXMuZmlyc3QsXG4gICAgICAgIHJvd3M6IHRoaXMucm93c1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25QYWdlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZpcnN0ID0gZXZlbnQuZmlyc3Q7XG4gICAgdGhpcy5yb3dzID0gZXZlbnQucm93cztcblxuICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgcGFnZTogdGhpcy5nZXRQYWdlKCksXG4gICAgICBmaXJzdDogdGhpcy5maXJzdCxcbiAgICAgIHJvd3M6IHRoaXMucm93cyxcbiAgICAgIHBhZ2VDb3VudDogTWF0aC5jZWlsKHRoaXMuZ2V0UGFnZUNvdW50KCkpXG4gICAgfTtcblxuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChzdGF0ZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uTGF6eUxvYWRlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5sYXp5TG9hZGVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25Ob2RlRXhwYW5kZWQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubm9kZUV4cGFuZGVkLmVtaXQoZXZlbnQpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fY2FsY0F1dG9MYXlvdXRIZWFkZXJXaWR0aHModHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVjYWxjVmlydHVhbEhlaWdodCgpO1xuICB9XG5cbiAgb25Ob2RlQ29sbGFwc2VkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm5vZGVDb2xsYXBzZWQuZW1pdChldmVudCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZWNhbGNWaXJ0dWFsSGVpZ2h0KCk7XG4gIH1cblxuICBvbk5vZGVTZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBvbk5vZGVVbnNlbGVjdGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLm5vZGVVbnNlbGVjdGVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb25Tb3J0KGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnNvcnRlZC5lbWl0KGV2ZW50KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2NhbGNBdXRvTGF5b3V0SGVhZGVyV2lkdGhzKHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgb25GaWx0ZXIoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZmlsdGVyZWQuZW1pdChldmVudCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICB9KTtcbiAgICB0aGlzLl9yZWNhbGNWaXJ0dWFsSGVpZ2h0KCk7XG4gIH1cblxuICBvblNlbGVjdENvbHVtbihjb2w6IGFueSkge1xuICAgIGxldCByZXMgPSBbXSBhcyBhbnk7XG4gICAgaWYgKHRoaXMuaXNDb2x1bW5TZWxlY3RlZChjb2wpKSB7XG4gICAgICByZXMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoKHY6IGFueSkgPT4gIWlzRXF1YWwodiwgY29sKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChvKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucy5zb21lKCh2OiBhbnkpID0+IGlzRXF1YWwodiwgbykpIHx8XG4gICAgICAgICAgaXNFcXVhbChjb2wsIG8pXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcy5wdXNoKG8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSByZXM7XG4gICAgdGhpcy5jb2x1bW5zU2VsZWN0ZWQuZW1pdCh0aGlzLnNlbGVjdGVkQ29sdW1ucyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jYWxjQXV0b0xheW91dEhlYWRlcldpZHRocyh0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFJlcGxhY2Ugd2l0aCBleHBsaWNpdCB0eXBlXG4gIG9uU2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb246IGFueVtdIHwgYW55KSB7XG4gICAgdGhpcy5yb3dzU2VsZWN0ZWQuZW1pdChzZWxlY3Rpb24pO1xuICB9XG59XG4iLCI8cC10cmVlVGFibGVcbiAgI3ByaW1lbmdUcmVlVGFibGVcbiAgdHRXaXRoVW5zb3J0XG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnY3BzLXRyZWV0YWJsZS1sb2FkaW5nJzogbG9hZGluZyxcbiAgICAnY3BzLXRyZWV0YWJsZS1mbGV4JzogZGVmU2Nyb2xsSGVpZ2h0ID09PSAnZmxleCcsXG4gICAgJ2Nwcy10cmVldGFibGUtbm9udmlydHVhbCc6ICF2aXJ0dWFsU2Nyb2xsLFxuICAgICdjcHMtdHJlZXRhYmxlLWF1dG9sYXlvdXQtY2FsY2VkJzogYXV0b0xheW91dCAmJiBzY3JvbGxhYmxlLFxuICB9XCJcbiAgW3ZhbHVlXT1cImRhdGFcIlxuICBbYXV0b0xheW91dF09XCJhdXRvTGF5b3V0ICYmICFzY3JvbGxhYmxlXCJcbiAgW3Njcm9sbGFibGVdPVwic2Nyb2xsYWJsZVwiXG4gIFtzY3JvbGxIZWlnaHRdPVwic2Nyb2xsSGVpZ2h0XCJcbiAgW3ZpcnR1YWxTY3JvbGxdPVwidmlydHVhbFNjcm9sbFwiXG4gIFt2aXJ0dWFsU2Nyb2xsSXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplXCJcbiAgW3ZpcnR1YWxTY3JvbGxPcHRpb25zXT1cIntcbiAgICBudW1Ub2xlcmF0ZWRJdGVtczogbnVtVG9sZXJhdGVkSXRlbXMsXG4gICAgYXV0b1NpemU6IGZhbHNlXG4gIH1cIlxuICBbY29sdW1uc109XCJzZWxlY3RlZENvbHVtbnNcIlxuICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgW3Jvd0hvdmVyXT1cInJvd0hvdmVyXCJcbiAgW2xhenldPVwibGF6eVwiXG4gIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZFJvd3NcIlxuICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCJcbiAgY29tcGFyZVNlbGVjdGlvbkJ5PVwiZGVlcEVxdWFsc1wiXG4gIFtsYXp5TG9hZE9uSW5pdF09XCJsYXp5TG9hZE9uSW5pdFwiXG4gIFtzdHlsZUNsYXNzXT1cInN0eWxlQ2xhc3NcIlxuICBbdGFibGVTdHlsZV09XCJ0YWJsZVN0eWxlXCJcbiAgW3RhYmxlU3R5bGVDbGFzc109XCJ0YWJsZVN0eWxlQ2xhc3NcIlxuICBbY3VzdG9tU29ydF09XCJjdXN0b21Tb3J0XCJcbiAgW3NvcnRNb2RlXT1cInNvcnRNb2RlXCJcbiAgW2dsb2JhbEZpbHRlckZpZWxkc109XCJnbG9iYWxGaWx0ZXJGaWVsZHNcIlxuICBbcGFnaW5hdG9yXT1cInBhZ2luYXRvclwiXG4gIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gIFthbHdheXNTaG93UGFnaW5hdG9yXT1cImFsd2F5c1Nob3dQYWdpbmF0b3JcIlxuICBbcm93c109XCJyb3dzXCJcbiAgW2ZpcnN0XT1cImZpcnN0XCJcbiAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbFJlY29yZHNcIlxuICBbcmVzZXRQYWdlT25Tb3J0XT1cInJlc2V0UGFnZU9uU29ydFwiXG4gIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IC0ge2xhc3R9IG9mIHt0b3RhbFJlY29yZHN9XCJcbiAgKG9uUGFnZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gIChvblNvcnQpPVwib25Tb3J0KCRldmVudClcIlxuICAob25GaWx0ZXIpPVwib25GaWx0ZXIoJGV2ZW50KVwiXG4gIChvbkxhenlMb2FkKT1cIm9uTGF6eUxvYWRlZCgkZXZlbnQpXCJcbiAgKHNvcnRGdW5jdGlvbik9XCJvblNvcnRGdW5jdGlvbigkZXZlbnQpXCJcbiAgKG9uTm9kZUV4cGFuZCk9XCJvbk5vZGVFeHBhbmRlZCgkZXZlbnQpXCJcbiAgKG9uTm9kZUNvbGxhcHNlKT1cIm9uTm9kZUNvbGxhcHNlZCgkZXZlbnQpXCJcbiAgKG9uTm9kZVNlbGVjdCk9XCJvbk5vZGVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgKG9uTm9kZVVuc2VsZWN0KT1cIm9uTm9kZVVuc2VsZWN0ZWQoJGV2ZW50KVwiPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiICpuZ0lmPVwiaGFzVG9vbGJhclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0b29sYmFyVGVtcGxhdGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b29sYmFyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRvb2xiYXJUZW1wbGF0ZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNwcy10cmVldGFibGUtdGJhci1sZWZ0XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0b29sYmFySWNvblwiIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS10YmFyLWljb25cIj5cbiAgICAgICAgICA8Y3BzLWljb24gW2ljb25dPVwidG9vbGJhckljb25cIiBbY29sb3JdPVwidG9vbGJhckljb25Db2xvclwiPjwvY3BzLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3BzLXRyZWV0YWJsZS10YmFyLXRpdGxlXCI+e3sgdG9vbGJhclRpdGxlIH19PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93R2xvYmFsRmlsdGVyXCIgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLXRiYXItZ2xvYmFsLWZpbHRlclwiPlxuICAgICAgICAgIDxjcHMtaW5wdXRcbiAgICAgICAgICAgICNnbG9iYWxGaWx0ZXJDb21wXG4gICAgICAgICAgICBwcmVmaXhJY29uPVwic2VhcmNoXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnbG9iYWxGaWx0ZXJQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIm9uRmlsdGVyR2xvYmFsKCRldmVudClcIlxuICAgICAgICAgICAgW2NsZWFyYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nXCJcbiAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cInRvb2xiYXJTaXplID09PSAnc21hbGwnID8gJ3VuZGVybGluZWQnIDogJ291dGxpbmVkJ1wiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiPlxuICAgICAgICAgIDwvY3BzLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNwcy10cmVldGFibGUtdGJhci1yaWdodFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJzaG93UmVtb3ZlQnRuT25TZWxlY3QgJiYgc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS10YmFyLWJ0bi1vbi1zZWxlY3RcIj5cbiAgICAgICAgICA8Y3BzLWJ1dHRvblxuICAgICAgICAgICAgbGFiZWw9XCJSZW1vdmVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlbW92ZUJ0bk9uU2VsZWN0RGlzYWJsZWRcIlxuICAgICAgICAgICAgY29sb3I9XCJwcmVwYXJlZFwiXG4gICAgICAgICAgICB0eXBlPVwiYm9yZGVybGVzc1wiXG4gICAgICAgICAgICBpY29uPVwicmVtb3ZlXCJcbiAgICAgICAgICAgIFtzaXplXT1cInRvb2xiYXJTaXplXCJcbiAgICAgICAgICAgIChjbGlja2VkKT1cInJlbW92ZVNlbGVjdGVkKClcIj5cbiAgICAgICAgICA8L2Nwcy1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJzaG93QWRkaXRpb25hbEJ0bk9uU2VsZWN0ICYmIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBjbGFzcz1cImNwcy10cmVldGFibGUtdGJhci1idG4tb24tc2VsZWN0XCI+XG4gICAgICAgICAgPGNwcy1idXR0b25cbiAgICAgICAgICAgIFtsYWJlbF09XCJhZGRpdGlvbmFsQnRuT25TZWxlY3RUaXRsZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWRkaXRpb25hbEJ0bk9uU2VsZWN0RGlzYWJsZWRcIlxuICAgICAgICAgICAgY29sb3I9XCJwcmVwYXJlZFwiXG4gICAgICAgICAgICB0eXBlPVwiYm9yZGVybGVzc1wiXG4gICAgICAgICAgICBbc2l6ZV09XCJ0b29sYmFyU2l6ZVwiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkNsaWNrQWRkaXRpb25hbEJ0bk9uU2VsZWN0KClcIj5cbiAgICAgICAgICA8L2Nwcy1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0FjdGlvbkJ0blwiIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS10YmFyLWFjdGlvbi1idG5cIj5cbiAgICAgICAgICA8Y3BzLWJ1dHRvblxuICAgICAgICAgICAgW2xhYmVsXT1cImFjdGlvbkJ0blRpdGxlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb25CdG5EaXNhYmxlZFwiXG4gICAgICAgICAgICBjb2xvcj1cInByZXBhcmVkXCJcbiAgICAgICAgICAgIHR5cGU9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICBbc2l6ZV09XCJ0b29sYmFyU2l6ZVwiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkNsaWNrQWN0aW9uQnRuKClcIj5cbiAgICAgICAgICA8L2Nwcy1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJzaG93Q29sdW1uc1RvZ2dsZUJ0biAmJiBjb2x1bW5zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS10YmFyLWNvbHRvZ2dsZS1idG5cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1kaXNhYmxlZCc6IGNvbHVtbnNUb2dnbGVCdG5EaXNhYmxlZCB9XCI+XG4gICAgICAgICAgPGNwcy1pY29uXG4gICAgICAgICAgICBpY29uPVwiY29sdW1uc1wiXG4gICAgICAgICAgICBzaXplPVwibm9ybWFsXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJcbiAgICAgICAgICAgICAgY29sdW1uc1RvZ2dsZUJ0bkRpc2FibGVkID8gJ3RleHQtbGlnaHRlc3QnIDogJ3ByZXBhcmVkLWxpZ2h0ZW4xJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNvbHVtbnNUb2dnbGUoJGV2ZW50KVwiPjwvY3BzLWljb24+XG4gICAgICAgICAgPGNwcy1tZW51ICNjb2xUb2dnbGVNZW51IFt3aXRoQXJyb3ddPVwiZmFsc2VcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWNvbHRvZ2dsZS1tZW51XCI+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNwcy10cmVldGFibGUtY29sdG9nZ2xlLW1lbnUtaXRlbSBzZWxlY3QtYWxsLW9wdGlvblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsbHNlbGVjdGVkXT1cInNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT09IGNvbHVtbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWxsQ29sdW1ucygpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWNvbHRvZ2dsZS1tZW51LWl0ZW0tbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWNvbHRvZ2dsZS1tZW51LWl0ZW0tY2hlY2tcIj4gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWNvbHRvZ2dsZS1tZW51LWl0ZW0tbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICA+U2hvdyBhbGwgY29sdW1uczwvc3BhblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS1jb2x0b2dnbGUtbWVudS1pdGVtXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZWxlY3RDb2x1bW4oY29sKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzQ29sdW1uU2VsZWN0ZWQoY29sKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS1jb2x0b2dnbGUtbWVudS1pdGVtLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS1jb2x0b2dnbGUtbWVudS1pdGVtLWNoZWNrXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcHMtdHJlZXRhYmxlLWNvbHRvZ2dsZS1tZW51LWl0ZW0tbGFiZWxcIj57e1xuICAgICAgICAgICAgICAgICAgICBjb2xbY29sSGVhZGVyTmFtZV1cbiAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Nwcy1tZW51PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwic2hvd0RhdGFSZWxvYWRCdG5cIlxuICAgICAgICAgIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS10YmFyLXJlbG9hZC1idG5cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1kaXNhYmxlZCc6IGRhdGFSZWxvYWRCdG5EaXNhYmxlZCB9XCI+XG4gICAgICAgICAgPGNwcy1pY29uXG4gICAgICAgICAgICBpY29uPVwicmVmcmVzaFwiXG4gICAgICAgICAgICBzaXplPVwiMThcIlxuICAgICAgICAgICAgW2NvbG9yXT1cImRhdGFSZWxvYWRCdG5EaXNhYmxlZCA/ICd0ZXh0LWxpZ2h0JyA6ICdwcmVwYXJlZC1saWdodGVuMSdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVsb2FkRGF0YSgpXCI+XG4gICAgICAgICAgPC9jcHMtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgKm5nSWY9XCJuZXN0ZWRIZWFkZXJUZW1wbGF0ZVwiIGxldC1jb2x1bW5zPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBuZXN0ZWRIZWFkZXJUZW1wbGF0ZTtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICRpbXBsaWNpdDogY29sdW1ucyxcbiAgICAgICAgfVxuICAgICAgXCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiICpuZ0lmPVwiIW5lc3RlZEhlYWRlclRlbXBsYXRlXCIgbGV0LWNvbHVtbnM+XG4gICAgPHRyPlxuICAgICAgPCEtLSA8dGggc3R5bGU9XCJ3aWR0aDogM3JlbVwiICpuZ0lmPVwicmVvcmRlcmFibGVSb3dzXCI+PC90aD4gLS0+XG4gICAgICA8dGggKm5nSWY9XCJzZWxlY3RhYmxlXCIgY3BzVFRIZHJTZWxlY3RhYmxlPjwvdGg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyVGVtcGxhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBoZWFkZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb2x1bW5zLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhlYWRlclRlbXBsYXRlICYmIGNvbHVtbnMubGVuZ3RoID4gMFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic29ydGFibGVcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiXG4gICAgICAgICAgICBbY3BzVFRDb2xTb3J0YWJsZV09XCJjb2xbY29sRmllbGROYW1lXVwiPlxuICAgICAgICAgICAge3sgY29sW2NvbEhlYWRlck5hbWVdIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc29ydGFibGVcIj5cbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgICB7eyBjb2xbY29sSGVhZGVyTmFtZV0gfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRoXG4gICAgICAgIGNsYXNzPVwiY3BzLXRyZWV0YWJsZS1yb3ctbWVudS1jZWxsXCJcbiAgICAgICAgKm5nSWY9XCJzaG93Um93TWVudSAmJiAoc2hvd1Jvd1JlbW92ZUJ1dHRvbiB8fCBzaG93Um93RWRpdEJ1dHRvbilcIj48L3RoPlxuICAgIDwvdHI+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlXG4gICAgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgbGV0LXJvd0RhdGE9XCJyb3dEYXRhXCJcbiAgICBsZXQtY29sdW1ucz1cImNvbHVtbnNcIlxuICAgIGxldC1yb3dOb2RlXG4gICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIj5cbiAgICA8dHJcbiAgICAgIFt0dFJvd109XCJyb3dOb2RlXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ2Nwcy10cmVldGFibGUtcm93LXNlbGVjdGVkJzpcbiAgICAgICAgICBzZWxlY3RhYmxlICYmIHByaW1lbmdUcmVlVGFibGUuaXNTZWxlY3RlZChyb3dOb2RlLm5vZGUpXG4gICAgICB9XCI+XG4gICAgICA8IS0tIDx0ZCAqbmdJZj1cInJlb3JkZXJhYmxlUm93c1wiIGNsYXNzPVwiY3BzLXRhYmxlLXJvdy1kcmFnLWhhbmRsZS1jZWxsXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3BzLXRhYmxlLXJvdy1kcmFnLWhhbmRsZVwiIHBSZW9yZGVyYWJsZVJvd0hhbmRsZT7imLA8L3NwYW4+XG4gICAgICA8L3RkPiAtLT5cbiAgICAgIDx0ZCBbY3BzVFRSb3dTZWxlY3RhYmxlXT1cInJvd05vZGVcIiAqbmdJZj1cInNlbGVjdGFibGVcIj48L3RkPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJvZHlUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIGJvZHlUZW1wbGF0ZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgJGltcGxpY2l0OiByb3dOb2RlLFxuICAgICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYm9keVRlbXBsYXRlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiaSA9PT0gMFwiIFtjcHNUVFJvd1RvZ2dsZXJdPVwicm93Tm9kZVwiPlxuICAgICAgICAgICAgICB7eyByb3dEYXRhW2NvbFtjb2xGaWVsZE5hbWVdXSB9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cImkgPiAwXCI+e3sgcm93RGF0YVtjb2xbY29sRmllbGROYW1lXV0gfX08L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHRkXG4gICAgICAgICpuZ0lmPVwic2hvd1Jvd01lbnUgJiYgKHNob3dSb3dSZW1vdmVCdXR0b24gfHwgc2hvd1Jvd0VkaXRCdXR0b24pXCJcbiAgICAgICAgY2xhc3M9XCJjcHMtdHJlZXRhYmxlLXJvdy1tZW51LWNlbGxcIj5cbiAgICAgICAgPHRhYmxlLXJvdy1tZW51XG4gICAgICAgICAgKGVkaXRSb3dCdG5DbGlja2VkKT1cIm9uRWRpdFJvd0NsaWNrZWQocm93Tm9kZS5ub2RlKVwiXG4gICAgICAgICAgKHJlbW92ZVJvd0J0bkNsaWNrZWQpPVwib25SZW1vdmVSb3dDbGlja2VkKHJvd05vZGUubm9kZSlcIlxuICAgICAgICAgIFtzaG93Um93UmVtb3ZlQnV0dG9uXT1cInNob3dSb3dSZW1vdmVCdXR0b25cIlxuICAgICAgICAgIFtzaG93Um93RWRpdEJ1dHRvbl09XCJzaG93Um93RWRpdEJ1dHRvblwiPlxuICAgICAgICA8L3RhYmxlLXJvdy1tZW51PlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XG4gICAgPHRyPlxuICAgICAgPHRkXG4gICAgICAgIGNvbHNwYW49XCIxMDBcIlxuICAgICAgICBjbGFzcz1cImNwcy10cmVldGFibGUtZW1wdHktbWVzc2FnZS10ZFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgaGVpZ2h0OiBlbXB0eUJvZHlIZWlnaHQgfVwiPlxuICAgICAgICB7eyBlbXB0eU1lc3NhZ2UgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxvYWRpbmdpY29uXCI+XG4gICAgPGNwcy1sb2FkZXIgW2Z1bGxTY3JlZW5dPVwiZmFsc2VcIiBvcGFjaXR5PVwiMFwiPjwvY3BzLWxvYWRlcj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInBhZ2luYXRvcmxlZnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3BzLXRhYmxlLXBhZ2luYXRvci1pdG1zLXBlci1wYWdlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNwcy10YWJsZS1wYWdpbmF0b3ItaXRlbXMtcGVyLXBhZ2UtdGl0bGVcIlxuICAgICAgICA+Um93cyBwZXIgcGFnZTpcbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgIFtvcHRpb25zXT1cInJvd09wdGlvbnNcIlxuICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwicm93c1wiXG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwib25Sb3dzUGVyUGFnZUNoYW5nZWQoKVwiXG4gICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICBvcHRpb25zQ2xhc3M9XCJjcHMtcGFnaW5hdG9yLXBhZ2Utb3B0aW9uc1wiPlxuICAgICAgPC9jcHMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJwYWdpbmF0b3JmaXJzdHBhZ2VsaW5raWNvblwiPlxuICAgIDxBbmdsZURvdWJsZUxlZnRJY29uIC8+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJwYWdpbmF0b3JwcmV2aW91c3BhZ2VsaW5raWNvblwiPlxuICAgIDxBbmdsZUxlZnRJY29uIC8+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJwYWdpbmF0b3JuZXh0cGFnZWxpbmtpY29uXCI+XG4gICAgPEFuZ2xlUmlnaHRJY29uIC8+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJwYWdpbmF0b3JsYXN0cGFnZWxpbmtpY29uXCI+XG4gICAgPEFuZ2xlRG91YmxlUmlnaHRJY29uIC8+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtdHJlZVRhYmxlPlxuIl19
|