@porscheinformatik/material-addons 18.0.5 → 19.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/fesm2022/porscheinformatik-material-addons.mjs +237 -236
  2. package/fesm2022/porscheinformatik-material-addons.mjs.map +1 -1
  3. package/lib/alert/alert.component.d.ts.map +1 -1
  4. package/lib/button/danger-button/danger-button.component.d.ts.map +1 -1
  5. package/lib/button/flat-button/link-button.component.d.ts.map +1 -1
  6. package/lib/button/icon-button/icon-button.component.d.ts.map +1 -1
  7. package/lib/button/mad-basic-button.d.ts.map +1 -1
  8. package/lib/button/outline-button/outline-button.component.d.ts.map +1 -1
  9. package/lib/button/primary-button/primary-button.component.d.ts.map +1 -1
  10. package/lib/card/card.component.d.ts.map +1 -1
  11. package/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.d.ts.map +1 -1
  12. package/lib/data-table/data-table-filter/data-table-filter-component/data-table-filter-dialog/data-table-filter-dialog.component.d.ts.map +1 -1
  13. package/lib/data-table/data-table-filter/data-table-filter-component/data-table-filter.component.d.ts.map +1 -1
  14. package/lib/data-table/data-table.component.d.ts.map +1 -1
  15. package/lib/file-upload/file-upload.component.d.ts.map +1 -1
  16. package/lib/layout/flowbar/flowbar.component.d.ts.map +1 -1
  17. package/lib/layout/sidebar/sidebar.component.d.ts.map +1 -1
  18. package/lib/layout/sidebar-layout/sidebar-layout.component.d.ts.map +1 -1
  19. package/lib/layout/toolbar/toolbar.component.d.ts.map +1 -1
  20. package/lib/material-action-button/material-action-button.component.d.ts.map +1 -1
  21. package/lib/quick-list/base-quick-list.component.d.ts.map +1 -1
  22. package/lib/quick-list/quick-list-compact/quick-list-compact.component.d.ts.map +1 -1
  23. package/lib/quick-list/quick-list.component.d.ts.map +1 -1
  24. package/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.d.ts.map +1 -1
  25. package/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.d.ts.map +1 -1
  26. package/lib/readonly/readonly-form-field/readonly-form-field.component.d.ts.map +1 -1
  27. package/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.d.ts.map +1 -1
  28. package/lib/stepper/step-header/step-header.component.d.ts.map +1 -1
  29. package/lib/stepper/stepper.component.d.ts.map +1 -1
  30. package/lib/table/table.component.d.ts.map +1 -1
  31. package/package.json +3 -5
  32. package/version.d.ts +1 -1
  33. package/esm2022/lib/alert/alert-configuration.mjs +0 -12
  34. package/esm2022/lib/alert/alert.component.mjs +0 -65
  35. package/esm2022/lib/alert/alert.mjs +0 -3
  36. package/esm2022/lib/button/button.mjs +0 -9
  37. package/esm2022/lib/button/button.module.mjs +0 -74
  38. package/esm2022/lib/button/danger-button/danger-button.component.mjs +0 -27
  39. package/esm2022/lib/button/flat-button/link-button.component.mjs +0 -27
  40. package/esm2022/lib/button/icon-button/icon-button.component.mjs +0 -27
  41. package/esm2022/lib/button/mad-basic-button.mjs +0 -39
  42. package/esm2022/lib/button/mad-button/mad-button.directive.mjs +0 -61
  43. package/esm2022/lib/button/mad-button-group/mad-button-group.component.mjs +0 -21
  44. package/esm2022/lib/button/outline-button/outline-button.component.mjs +0 -30
  45. package/esm2022/lib/button/primary-button/primary-button.component.mjs +0 -27
  46. package/esm2022/lib/card/card.component.mjs +0 -139
  47. package/esm2022/lib/card/card.mjs +0 -2
  48. package/esm2022/lib/card/card.module.mjs +0 -22
  49. package/esm2022/lib/data-table/configuration/data-table-action-type.mjs +0 -6
  50. package/esm2022/lib/data-table/configuration/data-table-action.mjs +0 -2
  51. package/esm2022/lib/data-table/configuration/data-table-column-definition.mjs +0 -2
  52. package/esm2022/lib/data-table/configuration/data-table-column.mjs +0 -2
  53. package/esm2022/lib/data-table/configuration/data-table-filter-mode.mjs +0 -2
  54. package/esm2022/lib/data-table/configuration/data-table-global-configuration.mjs +0 -16
  55. package/esm2022/lib/data-table/configuration/data-table-header-type.mjs +0 -2
  56. package/esm2022/lib/data-table/configuration/data-table-persistence-configuration.mjs +0 -2
  57. package/esm2022/lib/data-table/configuration/data-table-row.mjs +0 -2
  58. package/esm2022/lib/data-table/configuration/data-table-selection-emit-mode.mjs +0 -2
  59. package/esm2022/lib/data-table/configuration/data-table-selection-emit-type.mjs +0 -2
  60. package/esm2022/lib/data-table/configuration/data-table-selection-mode.mjs +0 -2
  61. package/esm2022/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.mjs +0 -107
  62. package/esm2022/lib/data-table/data-table-filter/data-table-filter-component/data-table-filter-dialog/data-table-filter-dialog.component.mjs +0 -43
  63. package/esm2022/lib/data-table/data-table-filter/data-table-filter-component/data-table-filter.component.mjs +0 -41
  64. package/esm2022/lib/data-table/data-table-filter/data-table-filter-header.directive.mjs +0 -128
  65. package/esm2022/lib/data-table/data-table-filter/data-table-filter-object.mjs +0 -2
  66. package/esm2022/lib/data-table/data-table-filter/data-table-filter-options.mjs +0 -2
  67. package/esm2022/lib/data-table/data-table-filter/data-table-filter.directive.mjs +0 -46
  68. package/esm2022/lib/data-table/data-table-persistence.service.mjs +0 -61
  69. package/esm2022/lib/data-table/data-table-template/data-table-template-cell-definition.directive.mjs +0 -28
  70. package/esm2022/lib/data-table/data-table-template/data-table-template-column-definition.directive.mjs +0 -22
  71. package/esm2022/lib/data-table/data-table-template/data-table-template-expandable-cell-definition.directive.mjs +0 -28
  72. package/esm2022/lib/data-table/data-table-template/data-table-template-expandable-column-definition.directive.mjs +0 -22
  73. package/esm2022/lib/data-table/data-table.component.mjs +0 -765
  74. package/esm2022/lib/data-table/data-table.mjs +0 -11
  75. package/esm2022/lib/data-table/util/data-table-action-util.mjs +0 -40
  76. package/esm2022/lib/data-table/util/data-table-data-util.mjs +0 -49
  77. package/esm2022/lib/data-table/util/data-table-filter-util.mjs +0 -24
  78. package/esm2022/lib/data-table/util/data-table-sort-util.mjs +0 -80
  79. package/esm2022/lib/file-upload/drag-and-drop-directive.directive.mjs +0 -61
  80. package/esm2022/lib/file-upload/file-upload.component.mjs +0 -103
  81. package/esm2022/lib/layout/content-panel/content-header/content-header.component.mjs +0 -11
  82. package/esm2022/lib/layout/content-panel/content-panel-container/content-panel-container.component.mjs +0 -11
  83. package/esm2022/lib/layout/content-panel/content-panel-container-content/content-panel-container-content.component.mjs +0 -11
  84. package/esm2022/lib/layout/content-panel/content-panel-container-footer/content-panel-container-footer.component.mjs +0 -11
  85. package/esm2022/lib/layout/content-panel/content-panel-container-sidebar/content-panel-container-sidebar.component.mjs +0 -11
  86. package/esm2022/lib/layout/content-panel/content-panel.module.mjs +0 -48
  87. package/esm2022/lib/layout/content-panel/main-container/main-container.component.mjs +0 -11
  88. package/esm2022/lib/layout/flowbar/flowbar.component.mjs +0 -191
  89. package/esm2022/lib/layout/flowbar/flowbar.module.mjs +0 -18
  90. package/esm2022/lib/layout/sidebar/sidebar-item/sidebar-item.component.mjs +0 -11
  91. package/esm2022/lib/layout/sidebar/sidebar.component.mjs +0 -23
  92. package/esm2022/lib/layout/sidebar/sidebar.module.mjs +0 -20
  93. package/esm2022/lib/layout/sidebar-layout/sidebar-layout.component.mjs +0 -67
  94. package/esm2022/lib/layout/toolbar/toolbar-action.interface.mjs +0 -2
  95. package/esm2022/lib/layout/toolbar/toolbar.component.mjs +0 -98
  96. package/esm2022/lib/layout/toolbar/toolbar.module.mjs +0 -58
  97. package/esm2022/lib/layout/toolbar/toolbar.service.mjs +0 -124
  98. package/esm2022/lib/material-action-button/material-action-button.component.mjs +0 -37
  99. package/esm2022/lib/material-action-button/material-action-button.module.mjs +0 -21
  100. package/esm2022/lib/material-addons.module.mjs +0 -49
  101. package/esm2022/lib/numeric-field/number-format.service.mjs +0 -146
  102. package/esm2022/lib/numeric-field/numeric-field.directive.mjs +0 -299
  103. package/esm2022/lib/numeric-field/numeric-field.mjs +0 -2
  104. package/esm2022/lib/numeric-field/numeric-field.module.mjs +0 -21
  105. package/esm2022/lib/quick-list/base-quick-list.component.mjs +0 -124
  106. package/esm2022/lib/quick-list/quick-list-compact/quick-list-compact.component.mjs +0 -23
  107. package/esm2022/lib/quick-list/quick-list.component.mjs +0 -24
  108. package/esm2022/lib/quick-list/quick-list.mjs +0 -6
  109. package/esm2022/lib/quick-list/quick-list.module.mjs +0 -63
  110. package/esm2022/lib/quick-list/reactive-form-quick-list/reactive-form-quick-list.component.mjs +0 -23
  111. package/esm2022/lib/quick-list/reactive-form-quick-list-compact/reactive-form-quick-list-compact.component.mjs +0 -23
  112. package/esm2022/lib/readonly/readonly-form-field/readonly-form-field.component.mjs +0 -243
  113. package/esm2022/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.mjs +0 -183
  114. package/esm2022/lib/readonly/readonly-form-field.module.mjs +0 -51
  115. package/esm2022/lib/stepper/mad-stepper-animation.mjs +0 -13
  116. package/esm2022/lib/stepper/step-header/step-header.component.mjs +0 -78
  117. package/esm2022/lib/stepper/stepper.component.mjs +0 -158
  118. package/esm2022/lib/stepper/stepper.module.mjs +0 -45
  119. package/esm2022/lib/table/column-header.mjs +0 -2
  120. package/esm2022/lib/table/table-action.mjs +0 -2
  121. package/esm2022/lib/table/table.component.mjs +0 -146
  122. package/esm2022/lib/table/table.mjs +0 -2
  123. package/esm2022/lib/table/table.module.mjs +0 -58
  124. package/esm2022/lib/throttle-click/throttle-click.directive.mjs +0 -39
  125. package/esm2022/lib/throttle-click/throttle-click.module.mjs +0 -17
  126. package/esm2022/porscheinformatik-material-addons.mjs +0 -5
  127. package/esm2022/public_api.mjs +0 -48
  128. package/esm2022/version.mjs +0 -2
@@ -1,765 +0,0 @@
1
- import { animate, state, style, transition, trigger } from '@angular/animations';
2
- import { Component, ContentChild, ContentChildren, EventEmitter, Inject, Input, Output, ViewChild, } from '@angular/core';
3
- import { MatTableDataSource, MatTableModule } from '@angular/material/table';
4
- import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
5
- import { MatSort, MatSortModule } from '@angular/material/sort';
6
- import { SelectionModel } from '@angular/cdk/collections';
7
- import { DataTableColumnsModalComponent } from './data-table-columns-modal/data-table-columns-modal.component';
8
- import { DataTableFilter } from './data-table-filter/data-table-filter.directive';
9
- import { DataTableSortUtil } from './util/data-table-sort-util';
10
- import { DataTableActionUtil } from './util/data-table-action-util';
11
- import { DataTableDataUtil } from './util/data-table-data-util';
12
- import { DataTableFilterUtil } from './util/data-table-filter-util';
13
- import { DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABLE_PERSISTENCE_SERVICE, } from './data-table-persistence.service';
14
- import { MAD_DATA_TABLE_GLOBAL_CONFIGURATION, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER, } from './configuration/data-table-global-configuration';
15
- import { CommonModule } from '@angular/common';
16
- import { MatButtonModule } from '@angular/material/button';
17
- import { MatIconModule } from '@angular/material/icon';
18
- import { MatFormFieldModule } from '@angular/material/form-field';
19
- import { MatInputModule } from '@angular/material/input';
20
- import { MatMenuModule } from '@angular/material/menu';
21
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
22
- import { DragDropModule } from '@angular/cdk/drag-drop';
23
- import { FormsModule } from '@angular/forms';
24
- import { MatBadgeModule } from '@angular/material/badge';
25
- import { MatCheckboxModule } from '@angular/material/checkbox';
26
- import { MatRadioModule } from '@angular/material/radio';
27
- import { TranslateModule } from '@ngx-translate/core';
28
- import { ButtonModule } from '../button/button.module';
29
- import { DataTableFilterHeader } from './data-table-filter/data-table-filter-header.directive';
30
- import { DataTableTemplateColumnDefinition } from './data-table-template/data-table-template-column-definition.directive';
31
- import { DataTableTemplateCellDefinition } from './data-table-template/data-table-template-cell-definition.directive';
32
- import { DataTableTemplateExpandableCellDefinition } from './data-table-template/data-table-template-expandable-cell-definition.directive';
33
- import { DataTableTemplateExpandableColumnDefinition } from './data-table-template/data-table-template-expandable-column-definition.directive';
34
- import * as i0 from "@angular/core";
35
- import * as i1 from "@angular/material/dialog";
36
- import * as i2 from "@angular/common";
37
- import * as i3 from "@angular/material/icon";
38
- import * as i4 from "@angular/material/form-field";
39
- import * as i5 from "@angular/material/input";
40
- import * as i6 from "@angular/material/menu";
41
- import * as i7 from "@angular/material/paginator";
42
- import * as i8 from "@angular/material/sort";
43
- import * as i9 from "@angular/material/table";
44
- import * as i10 from "@angular/material/progress-spinner";
45
- import * as i11 from "../button/outline-button/outline-button.component";
46
- import * as i12 from "../button/icon-button/icon-button.component";
47
- import * as i13 from "../button/mad-button-group/mad-button-group.component";
48
- import * as i14 from "@ngx-translate/core";
49
- import * as i15 from "@angular/material/checkbox";
50
- import * as i16 from "@angular/material/radio";
51
- import * as i17 from "./data-table-persistence.service";
52
- export class DataTableComponent {
53
- set useAsync(useAsync) {
54
- this._useAsync = useAsync;
55
- this.applySortData();
56
- }
57
- /**
58
- * @deprecated
59
- * Please use the more specific persistenceConfig instead
60
- */
61
- set stateful(stateful) {
62
- this.persistenceConfig = {
63
- persistSort: stateful,
64
- persistFilter: stateful,
65
- persistPageSize: stateful,
66
- };
67
- }
68
- set selection(selection) {
69
- this._selection = selection;
70
- this.updateSelectionModel(selection);
71
- }
72
- /**
73
- * @deprecated
74
- * Please use "filterMode" instead
75
- */
76
- set filterEnabled(isFilterEnabled) {
77
- this._filterMode = isFilterEnabled ? 'TABLE_BASED' : 'NONE';
78
- this.applyFilterPredicate();
79
- }
80
- set filterMode(filterMode) {
81
- this._filterMode = filterMode;
82
- this.applyFilterPredicate();
83
- }
84
- set filterValue(filterValue) {
85
- this._filterValue = filterValue;
86
- this.applyFilterValue(this._filterValue);
87
- }
88
- set externalPaginator(paginator) {
89
- this.extPaginator = paginator;
90
- }
91
- set defaultPageSize(defaultSize) {
92
- this.page = {
93
- ...this.page,
94
- pageSize: defaultSize,
95
- };
96
- }
97
- set selectionEmitMode(selectionEmitMode) {
98
- this._selectionEmitMode = selectionEmitMode;
99
- }
100
- /**
101
- * @deprecated
102
- * This function mixes up 2 responsibilities:
103
- * - determining if actions should be displayed / handled
104
- * - determining whether actions are row based (single) or table based (batch)
105
- * Please use a combination of "selectionEmitMode" and "selectionMode" instead:
106
- * - selectionEmitMode determines how selected items are handled (as part of actions, as selections or not at all)
107
- * - selectionMode determines if selected items are treated separately (single) or together (batch)
108
- */
109
- set forceMode(selectionMode) {
110
- if (selectionMode === 'SINGLE' || selectionMode === 'BATCH') {
111
- this._selectionEmitMode = 'ON_ACTION';
112
- this._forceSelectionMode = selectionMode;
113
- this._selectionModel.clear();
114
- }
115
- }
116
- set forceSelectionMode(selectionMode) {
117
- this._forceSelectionMode = selectionMode;
118
- this._selectionModel.clear();
119
- }
120
- set displayedColumns(cols) {
121
- if (!this.displayedColumnDefinition) {
122
- this.columns = cols ? [...cols] : [];
123
- this.columnIds = this.columns.map((column) => column.id);
124
- this.columnIds.unshift(this.ACTION_COLUMN_NAME);
125
- }
126
- }
127
- set displayedColumnDefinition(def) {
128
- this.columns = def.displayedColumns;
129
- this.columnIds = this.columns.map((column) => column.id);
130
- this.columnIds.unshift(this.ACTION_COLUMN_NAME);
131
- this._selectedColumnDefinition = def;
132
- }
133
- set columnDefinitions(definitions) {
134
- this.editableColumnDefinitions = [];
135
- this.viewableColumnDefinitions = [];
136
- this._allColumnDefinitions = [...definitions];
137
- for (const definition of definitions) {
138
- if (definition.editable) {
139
- this.editableColumnDefinitions.push(definition);
140
- }
141
- if (definition.displayedColumns?.length > 0) {
142
- this.viewableColumnDefinitions.push(definition);
143
- }
144
- }
145
- }
146
- set allColumns(allColumns) {
147
- this._allAvailableColumns = allColumns;
148
- if (allColumns && this._showColumnModal) {
149
- this.openColumnModal();
150
- }
151
- }
152
- // we need to have this as a setter due to the *ngIf it is in
153
- set matSort(matSort) {
154
- this._sort = matSort;
155
- this.dataSource.sort = this._sort;
156
- }
157
- set columnDefs(columnDefs) {
158
- this._columnDefs = columnDefs;
159
- this.changeDetectorRef.detectChanges();
160
- }
161
- get columnDefs() {
162
- return this._columnDefs;
163
- }
164
- set expandableDef(expandableDef) {
165
- this._expandableDef = expandableDef;
166
- this.changeDetectorRef.detectChanges();
167
- }
168
- get expandableDef() {
169
- return this._expandableDef;
170
- }
171
- constructor(changeDetectorRef, matDialog, persistenceService, dataTableGlobalConfig) {
172
- this.changeDetectorRef = changeDetectorRef;
173
- this.matDialog = matDialog;
174
- this.persistenceService = persistenceService;
175
- this.dataTableGlobalConfig = dataTableGlobalConfig;
176
- // Translations
177
- this.filterLabel = 'common.filter';
178
- this.filterPlaceholder = '';
179
- this.filterColumnsLabel = 'Filter';
180
- this.filterColumnsPlaceHolder = 'Filter available columns';
181
- this.showEmptyTable = false;
182
- this.noDataText = 'No matching data found';
183
- this.columnSettingsModalTitleLabel = 'Column settings';
184
- this.selectedLabel = 'Selected columns';
185
- this.availableLabel = 'Available columns';
186
- this.saveLabel = 'Save';
187
- this.deleteLabel = 'Delete';
188
- this.cancelLabel = 'Cancel';
189
- this.infoTextLabel = 'Drag and drop a column to select or reorder it.';
190
- this.translateLabels = true;
191
- this.persistenceConfig = {
192
- persistSort: false,
193
- persistFilter: false,
194
- persistPageSize: false,
195
- };
196
- this.loading = false;
197
- this.paginationEnabled = false;
198
- this.page = { pageIndex: 0, pageSize: 50, length: 0 };
199
- this.pageSizeOptions = [5, 10, 15];
200
- this.actions = [];
201
- this.selectionEmitType = 'ID';
202
- this.showDeleteFilterAction = true;
203
- this.disableRowClick = false;
204
- this.deleteDefinitionAllowed = false;
205
- this.actionEvent = new EventEmitter();
206
- this.selectionEvent = new EventEmitter();
207
- this.sortEvent = new EventEmitter();
208
- this.filterEvent = new EventEmitter();
209
- this.pageEvent = new EventEmitter();
210
- this.allColumnsEvent = new EventEmitter();
211
- this.columnDefinitionChangeEvent = new EventEmitter();
212
- this.viewDefinitionChangeEvent = new EventEmitter();
213
- this.allSelected = false;
214
- this.ACTION_COLUMN_NAME = '__action__';
215
- this.tableActions = [];
216
- this.rowActions = [];
217
- this.columns = [];
218
- this._useAsync = false;
219
- this._rowMap = new Map();
220
- this._selectionModel = new SelectionModel(true);
221
- this._selectionEmitMode = 'NONE';
222
- this._filterMode = 'NONE';
223
- this._allColumnDefinitions = [];
224
- this._showColumnModal = false;
225
- this.dataSource = new MatTableDataSource();
226
- }
227
- ngAfterViewInit() {
228
- if (!this._useAsync) {
229
- this.dataSource.paginator = this.paginator;
230
- this.dataSource.sort = this._sort;
231
- }
232
- this.applySortData();
233
- this.initState();
234
- }
235
- ngOnChanges(changes) {
236
- if ('tableData' in changes) {
237
- this.updateDataTableData();
238
- this.updateSelectionModel(this.getSelection('ID').length ? this.getSelection('ID') : this._selection);
239
- if (this.showAll) {
240
- this.updatePaginator();
241
- }
242
- }
243
- if ('idGenerator' in changes || 'displayedColumns' in changes) {
244
- this.updateDataTableData();
245
- }
246
- // performance reasons (same behaviour could be achived in getters)
247
- if ('forceMode' in changes || 'forceSelectionMode' in changes || 'actions' in changes) {
248
- const actions = DataTableActionUtil.getDisplayActions(this.actions, this.selectionMode);
249
- this.rowActions = actions.rowActions;
250
- this.tableActions = actions.groupedTableActions;
251
- }
252
- }
253
- /** TABLE DISPLAY HANDLING */
254
- getDataTableHeaderType(column) {
255
- if (column.isSortable && !column.isFilterable) {
256
- return 'SORT';
257
- }
258
- if (!column.isSortable && column.isFilterable) {
259
- return 'FILTER';
260
- }
261
- if (column.isSortable && column.isFilterable) {
262
- return 'SORT_AND_FILTER';
263
- }
264
- return 'PLAIN';
265
- }
266
- getCustomCellTemplate(columnId) {
267
- const columnDef = this._columnDefs?.find((it) => it.madColumnDef === columnId);
268
- return columnDef && columnDef.cellDef ? columnDef.cellDef.getCellTemplate() : null;
269
- }
270
- getCustomExpandableTemplate() {
271
- return this._expandableDef?.getCellTemplate() || null;
272
- }
273
- get expandableColumnDef() {
274
- return this._expandableDef?.columnDef.madExpandableColumnDef || '';
275
- }
276
- onExpand(event, element) {
277
- this.expandedElement = this.expandedElement === element ? null : element;
278
- event.stopPropagation();
279
- }
280
- /** ACTION BUTTON DISPLAY HANDLING */
281
- hasVisibleRowActions(displayedData) {
282
- return !this.rowActions.every((action) => this.isHiddenForData(action, [this._rowMap.get(displayedData.rowId)?.actualData]));
283
- }
284
- isHidden(action) {
285
- return this.isHiddenForData(action, this.getSelection('DATA'));
286
- }
287
- isHiddenForData(action, data) {
288
- return !!action.isHidden && action.isHidden(data);
289
- }
290
- isDisabled(action) {
291
- return this.isDisabledForActionType(action.type) || (!!action.isDisabled && action.isDisabled(this.getSelection('DATA')));
292
- }
293
- isDisabledForActionType(actionType) {
294
- switch (actionType) {
295
- case 'SINGLE':
296
- return this.selectedCount !== 1;
297
- case 'BATCH':
298
- return this.selectedCount < 1;
299
- default:
300
- return false;
301
- }
302
- }
303
- getSelectedCount(actionType) {
304
- const count = this.selectedCount;
305
- if (actionType !== 'BATCH' || count < 2) {
306
- return '';
307
- }
308
- return ` (${count})`;
309
- }
310
- get selectedCount() {
311
- return this._selectionModel?.selected ? this._selectionModel.selected.length : 0;
312
- }
313
- /** TABLE DATA CHANGE HANDLING */
314
- updateDataTableData() {
315
- // do not make this function immutable - we desparately need the reference of rowMap to stay the same
316
- DataTableDataUtil.updateRowMap(this._rowMap, this.tableData, this.columns, this.idGenerator, this.parentIdGenerator);
317
- this.dataSource.data = Array.from(this._rowMap.values()).map((it) => it.displayedData);
318
- }
319
- updateSelectionModel(selection) {
320
- this._selectionModel.clear();
321
- selection?.forEach((it) => {
322
- const item = this._rowMap.get(it) || [...this._rowMap.values()].find((row) => row.actualData === it);
323
- if (!!item) {
324
- this.onSelectionEvent(item.id);
325
- }
326
- });
327
- this.emitSelection();
328
- }
329
- /** ACTION & SELECTION HANDLING */
330
- get selectionEmitMode() {
331
- return this._selectionEmitMode === 'NONE' && !!this.actions.length ? 'ON_ACTION' : this._selectionEmitMode;
332
- }
333
- get selectionMode() {
334
- return !!this._forceSelectionMode ? this._forceSelectionMode : this.actions.find((it) => it.type === 'BATCH') ? 'BATCH' : 'SINGLE';
335
- }
336
- // get filtered & sorted data of the current page
337
- get displayedData() {
338
- return this.dataSource?._pageData(this.dataSource?.sortData(this.dataSource.filteredData, this.dataSource.sort));
339
- }
340
- get showActionColumn() {
341
- return !(this.selectionEmitMode === 'NONE' || this.hideActionColumn) || !!this._expandableDef;
342
- }
343
- showCheckbox(displayedData) {
344
- return !displayedData.parentId && this.selectionMode === 'BATCH' && !this.hideActionColumn;
345
- }
346
- showRowActionIcon(displayedData) {
347
- return !displayedData.parentId && this.selectionEmitMode === 'ON_ACTION' && this.selectionMode === 'SINGLE' && !this.hideActionColumn;
348
- }
349
- showRadioButton(displayedData) {
350
- return !displayedData.parentId && this.selectionEmitMode === 'ON_SELECTION' && this.selectionMode === 'SINGLE';
351
- }
352
- showExpandableButton(displayedData) {
353
- return !displayedData.parentId && !!this._expandableDef;
354
- }
355
- isSelected(rowId) {
356
- return this._selectionModel.isSelected(rowId);
357
- }
358
- onToggleSelectAll() {
359
- // clear all selection first
360
- this._selectionModel.clear();
361
- // toggle all checkbox
362
- this.allSelected = !this.allSelected;
363
- if (this.allSelected) {
364
- // select all rows of the current page
365
- this.displayedData.forEach((row) => {
366
- if (!row.parentId) {
367
- this._selectionModel.select(row.rowId);
368
- }
369
- });
370
- }
371
- this.emitSelection();
372
- }
373
- onActionEvent(action) {
374
- const emitAction = { ...action };
375
- if (!!emitAction && this.selectionEmitMode !== 'NONE') {
376
- emitAction.selected = this.getSelection(this.selectionEmitType);
377
- this.actionEvent.emit(emitAction);
378
- }
379
- }
380
- onSelectionEvent(id) {
381
- switch (this.selectionMode) {
382
- case 'BATCH':
383
- this._selectionModel.toggle(id);
384
- break;
385
- case 'SINGLE':
386
- this._selectionModel.clear();
387
- this._selectionModel.toggle(id);
388
- break;
389
- }
390
- }
391
- onRowEvent(event, row, action = this.defaultAction) {
392
- if (this.selectionEmitMode === 'NONE' || row?.parentId) {
393
- return;
394
- }
395
- this.onSelectionEvent(row.rowId);
396
- this.processSelection(event, action);
397
- }
398
- get defaultAction() {
399
- return this.selectionEmitMode !== 'NONE' ? this.rowActions[0] : undefined;
400
- }
401
- get hideActionColumn() {
402
- return this.selectionEmitMode === 'ON_ACTION' && this.actions.every((it) => it.type === 'NONE');
403
- }
404
- processSelection(event, action) {
405
- if (this.selectionEmitMode === 'ON_ACTION' &&
406
- this.selectionMode === 'SINGLE' &&
407
- !!action &&
408
- !DataTableComponent.isClickOnRowMenuIcon(event)) {
409
- this.onActionEvent(action);
410
- }
411
- this.emitSelection();
412
- }
413
- emitSelection() {
414
- if (this.selectionEmitMode === 'ON_SELECTION') {
415
- this.selectionEvent.emit(this.getSelection(this.selectionEmitType));
416
- }
417
- }
418
- getSelection(selectionEmitType) {
419
- const selection = [];
420
- this._selectionModel.selected.forEach((it) =>
421
- // if ID-generator is provided, return the ID, else return the ACTUAL data
422
- selection.push(this.idGenerator && selectionEmitType === 'ID' ? it : this._rowMap.get(it)?.actualData));
423
- return selection;
424
- }
425
- static isClickOnRowMenuIcon(event) {
426
- return event?.target?.classList.contains('mat-icon');
427
- }
428
- /** SORT HANDLING */
429
- onSortingEvent(sort) {
430
- if (this._useAsync) {
431
- this.sortEvent.emit(sort);
432
- }
433
- if (this.persistenceConfig.persistSort) {
434
- this.persistenceService.saveSort(this.id, sort);
435
- }
436
- }
437
- applySortData() {
438
- this.dataSource.sortData = this._useAsync
439
- ? DataTableSortUtil.sortNothing()
440
- : DataTableSortUtil.sortData([...this.dataTableGlobalConfig.dateTimeFormat], this.dataTableGlobalConfig.numberFormat);
441
- }
442
- /** FILTER HANDLING */
443
- get filterMode() {
444
- return this._useAsync && this._filterMode === 'TABLE_BASED' ? 'NONE' : this._filterMode;
445
- }
446
- onTableBasedFilterEvent(event) {
447
- this.onFilteringEvent(event.target.value);
448
- }
449
- onColumnBasedFilterEvent(filter) {
450
- this.onFilteringEvent(filter);
451
- }
452
- onDeleteFilter() {
453
- this.onFilteringEvent(undefined);
454
- this.filter.updateFilterables(undefined);
455
- }
456
- onFilteringEvent(filter) {
457
- if (this._useAsync) {
458
- this.filterEvent.emit(filter);
459
- }
460
- else {
461
- this.allSelected = false;
462
- this._selectionModel.clear();
463
- this.applyFilterValue(filter);
464
- }
465
- if (this.persistenceConfig.persistFilter) {
466
- this.persistenceService.saveFilter(this.id, filter);
467
- }
468
- }
469
- applyFilterPredicate() {
470
- this.dataSource.filterPredicate =
471
- this.filterMode === 'COLUMN_BASED'
472
- ? DataTableFilterUtil.columnBasedFilterPredicate(this._rowMap)
473
- : DataTableFilterUtil.tableBasedFilterPredicate();
474
- this.applyFilterValue(this._filterValue);
475
- }
476
- applyFilterValue(value) {
477
- const isString = typeof this._filterValue === 'string';
478
- this.dataSource.filter = !!value ? (isString ? value.trim().toLowerCase() : JSON.stringify(value)) : '';
479
- }
480
- /** PAGINATION HANDLING */
481
- onPageEvent(event) {
482
- if (this._useAsync) {
483
- this.pageEvent.emit(event);
484
- }
485
- if (this.persistenceConfig.persistPageSize) {
486
- this.persistenceService.savePageSize(this.id, event.pageSize);
487
- }
488
- }
489
- get pageIndex() {
490
- return this.showAll ? 0 : this.page.pageIndex;
491
- }
492
- get pageSize() {
493
- return this.showAll ? this.dataLength : this.page.pageSize;
494
- }
495
- get pageLength() {
496
- return this.showAll ? this.dataLength : this.page.length;
497
- }
498
- updatePaginator() {
499
- if (this.paginator) {
500
- this.paginator.pageSize = this.pageSize;
501
- this.paginator.page.emit(this.page);
502
- }
503
- }
504
- get dataLength() {
505
- return this.dataSource.data?.length || 0;
506
- }
507
- get showAll() {
508
- return !this._useAsync && !this.paginationEnabled;
509
- }
510
- /** INIT STATE */
511
- initState() {
512
- // only set default sort if there is no other sort persisted
513
- if (!!this.defaultSort && !this.persistenceService.loadSort(this.id)?.direction) {
514
- this.setSort(this.defaultSort);
515
- }
516
- if (this.persistenceConfig.persistSort) {
517
- this.initSortState();
518
- }
519
- if (this.persistenceConfig.persistFilter) {
520
- this.initFilterState();
521
- }
522
- if (this.persistenceConfig.persistPageSize) {
523
- this.initPaginatorState();
524
- }
525
- this.changeDetectorRef.detectChanges();
526
- }
527
- initSortState() {
528
- const sort = this.persistenceService.loadSort(this.id);
529
- if (!!sort) {
530
- this.setSort(sort);
531
- }
532
- }
533
- setSort(sort) {
534
- this._sort.active = sort.active;
535
- this._sort.direction = sort.direction;
536
- this._sort.sortChange.emit(sort);
537
- }
538
- initFilterState() {
539
- const filter = this.persistenceService.loadFilter(this.id);
540
- this.filter.updateFilterables(filter);
541
- }
542
- initPaginatorState() {
543
- this.page = {
544
- pageIndex: 0,
545
- pageSize: this.persistenceService.loadPageSize(this.id) || this.pageSize,
546
- length: 0,
547
- };
548
- this.updatePaginator();
549
- }
550
- /** COLUMN HANDLING */
551
- onViewDefinition(definition) {
552
- this._selectedColumnDefinition = definition;
553
- this.viewDefinitionChangeEvent.emit(definition);
554
- }
555
- onColumnSettings(definition) {
556
- this._showColumnModal = true;
557
- this._selectedColumnDefinition = definition ? definition : this._allColumnDefinitions[0];
558
- if (this._allAvailableColumns) {
559
- this.openColumnModal();
560
- }
561
- else {
562
- // if no complete definitions have been loaded yet send an event so the app can load it
563
- this.allColumnsEvent.emit();
564
- }
565
- }
566
- isCurrentDefinition(definition) {
567
- return this._selectedColumnDefinition && this._selectedColumnDefinition.id === definition.id;
568
- }
569
- openColumnModal() {
570
- const dialogData = {
571
- allColumns: this._allAvailableColumns,
572
- definition: this._selectedColumnDefinition,
573
- deleteDefinitionAllowed: this.deleteDefinitionAllowed,
574
- filterColumnsLabel: this.filterColumnsLabel,
575
- filterColumnsPlaceHolder: this.filterColumnsPlaceHolder,
576
- noDataText: this.noDataText,
577
- titleLabel: this.columnSettingsModalTitleLabel,
578
- selectedLabel: this.selectedLabel,
579
- availableLabel: this.availableLabel,
580
- saveLabel: this.saveLabel,
581
- deleteLabel: this.deleteLabel,
582
- cancelLabel: this.cancelLabel,
583
- infoTextLabel: this.infoTextLabel,
584
- };
585
- const dialog = this.matDialog.open(DataTableColumnsModalComponent, { data: dialogData });
586
- dialog.afterClosed().subscribe((result) => {
587
- // no event on CANCEL
588
- if (result) {
589
- this.columnDefinitionChangeEvent.emit(result);
590
- }
591
- });
592
- }
593
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: DataTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MatDialog }, { token: MAD_DATA_TABLE_PERSISTENCE_SERVICE }, { token: MAD_DATA_TABLE_GLOBAL_CONFIGURATION }], target: i0.ɵɵFactoryTarget.Component }); }
594
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: DataTableComponent, isStandalone: true, selector: "mad-data-table", inputs: { id: "id", filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", showEmptyTable: "showEmptyTable", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", translateLabels: "translateLabels", useAsync: "useAsync", stateful: "stateful", persistenceConfig: "persistenceConfig", loading: "loading", tableData: "tableData", idGenerator: "idGenerator", parentIdGenerator: "parentIdGenerator", defaultSort: "defaultSort", externalFilter: "externalFilter", paginationEnabled: "paginationEnabled", page: "page", pageSizeOptions: "pageSizeOptions", actions: "actions", selectionEmitType: "selectionEmitType", showDeleteFilterAction: "showDeleteFilterAction", disableRowClick: "disableRowClick", deleteDefinitionAllowed: "deleteDefinitionAllowed", selection: "selection", filterEnabled: "filterEnabled", filterMode: "filterMode", filterValue: "filterValue", externalPaginator: "externalPaginator", defaultPageSize: "defaultPageSize", selectionEmitMode: "selectionEmitMode", forceMode: "forceMode", forceSelectionMode: "forceSelectionMode", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", columnDefinitions: "columnDefinitions", allColumns: "allColumns" }, outputs: { actionEvent: "actionEvent", selectionEvent: "selectionEvent", sortEvent: "sortEvent", filterEvent: "filterEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, providers: [DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER], queries: [{ propertyName: "expandableDef", first: true, predicate: DataTableTemplateExpandableCellDefinition, descendants: true }, { propertyName: "columnDefs", predicate: DataTableTemplateColumnDefinition }], viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true }, { propertyName: "filter", first: true, predicate: DataTableFilter, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div data-cy=\"table-action-bar\" class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length || (filterMode === 'COLUMN_BASED' && showDeleteFilterAction)\">\n <mad-button-group *ngFor=\"let actionGroup of tableActions\" class=\"table-action-group\">\n <mad-outline-button\n [hidden]=\"isHidden(tableAction)\"\n [disabled]=\"isDisabled(tableAction)\"\n *ngFor=\"let tableAction of actionGroup\"\n (click)=\"onActionEvent(tableAction)\"\n >\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }}\n {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </mad-button-group>\n </div>\n <ng-container *ngIf=\"filterMode === 'COLUMN_BASED' && showDeleteFilterAction\">\n <mat-icon fontSet=\"material-icons-outlined\" class=\"delete-filter-action\" color=\"primary\" (click)=\"onDeleteFilter()\"\n >filter_alt_off</mat-icon\n >\n </ng-container>\n <mat-form-field data-cy=\"filter-input\" *ngIf=\"filterMode === 'TABLE_BASED'\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"onTableBasedFilterEvent($event)\" placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <ng-container *ngFor=\"let rowAction of rowActions\">\n <button\n data-cy=\"row-action-menu-button\"\n *ngIf=\"!isHidden(rowAction)\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\"\n [disabled]=\"isDisabled(rowAction)\"\n >\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-container>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div\n *ngIf=\"filterMode === 'COLUMN_BASED' || showEmptyTable || !!dataSource.filteredData?.length; else noData\"\n class=\"datatable\"\n [class]=\"tableClass\"\n>\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n <table\n [id]=\"id\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortingEvent($event)\"\n madFilter\n (madFilterChange)=\"onColumnBasedFilterEvent($event)\"\n [multiTemplateDataRows]=\"!!expandableDef\"\n >\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"selectionEmitMode !== 'NONE' && selectionMode === 'BATCH'\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox (change)=\"onToggleSelectAll()\" [checked]=\"allSelected\"> </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"showCheckbox(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-checkbox class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n data-cy=\"row-action-button\"\n *ngIf=\"showRowActionIcon(element) && hasVisibleRowActions(element)\"\n [matMenuTriggerData]=\"{ element: element }\"\n [matMenuTriggerFor]=\"rowActionMenu\"\n (click)=\"onSelectionEvent(element.rowId)\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- SINGLE: row radio button -->\n <div *ngIf=\"showRadioButton(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-radio-button class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-radio-button>\n </div>\n <!-- EXPANDABLE: row is expandable/collapsable -->\n <mad-icon-button *ngIf=\"showExpandableButton(element)\" (click)=\"onExpand($event, element)\">\n <mat-icon *ngIf=\"expandedElement !== element\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"expandedElement === element\">keyboard_arrow_up</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container [ngSwitch]=\"getDataTableHeaderType(column)\">\n <ng-container *ngSwitchCase=\"'SORT'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'SORT_AND_FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n </ng-container>\n\n <!-- data cell to be injected -->\n <td\n mat-cell\n *matCellDef=\"let element\"\n [class.text-right]=\"column.isRightAligned\"\n [class.mad-dt-child-cell]=\"element.parentId\"\n [ngSwitch]=\"column.transformer\"\n (click)=\"!disableRowClick && onRowEvent($event, element)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n getCustomCellTemplate(column.id) || defaultCellTemplate;\n context: { column: column, element: element, $implicit: element }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <!-- Expanded Content Column - The row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"!!expandableDef\" [matColumnDef]=\"expandableColumnDef\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"columns.length + 1\">\n <div class=\"mad-data-table-expandable-area\" [@detailExpand]=\"element === expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container\n *ngTemplateOutlet=\"\n getCustomExpandableTemplate() || defaultCellTemplate;\n context: { column: element, element: element, $implicit: element }\n \"\n ></ng-container>\n </div>\n </td>\n </ng-container>\n\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && selectionEmitMode !== 'NONE'\"\n *matRowDef=\"let row; columns: columnIds\"\n (click)=\"!!expandableColumnDef && onExpand($event, row)\"\n ></tr>\n <ng-container *ngIf=\"!!expandableDef\">\n <tr mat-row *matRowDef=\"let element; columns: [expandableColumnDef]\" class=\"mad-data-table-expandable-row\"></tr>\n </ng-container>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell noDataText columnBasedFilter\" [attr.colspan]=\"columnIds.length\">\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </td>\n </tr>\n </table>\n</div>\n<div data-cy=\"table-bottom-area\" class=\"mad-data-table-bottom-area\">\n <div data-cy=\"definition-button-block\" class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button *ngIf=\"editableColumnDefinitions?.length === 1\" (click)=\"onColumnSettings()\">\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button *ngIf=\"(editableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\">\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button *ngIf=\"(viewableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\">\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"paginationEnabled ? 'block' : 'none'\"\n [length]=\"pageLength\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div data-cy=\"no-data-block\" class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </div>\n</ng-template>\n\n<!-- default cell template -->\n<ng-template #defaultCellTemplate let-element=\"element\" let-column=\"column\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n</ng-template>\n\n<!-- custom cell templates injected from parent -->\n<ng-content></ng-content>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{width:100%;min-height:140px;max-height:100%}.datatable table th,.datatable table td{width:auto;text-overflow:ellipsis;white-space:nowrap}.datatable table th{overflow:visible}.datatable table td{overflow:hidden}.layout-fixed table{table-layout:fixed}.layout-fixed table th{font-weight:700}.layout-fixed table td{white-space:normal;word-wrap:break-word}.text-right{text-align:right!important;padding-right:24px!important}.table-action-group{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.noDataText.columnBasedFilter{padding-top:10px}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-expandable-row{height:0;display:contents;padding:0}.mad-data-table-expandable-row td{border-top-color:transparent;border-bottom-color:transparent}.mad-data-table-expandable-area{overflow:hidden;display:flex;width:100%}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"], dependencies: [{ 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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i9.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i11.OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title", "color"] }, { kind: "component", type: i12.IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MadButtonGroupComponent, selector: "mad-button-group" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i15.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: DataTableFilterHeader, selector: "th[mad-filter-header]", inputs: ["mad-filter-header", "madFilterColumnRightAligned", "madFilterOptions"] }, { kind: "directive", type: DataTableFilter, selector: "[madFilter]", outputs: ["madFilterChange"] }], animations: [
595
- trigger('detailExpand', [
596
- state('collapsed,void', style({ height: '0px', minHeight: '0' })),
597
- state('expanded', style({ height: '*' })),
598
- transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
599
- ]),
600
- ] }); }
601
- }
602
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: DataTableComponent, decorators: [{
603
- type: Component,
604
- args: [{ selector: 'mad-data-table', animations: [
605
- trigger('detailExpand', [
606
- state('collapsed,void', style({ height: '0px', minHeight: '0' })),
607
- state('expanded', style({ height: '*' })),
608
- transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
609
- ]),
610
- ], standalone: true, imports: [
611
- CommonModule,
612
- MatButtonModule,
613
- MatIconModule,
614
- MatFormFieldModule,
615
- MatInputModule,
616
- MatMenuModule,
617
- MatPaginatorModule,
618
- MatSortModule,
619
- MatTableModule,
620
- MatProgressSpinnerModule,
621
- ButtonModule,
622
- TranslateModule,
623
- MatCheckboxModule,
624
- MatRadioModule,
625
- MatBadgeModule,
626
- DragDropModule,
627
- FormsModule,
628
- DataTableFilterHeader,
629
- DataTableFilter,
630
- DataTableTemplateColumnDefinition,
631
- DataTableTemplateCellDefinition,
632
- DataTableTemplateExpandableColumnDefinition,
633
- DataTableTemplateExpandableCellDefinition,
634
- ], providers: [DATA_TABLE_PERSISTENCE_SERVICE_PROVIDER, MAD_DATA_TABL_GLOBAL_CONFIGURATION_PROVIDER], template: "<div data-cy=\"table-action-bar\" class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length || (filterMode === 'COLUMN_BASED' && showDeleteFilterAction)\">\n <mad-button-group *ngFor=\"let actionGroup of tableActions\" class=\"table-action-group\">\n <mad-outline-button\n [hidden]=\"isHidden(tableAction)\"\n [disabled]=\"isDisabled(tableAction)\"\n *ngFor=\"let tableAction of actionGroup\"\n (click)=\"onActionEvent(tableAction)\"\n >\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }}\n {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </mad-button-group>\n </div>\n <ng-container *ngIf=\"filterMode === 'COLUMN_BASED' && showDeleteFilterAction\">\n <mat-icon fontSet=\"material-icons-outlined\" class=\"delete-filter-action\" color=\"primary\" (click)=\"onDeleteFilter()\"\n >filter_alt_off</mat-icon\n >\n </ng-container>\n <mat-form-field data-cy=\"filter-input\" *ngIf=\"filterMode === 'TABLE_BASED'\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"onTableBasedFilterEvent($event)\" placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <ng-container *ngFor=\"let rowAction of rowActions\">\n <button\n data-cy=\"row-action-menu-button\"\n *ngIf=\"!isHidden(rowAction)\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\"\n [disabled]=\"isDisabled(rowAction)\"\n >\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-container>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button\n *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{ 'active-column-definition': isCurrentDefinition(definition) }\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div\n *ngIf=\"filterMode === 'COLUMN_BASED' || showEmptyTable || !!dataSource.filteredData?.length; else noData\"\n class=\"datatable\"\n [class]=\"tableClass\"\n>\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n <table\n [id]=\"id\"\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"onSortingEvent($event)\"\n madFilter\n (madFilterChange)=\"onColumnBasedFilterEvent($event)\"\n [multiTemplateDataRows]=\"!!expandableDef\"\n >\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"selectionEmitMode !== 'NONE' && selectionMode === 'BATCH'\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox (change)=\"onToggleSelectAll()\" [checked]=\"allSelected\"> </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"showActionColumn ? 'row-action-cell' : 'no-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"showCheckbox(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-checkbox class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n data-cy=\"row-action-button\"\n *ngIf=\"showRowActionIcon(element) && hasVisibleRowActions(element)\"\n [matMenuTriggerData]=\"{ element: element }\"\n [matMenuTriggerFor]=\"rowActionMenu\"\n (click)=\"onSelectionEvent(element.rowId)\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- SINGLE: row radio button -->\n <div *ngIf=\"showRadioButton(element)\" class=\"mad-datatable-checkbox-container\" (click)=\"onRowEvent($event, element)\">\n <mat-radio-button class=\"no-pointer-events\" [checked]=\"isSelected(element.rowId)\"> </mat-radio-button>\n </div>\n <!-- EXPANDABLE: row is expandable/collapsable -->\n <mad-icon-button *ngIf=\"showExpandableButton(element)\" (click)=\"onExpand($event, element)\">\n <mat-icon *ngIf=\"expandedElement !== element\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"expandedElement === element\">keyboard_arrow_up</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container [ngSwitch]=\"getDataTableHeaderType(column)\">\n <ng-container *ngSwitchCase=\"'SORT'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchCase=\"'SORT_AND_FILTER'\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n [class.text-right]=\"column.isRightAligned\"\n mat-sort-header=\"{{ column.orderByName ? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n mad-filter-header=\"{{ column.dataPropertyName }}\"\n [madFilterColumnRightAligned]=\"column.isRightAligned\"\n [madFilterOptions]=\"column.filterParams?.filterOptions\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n </ng-container>\n\n <!-- data cell to be injected -->\n <td\n mat-cell\n *matCellDef=\"let element\"\n [class.text-right]=\"column.isRightAligned\"\n [class.mad-dt-child-cell]=\"element.parentId\"\n [ngSwitch]=\"column.transformer\"\n (click)=\"!disableRowClick && onRowEvent($event, element)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n getCustomCellTemplate(column.id) || defaultCellTemplate;\n context: { column: column, element: element, $implicit: element }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <!-- Expanded Content Column - The row is made up of this one column that spans across all columns -->\n <ng-container *ngIf=\"!!expandableDef\" [matColumnDef]=\"expandableColumnDef\">\n <td mat-cell *matCellDef=\"let element\" [attr.colspan]=\"columns.length + 1\">\n <div class=\"mad-data-table-expandable-area\" [@detailExpand]=\"element === expandedElement ? 'expanded' : 'collapsed'\">\n <ng-container\n *ngTemplateOutlet=\"\n getCustomExpandableTemplate() || defaultCellTemplate;\n context: { column: element, element: element, $implicit: element }\n \"\n ></ng-container>\n </div>\n </td>\n </ng-container>\n\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && selectionEmitMode !== 'NONE'\"\n *matRowDef=\"let row; columns: columnIds\"\n (click)=\"!!expandableColumnDef && onExpand($event, row)\"\n ></tr>\n <ng-container *ngIf=\"!!expandableDef\">\n <tr mat-row *matRowDef=\"let element; columns: [expandableColumnDef]\" class=\"mad-data-table-expandable-row\"></tr>\n </ng-container>\n <tr class=\"mat-row\" *matNoDataRow>\n <td class=\"mat-cell noDataText columnBasedFilter\" [attr.colspan]=\"columnIds.length\">\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </td>\n </tr>\n </table>\n</div>\n<div data-cy=\"table-bottom-area\" class=\"mad-data-table-bottom-area\">\n <div data-cy=\"definition-button-block\" class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button *ngIf=\"editableColumnDefinitions?.length === 1\" (click)=\"onColumnSettings()\">\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button *ngIf=\"(editableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\">\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button *ngIf=\"(viewableColumnDefinitions?.length || 0) > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\">\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"paginationEnabled ? 'block' : 'none'\"\n [length]=\"pageLength\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div data-cy=\"no-data-block\" class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"loading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ translateLabels ? (noDataText | translate) : noDataText }}\n </div>\n</ng-template>\n\n<!-- default cell template -->\n<ng-template #defaultCellTemplate let-element=\"element\" let-column=\"column\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n</ng-template>\n\n<!-- custom cell templates injected from parent -->\n<ng-content></ng-content>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{width:100%;min-height:140px;max-height:100%}.datatable table th,.datatable table td{width:auto;text-overflow:ellipsis;white-space:nowrap}.datatable table th{overflow:visible}.datatable table td{overflow:hidden}.layout-fixed table{table-layout:fixed}.layout-fixed table th{font-weight:700}.layout-fixed table td{white-space:normal;word-wrap:break-word}.text-right{text-align:right!important;padding-right:24px!important}.table-action-group{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.noDataText.columnBasedFilter{padding-top:10px}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-expandable-row{height:0;display:contents;padding:0}.mad-data-table-expandable-row td{border-top-color:transparent;border-bottom-color:transparent}.mad-data-table-expandable-area{overflow:hidden;display:flex;width:100%}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"] }]
635
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.MatDialog }, { type: i17.DataTablePersistenceService, decorators: [{
636
- type: Inject,
637
- args: [MAD_DATA_TABLE_PERSISTENCE_SERVICE]
638
- }] }, { type: undefined, decorators: [{
639
- type: Inject,
640
- args: [MAD_DATA_TABLE_GLOBAL_CONFIGURATION]
641
- }] }], propDecorators: { id: [{
642
- type: Input
643
- }], filterLabel: [{
644
- type: Input
645
- }], filterPlaceholder: [{
646
- type: Input
647
- }], filterColumnsLabel: [{
648
- type: Input
649
- }], filterColumnsPlaceHolder: [{
650
- type: Input
651
- }], showEmptyTable: [{
652
- type: Input
653
- }], noDataText: [{
654
- type: Input
655
- }], columnSettingsModalTitleLabel: [{
656
- type: Input
657
- }], selectedLabel: [{
658
- type: Input
659
- }], availableLabel: [{
660
- type: Input
661
- }], saveLabel: [{
662
- type: Input
663
- }], deleteLabel: [{
664
- type: Input
665
- }], cancelLabel: [{
666
- type: Input
667
- }], infoTextLabel: [{
668
- type: Input
669
- }], tableClass: [{
670
- type: Input
671
- }], translateLabels: [{
672
- type: Input
673
- }], useAsync: [{
674
- type: Input
675
- }], stateful: [{
676
- type: Input
677
- }], persistenceConfig: [{
678
- type: Input
679
- }], loading: [{
680
- type: Input
681
- }], tableData: [{
682
- type: Input
683
- }], idGenerator: [{
684
- type: Input
685
- }], parentIdGenerator: [{
686
- type: Input
687
- }], defaultSort: [{
688
- type: Input
689
- }], externalFilter: [{
690
- type: Input
691
- }], paginationEnabled: [{
692
- type: Input
693
- }], page: [{
694
- type: Input
695
- }], pageSizeOptions: [{
696
- type: Input
697
- }], actions: [{
698
- type: Input
699
- }], selectionEmitType: [{
700
- type: Input
701
- }], showDeleteFilterAction: [{
702
- type: Input
703
- }], disableRowClick: [{
704
- type: Input
705
- }], deleteDefinitionAllowed: [{
706
- type: Input
707
- }], selection: [{
708
- type: Input
709
- }], filterEnabled: [{
710
- type: Input
711
- }], filterMode: [{
712
- type: Input
713
- }], filterValue: [{
714
- type: Input
715
- }], externalPaginator: [{
716
- type: Input
717
- }], defaultPageSize: [{
718
- type: Input
719
- }], selectionEmitMode: [{
720
- type: Input
721
- }], forceMode: [{
722
- type: Input
723
- }], forceSelectionMode: [{
724
- type: Input
725
- }], displayedColumns: [{
726
- type: Input
727
- }], displayedColumnDefinition: [{
728
- type: Input
729
- }], columnDefinitions: [{
730
- type: Input
731
- }], allColumns: [{
732
- type: Input
733
- }], actionEvent: [{
734
- type: Output
735
- }], selectionEvent: [{
736
- type: Output
737
- }], sortEvent: [{
738
- type: Output
739
- }], filterEvent: [{
740
- type: Output
741
- }], pageEvent: [{
742
- type: Output
743
- }], allColumnsEvent: [{
744
- type: Output
745
- }], columnDefinitionChangeEvent: [{
746
- type: Output
747
- }], viewDefinitionChangeEvent: [{
748
- type: Output
749
- }], paginator: [{
750
- type: ViewChild,
751
- args: [MatPaginator]
752
- }], matSort: [{
753
- type: ViewChild,
754
- args: [MatSort]
755
- }], filter: [{
756
- type: ViewChild,
757
- args: [DataTableFilter]
758
- }], columnDefs: [{
759
- type: ContentChildren,
760
- args: [DataTableTemplateColumnDefinition]
761
- }], expandableDef: [{
762
- type: ContentChild,
763
- args: [DataTableTemplateExpandableCellDefinition]
764
- }] } });
765
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUdMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFJTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQVUvRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFJbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FB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LE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csMkJBQTJCO3NCQUFwQyxNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFFa0IsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUVDLE9BQU87c0JBQTlCLFNBQVM7dUJBQUMsT0FBTztnQkFJVSxNQUFNO3NCQUFqQyxTQUFTO3VCQUFDLGVBQWU7Z0JBR3RCLFVBQVU7c0JBRGIsZUFBZTt1QkFBQyxpQ0FBaUM7Z0JBVzlDLGFBQWE7c0JBRGhCLFlBQVk7dUJBQUMseUNBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFBhZ2luYXRvck1vZHVsZSwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIE1hdFNvcnRNb2R1bGUsIFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1hY3Rpb24nO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbnNNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW5zLW1vZGFsL2RhdGEtdGFibGUtY29sdW1ucy1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbixcbiAgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZSxcbiAgRGF0YVRhYmxlRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtY29sdW1uLWRlZmluaXRpb24nO1xuaW1wb3J0IHsgRGF0YVRhYmxlUm93IH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtcm93JztcbmltcG9ydCB7IERhdGFUYWJsZUhlYWRlclR5cGUgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1oZWFkZXItdHlwZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJNb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtZmlsdGVyLW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci1vYmplY3QnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRmlsdGVyIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWZpbHRlci9kYXRhLXRhYmxlLWZpbHRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1zZWxlY3Rpb24tZW1pdC10eXBlJztcbmltcG9ydCB7IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLWVtaXQtbW9kZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVTZWxlY3Rpb25Nb2RlIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uL2RhdGEtdGFibGUtc2VsZWN0aW9uLW1vZGUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU29ydFV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1zb3J0LXV0aWwnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQWN0aW9uVXRpbCB9IGZyb20gJy4vdXRpbC9kYXRhLXRhYmxlLWFjdGlvbi11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZURhdGFVdGlsIH0gZnJvbSAnLi91dGlsL2RhdGEtdGFibGUtZGF0YS11dGlsJztcbmltcG9ydCB7IERhdGFUYWJsZUZpbHRlclV0aWwgfSBmcm9tICcuL3V0aWwvZGF0YS10YWJsZS1maWx0ZXItdXRpbCc7XG5pbXBvcnQge1xuICBEQVRBX1RBQkxFX1BFUlNJU1RFTkNFX1NFUlZJQ0VfUFJPVklERVIsXG4gIERhdGFUYWJsZVBlcnNpc3RlbmNlU2VydmljZSxcbiAgTUFEX0RBVEFfVEFCTEVfUEVSU0lTVEVOQ0VfU0VSVklDRSxcbn0gZnJvbSAnLi9kYXRhLXRhYmxlLXBlcnNpc3RlbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTUFEX0RBVEFfVEFCTEVfR0xPQkFMX0NPTkZJR1VSQVRJT04sXG4gIERhdGFUYWJsZUdsb2JhbENvbmZpZ3VyYXRpb24sXG4gIE1BRF9EQVRBX1RBQkxfR0xPQkFMX0NPTkZJR1VSQVRJT05fUFJPVklERVIsXG59IGZyb20gJy4vY29uZmlndXJhdGlvbi9kYXRhLXRhYmxlLWdsb2JhbC1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuaW1wb3J0IHsgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QmFkZ2VNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9iYWRnZSc7XG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLm1vZHVsZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVGaWx0ZXJIZWFkZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtZmlsdGVyL2RhdGEtdGFibGUtZmlsdGVyLWhlYWRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtY29sdW1uLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlQ2VsbERlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUvZGF0YS10YWJsZS10ZW1wbGF0ZS1jZWxsLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlL2RhdGEtdGFibGUtdGVtcGxhdGUtZXhwYW5kYWJsZS1jZWxsLWRlZmluaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNvbHVtbkRlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtdGVtcGxhdGUvZGF0YS10YWJsZS10ZW1wbGF0ZS1leHBhbmRhYmxlLWNvbHVtbi1kZWZpbml0aW9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVQZXJzaXN0ZW5jZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24vZGF0YS10YWJsZS1wZXJzaXN0ZW5jZS1jb25maWd1cmF0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWFkLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQsdm9pZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcbiAgICBNYXRTb3J0TW9kdWxlLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdEJhZGdlTW9kdWxlLFxuICAgIERyYWdEcm9wTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIERhdGFUYWJsZUZpbHRlckhlYWRlcixcbiAgICBEYXRhVGFibGVGaWx0ZXIsXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVDb2x1bW5EZWZpbml0aW9uLFxuICAgIERhdGFUYWJsZVRlbXBsYXRlQ2VsbERlZmluaXRpb24sXG4gICAgRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ29sdW1uRGVmaW5pdGlvbixcbiAgICBEYXRhVGFibGVUZW1wbGF0ZUV4cGFuZGFibGVDZWxsRGVmaW5pdGlvbixcbiAgXSxcbiAgcHJvdmlkZXJzOiBbREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFX1BST1ZJREVSLCBNQURfREFUQV9UQUJMX0dMT0JBTF9DT05GSUdVUkFUSU9OX1BST1ZJREVSXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcblxuICAvLyBUcmFuc2xhdGlvbnNcbiAgQElucHV0KCkgZmlsdGVyTGFiZWwgPSAnY29tbW9uLmZpbHRlcic7XG4gIEBJbnB1dCgpIGZpbHRlclBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNMYWJlbCA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIgPSAnRmlsdGVyIGF2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgc2hvd0VtcHR5VGFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgbm9EYXRhVGV4dCA9ICdObyBtYXRjaGluZyBkYXRhIGZvdW5kJztcbiAgQElucHV0KCkgY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwgPSAnQ29sdW1uIHNldHRpbmdzJztcbiAgQElucHV0KCkgc2VsZWN0ZWRMYWJlbCA9ICdTZWxlY3RlZCBjb2x1bW5zJztcbiAgQElucHV0KCkgYXZhaWxhYmxlTGFiZWwgPSAnQXZhaWxhYmxlIGNvbHVtbnMnO1xuICBASW5wdXQoKSBzYXZlTGFiZWwgPSAnU2F2ZSc7XG4gIEBJbnB1dCgpIGRlbGV0ZUxhYmVsID0gJ0RlbGV0ZSc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIGluZm9UZXh0TGFiZWwgPSAnRHJhZyBhbmQgZHJvcCBhIGNvbHVtbiB0byBzZWxlY3Qgb3IgcmVvcmRlciBpdC4nO1xuICBASW5wdXQoKSB0YWJsZUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgdHJhbnNsYXRlTGFiZWxzID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzZXQgdXNlQXN5bmModXNlQXN5bmM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl91c2VBc3luYyA9IHVzZUFzeW5jO1xuICAgIHRoaXMuYXBwbHlTb3J0RGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIFBsZWFzZSB1c2UgdGhlIG1vcmUgc3BlY2lmaWMgcGVyc2lzdGVuY2VDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IHN0YXRlZnVsKHN0YXRlZnVsOiBib29sZWFuKSB7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZUNvbmZpZyA9IHtcbiAgICAgIHBlcnNpc3RTb3J0OiBzdGF0ZWZ1bCxcbiAgICAgIHBlcnNpc3RGaWx0ZXI6IHN0YXRlZnVsLFxuICAgICAgcGVyc2lzdFBhZ2VTaXplOiBzdGF0ZWZ1bCxcbiAgICB9O1xuICB9XG5cbiAgQElucHV0KCkgcGVyc2lzdGVuY2VDb25maWc6IERhdGFUYWJsZVBlcnNpc3RlbmNlQ29uZmlndXJhdGlvbiA9IHtcbiAgICBwZXJzaXN0U29ydDogZmFsc2UsXG4gICAgcGVyc2lzdEZpbHRlcjogZmFsc2UsXG4gICAgcGVyc2lzdFBhZ2VTaXplOiBmYWxzZSxcbiAgfTtcblxuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdGFibGVEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGlkR2VuZXJhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIHBhcmVudElkR2VuZXJhdG9yOiBhbnk7XG5cbiAgQElucHV0KCkgZGVmYXVsdFNvcnQ6IFNvcnQ7XG4gIEBJbnB1dCgpIGV4dGVybmFsRmlsdGVyOiBhbnk7XG4gIEBJbnB1dCgpIHBhZ2luYXRpb25FbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBhZ2U6IFBhZ2VFdmVudCA9IHsgcGFnZUluZGV4OiAwLCBwYWdlU2l6ZTogNTAsIGxlbmd0aDogMCB9O1xuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnMgPSBbNSwgMTAsIDE1XTtcblxuICBASW5wdXQoKSBhY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3Rpb25FbWl0VHlwZTogRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUgPSAnSUQnO1xuICBASW5wdXQoKSBzaG93RGVsZXRlRmlsdGVyQWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZGlzYWJsZVJvd0NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uKHNlbGVjdGlvbjogc3RyaW5nW10gfCBhbnlbXSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbk1vZGVsKHNlbGVjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogUGxlYXNlIHVzZSBcImZpbHRlck1vZGVcIiBpbnN0ZWFkXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZmlsdGVyRW5hYmxlZChpc0ZpbHRlckVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9maWx0ZXJNb2RlID0gaXNGaWx0ZXJFbmFibGVkID8gJ1RBQkxFX0JBU0VEJyA6ICdOT05FJztcbiAgICB0aGlzLmFwcGx5RmlsdGVyUHJlZGljYXRlKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZmlsdGVyTW9kZShmaWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlKSB7XG4gICAgdGhpcy5fZmlsdGVyTW9kZSA9IGZpbHRlck1vZGU7XG4gICAgdGhpcy5hcHBseUZpbHRlclByZWRpY2F0ZSgpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZpbHRlclZhbHVlKGZpbHRlclZhbHVlOiBzdHJpbmcgfCBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9maWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXJWYWx1ZSh0aGlzLl9maWx0ZXJWYWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZXh0ZXJuYWxQYWdpbmF0b3IocGFnaW5hdG9yOiBhbnkpIHtcbiAgICB0aGlzLmV4dFBhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkZWZhdWx0UGFnZVNpemUoZGVmYXVsdFNpemU6IG51bWJlcikge1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIC4uLnRoaXMucGFnZSxcbiAgICAgIHBhZ2VTaXplOiBkZWZhdWx0U2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbkVtaXRNb2RlKHNlbGVjdGlvbkVtaXRNb2RlOiBEYXRhVGFibGVTZWxlY3Rpb25FbWl0TW9kZSkge1xuICAgIHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlID0gc2VsZWN0aW9uRW1pdE1vZGU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogVGhpcyBmdW5jdGlvbiBtaXhlcyB1cCAyIHJlc3BvbnNpYmlsaXRpZXM6XG4gICAqICAtIGRldGVybWluaW5nIGlmIGFjdGlvbnMgc2hvdWxkIGJlIGRpc3BsYXllZCAvIGhhbmRsZWRcbiAgICogIC0gZGV0ZXJtaW5pbmcgd2hldGhlciBhY3Rpb25zIGFyZSByb3cgYmFzZWQgKHNpbmdsZSkgb3IgdGFibGUgYmFzZWQgKGJhdGNoKVxuICAgKiBQbGVhc2UgdXNlIGEgY29tYmluYXRpb24gb2YgXCJzZWxlY3Rpb25FbWl0TW9kZVwiIGFuZCBcInNlbGVjdGlvbk1vZGVcIiBpbnN0ZWFkOlxuICAgKiAgLSBzZWxlY3Rpb25FbWl0TW9kZSBkZXRlcm1pbmVzIGhvdyBzZWxlY3RlZCBpdGVtcyBhcmUgaGFuZGxlZCAoYXMgcGFydCBvZiBhY3Rpb25zLCBhcyBzZWxlY3Rpb25zIG9yIG5vdCBhdCBhbGwpXG4gICAqICAtIHNlbGVjdGlvbk1vZGUgZGV0ZXJtaW5lcyBpZiBzZWxlY3RlZCBpdGVtcyBhcmUgdHJlYXRlZCBzZXBhcmF0ZWx5IChzaW5nbGUpIG9yIHRvZ2V0aGVyIChiYXRjaClcbiAgICovXG4gIEBJbnB1dCgpIHNldCBmb3JjZU1vZGUoc2VsZWN0aW9uTW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdTSU5HTEUnIHx8IHNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCcpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlID0gJ09OX0FDVElPTic7XG4gICAgICB0aGlzLl9mb3JjZVNlbGVjdGlvbk1vZGUgPSA8RGF0YVRhYmxlU2VsZWN0aW9uTW9kZT5zZWxlY3Rpb25Nb2RlO1xuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZm9yY2VTZWxlY3Rpb25Nb2RlKHNlbGVjdGlvbk1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUpIHtcbiAgICB0aGlzLl9mb3JjZVNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzcGxheWVkQ29sdW1ucyhjb2xzOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIGlmICghdGhpcy5kaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2xzID8gWy4uLmNvbHNdIDogW107XG4gICAgICB0aGlzLmNvbHVtbklkcyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmlkKTtcbiAgICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKGRlZjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbikge1xuICAgIHRoaXMuY29sdW1ucyA9IGRlZi5kaXNwbGF5ZWRDb2x1bW5zO1xuICAgIHRoaXMuY29sdW1uSWRzID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uaWQpO1xuICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiA9IGRlZjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5EZWZpbml0aW9ucyhkZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdKSB7XG4gICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy52aWV3YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy5fYWxsQ29sdW1uRGVmaW5pdGlvbnMgPSBbLi4uZGVmaW5pdGlvbnNdO1xuICAgIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiBkZWZpbml0aW9ucykge1xuICAgICAgaWYgKGRlZmluaXRpb24uZWRpdGFibGUpIHtcbiAgICAgICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zLnB1c2goZGVmaW5pdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoZGVmaW5pdGlvbi5kaXNwbGF5ZWRDb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudmlld2FibGVDb2x1bW5EZWZpbml0aW9ucy5wdXNoKGRlZmluaXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBhbGxDb2x1bW5zKGFsbENvbHVtbnM6IERhdGFUYWJsZUNvbHVtbltdKSB7XG4gICAgdGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnM7XG4gICAgaWYgKGFsbENvbHVtbnMgJiYgdGhpcy5fc2hvd0NvbHVtbk1vZGFsKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBhY3Rpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG4gIEBPdXRwdXQoKSBmaWx0ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkPigpO1xuICBAT3V0cHV0KCkgcGFnZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpIGFsbENvbHVtbnNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZT4oKTtcbiAgQE91dHB1dCgpIHZpZXdEZWZpbml0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24+KCk7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICAvLyB3ZSBuZWVkIHRvIGhhdmUgdGhpcyBhcyBhIHNldHRlciBkdWUgdG8gdGhlICpuZ0lmIGl0IGlzIGluXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc2V0IG1hdFNvcnQobWF0U29ydDogTWF0U29ydCkge1xuICAgIHRoaXMuX3NvcnQgPSBtYXRTb3J0O1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5fc29ydDtcbiAgfVxuICBAVmlld0NoaWxkKERhdGFUYWJsZUZpbHRlcikgZmlsdGVyOiBEYXRhVGFibGVGaWx0ZXI7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihEYXRhVGFibGVUZW1wbGF0ZUNvbHVtbkRlZmluaXRpb24pXG4gIHNldCBjb2x1bW5EZWZzKGNvbHVtbkRlZnM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVUZW1wbGF0ZUNvbHVtbkRlZmluaXRpb24+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29sdW1uRGVmcyA9IGNvbHVtbkRlZnM7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgY29sdW1uRGVmcygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmcztcbiAgfVxuXG4gIEBDb250ZW50Q2hpbGQoRGF0YVRhYmxlVGVtcGxhdGVFeHBhbmRhYmxlQ2VsbERlZmluaXRpb24pXG4gIHNldCBleHBhbmRhYmxlRGVmKGV4cGFuZGFibGVEZWY6IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZXhwYW5kYWJsZURlZiA9IGV4cGFuZGFibGVEZWY7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBnZXQgZXhwYW5kYWJsZURlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZjtcbiAgfVxuXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnlbXT47XG4gIGFsbFNlbGVjdGVkID0gZmFsc2U7XG5cbiAgZXh0UGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgcmVhZG9ubHkgQUNUSU9OX0NPTFVNTl9OQU1FID0gJ19fYWN0aW9uX18nO1xuICB0YWJsZUFjdGlvbnM6IERhdGFUYWJsZUFjdGlvbltdW10gPSBbXTtcbiAgcm93QWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcblxuICBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICBjb2x1bW5JZHM6IHN0cmluZ1tdO1xuXG4gIGV4cGFuZGVkRWxlbWVudDogRGF0YVRhYmxlQ29sdW1uIHwgbnVsbDtcblxuICBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW107XG4gIHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcblxuICBwcml2YXRlIF91c2VBc3luYzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3Jvd01hcCA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhVGFibGVSb3c+KCk7XG4gIHByaXZhdGUgX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPHN0cmluZz4odHJ1ZSk7XG4gIHByaXZhdGUgX3NlbGVjdGlvbjogc3RyaW5nW10gfCBhbnlbXTtcblxuICBwcml2YXRlIF9zb3J0OiBNYXRTb3J0O1xuXG4gIHByaXZhdGUgX2ZvcmNlU2VsZWN0aW9uTW9kZTogRGF0YVRhYmxlU2VsZWN0aW9uTW9kZTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uRW1pdE1vZGU6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJNb2RlOiBEYXRhVGFibGVGaWx0ZXJNb2RlID0gJ05PTkUnO1xuICBwcml2YXRlIF9maWx0ZXJWYWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2FsbENvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfYWxsQXZhaWxhYmxlQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uW107XG4gIHByaXZhdGUgX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfc2hvd0NvbHVtbk1vZGFsID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY29sdW1uRGVmczogUXVlcnlMaXN0PERhdGFUYWJsZVRlbXBsYXRlQ29sdW1uRGVmaW5pdGlvbj4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2V4cGFuZGFibGVEZWY6IERhdGFUYWJsZVRlbXBsYXRlRXhwYW5kYWJsZUNlbGxEZWZpbml0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbWF0RGlhbG9nOiBNYXREaWFsb2csXG4gICAgQEluamVjdChNQURfREFUQV9UQUJMRV9QRVJTSVNURU5DRV9TRVJWSUNFKSBwcml2YXRlIHBlcnNpc3RlbmNlU2VydmljZTogRGF0YVRhYmxlUGVyc2lzdGVuY2VTZXJ2aWNlLFxuICAgIEBJbmplY3QoTUFEX0RBVEFfVEFCTEVfR0xPQkFMX0NPTkZJR1VSQVRJT04pIHByaXZhdGUgZGF0YVRhYmxlR2xvYmFsQ29uZmlnOiBEYXRhVGFibGVHbG9iYWxDb25maWd1cmF0aW9uLFxuICApIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuX3NvcnQ7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlTb3J0RGF0YSgpO1xuICAgIHRoaXMuaW5pdFN0YXRlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCd0YWJsZURhdGEnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVRhYmxlRGF0YSgpO1xuICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlbCh0aGlzLmdldFNlbGVjdGlvbignSUQnKS5sZW5ndGggPyB0aGlzLmdldFNlbGVjdGlvbignSUQnKSA6IHRoaXMuX3NlbGVjdGlvbik7XG4gICAgICBpZiAodGhpcy5zaG93QWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgnaWRHZW5lcmF0b3InIGluIGNoYW5nZXMgfHwgJ2Rpc3BsYXllZENvbHVtbnMnIGluIGNoYW5nZXMpIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YVRhYmxlRGF0YSgpO1xuICAgIH1cblxuICAgIC8vIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHNhbWUgYmVoYXZpb3VyIGNvdWxkIGJlIGFjaGl2ZWQgaW4gZ2V0dGVycylcbiAgICBpZiAoJ2ZvcmNlTW9kZScgaW4gY2hhbmdlcyB8fCAnZm9yY2VTZWxlY3Rpb25Nb2RlJyBpbiBjaGFuZ2VzIHx8ICdhY3Rpb25zJyBpbiBjaGFuZ2VzKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gRGF0YVRhYmxlQWN0aW9uVXRpbC5nZXREaXNwbGF5QWN0aW9ucyh0aGlzLmFjdGlvbnMsIHRoaXMuc2VsZWN0aW9uTW9kZSk7XG4gICAgICB0aGlzLnJvd0FjdGlvbnMgPSBhY3Rpb25zLnJvd0FjdGlvbnM7XG4gICAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IGFjdGlvbnMuZ3JvdXBlZFRhYmxlQWN0aW9ucztcbiAgICB9XG4gIH1cblxuICAvKiogVEFCTEUgRElTUExBWSBIQU5ETElORyAqL1xuXG4gIHB1YmxpYyBnZXREYXRhVGFibGVIZWFkZXJUeXBlKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uKTogRGF0YVRhYmxlSGVhZGVyVHlwZSB7XG4gICAgaWYgKGNvbHVtbi5pc1NvcnRhYmxlICYmICFjb2x1bW4uaXNGaWx0ZXJhYmxlKSB7XG4gICAgICByZXR1cm4gJ1NPUlQnO1xuICAgIH1cbiAgICBpZiAoIWNvbHVtbi5pc1NvcnRhYmxlICYmIGNvbHVtbi5pc0ZpbHRlcmFibGUpIHtcbiAgICAgIHJldHVybiAnRklMVEVSJztcbiAgICB9XG4gICAgaWYgKGNvbHVtbi5pc1NvcnRhYmxlICYmIGNvbHVtbi5pc0ZpbHRlcmFibGUpIHtcbiAgICAgIHJldHVybiAnU09SVF9BTkRfRklMVEVSJztcbiAgICB9XG4gICAgcmV0dXJuICdQTEFJTic7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tQ2VsbFRlbXBsYXRlKGNvbHVtbklkOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XG4gICAgY29uc3QgY29sdW1uRGVmID0gdGhpcy5fY29sdW1uRGVmcz8uZmluZCgoaXQpID0+IGl0Lm1hZENvbHVtbkRlZiA9PT0gY29sdW1uSWQpO1xuICAgIHJldHVybiBjb2x1bW5EZWYgJiYgY29sdW1uRGVmLmNlbGxEZWYgPyBjb2x1bW5EZWYuY2VsbERlZi5nZXRDZWxsVGVtcGxhdGUoKSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tRXhwYW5kYWJsZVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZj8uZ2V0Q2VsbFRlbXBsYXRlKCkgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwYW5kYWJsZUNvbHVtbkRlZigpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhwYW5kYWJsZURlZj8uY29sdW1uRGVmLm1hZEV4cGFuZGFibGVDb2x1bW5EZWYgfHwgJyc7XG4gIH1cblxuICBwdWJsaWMgb25FeHBhbmQoZXZlbnQ6IE1vdXNlRXZlbnQsIGVsZW1lbnQ6IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuZXhwYW5kZWRFbGVtZW50ID0gdGhpcy5leHBhbmRlZEVsZW1lbnQgPT09IGVsZW1lbnQgPyBudWxsIDogZWxlbWVudDtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gQlVUVE9OIERJU1BMQVkgSEFORExJTkcgKi9cblxuICBwdWJsaWMgaGFzVmlzaWJsZVJvd0FjdGlvbnMoZGlzcGxheWVkRGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJvd0FjdGlvbnMuZXZlcnkoKGFjdGlvbikgPT4gdGhpcy5pc0hpZGRlbkZvckRhdGEoYWN0aW9uLCBbdGhpcy5fcm93TWFwLmdldChkaXNwbGF5ZWREYXRhLnJvd0lkKT8uYWN0dWFsRGF0YV0pKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0hpZGRlbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSGlkZGVuRm9yRGF0YShhY3Rpb24sIHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0hpZGRlbkZvckRhdGEoYWN0aW9uOiBEYXRhVGFibGVBY3Rpb24sIGRhdGE6IGFueVtdKSB7XG4gICAgcmV0dXJuICEhYWN0aW9uLmlzSGlkZGVuICYmIGFjdGlvbi5pc0hpZGRlbihkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGFjdGlvbjogRGF0YVRhYmxlQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uLnR5cGUpIHx8ICghIWFjdGlvbi5pc0Rpc2FibGVkICYmIGFjdGlvbi5pc0Rpc2FibGVkKHRoaXMuZ2V0U2VsZWN0aW9uKCdEQVRBJykpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEaXNhYmxlZEZvckFjdGlvblR5cGUoYWN0aW9uVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlICdTSU5HTEUnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50ICE9PSAxO1xuICAgICAgY2FzZSAnQkFUQ0gnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50IDwgMTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSAnQkFUQ0gnIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCAoJHtjb3VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWw/LnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIC8qKiBUQUJMRSBEQVRBIENIQU5HRSBIQU5ETElORyAqL1xuXG4gIHByaXZhdGUgdXBkYXRlRGF0YVRhYmxlRGF0YSgpOiB2b2lkIHtcbiAgICAvLyBkbyBub3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGltbXV0YWJsZSAtIHdlIGRlc3BhcmF0ZWx5IG5lZWQgdGhlIHJlZmVyZW5jZSBvZiByb3dNYXAgdG8gc3RheSB0aGUgc2FtZVxuICAgIERhdGFUYWJsZURhdGFVdGlsLnVwZGF0ZVJvd01hcCh0aGlzLl9yb3dNYXAsIHRoaXMudGFibGVEYXRhLCB0aGlzLmNvbHVtbnMsIHRoaXMuaWRHZW5lcmF0b3IsIHRoaXMucGFyZW50SWRHZW5lcmF0b3IpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gQXJyYXkuZnJvbSh0aGlzLl9yb3dNYXAudmFsdWVzKCkpLm1hcCgoaXQpID0+IGl0LmRpc3BsYXllZERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTZWxlY3Rpb25Nb2RlbChzZWxlY3Rpb246IHN0cmluZ1tdIHwgYW55W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgIHNlbGVjdGlvbj8uZm9yRWFjaCgoaXQpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9yb3dNYXAuZ2V0KGl0KSB8fCBbLi4udGhpcy5fcm93TWFwLnZhbHVlcygpXS5maW5kKChyb3cpID0+IHJvdy5hY3R1YWxEYXRhID09PSBpdCk7XG4gICAgICBpZiAoISFpdGVtKSB7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25FdmVudChpdGVtLmlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmVtaXRTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKiBBQ1RJT04gJiBTRUxFQ1RJT04gSEFORExJTkcgKi9cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkVtaXRNb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbkVtaXRNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdOT05FJyAmJiAhIXRoaXMuYWN0aW9ucy5sZW5ndGggPyAnT05fQUNUSU9OJyA6IHRoaXMuX3NlbGVjdGlvbkVtaXRNb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IERhdGFUYWJsZVNlbGVjdGlvbk1vZGUge1xuICAgIHJldHVybiAhIXRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA/IHRoaXMuX2ZvcmNlU2VsZWN0aW9uTW9kZSA6IHRoaXMuYWN0aW9ucy5maW5kKChpdCkgPT4gaXQudHlwZSA9PT0gJ0JBVENIJykgPyAnQkFUQ0gnIDogJ1NJTkdMRSc7XG4gIH1cblxuICAvLyBnZXQgZmlsdGVyZWQgJiBzb3J0ZWQgZGF0YSBvZiB0aGUgY3VycmVudCBwYWdlXG4gIHB1YmxpYyBnZXQgZGlzcGxheWVkRGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uX3BhZ2VEYXRhKHRoaXMuZGF0YVNvdXJjZT8uc29ydERhdGEodGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YSwgdGhpcy5kYXRhU291cmNlLnNvcnQpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd0FjdGlvbkNvbHVtbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnTk9ORScgfHwgdGhpcy5oaWRlQWN0aW9uQ29sdW1uKSB8fCAhIXRoaXMuX2V4cGFuZGFibGVEZWY7XG4gIH1cblxuICBwdWJsaWMgc2hvd0NoZWNrYm94KGRpc3BsYXllZERhdGE6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGlzcGxheWVkRGF0YS5wYXJlbnRJZCAmJiB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdCQVRDSCcgJiYgIXRoaXMuaGlkZUFjdGlvbkNvbHVtbjtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Um93QWN0aW9uSWNvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX0FDVElPTicgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJyAmJiAhdGhpcy5oaWRlQWN0aW9uQ29sdW1uO1xuICB9XG5cbiAgcHVibGljIHNob3dSYWRpb0J1dHRvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ09OX1NFTEVDVElPTicgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnU0lOR0xFJztcbiAgfVxuXG4gIHB1YmxpYyBzaG93RXhwYW5kYWJsZUJ1dHRvbihkaXNwbGF5ZWREYXRhOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRpc3BsYXllZERhdGEucGFyZW50SWQgJiYgISF0aGlzLl9leHBhbmRhYmxlRGVmO1xuICB9XG5cbiAgcHVibGljIGlzU2VsZWN0ZWQocm93SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvd0lkKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRvZ2dsZVNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICAvLyBjbGVhciBhbGwgc2VsZWN0aW9uIGZpcnN0XG4gICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAvLyB0b2dnbGUgYWxsIGNoZWNrYm94XG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9ICF0aGlzLmFsbFNlbGVjdGVkO1xuICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKSB7XG4gICAgICAvLyBzZWxlY3QgYWxsIHJvd3Mgb2YgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBpZiAoIXJvdy5wYXJlbnRJZCkge1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChyb3cucm93SWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgb25BY3Rpb25FdmVudChhY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGVtaXRBY3Rpb24gPSB7IC4uLmFjdGlvbiB9O1xuICAgIGlmICghIWVtaXRBY3Rpb24gJiYgdGhpcy5zZWxlY3Rpb25FbWl0TW9kZSAhPT0gJ05PTkUnKSB7XG4gICAgICBlbWl0QWN0aW9uLnNlbGVjdGVkID0gdGhpcy5nZXRTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb25FbWl0VHlwZSk7XG4gICAgICB0aGlzLmFjdGlvbkV2ZW50LmVtaXQoZW1pdEFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU2VsZWN0aW9uRXZlbnQoaWQ6IGFueSk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5zZWxlY3Rpb25Nb2RlKSB7XG4gICAgICBjYXNlICdCQVRDSCc6XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnRvZ2dsZShpZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU0lOR0xFJzpcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwudG9nZ2xlKGlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUm93RXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25FbWl0TW9kZSA9PT0gJ05PTkUnIHx8IHJvdz8ucGFyZW50SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uU2VsZWN0aW9uRXZlbnQocm93LnJvd0lkKTtcbiAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb24oZXZlbnQsIGFjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZWZhdWx0QWN0aW9uKCk6IERhdGFUYWJsZUFjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJyA/IHRoaXMucm93QWN0aW9uc1swXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGhpZGVBY3Rpb25Db2x1bW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9BQ1RJT04nICYmIHRoaXMuYWN0aW9ucy5ldmVyeSgoaXQpID0+IGl0LnR5cGUgPT09ICdOT05FJyk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NTZWxlY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQsIGFjdGlvbj86IERhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2VsZWN0aW9uRW1pdE1vZGUgPT09ICdPTl9BQ1RJT04nICYmXG4gICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdTSU5HTEUnICYmXG4gICAgICAhIWFjdGlvbiAmJlxuICAgICAgIURhdGFUYWJsZUNvbXBvbmVudC5pc0NsaWNrT25Sb3dNZW51SWNvbihldmVudClcbiAgICApIHtcbiAgICAgIHRoaXMub25BY3Rpb25FdmVudChhY3Rpb24pO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVtaXRNb2RlID09PSAnT05fU0VMRUNUSU9OJykge1xuICAgICAgdGhpcy5zZWxlY3Rpb25FdmVudC5lbWl0KHRoaXMuZ2V0U2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uRW1pdFR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdGlvbihzZWxlY3Rpb25FbWl0VHlwZTogRGF0YVRhYmxlU2VsZWN0aW9uRW1pdFR5cGUpOiBhbnlbXSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xuICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmZvckVhY2goKGl0KSA9PlxuICAgICAgLy8gaWYgSUQtZ2VuZXJhdG9yIGlzIHByb3ZpZGVkLCByZXR1cm4gdGhlIElELCBlbHNlIHJldHVybiB0aGUgQUNUVUFMIGRhdGFcbiAgICAgIHNlbGVjdGlvbi5wdXNoKHRoaXMuaWRHZW5lcmF0b3IgJiYgc2VsZWN0aW9uRW1pdFR5cGUgPT09ICdJRCcgPyBpdCA6IHRoaXMuX3Jvd01hcC5nZXQoaXQpPy5hY3R1YWxEYXRhKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGlzQ2xpY2tPblJvd01lbnVJY29uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChldmVudD8udGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXQtaWNvbicpO1xuICB9XG5cbiAgLyoqIFNPUlQgSEFORExJTkcgKi9cblxuICBvblNvcnRpbmdFdmVudChzb3J0OiBTb3J0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3VzZUFzeW5jKSB7XG4gICAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RTb3J0KSB7XG4gICAgICB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5zYXZlU29ydCh0aGlzLmlkLCBzb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U29ydERhdGEoKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnREYXRhID0gdGhpcy5fdXNlQXN5bmNcbiAgICAgID8gRGF0YVRhYmxlU29ydFV0aWwuc29ydE5vdGhpbmcoKVxuICAgICAgOiBEYXRhVGFibGVTb3J0VXRpbC5zb3J0RGF0YShbLi4udGhpcy5kYXRhVGFibGVHbG9iYWxDb25maWcuZGF0ZVRpbWVGb3JtYXRdLCB0aGlzLmRhdGFUYWJsZUdsb2JhbENvbmZpZy5udW1iZXJGb3JtYXQpO1xuICB9XG5cbiAgLyoqIEZJTFRFUiBIQU5ETElORyAqL1xuXG4gIHB1YmxpYyBnZXQgZmlsdGVyTW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlQXN5bmMgJiYgdGhpcy5fZmlsdGVyTW9kZSA9PT0gJ1RBQkxFX0JBU0VEJyA/ICdOT05FJyA6IHRoaXMuX2ZpbHRlck1vZGU7XG4gIH1cblxuICBwdWJsaWMgb25UYWJsZUJhc2VkRmlsdGVyRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vbkZpbHRlcmluZ0V2ZW50KChldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIG9uQ29sdW1uQmFzZWRGaWx0ZXJFdmVudChmaWx0ZXI6IERhdGFUYWJsZUZpbHRlck9iamVjdCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudChmaWx0ZXIpO1xuICB9XG5cbiAgcHVibGljIG9uRGVsZXRlRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMub25GaWx0ZXJpbmdFdmVudCh1bmRlZmluZWQpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZUZpbHRlcmFibGVzKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIG9uRmlsdGVyaW5nRXZlbnQoZmlsdGVyOiBzdHJpbmcgfCBEYXRhVGFibGVGaWx0ZXJPYmplY3QgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMuZmlsdGVyRXZlbnQuZW1pdChmaWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpO1xuICAgICAgdGhpcy5hcHBseUZpbHRlclZhbHVlKGZpbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdEZpbHRlcikge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZUZpbHRlcih0aGlzLmlkLCBmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJQcmVkaWNhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9XG4gICAgICB0aGlzLmZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnXG4gICAgICAgID8gRGF0YVRhYmxlRmlsdGVyVXRpbC5jb2x1bW5CYXNlZEZpbHRlclByZWRpY2F0ZSh0aGlzLl9yb3dNYXApXG4gICAgICAgIDogRGF0YVRhYmxlRmlsdGVyVXRpbC50YWJsZUJhc2VkRmlsdGVyUHJlZGljYXRlKCk7XG4gICAgdGhpcy5hcHBseUZpbHRlclZhbHVlKHRoaXMuX2ZpbHRlclZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0YVRhYmxlRmlsdGVyT2JqZWN0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgdGhpcy5fZmlsdGVyVmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAhIXZhbHVlID8gKGlzU3RyaW5nID8gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIDogJyc7XG4gIH1cblxuICAvKiogUEFHSU5BVElPTiBIQU5ETElORyAqL1xuXG4gIG9uUGFnZUV2ZW50KGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXNlQXN5bmMpIHtcbiAgICAgIHRoaXMucGFnZUV2ZW50LmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlQ29uZmlnLnBlcnNpc3RQYWdlU2l6ZSkge1xuICAgICAgdGhpcy5wZXJzaXN0ZW5jZVNlcnZpY2Uuc2F2ZVBhZ2VTaXplKHRoaXMuaWQsIGV2ZW50LnBhZ2VTaXplKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFnZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IDAgOiB0aGlzLnBhZ2UucGFnZUluZGV4O1xuICB9XG5cbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IHRoaXMuZGF0YUxlbmd0aCA6IHRoaXMucGFnZS5wYWdlU2l6ZTtcbiAgfVxuXG4gIGdldCBwYWdlTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0FsbCA/IHRoaXMuZGF0YUxlbmd0aCA6IHRoaXMucGFnZS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRvcigpIHtcbiAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UuZW1pdCh0aGlzLnBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRhdGFMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmRhdGE/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc2hvd0FsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3VzZUFzeW5jICYmICF0aGlzLnBhZ2luYXRpb25FbmFibGVkO1xuICB9XG5cbiAgLyoqIElOSVQgU1RBVEUgKi9cblxuICBwcml2YXRlIGluaXRTdGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBvbmx5IHNldCBkZWZhdWx0IHNvcnQgaWYgdGhlcmUgaXMgbm8gb3RoZXIgc29ydCBwZXJzaXN0ZWRcbiAgICBpZiAoISF0aGlzLmRlZmF1bHRTb3J0ICYmICF0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkU29ydCh0aGlzLmlkKT8uZGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNldFNvcnQodGhpcy5kZWZhdWx0U29ydCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVyc2lzdGVuY2VDb25maWcucGVyc2lzdFNvcnQpIHtcbiAgICAgIHRoaXMuaW5pdFNvcnRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0RmlsdGVyKSB7XG4gICAgICB0aGlzLmluaXRGaWx0ZXJTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZUNvbmZpZy5wZXJzaXN0UGFnZVNpemUpIHtcbiAgICAgIHRoaXMuaW5pdFBhZ2luYXRvclN0YXRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTb3J0U3RhdGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLmxvYWRTb3J0KHRoaXMuaWQpO1xuICAgIGlmICghIXNvcnQpIHtcbiAgICAgIHRoaXMuc2V0U29ydChzb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNvcnQoc29ydDogU29ydCk6IHZvaWQge1xuICAgIHRoaXMuX3NvcnQuYWN0aXZlID0gc29ydC5hY3RpdmU7XG4gICAgdGhpcy5fc29ydC5kaXJlY3Rpb24gPSBzb3J0LmRpcmVjdGlvbjtcbiAgICB0aGlzLl9zb3J0LnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZpbHRlclN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMucGVyc2lzdGVuY2VTZXJ2aWNlLmxvYWRGaWx0ZXIodGhpcy5pZCk7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlRmlsdGVyYWJsZXMoZmlsdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBhZ2luYXRvclN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIHBhZ2VJbmRleDogMCxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBlcnNpc3RlbmNlU2VydmljZS5sb2FkUGFnZVNpemUodGhpcy5pZCkgfHwgdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGxlbmd0aDogMCxcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVQYWdpbmF0b3IoKTtcbiAgfVxuXG4gIC8qKiBDT0xVTU4gSEFORExJTkcgKi9cblxuICBwdWJsaWMgb25WaWV3RGVmaW5pdGlvbihkZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0ZWRDb2x1bW5EZWZpbml0aW9uID0gZGVmaW5pdGlvbjtcbiAgICB0aGlzLnZpZXdEZWZpbml0aW9uQ2hhbmdlRXZlbnQuZW1pdChkZWZpbml0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbHVtblNldHRpbmdzKGRlZmluaXRpb24/OiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24gPSBkZWZpbml0aW9uID8gZGVmaW5pdGlvbiA6IHRoaXMuX2FsbENvbHVtbkRlZmluaXRpb25zWzBdO1xuICAgIGlmICh0aGlzLl9hbGxBdmFpbGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBubyBjb21wbGV0ZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbG9hZGVkIHlldCBzZW5kIGFuIGV2ZW50IHNvIHRoZSBhcHAgY2FuIGxvYWQgaXRcbiAgICAgIHRoaXMuYWxsQ29sdW1uc0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbiAmJiB0aGlzLl9zZWxlY3RlZENvbHVtbkRlZmluaXRpb24uaWQgPT09IGRlZmluaXRpb24uaWQ7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Db2x1bW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dEYXRhOiBEYXRhVGFibGVEaWFsb2dEYXRhID0ge1xuICAgICAgYWxsQ29sdW1uczogdGhpcy5fYWxsQXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIGRlZmluaXRpb246IHRoaXMuX3NlbGVjdGVkQ29sdW1uRGVmaW5pdGlvbixcbiAgICAgIGRlbGV0ZURlZmluaXRpb25BbGxvd2VkOiB0aGlzLmRlbGV0ZURlZmluaXRpb25BbGxvd2VkLFxuICAgICAgZmlsdGVyQ29sdW1uc0xhYmVsOiB0aGlzLmZpbHRlckNvbHVtbnNMYWJlbCxcbiAgICAgIGZpbHRlckNvbHVtbnNQbGFjZUhvbGRlcjogdGhpcy5maWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIsXG4gICAgICBub0RhdGFUZXh0OiB0aGlzLm5vRGF0YVRleHQsXG4gICAgICB0aXRsZUxhYmVsOiB0aGlzLmNvbHVtblNldHRpbmdzTW9kYWxUaXRsZUxhYmVsLFxuICAgICAgc2VsZWN0ZWRMYWJlbDogdGhpcy5zZWxlY3RlZExhYmVsLFxuICAgICAgYXZhaWxhYmxlTGFiZWw6IHRoaXMuYXZhaWxhYmxlTGFiZWwsXG4gICAgICBzYXZlTGFiZWw6IHRoaXMuc2F2ZUxhYmVsLFxuICAgICAgZGVsZXRlTGFiZWw6IHRoaXMuZGVsZXRlTGFiZWwsXG4gICAgICBjYW5jZWxMYWJlbDogdGhpcy5jYW5jZWxMYWJlbCxcbiAgICAgIGluZm9UZXh0TGFiZWw6IHRoaXMuaW5mb1RleHRMYWJlbCxcbiAgICB9O1xuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMubWF0RGlhbG9nLm9wZW4oRGF0YVRhYmxlQ29sdW1uc01vZGFsQ29tcG9uZW50LCB7IGRhdGE6IGRpYWxvZ0RhdGEgfSk7XG4gICAgZGlhbG9nLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIC8vIG5vIGV2ZW50IG9uIENBTkNFTFxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudC5lbWl0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgZGF0YS1jeT1cInRhYmxlLWFjdGlvbi1iYXJcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtYWN0aW9uLWJhclwiPlxuICA8IS0tIFRhYmxlIGFjdGlvbnM6IGRpc3BsYXllZCBiZWZvcmUgdGhlIHRhYmxlIC0tPlxuICA8ZGl2ICpuZ0lmPVwidGFibGVBY3Rpb25zPy5sZW5ndGggfHwgKGZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnICYmIHNob3dEZWxldGVGaWx0ZXJBY3Rpb24pXCI+XG4gICAgPG1hZC1idXR0b24tZ3JvdXAgKm5nRm9yPVwibGV0IGFjdGlvbkdyb3VwIG9mIHRhYmxlQWN0aW9uc1wiIGNsYXNzPVwidGFibGUtYWN0aW9uLWdyb3VwXCI+XG4gICAgICA8bWFkLW91dGxpbmUtYnV0dG9uXG4gICAgICAgIFtoaWRkZW5dPVwiaXNIaWRkZW4odGFibGVBY3Rpb24pXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQodGFibGVBY3Rpb24pXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHRhYmxlQWN0aW9uIG9mIGFjdGlvbkdyb3VwXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQWN0aW9uRXZlbnQodGFibGVBY3Rpb24pXCJcbiAgICAgID5cbiAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKHRhYmxlQWN0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IHRhYmxlQWN0aW9uLmxhYmVsIH19XG4gICAgICAgIHt7IGdldFNlbGVjdGVkQ291bnQodGFibGVBY3Rpb24udHlwZSkgfX1cbiAgICAgIDwvbWFkLW91dGxpbmUtYnV0dG9uPlxuICAgIDwvbWFkLWJ1dHRvbi1ncm91cD5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJNb2RlID09PSAnQ09MVU1OX0JBU0VEJyAmJiBzaG93RGVsZXRlRmlsdGVyQWN0aW9uXCI+XG4gICAgPG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiIGNsYXNzPVwiZGVsZXRlLWZpbHRlci1hY3Rpb25cIiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25EZWxldGVGaWx0ZXIoKVwiXG4gICAgICA+ZmlsdGVyX2FsdF9vZmY8L21hdC1pY29uXG4gICAgPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG1hdC1mb3JtLWZpZWxkIGRhdGEtY3k9XCJmaWx0ZXItaW5wdXRcIiAqbmdJZj1cImZpbHRlck1vZGUgPT09ICdUQUJMRV9CQVNFRCdcIj5cbiAgICA8bWF0LWxhYmVsPnt7IHRyYW5zbGF0ZUxhYmVscyA/IChmaWx0ZXJMYWJlbCB8IHRyYW5zbGF0ZSkgOiBmaWx0ZXJMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dCBtYXRJbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiAoa2V5dXApPVwib25UYWJsZUJhc2VkRmlsdGVyRXZlbnQoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwie3sgZmlsdGVyUGxhY2Vob2xkZXIgfX1cIiAvPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG5cbjwhLS0gUm93IGFjdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICNyb3dBY3Rpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQgbGV0LWVsZW1lbnQ9XCJlbGVtZW50XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93QWN0aW9uIG9mIHJvd0FjdGlvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgZGF0YS1jeT1cInJvdy1hY3Rpb24tbWVudS1idXR0b25cIlxuICAgICAgICAqbmdJZj1cIiFpc0hpZGRlbihyb3dBY3Rpb24pXCJcbiAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgICAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQsIHJvd0FjdGlvbilcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChyb3dBY3Rpb24pXCJcbiAgICAgID5cbiAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKHJvd0FjdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiByb3dBY3Rpb24ubGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBlZGl0YWJsZSBkZWZpbml0aW9uIG1lbnUgLS0+XG48bWF0LW1lbnUgI2VkaXRhYmxlRGVmaW5pdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zXCJcbiAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgIGNsYXNzPVwicm93LWFjdGlvblwiXG4gICAgICAoY2xpY2spPVwib25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uKVwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdhY3RpdmUtY29sdW1uLWRlZmluaXRpb24nOiBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb24pIH1cIlxuICAgID5cbiAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChkZWZpbml0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGRlZmluaXRpb24ubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gdmlld2FibGUgZGVmaW5pdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICN2aWV3YWJsZURlZmluaXRpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IGRlZmluaXRpb24gb2Ygdmlld2FibGVDb2x1bW5EZWZpbml0aW9uc1wiXG4gICAgICBtYXQtbWVudS1pdGVtXG4gICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgKGNsaWNrKT1cIm9uVmlld0RlZmluaXRpb24oZGVmaW5pdGlvbilcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLWNvbHVtbi1kZWZpbml0aW9uJzogaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uKSB9XCJcbiAgICA+XG4gICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoZGVmaW5pdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBkZWZpbml0aW9uLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48IS0tIFRhYmxlIC0tPlxuPGRpdlxuICAqbmdJZj1cImZpbHRlck1vZGUgPT09ICdDT0xVTU5fQkFTRUQnIHx8IHNob3dFbXB0eVRhYmxlIHx8ICEhZGF0YVNvdXJjZS5maWx0ZXJlZERhdGE/Lmxlbmd0aDsgZWxzZSBub0RhdGFcIlxuICBjbGFzcz1cImRhdGF0YWJsZVwiXG4gIFtjbGFzc109XCJ0YWJsZUNsYXNzXCJcbj5cbiAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtc3Bpbm5lci13cmFwcGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG4gIDx0YWJsZVxuICAgIFtpZF09XCJpZFwiXG4gICAgbWF0LXRhYmxlXG4gICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgbWF0U29ydFxuICAgIChtYXRTb3J0Q2hhbmdlKT1cIm9uU29ydGluZ0V2ZW50KCRldmVudClcIlxuICAgIG1hZEZpbHRlclxuICAgIChtYWRGaWx0ZXJDaGFuZ2UpPVwib25Db2x1bW5CYXNlZEZpbHRlckV2ZW50KCRldmVudClcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwiISFleHBhbmRhYmxlRGVmXCJcbiAgPlxuICAgIDwhLS0gUm93IGFjdGlvbnMgY29sdW1uLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIkFDVElPTl9DT0xVTU5fTkFNRVwiPlxuICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtuZ0NsYXNzXT1cInNob3dBY3Rpb25Db2x1bW4gPyAncm93LWFjdGlvbi1jZWxsJyA6ICduby1hY3Rpb24tY2VsbCdcIj5cbiAgICAgICAgPCEtLSBCQVRDSDogbWFzdGVyIGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJyAmJiBzZWxlY3Rpb25Nb2RlID09PSAnQkFUQ0gnXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCJvblRvZ2dsZVNlbGVjdEFsbCgpXCIgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIj4gPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNJTkdMRSAvIE5PTkU6IG5vdGhpbmcgaW4gaGVhZGVyIHJvdyAtLT5cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFtuZ0NsYXNzXT1cInNob3dBY3Rpb25Db2x1bW4gPyAncm93LWFjdGlvbi1jZWxsJyA6ICduby1hY3Rpb24tY2VsbCdcIj5cbiAgICAgICAgPCEtLSBCQVRDSDogcm93IGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NoZWNrYm94KGVsZW1lbnQpXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIChjbGljayk9XCJvblJvd0V2ZW50KCRldmVudCwgZWxlbWVudClcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibm8tcG9pbnRlci1ldmVudHNcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGVsZW1lbnQucm93SWQpXCI+IDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTSU5HTEU6IHJvdyBhY3Rpb24gbWVudSBpY29uIC0tPlxuICAgICAgICA8bWFkLWljb24tYnV0dG9uXG4gICAgICAgICAgZGF0YS1jeT1cInJvdy1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAqbmdJZj1cInNob3dSb3dBY3Rpb25JY29uKGVsZW1lbnQpICYmIGhhc1Zpc2libGVSb3dBY3Rpb25zKGVsZW1lbnQpXCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJEYXRhXT1cInsgZWxlbWVudDogZWxlbWVudCB9XCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwicm93QWN0aW9uTWVudVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0aW9uRXZlbnQoZWxlbWVudC5yb3dJZClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgICAgICA8IS0tIFNJTkdMRTogcm93IHJhZGlvIGJ1dHRvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dSYWRpb0J1dHRvbihlbGVtZW50KVwiIGNsYXNzPVwibWFkLWRhdGF0YWJsZS1jaGVja2JveC1jb250YWluZXJcIiAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQpXCI+XG4gICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJuby1wb2ludGVyLWV2ZW50c1wiIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQoZWxlbWVudC5yb3dJZClcIj4gPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBFWFBBTkRBQkxFOiByb3cgaXMgZXhwYW5kYWJsZS9jb2xsYXBzYWJsZSAtLT5cbiAgICAgICAgPG1hZC1pY29uLWJ1dHRvbiAqbmdJZj1cInNob3dFeHBhbmRhYmxlQnV0dG9uKGVsZW1lbnQpXCIgKGNsaWNrKT1cIm9uRXhwYW5kKCRldmVudCwgZWxlbWVudClcIj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJleHBhbmRlZEVsZW1lbnQgIT09IGVsZW1lbnRcIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJleHBhbmRlZEVsZW1lbnQgPT09IGVsZW1lbnRcIj5rZXlib2FyZF9hcnJvd191cDwvbWF0LWljb24+XG4gICAgICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgICAgICA8IS0tIE5PTkU6IG5vdGhpbmcgLS0+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gQ2VsbCBkZWZpbml0aW9ucyBhbmQgcm93cyB3aXRoIGluamVjdGVkIGNlbGxzIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4uaWRcIj5cbiAgICAgIDwhLS0gaGVhZGVyIGNlbGwgdG8gYmUgaW5qZWN0ZWQgLS0+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJnZXREYXRhVGFibGVIZWFkZXJUeXBlKGNvbHVtbilcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1NPUlQnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgbWF0LXNvcnQtaGVhZGVyPVwie3sgY29sdW1uLm9yZGVyQnlOYW1lID8gY29sdW1uLm9yZGVyQnlOYW1lIDogY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkID8gJ2JlZm9yZScgOiAnYWZ0ZXInXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInRklMVEVSJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgICAgIG1hZC1maWx0ZXItaGVhZGVyPVwie3sgY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgICAgW21hZEZpbHRlckNvbHVtblJpZ2h0QWxpZ25lZF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICAgICAgW21hZEZpbHRlck9wdGlvbnNdPVwiY29sdW1uLmZpbHRlclBhcmFtcz8uZmlsdGVyT3B0aW9uc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ1NPUlRfQU5EX0ZJTFRFUidcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgICAgICBtYXQtc29ydC1oZWFkZXI9XCJ7eyBjb2x1bW4ub3JkZXJCeU5hbWUgPyBjb2x1bW4ub3JkZXJCeU5hbWUgOiBjb2x1bW4uZGF0YVByb3BlcnR5TmFtZSB9fVwiXG4gICAgICAgICAgICBbYXJyb3dQb3NpdGlvbl09XCJjb2x1bW4uaXNSaWdodEFsaWduZWQgPyAnYmVmb3JlJyA6ICdhZnRlcidcIlxuICAgICAgICAgICAgbWFkLWZpbHRlci1oZWFkZXI9XCJ7eyBjb2x1bW4uZGF0YVByb3BlcnR5TmFtZSB9fVwiXG4gICAgICAgICAgICBbbWFkRmlsdGVyQ29sdW1uUmlnaHRBbGlnbmVkXT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgICAgICBbbWFkRmlsdGVyT3B0aW9uc109XCJjb2x1bW4uZmlsdGVyUGFyYW1zPy5maWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiPlxuICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGRhdGEgY2VsbCB0byBiZSBpbmplY3RlZCAtLT5cbiAgICAgIDx0ZFxuICAgICAgICBtYXQtY2VsbFxuICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCJcbiAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgW2NsYXNzLm1hZC1kdC1jaGlsZC1jZWxsXT1cImVsZW1lbnQucGFyZW50SWRcIlxuICAgICAgICBbbmdTd2l0Y2hdPVwiY29sdW1uLnRyYW5zZm9ybWVyXCJcbiAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlUm93Q2xpY2sgJiYgb25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBnZXRDdXN0b21DZWxsVGVtcGxhdGUoY29sdW1uLmlkKSB8fCBkZWZhdWx0Q2VsbFRlbXBsYXRlO1xuICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGNvbHVtbiwgZWxlbWVudDogZWxlbWVudCwgJGltcGxpY2l0OiBlbGVtZW50IH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFeHBhbmRlZCBDb250ZW50IENvbHVtbiAtIFRoZSByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhZXhwYW5kYWJsZURlZlwiIFttYXRDb2x1bW5EZWZdPVwiZXhwYW5kYWJsZUNvbHVtbkRlZlwiPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoICsgMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWFkLWRhdGEtdGFibGUtZXhwYW5kYWJsZS1hcmVhXCIgW0BkZXRhaWxFeHBhbmRdPVwiZWxlbWVudCA9PT0gZXhwYW5kZWRFbGVtZW50ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgZ2V0Q3VzdG9tRXhwYW5kYWJsZVRlbXBsYXRlKCkgfHwgZGVmYXVsdENlbGxUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGVsZW1lbnQsIGVsZW1lbnQ6IGVsZW1lbnQsICRpbXBsaWNpdDogZWxlbWVudCB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBoZWFkZXIgcm93IHdoZXJlIGNlbGxzIHdpbGwgYmUgaW5qZWN0ZWQgLS0+XG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5JZHNcIj48L3RyPlxuICAgIDwhLS0gZGF0YSByb3cgd2hlcmUgY2VsbHMgd2lsbCBiZSBpbmplY3RlZCAtLT5cbiAgICA8dHJcbiAgICAgIG1hdC1yb3dcbiAgICAgIFtjbGFzcy5jbGlja2FibGUtdGFibGUtcm93XT1cIiFyb3cucGFyZW50SWQgJiYgc2VsZWN0aW9uRW1pdE1vZGUgIT09ICdOT05FJ1wiXG4gICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzXCJcbiAgICAgIChjbGljayk9XCIhIWV4cGFuZGFibGVDb2x1bW5EZWYgJiYgb25FeHBhbmQoJGV2ZW50LCByb3cpXCJcbiAgICA+PC90cj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISFleHBhbmRhYmxlRGVmXCI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IFtleHBhbmRhYmxlQ29sdW1uRGVmXVwiIGNsYXNzPVwibWFkLWRhdGEtdGFibGUtZXhwYW5kYWJsZS1yb3dcIj48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbWF0Tm9EYXRhUm93PlxuICAgICAgPHRkIGNsYXNzPVwibWF0LWNlbGwgbm9EYXRhVGV4dCBjb2x1bW5CYXNlZEZpbHRlclwiIFthdHRyLmNvbHNwYW5dPVwiY29sdW1uSWRzLmxlbmd0aFwiPlxuICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAobm9EYXRhVGV4dCB8IHRyYW5zbGF0ZSkgOiBub0RhdGFUZXh0IH19XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGFibGU+XG48L2Rpdj5cbjxkaXYgZGF0YS1jeT1cInRhYmxlLWJvdHRvbS1hcmVhXCIgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1ib3R0b20tYXJlYVwiPlxuICA8ZGl2IGRhdGEtY3k9XCJkZWZpbml0aW9uLWJ1dHRvbi1ibG9ja1wiIGNsYXNzPVwibWFkLWRhdGEtdGFibGUtYm90dG9tLWluZm8tYXJlYVwiPlxuICAgIDwhLS0gY29sdW1uIHNldHRpbmdzOiAxIGRlZmluaXRpb24gLS0+XG4gICAgPG1hZC1pY29uLWJ1dHRvbiAqbmdJZj1cImVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCA9PT0gMVwiIChjbGljayk9XCJvbkNvbHVtblNldHRpbmdzKClcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgIDwhLS0gY29sdW1uIHNldHRpbmdzOiBtdWx0aXBsZSBkZWZpbml0aW9ucyAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uICpuZ0lmPVwiKGVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCB8fCAwKSA+IDBcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZWRpdGFibGVEZWZpbml0aW9uTWVudVwiPlxuICAgICAgPG1hdC1pY29uPnZpZXdfY29sdW1uPC9tYXQtaWNvbj5cbiAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICA8IS0tIGNvbHVtbiB2aWV3OiBtdWx0aXBsZSBkZWZpbml0aW9ucyAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uICpuZ0lmPVwiKHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCB8fCAwKSA+IDBcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidmlld2FibGVEZWZpbml0aW9uTWVudVwiPlxuICAgICAgPG1hdC1pY29uPnByZXZpZXc8L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gIDxtYXQtcGFnaW5hdG9yXG4gICAgW3N0eWxlLmRpc3BsYXldPVwicGFnaW5hdGlvbkVuYWJsZWQgPyAnYmxvY2snIDogJ25vbmUnXCJcbiAgICBbbGVuZ3RoXT1cInBhZ2VMZW5ndGhcIlxuICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAocGFnZSk9XCJvblBhZ2VFdmVudCgkZXZlbnQpXCJcbiAgICBzaG93Rmlyc3RMYXN0QnV0dG9uc1xuICA+XG4gIDwvbWF0LXBhZ2luYXRvcj5cbjwvZGl2PlxuXG48IS0tIE5vIGRhdGEgYWxlcnQgLS0+XG48bmctdGVtcGxhdGUgI25vRGF0YT5cbiAgPGRpdiBkYXRhLWN5PVwibm8tZGF0YS1ibG9ja1wiIGNsYXNzPVwibm9EYXRhVGV4dFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLXNwaW5uZXItd3JhcHBlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAobm9EYXRhVGV4dCB8IHRyYW5zbGF0ZSkgOiBub0RhdGFUZXh0IH19XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBkZWZhdWx0IGNlbGwgdGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRDZWxsVGVtcGxhdGUgbGV0LWVsZW1lbnQ9XCJlbGVtZW50XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8c3Bhbj5cbiAgICB7eyBlbGVtZW50W2NvbHVtbi5kYXRhUHJvcGVydHlOYW1lXSB9fVxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIGN1c3RvbSBjZWxsIHRlbXBsYXRlcyBpbmplY3RlZCBmcm9tIHBhcmVudCAtLT5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==