@paperless/angular 0.1.0-alpha.37 → 0.1.0-alpha.370

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 (116) hide show
  1. package/README.md +9 -1
  2. package/esm2020/lib/animations/fade.mjs +22 -0
  3. package/esm2020/lib/animations/index.mjs +3 -0
  4. package/esm2020/lib/animations/slide.mjs +20 -0
  5. package/esm2020/lib/base/form.component.mjs +105 -0
  6. package/esm2020/lib/base/index.mjs +3 -1
  7. package/esm2020/lib/base/upload.component.mjs +57 -0
  8. package/esm2020/lib/base/value-accessor.mjs +8 -8
  9. package/esm2020/lib/directives/index.mjs +15 -4
  10. package/esm2020/lib/directives/p-datepicker.directive.mjs +39 -0
  11. package/esm2020/lib/directives/p-page-size-select.directive.mjs +42 -0
  12. package/esm2020/lib/directives/p-pagination.directive.mjs +42 -0
  13. package/esm2020/lib/directives/p-select.directive.mjs +37 -0
  14. package/esm2020/lib/modules/index.mjs +8 -0
  15. package/esm2020/lib/modules/overlay/index.mjs +4 -0
  16. package/esm2020/lib/modules/overlay/overlay.module.mjs +38 -0
  17. package/esm2020/lib/modules/overlay/overlay.ref.mjs +12 -0
  18. package/esm2020/lib/modules/overlay/services/index.mjs +4 -0
  19. package/esm2020/lib/modules/overlay/services/overlay.service.mjs +74 -0
  20. package/esm2020/lib/modules/table/base/index.mjs +2 -0
  21. package/esm2020/lib/modules/table/base/table.component.mjs +201 -0
  22. package/esm2020/lib/modules/table/components/index.mjs +8 -0
  23. package/esm2020/lib/modules/table/components/table/constants.mjs +3 -0
  24. package/esm2020/lib/modules/table/components/table/table.component.mjs +658 -0
  25. package/esm2020/lib/modules/table/components/table-cell/table-cell.component.mjs +167 -0
  26. package/esm2020/lib/modules/table/components/table-column/table-column.component.mjs +37 -0
  27. package/esm2020/lib/modules/table/directives/index.mjs +21 -0
  28. package/esm2020/lib/modules/table/directives/p-table-custom-filter.directive.mjs +13 -0
  29. package/esm2020/lib/modules/table/directives/p-table-filter-modal.directive.mjs +13 -0
  30. package/esm2020/lib/modules/table/directives/p-table-footer.directive.mjs +52 -0
  31. package/esm2020/lib/modules/table/directives/p-table-header.directive.mjs +60 -0
  32. package/esm2020/lib/modules/table/directives/p-table-ngx.directive.mjs +121 -0
  33. package/esm2020/lib/modules/table/directives/p-table.directive.mjs +78 -0
  34. package/esm2020/lib/modules/table/index.mjs +6 -0
  35. package/esm2020/lib/modules/table/table.module.mjs +29 -0
  36. package/esm2020/lib/modules/table/utils.mjs +23 -0
  37. package/esm2020/lib/modules/toast/components/index.mjs +4 -0
  38. package/esm2020/lib/modules/toast/components/toast-container/toast-container.component.mjs +36 -0
  39. package/esm2020/lib/modules/toast/directives/index.mjs +4 -0
  40. package/esm2020/lib/modules/toast/directives/toast.directive.mjs +51 -0
  41. package/esm2020/lib/modules/toast/index.mjs +6 -0
  42. package/esm2020/lib/modules/toast/services/index.mjs +4 -0
  43. package/esm2020/lib/modules/toast/services/toast.service.mjs +53 -0
  44. package/esm2020/lib/modules/toast/toast.module.mjs +22 -0
  45. package/esm2020/lib/modules/toast/types.mjs +10 -0
  46. package/esm2020/lib/paperless.module.mjs +32 -11
  47. package/esm2020/lib/pipes/currency.pipe.mjs +20 -0
  48. package/esm2020/lib/pipes/date.pipe.mjs +20 -0
  49. package/esm2020/lib/pipes/index.mjs +8 -0
  50. package/esm2020/lib/pipes/safe.pipe.mjs +33 -0
  51. package/esm2020/lib/stencil/angular-component-lib/utils.mjs +6 -8
  52. package/esm2020/lib/stencil/components.mjs +1110 -145
  53. package/esm2020/lib/stencil/index.mjs +39 -1
  54. package/esm2020/lib/stencil.module.mjs +17 -0
  55. package/esm2020/public-api.mjs +6 -1
  56. package/fesm2015/paperless-angular.mjs +3266 -246
  57. package/fesm2015/paperless-angular.mjs.map +1 -1
  58. package/fesm2020/paperless-angular.mjs +3279 -246
  59. package/fesm2020/paperless-angular.mjs.map +1 -1
  60. package/lib/animations/fade.d.ts +2 -0
  61. package/lib/animations/index.d.ts +2 -0
  62. package/lib/animations/slide.d.ts +2 -0
  63. package/lib/base/form.component.d.ts +15 -0
  64. package/lib/base/index.d.ts +2 -0
  65. package/lib/base/upload.component.d.ts +16 -0
  66. package/lib/base/value-accessor.d.ts +6 -6
  67. package/lib/directives/index.d.ts +6 -3
  68. package/lib/directives/p-datepicker.directive.d.ts +9 -0
  69. package/lib/directives/p-page-size-select.directive.d.ts +10 -0
  70. package/lib/directives/{pagination.directive.d.ts → p-pagination.directive.d.ts} +3 -3
  71. package/lib/directives/p-select.directive.d.ts +9 -0
  72. package/lib/modules/index.d.ts +5 -0
  73. package/lib/modules/overlay/index.d.ts +3 -0
  74. package/lib/modules/overlay/overlay.module.d.ts +12 -0
  75. package/lib/modules/overlay/overlay.ref.d.ts +9 -0
  76. package/lib/modules/overlay/services/index.d.ts +3 -0
  77. package/lib/modules/overlay/services/overlay.service.d.ts +24 -0
  78. package/lib/modules/table/base/index.d.ts +1 -0
  79. package/lib/modules/table/base/table.component.d.ts +58 -0
  80. package/lib/modules/table/components/index.d.ts +7 -0
  81. package/lib/modules/table/components/table/constants.d.ts +2 -0
  82. package/lib/modules/table/components/table/table.component.d.ts +240 -0
  83. package/lib/modules/table/components/table-cell/table-cell.component.d.ts +45 -0
  84. package/lib/modules/table/components/table-column/table-column.component.d.ts +17 -0
  85. package/lib/modules/table/directives/index.d.ts +12 -0
  86. package/lib/modules/table/directives/p-table-custom-filter.directive.d.ts +5 -0
  87. package/lib/modules/table/directives/p-table-filter-modal.directive.d.ts +5 -0
  88. package/lib/modules/table/directives/p-table-footer.directive.d.ts +11 -0
  89. package/lib/modules/table/directives/p-table-header.directive.d.ts +17 -0
  90. package/lib/modules/table/directives/p-table-ngx.directive.d.ts +27 -0
  91. package/lib/modules/table/directives/p-table.directive.d.ts +22 -0
  92. package/lib/modules/table/index.d.ts +5 -0
  93. package/lib/modules/table/table.module.d.ts +17 -0
  94. package/lib/modules/table/utils.d.ts +10 -0
  95. package/lib/modules/toast/components/index.d.ts +3 -0
  96. package/lib/modules/toast/components/toast-container/toast-container.component.d.ts +17 -0
  97. package/lib/modules/toast/directives/index.d.ts +3 -0
  98. package/lib/modules/toast/directives/toast.directive.d.ts +16 -0
  99. package/lib/modules/toast/index.d.ts +5 -0
  100. package/lib/modules/toast/services/index.d.ts +3 -0
  101. package/lib/modules/toast/services/toast.service.d.ts +12 -0
  102. package/lib/modules/toast/toast.module.d.ts +10 -0
  103. package/lib/modules/toast/types.d.ts +31 -0
  104. package/lib/paperless.module.d.ts +15 -3
  105. package/lib/pipes/currency.pipe.d.ts +10 -0
  106. package/lib/pipes/date.pipe.d.ts +10 -0
  107. package/lib/pipes/index.d.ts +7 -0
  108. package/lib/pipes/safe.pipe.d.ts +10 -0
  109. package/lib/stencil/components.d.ts +489 -43
  110. package/lib/stencil/index.d.ts +1 -1
  111. package/lib/stencil.module.d.ts +7 -0
  112. package/package.json +8 -6
  113. package/paperless.css +436 -0
  114. package/public-api.d.ts +5 -0
  115. package/esm2020/lib/directives/pagination.directive.mjs +0 -42
  116. /package/{paperless-angular.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,658 @@
1
+ import { __decorate } from "tslib";
2
+ import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, EventEmitter, HostListener, Input, Output, TemplateRef, } from '@angular/core';
3
+ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
4
+ import { BehaviorSubject, distinctUntilChanged } from 'rxjs';
5
+ import { TableCustomFilterDirective, TableFilterModalDirective, } from '../../directives';
6
+ import { TableColumn } from '../table-column/table-column.component';
7
+ import { defaultSize, defaultSizeOptions } from './constants';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "../../../../stencil/components";
11
+ import * as i3 from "../table-cell/table-cell.component";
12
+ import * as i4 from "../../directives/p-table-footer.directive";
13
+ import * as i5 from "../../directives/p-table-header.directive";
14
+ let Table = class Table {
15
+ constructor() {
16
+ /**
17
+ * Wether data is loading
18
+ */
19
+ this.loading = false;
20
+ /**
21
+ * Wether the header should show loading state
22
+ */
23
+ this.headerLoading = false;
24
+ /**
25
+ * Wether the footer should show loading state
26
+ */
27
+ this.footerLoading = false;
28
+ /**
29
+ * The amount of loading rows to show
30
+ */
31
+ this.amountOfLoadingRows = 6;
32
+ /**
33
+ * Wether to enable selection
34
+ */
35
+ this.enableRowSelection = true;
36
+ /**
37
+ * Wether to enable row clicking
38
+ */
39
+ this.enableRowClick = true;
40
+ /**
41
+ * The current selection of items
42
+ */
43
+ this.selectedRows = [];
44
+ /**
45
+ * Event whenever the current selection changes
46
+ */
47
+ this.selectedRowsChange = new EventEmitter();
48
+ /**
49
+ * Event whenever a row is clicked
50
+ */
51
+ this.rowClick = new EventEmitter();
52
+ /**
53
+ * Event whenever a row is selected
54
+ */
55
+ this.rowSelected = new EventEmitter();
56
+ /**
57
+ * Event whenever a row is deselected
58
+ */
59
+ this.rowDeselected = new EventEmitter();
60
+ /** START HEADER */
61
+ /**
62
+ * Wether to show the header
63
+ */
64
+ this.enableHeader = true;
65
+ /**
66
+ * Quick filters to show
67
+ */
68
+ this.quickFilters = [];
69
+ /**
70
+ * Wether to show the search input
71
+ */
72
+ this.enableSearch = true;
73
+ /**
74
+ * Wether to show the filter button
75
+ */
76
+ this.enableFilter = true;
77
+ /**
78
+ * Wether to show the edit button
79
+ */
80
+ this.enableEdit = true;
81
+ /**
82
+ * The edit button icon
83
+ */
84
+ this.editButtonIcon = 'pencil';
85
+ /**
86
+ * Event when one of the quick filters is clicked
87
+ */
88
+ this.quickFilter = new EventEmitter();
89
+ /**
90
+ * Event when the query changes
91
+ */
92
+ this.queryChange = new EventEmitter();
93
+ /**
94
+ * Event when the filter button is clicked
95
+ */
96
+ this.filter = new EventEmitter();
97
+ /**
98
+ * Event when the edit button is clicked
99
+ */
100
+ this.edit = new EventEmitter();
101
+ /** START FOOTER */
102
+ /**
103
+ * Wether to show the footer
104
+ */
105
+ this.enableFooter = true;
106
+ /**
107
+ * Wether to enable page size select
108
+ */
109
+ this.enablePageSize = true;
110
+ /**
111
+ * Wether to enable pagination
112
+ */
113
+ this.enablePagination = true;
114
+ /**
115
+ * Wether to enable export
116
+ */
117
+ this.enableExport = true;
118
+ /**
119
+ * The current page
120
+ */
121
+ this.page = 1;
122
+ /**
123
+ * Event whenever the page changes
124
+ */
125
+ this.pageChange = new EventEmitter();
126
+ /**
127
+ * The amount of items per page
128
+ */
129
+ this.pageSize = defaultSize;
130
+ /**
131
+ * The options for the page size
132
+ */
133
+ this.pageSizeOptions = defaultSizeOptions;
134
+ /**
135
+ * Event whenever the page changes
136
+ */
137
+ this.pageSizeChange = new EventEmitter();
138
+ /**
139
+ * Event whenever the page changes
140
+ */
141
+ this.export = new EventEmitter();
142
+ /**
143
+ * Wether to hide when there is only 1 page available
144
+ */
145
+ this.hideOnSinglePage = true;
146
+ /* Empty state start */
147
+ this.emptyStateType = 'no_filter';
148
+ /**
149
+ * Event whenever the empty state is clicked
150
+ */
151
+ this.emptyStateActionClick = new EventEmitter();
152
+ /* Empty state end */
153
+ this.columns = [];
154
+ this.parsedItems = [];
155
+ this.loadingRows = Array.from({
156
+ length: this.amountOfLoadingRows,
157
+ });
158
+ this._ctrlDown = false;
159
+ this.filterModalShow$ = new BehaviorSubject(false);
160
+ this.filterModalHeaderText = 'Filters';
161
+ this.filterModalSaveText = 'Save';
162
+ this.filterModalCancelText = 'Cancel';
163
+ this.filterModalResetText = 'Reset filters';
164
+ this.filterModalShowReset = false;
165
+ this.filterModalShowResetMobile = false;
166
+ this.filterModalShow = new EventEmitter();
167
+ this.filterModalSave = new EventEmitter();
168
+ this.filterModalReset = new EventEmitter();
169
+ }
170
+ set columnDefinitions(v) {
171
+ this._columnDefinitions = v;
172
+ this._generateColumns();
173
+ }
174
+ get columnDefinitions() {
175
+ return this._columnDefinitions;
176
+ }
177
+ ngOnInit() {
178
+ this._parseItems(this.items);
179
+ this.loadingRows = Array.from({
180
+ length: this.amountOfLoadingRows,
181
+ });
182
+ this.filterModalShow$
183
+ .pipe(untilDestroyed(this), distinctUntilChanged())
184
+ .subscribe((value) => this.filterModalShow.next(value));
185
+ // this._generateColumns();
186
+ }
187
+ ngOnChanges(changes) {
188
+ if (changes['items']) {
189
+ this._parseItems(changes['items'].currentValue);
190
+ }
191
+ if (changes['amountOfLoadingRows']) {
192
+ this.loadingRows = Array.from({
193
+ length: changes['amountOfLoadingRows'].currentValue,
194
+ });
195
+ }
196
+ }
197
+ // @HostListener('body:tableDefinitionChanged', { target: 'body' })
198
+ // onTableDefinitionUpdated() {
199
+ // this._generateColumns();
200
+ // }
201
+ keyDown({ key }) {
202
+ if (key !== 'Control' || this._ctrlDown === true) {
203
+ return;
204
+ }
205
+ this._ctrlDown = true;
206
+ }
207
+ keyUp({ key }) {
208
+ if (key !== 'Control' || this._ctrlDown === false) {
209
+ return;
210
+ }
211
+ this._ctrlDown = false;
212
+ }
213
+ visibilityChange() {
214
+ if (document.visibilityState !== 'hidden' || this._ctrlDown === false) {
215
+ return;
216
+ }
217
+ this._ctrlDown = false;
218
+ }
219
+ onQueryChange({ detail }) {
220
+ this.queryChange.emit(detail);
221
+ }
222
+ onQuickFilter({ detail }) {
223
+ this.quickFilter.emit(detail);
224
+ }
225
+ onPageSizeChange({ detail }) {
226
+ this.pageSizeChange.emit(detail);
227
+ }
228
+ onPageChange({ detail }) {
229
+ this.pageChange.emit(detail);
230
+ }
231
+ onFilterModalSave() {
232
+ this.filterModalSave.next();
233
+ this.filterModalShow$.next(false);
234
+ }
235
+ onFilterModalReset(resetQuickFilter = false) {
236
+ this.filterModalReset.next(resetQuickFilter);
237
+ this.filterModalShow$.next(false);
238
+ }
239
+ _parseItems(items) {
240
+ if (!items) {
241
+ this.parsedItems = [];
242
+ return;
243
+ }
244
+ if (Array.isArray(items)) {
245
+ this.parsedItems = items;
246
+ return;
247
+ }
248
+ this.parsedItems = JSON.parse(items);
249
+ }
250
+ _generateColumns() {
251
+ // const definitions =
252
+ // this._el.nativeElement.querySelectorAll('p-table-definition');
253
+ this.columns = Array.from(this._columnDefinitions);
254
+ }
255
+ // private _getHeader() {
256
+ // return (
257
+ // <p-table-row variant="header">
258
+ // {this._columns.map((col: TableDefinition, index) => (
259
+ // <p-table-column
260
+ // definition={col}
261
+ // value={col.name}
262
+ // variant="header"
263
+ // checkbox={this._getCheckbox(index, null, 'header')}
264
+ // index={index}
265
+ // ></p-table-column>
266
+ // ))}
267
+ // </p-table-row>
268
+ // );
269
+ // }
270
+ // private _getRows() {
271
+ // if (this.loading) {
272
+ // return Array.from(
273
+ // {
274
+ // length: this.amountOfLoadingRows,
275
+ // },
276
+ // (_, i) => (
277
+ // <p-table-row
278
+ // enableHover={
279
+ // this.enableRowSelection || this.enableRowClick
280
+ // }
281
+ // >
282
+ // {this._getLoadingColumns(i)}
283
+ // </p-table-row>
284
+ // )
285
+ // );
286
+ // }
287
+ // return this._items.map((item, index) => (
288
+ // <p-table-row
289
+ // enableHover={this.enableRowSelection || this.enableRowClick}
290
+ // onClick={(ev) => this._rowClick(ev, index)}
291
+ // >
292
+ // {this._getRowColumns(item, index)}
293
+ // </p-table-row>
294
+ // ));
295
+ // }
296
+ // private _getRowColumns(item, index) {
297
+ // return this._columns.map((col: TableDefinition, colIndex) => {
298
+ // return (
299
+ // <p-table-column
300
+ // definition={col}
301
+ // item={item}
302
+ // checkbox={this._getCheckbox(colIndex, index)}
303
+ // index={colIndex}
304
+ // rowIndex={index}
305
+ // ></p-table-column>
306
+ // );
307
+ // });
308
+ // }
309
+ // private _getLoadingColumns(index) {
310
+ // return this._columns.map((col: TableDefinition, colIndex) => {
311
+ // return (
312
+ // <p-table-column
313
+ // definition={col}
314
+ // variant="loading"
315
+ // checkbox={this._getCheckbox(colIndex, index, 'loading')}
316
+ // index={colIndex}
317
+ // rowIndex={index}
318
+ // ></p-table-column>
319
+ // );
320
+ // });
321
+ // }
322
+ // private _getCheckbox(
323
+ // index,
324
+ // rowIndex,
325
+ // variant: 'header' | 'default' | 'loading' = 'default'
326
+ // ) {
327
+ // if (!this.enableRowSelection || !this.selectionKey || index !== 0) {
328
+ // return;
329
+ // }
330
+ // if (variant === 'loading') {
331
+ // return <p-loader variant="ghost" class="rounded w-6 h-6" />;
332
+ // }
333
+ // if (variant === 'header') {
334
+ // return (
335
+ // <input
336
+ // class="p-input"
337
+ // type="checkbox"
338
+ // onChange={(ev) => this._selectAllChange(ev)}
339
+ // checked={this._selectionContainsAll()}
340
+ // indeterminate={this._selectionIndeterminate()}
341
+ // />
342
+ // );
343
+ // }
344
+ // const item = this._items[rowIndex];
345
+ // return (
346
+ // <input
347
+ // class="p-input"
348
+ // type="checkbox"
349
+ // onChange={(ev) => this._checkboxChange(ev?.target, rowIndex)}
350
+ // disabled={this.canSelectKey && !item[this.canSelectKey]}
351
+ // checked={this._selectionContains(item, rowIndex)}
352
+ // />
353
+ // );
354
+ // }
355
+ _checkboxDisabled(item) {
356
+ return this.canSelectKey && !item[this.canSelectKey];
357
+ }
358
+ _selectAllChange($event) {
359
+ if (!this.enableRowSelection) {
360
+ return;
361
+ }
362
+ const value = this._getCheckedValue($event.target);
363
+ if (value) {
364
+ const toAdd = [];
365
+ for (let i = 0; i < this.parsedItems.length; i++) {
366
+ const row = this.parsedItems[i];
367
+ if (this.canSelectKey && !row[this.canSelectKey]) {
368
+ continue;
369
+ }
370
+ if (this._selectionContains(row, i)) {
371
+ continue;
372
+ }
373
+ toAdd.push(row);
374
+ this.rowSelected.emit(row);
375
+ }
376
+ this.selectedRows = [...this.selectedRows, ...toAdd];
377
+ this.selectedRowsChange.emit(this.selectedRows);
378
+ return;
379
+ }
380
+ for (let i = 0; i < this.selectedRows.length; i++) {
381
+ const value = this.selectedRows[i];
382
+ const row = this.parsedItems.find((d) => this._getSelectionValue(d, i) ===
383
+ this._getSelectionValue(value, i));
384
+ if (!row) {
385
+ continue;
386
+ }
387
+ this.rowDeselected.emit(row);
388
+ }
389
+ this.selectedRows = [];
390
+ this.selectedRowsChange.emit(this.selectedRows);
391
+ }
392
+ _checkboxChange(target, index) {
393
+ if (!this.enableRowSelection) {
394
+ return;
395
+ }
396
+ const row = this.parsedItems[index];
397
+ if (this.canSelectKey && !row[this.canSelectKey]) {
398
+ target.checked = false;
399
+ return;
400
+ }
401
+ const value = this._getCheckedValue(target);
402
+ if (value) {
403
+ this.selectedRows = [...this.selectedRows, row];
404
+ this.selectedRowsChange.emit(this.selectedRows);
405
+ this.rowSelected.emit(row);
406
+ return;
407
+ }
408
+ const indexOfToRemove = this._selectionContains(row, index, true);
409
+ // we need to do this, because splice does not trigger the selection setter.
410
+ const selection = [...this.selectedRows];
411
+ selection.splice(indexOfToRemove, 1);
412
+ this.selectedRows = selection;
413
+ this.selectedRowsChange.emit(this.selectedRows);
414
+ this.rowDeselected.emit(row);
415
+ }
416
+ _getCheckedValue(target) {
417
+ return target?.checked;
418
+ }
419
+ _getSelectionValue(row, index) {
420
+ return this.selectionKey ? row?.[this.selectionKey] || index : index;
421
+ }
422
+ _selectionContains(row, index, returnIndex = false) {
423
+ const returnValue = this.selectedRows.findIndex((item) => this._getSelectionValue(row, index) ===
424
+ this._getSelectionValue(item, index));
425
+ return !returnIndex ? returnValue >= 0 : returnValue;
426
+ }
427
+ _selectionContainsAll() {
428
+ let returnValue = true;
429
+ if (!this.parsedItems?.length) {
430
+ return false;
431
+ }
432
+ for (let i = 0; i < this.parsedItems?.length; i++) {
433
+ const item = this.parsedItems[i];
434
+ const contains = this._selectionContains(item, i);
435
+ if (!contains) {
436
+ returnValue = false;
437
+ break;
438
+ }
439
+ }
440
+ return returnValue;
441
+ }
442
+ _selectionIndeterminate() {
443
+ if (!this.parsedItems?.length || !this.selectedRows?.length) {
444
+ return false;
445
+ }
446
+ let containsCount = 0;
447
+ for (let i = 0; i < this.parsedItems?.length; i++) {
448
+ const item = this.parsedItems[i];
449
+ const contains = this._selectionContains(item, i);
450
+ if (contains) {
451
+ containsCount++;
452
+ }
453
+ }
454
+ return containsCount > 0 && containsCount !== this.parsedItems.length;
455
+ }
456
+ _rowClick($event, index) {
457
+ const target = $event.target;
458
+ if (target.tagName.toLowerCase() === 'input' ||
459
+ target.type === 'checkbox') {
460
+ return;
461
+ }
462
+ const row = this._findRow($event.target);
463
+ if (this.enableRowClick) {
464
+ const action = this._findRowAction($event.target);
465
+ if (action) {
466
+ return;
467
+ }
468
+ const item = this.parsedItems[index];
469
+ this.rowClick.emit({
470
+ item,
471
+ ctrlDown: this._ctrlDown,
472
+ });
473
+ return;
474
+ }
475
+ if (!this.enableRowSelection) {
476
+ return;
477
+ }
478
+ const checkbox = row?.querySelector('input[type="checkbox"]');
479
+ if (!checkbox) {
480
+ return;
481
+ }
482
+ checkbox.checked = !checkbox.checked;
483
+ this._checkboxChange(checkbox, index);
484
+ }
485
+ _findRow(el) {
486
+ if (!el) {
487
+ return el;
488
+ }
489
+ if (el?.tagName?.toLowerCase() === 'p-table-row') {
490
+ return el;
491
+ }
492
+ return this._findRow(el?.parentElement);
493
+ }
494
+ _findRowAction(el) {
495
+ if (!el) {
496
+ return null;
497
+ }
498
+ if (el.getAttribute('data-is-action') !== null &&
499
+ el.getAttribute('data-is-action') !== 'false') {
500
+ return el;
501
+ }
502
+ if (el?.tagName?.toLowerCase() === 'p-table-row') {
503
+ return null;
504
+ }
505
+ return this._findRowAction(el?.parentElement);
506
+ }
507
+ };
508
+ Table.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: Table, deps: [], target: i0.ɵɵFactoryTarget.Component });
509
+ Table.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: Table, selector: "p-table-ngx", inputs: { items: "items", loading: "loading", headerLoading: "headerLoading", footerLoading: "footerLoading", amountOfLoadingRows: "amountOfLoadingRows", enableRowSelection: "enableRowSelection", enableRowClick: "enableRowClick", selectedRows: "selectedRows", selectionKey: "selectionKey", canSelectKey: "canSelectKey", enableHeader: "enableHeader", quickFilters: "quickFilters", activeQuickFilterIdentifier: "activeQuickFilterIdentifier", enableSearch: "enableSearch", query: "query", enableFilter: "enableFilter", selectedFiltersAmount: "selectedFiltersAmount", filterButtonTemplate: "filterButtonTemplate", enableEdit: "enableEdit", editButtonIcon: "editButtonIcon", editButtonText: "editButtonText", editButtonTemplate: "editButtonTemplate", enableFooter: "enableFooter", enablePageSize: "enablePageSize", enablePagination: "enablePagination", enableExport: "enableExport", page: "page", total: "total", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hideOnSinglePage: "hideOnSinglePage", emptyStateType: "emptyStateType", emptyStateHeader: "emptyStateHeader", emptyStateContent: "emptyStateContent", emptyStateAction: "emptyStateAction", emptyStateFilteredHeader: "emptyStateFilteredHeader", emptyStateFilteredContent: "emptyStateFilteredContent", filterModalHeaderText: "filterModalHeaderText", filterModalSaveText: "filterModalSaveText", filterModalCancelText: "filterModalCancelText", filterModalResetText: "filterModalResetText", filterModalShowReset: "filterModalShowReset", filterModalShowResetMobile: "filterModalShowResetMobile" }, outputs: { selectedRowsChange: "selectedRowsChange", rowClick: "rowClick", rowSelected: "rowSelected", rowDeselected: "rowDeselected", quickFilter: "quickFilter", queryChange: "queryChange", filter: "filter", edit: "edit", pageChange: "pageChange", pageSizeChange: "pageSizeChange", export: "export", emptyStateActionClick: "emptyStateActionClick", filterModalShow: "filterModalShow", filterModalSave: "filterModalSave", filterModalReset: "filterModalReset" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:visibilitychange": "visibilityChange($event)" } }, queries: [{ propertyName: "headerCustomFilterTemplate", first: true, predicate: TableCustomFilterDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "filterModalTemplate", first: true, predicate: TableFilterModalDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "columnDefinitions", predicate: TableColumn }], usesOnChanges: true, ngImport: i0, template: "<p-table-container>\n <p-table-header\n *ngIf=\"enableHeader\"\n [quickFilters]=\"quickFilters\"\n [activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n (quickFilter)=\"(onQuickFilter)\"\n [enableSearch]=\"enableSearch\"\n [query]=\"query\"\n (queryChange)=\"(onQueryChange)\"\n [enableFilter]=\"enableFilter\"\n [selectedFiltersAmount]=\"selectedFiltersAmount\"\n [filterButtonTemplate]=\"filterButtonTemplate\"\n (filter)=\"filterModalShow$.next(true)\"\n [enableEdit]=\"enableEdit\"\n [canEdit]=\"!!selectedRows.length\"\n [editButtonTemplate]=\"editButtonTemplate\"\n [editText]=\"editButtonText\"\n [editIcon]=\"editButtonIcon\"\n (edit)=\"edit.emit()\"\n [itemsSelectedAmount]=\"selectedRows.length\"\n [loading]=\"headerLoading\"\n >\n <div *ngIf=\"headerCustomFilterTemplate\" slot=\"custom-filter\">\n <ng-container\n *ngTemplateOutlet=\"headerCustomFilterTemplate\"\n ></ng-container>\n </div>\n </p-table-header>\n\n <p-table-row variant=\"header\">\n <ng-container *ngFor=\"let col of columns; let index = index\">\n <p-table-cell-ngx\n [definition]=\"col\"\n [value]=\"col.name\"\n variant=\"header\"\n [index]=\"index\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n ></p-table-cell-ngx>\n <ng-template #checkboxTemplate>\n <input\n class=\"p-input\"\n type=\"checkbox\"\n (change)=\"_selectAllChange($event)\"\n [checked]=\"_selectionContainsAll()\"\n [indeterminate]=\"_selectionIndeterminate()\"\n />\n </ng-template>\n </ng-container>\n </p-table-row>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"loading; else contentTemplate\">\n <p-table-row\n *ngFor=\"let r of loadingRows; let rowIndex = index\"\n [enableHover]=\"enableRowSelection || enableRowClick\"\n >\n <ng-container *ngFor=\"let col of columns; let index = index\">\n <p-table-cell-ngx\n [definition]=\"col\"\n variant=\"loading\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n [index]=\"index\"\n [rowIndex]=\"rowIndex\"\n ></p-table-cell-ngx>\n <ng-template #checkboxTemplate>\n <p-loader\n variant=\"ghost\"\n class=\"h-6 w-6 rounded\"\n ></p-loader>\n </ng-template>\n </ng-container>\n </p-table-row>\n </ng-container>\n\n <ng-template #contentTemplate>\n <ng-container *ngIf=\"items?.length; else emptyStateTemplate\">\n <p-table-row\n *ngFor=\"let item of items; let rowIndex = index\"\n [enableHover]=\"enableRowSelection || enableRowClick\"\n (click)=\"_rowClick($event, rowIndex)\"\n >\n <ng-container\n *ngFor=\"let col of columns; let index = index\"\n >\n <p-table-cell-ngx\n [definition]=\"col\"\n [item]=\"item\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n [index]=\"index\"\n [rowIndex]=\"rowIndex\"\n [template]=\"col.template\"\n ></p-table-cell-ngx>\n\n <ng-template #checkboxTemplate>\n <input\n class=\"p-input\"\n type=\"checkbox\"\n (change)=\"\n _checkboxChange($event.target, rowIndex)\n \"\n [disabled]=\"_checkboxDisabled(item)\"\n [checked]=\"_selectionContains(item, rowIndex)\"\n />\n </ng-template>\n </ng-container>\n </p-table-row>\n </ng-container>\n </ng-template>\n </div>\n\n <p-table-footer\n *ngIf=\"enableFooter\"\n [hideOnSinglePage]=\"hideOnSinglePage\"\n [enablePageSize]=\"enablePageSize\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (pageSizeChange)=\"(pageSizeChange)\"\n [enablePagination]=\"enablePagination\"\n [page]=\"page\"\n [total]=\"total\"\n (pageChange)=\"(pageChange)\"\n [enableExport]=\"enableExport\"\n (export)=\"export.emit()\"\n [loading]=\"footerLoading\"\n ></p-table-footer>\n</p-table-container>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n <p-modal\n [header]=\"filterModalHeaderText\"\n [show]=\"filterModalShow$ | async\"\n (close)=\"filterModalShow$.next(false)\"\n >\n <div slot=\"content\" class=\"flex flex-col gap-6\">\n <ng-container\n *ngTemplateOutlet=\"filterModalTemplate\"\n ></ng-container>\n </div>\n <div slot=\"footer\" class=\"flex w-full justify-between gap-4\">\n <p-button\n *ngIf=\"filterModalShowResetMobile\"\n class=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset(true)\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n *ngIf=\"filterModalShowReset\"\n class=\"hidden w-full tablet:w-auto desktop-xs:flex\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset()\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n class=\"ml-auto w-full tablet:w-auto\"\n icon=\"checkmark\"\n (onClick)=\"onFilterModalSave()\"\n >\n {{ filterModalSaveText }}\n </p-button>\n </div>\n </p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n <div\n *ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n class=\"\n flex\n max-w-[20rem]\n flex-col\n items-center\n self-center\n py-24\n text-center\n \"\n >\n <p-illustration\n variant=\"empty-state-search\"\n class=\"mb-6\"\n ></p-illustration>\n <p class=\"text-storm-default font-semibold\">\n {{ emptyStateFilteredHeader }}\n </p>\n <p class=\"mb-14 text-sm text-storm-medium\">\n {{ emptyStateFilteredContent }}\n </p>\n </div>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n <div\n class=\"\n flex\n max-w-[20rem]\n flex-col\n items-center\n self-center\n py-24\n text-center\n \"\n >\n <p-illustration\n variant=\"empty-state-overview\"\n class=\"mb-6 cursor-pointer\"\n (onClick)=\"emptyStateActionClick.emit()\"\n ></p-illustration>\n <p class=\"text-storm-default font-semibold\">\n {{ emptyStateHeader }}\n </p>\n <p class=\"mb-6 text-sm text-storm-medium\">\n {{ emptyStateContent }}\n </p>\n <p-button\n variant=\"secondary\"\n icon=\"plus\"\n size=\"small\"\n (onClick)=\"emptyStateActionClick.emit()\"\n >\n {{ emptyStateAction }}\n </p-button>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.PButton, selector: "p-button", inputs: ["chevron", "chevronPosition", "disabled", "href", "icon", "iconFlip", "iconOnly", "iconPosition", "iconRotate", "inheritText", "loading", "size", "target", "variant"] }, { kind: "component", type: i2.PIllustration, selector: "p-illustration", inputs: ["variant"] }, { kind: "component", type: i2.PLoader, selector: "p-loader", inputs: ["color", "modalDescription", "modalTitle", "show", "variant"] }, { kind: "component", type: i2.PModal, selector: "p-modal", inputs: ["applyBlur", "backdropClickClose", "header", "scrollLock", "show", "showClose", "showMobileFooter", "size", "variant"] }, { kind: "component", type: i2.PTableContainer, selector: "p-table-container" }, { kind: "component", type: i2.PTableFooter, selector: "p-table-footer", inputs: ["enableExport", "enablePageSize", "enablePagination", "hideOnSinglePage", "loading", "page", "pageSize", "pageSizeOptions", "total"] }, { kind: "component", type: i2.PTableHeader, selector: "p-table-header", inputs: ["activeQuickFilterIdentifier", "canEdit", "editButtonTemplate", "editIcon", "editText", "enableEdit", "enableFilter", "enableSearch", "filterButtonTemplate", "itemsSelectedAmount", "loading", "query", "quickFilters", "selectedFiltersAmount"] }, { kind: "component", type: i2.PTableRow, selector: "p-table-row", inputs: ["enableHover", "variant"] }, { kind: "component", type: i3.TableCell, selector: "p-table-cell-ngx", inputs: ["variant", "index", "rowIndex", "definition", "item", "value", "checkbox", "template"] }, { kind: "directive", type: i4.TableFooterDirective, selector: "p-table-footer" }, { kind: "directive", type: i5.TableHeaderDirective, selector: "p-table-header" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
510
+ Table = __decorate([
511
+ UntilDestroy({ checkProperties: true })
512
+ ], Table);
513
+ export { Table };
514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: Table, decorators: [{
515
+ type: Component,
516
+ args: [{ selector: 'p-table-ngx', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-table-container>\n <p-table-header\n *ngIf=\"enableHeader\"\n [quickFilters]=\"quickFilters\"\n [activeQuickFilterIdentifier]=\"activeQuickFilterIdentifier\"\n (quickFilter)=\"(onQuickFilter)\"\n [enableSearch]=\"enableSearch\"\n [query]=\"query\"\n (queryChange)=\"(onQueryChange)\"\n [enableFilter]=\"enableFilter\"\n [selectedFiltersAmount]=\"selectedFiltersAmount\"\n [filterButtonTemplate]=\"filterButtonTemplate\"\n (filter)=\"filterModalShow$.next(true)\"\n [enableEdit]=\"enableEdit\"\n [canEdit]=\"!!selectedRows.length\"\n [editButtonTemplate]=\"editButtonTemplate\"\n [editText]=\"editButtonText\"\n [editIcon]=\"editButtonIcon\"\n (edit)=\"edit.emit()\"\n [itemsSelectedAmount]=\"selectedRows.length\"\n [loading]=\"headerLoading\"\n >\n <div *ngIf=\"headerCustomFilterTemplate\" slot=\"custom-filter\">\n <ng-container\n *ngTemplateOutlet=\"headerCustomFilterTemplate\"\n ></ng-container>\n </div>\n </p-table-header>\n\n <p-table-row variant=\"header\">\n <ng-container *ngFor=\"let col of columns; let index = index\">\n <p-table-cell-ngx\n [definition]=\"col\"\n [value]=\"col.name\"\n variant=\"header\"\n [index]=\"index\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n ></p-table-cell-ngx>\n <ng-template #checkboxTemplate>\n <input\n class=\"p-input\"\n type=\"checkbox\"\n (change)=\"_selectAllChange($event)\"\n [checked]=\"_selectionContainsAll()\"\n [indeterminate]=\"_selectionIndeterminate()\"\n />\n </ng-template>\n </ng-container>\n </p-table-row>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"loading; else contentTemplate\">\n <p-table-row\n *ngFor=\"let r of loadingRows; let rowIndex = index\"\n [enableHover]=\"enableRowSelection || enableRowClick\"\n >\n <ng-container *ngFor=\"let col of columns; let index = index\">\n <p-table-cell-ngx\n [definition]=\"col\"\n variant=\"loading\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n [index]=\"index\"\n [rowIndex]=\"rowIndex\"\n ></p-table-cell-ngx>\n <ng-template #checkboxTemplate>\n <p-loader\n variant=\"ghost\"\n class=\"h-6 w-6 rounded\"\n ></p-loader>\n </ng-template>\n </ng-container>\n </p-table-row>\n </ng-container>\n\n <ng-template #contentTemplate>\n <ng-container *ngIf=\"items?.length; else emptyStateTemplate\">\n <p-table-row\n *ngFor=\"let item of items; let rowIndex = index\"\n [enableHover]=\"enableRowSelection || enableRowClick\"\n (click)=\"_rowClick($event, rowIndex)\"\n >\n <ng-container\n *ngFor=\"let col of columns; let index = index\"\n >\n <p-table-cell-ngx\n [definition]=\"col\"\n [item]=\"item\"\n [checkbox]=\"\n index === 0 && enableRowSelection\n ? checkboxTemplate\n : undefined\n \"\n [index]=\"index\"\n [rowIndex]=\"rowIndex\"\n [template]=\"col.template\"\n ></p-table-cell-ngx>\n\n <ng-template #checkboxTemplate>\n <input\n class=\"p-input\"\n type=\"checkbox\"\n (change)=\"\n _checkboxChange($event.target, rowIndex)\n \"\n [disabled]=\"_checkboxDisabled(item)\"\n [checked]=\"_selectionContains(item, rowIndex)\"\n />\n </ng-template>\n </ng-container>\n </p-table-row>\n </ng-container>\n </ng-template>\n </div>\n\n <p-table-footer\n *ngIf=\"enableFooter\"\n [hideOnSinglePage]=\"hideOnSinglePage\"\n [enablePageSize]=\"enablePageSize\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (pageSizeChange)=\"(pageSizeChange)\"\n [enablePagination]=\"enablePagination\"\n [page]=\"page\"\n [total]=\"total\"\n (pageChange)=\"(pageChange)\"\n [enableExport]=\"enableExport\"\n (export)=\"export.emit()\"\n [loading]=\"footerLoading\"\n ></p-table-footer>\n</p-table-container>\n\n<ng-container *ngIf=\"filterModalTemplate\">\n <p-modal\n [header]=\"filterModalHeaderText\"\n [show]=\"filterModalShow$ | async\"\n (close)=\"filterModalShow$.next(false)\"\n >\n <div slot=\"content\" class=\"flex flex-col gap-6\">\n <ng-container\n *ngTemplateOutlet=\"filterModalTemplate\"\n ></ng-container>\n </div>\n <div slot=\"footer\" class=\"flex w-full justify-between gap-4\">\n <p-button\n *ngIf=\"filterModalShowResetMobile\"\n class=\"flex w-full tablet:w-auto desktop-xs:hidden\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset(true)\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n *ngIf=\"filterModalShowReset\"\n class=\"hidden w-full tablet:w-auto desktop-xs:flex\"\n variant=\"secondary\"\n (onClick)=\"onFilterModalReset()\"\n >\n {{ filterModalResetText }}\n </p-button>\n <p-button\n class=\"ml-auto w-full tablet:w-auto\"\n icon=\"checkmark\"\n (onClick)=\"onFilterModalSave()\"\n >\n {{ filterModalSaveText }}\n </p-button>\n </div>\n </p-modal>\n</ng-container>\n\n<ng-template #emptyStateTemplate>\n <div\n *ngIf=\"emptyStateType === 'filtered'; else emptyStateNonFilterTemplate\"\n class=\"\n flex\n max-w-[20rem]\n flex-col\n items-center\n self-center\n py-24\n text-center\n \"\n >\n <p-illustration\n variant=\"empty-state-search\"\n class=\"mb-6\"\n ></p-illustration>\n <p class=\"text-storm-default font-semibold\">\n {{ emptyStateFilteredHeader }}\n </p>\n <p class=\"mb-14 text-sm text-storm-medium\">\n {{ emptyStateFilteredContent }}\n </p>\n </div>\n</ng-template>\n\n<ng-template #emptyStateNonFilterTemplate>\n <div\n class=\"\n flex\n max-w-[20rem]\n flex-col\n items-center\n self-center\n py-24\n text-center\n \"\n >\n <p-illustration\n variant=\"empty-state-overview\"\n class=\"mb-6 cursor-pointer\"\n (onClick)=\"emptyStateActionClick.emit()\"\n ></p-illustration>\n <p class=\"text-storm-default font-semibold\">\n {{ emptyStateHeader }}\n </p>\n <p class=\"mb-6 text-sm text-storm-medium\">\n {{ emptyStateContent }}\n </p>\n <p-button\n variant=\"secondary\"\n icon=\"plus\"\n size=\"small\"\n (onClick)=\"emptyStateActionClick.emit()\"\n >\n {{ emptyStateAction }}\n </p-button>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}\n"] }]
517
+ }], ctorParameters: function () { return []; }, propDecorators: { items: [{
518
+ type: Input
519
+ }], loading: [{
520
+ type: Input
521
+ }], headerLoading: [{
522
+ type: Input
523
+ }], footerLoading: [{
524
+ type: Input
525
+ }], amountOfLoadingRows: [{
526
+ type: Input
527
+ }], enableRowSelection: [{
528
+ type: Input
529
+ }], enableRowClick: [{
530
+ type: Input
531
+ }], selectedRows: [{
532
+ type: Input
533
+ }], selectedRowsChange: [{
534
+ type: Output
535
+ }], selectionKey: [{
536
+ type: Input
537
+ }], canSelectKey: [{
538
+ type: Input
539
+ }], rowClick: [{
540
+ type: Output
541
+ }], rowSelected: [{
542
+ type: Output
543
+ }], rowDeselected: [{
544
+ type: Output
545
+ }], enableHeader: [{
546
+ type: Input
547
+ }], quickFilters: [{
548
+ type: Input
549
+ }], activeQuickFilterIdentifier: [{
550
+ type: Input
551
+ }], enableSearch: [{
552
+ type: Input
553
+ }], query: [{
554
+ type: Input
555
+ }], enableFilter: [{
556
+ type: Input
557
+ }], selectedFiltersAmount: [{
558
+ type: Input
559
+ }], filterButtonTemplate: [{
560
+ type: Input
561
+ }], enableEdit: [{
562
+ type: Input
563
+ }], editButtonIcon: [{
564
+ type: Input
565
+ }], editButtonText: [{
566
+ type: Input
567
+ }], editButtonTemplate: [{
568
+ type: Input
569
+ }], quickFilter: [{
570
+ type: Output
571
+ }], queryChange: [{
572
+ type: Output
573
+ }], filter: [{
574
+ type: Output
575
+ }], edit: [{
576
+ type: Output
577
+ }], enableFooter: [{
578
+ type: Input
579
+ }], enablePageSize: [{
580
+ type: Input
581
+ }], enablePagination: [{
582
+ type: Input
583
+ }], enableExport: [{
584
+ type: Input
585
+ }], page: [{
586
+ type: Input
587
+ }], total: [{
588
+ type: Input
589
+ }], pageChange: [{
590
+ type: Output
591
+ }], pageSize: [{
592
+ type: Input
593
+ }], pageSizeOptions: [{
594
+ type: Input
595
+ }], pageSizeChange: [{
596
+ type: Output
597
+ }], export: [{
598
+ type: Output
599
+ }], hideOnSinglePage: [{
600
+ type: Input
601
+ }], emptyStateType: [{
602
+ type: Input
603
+ }], emptyStateHeader: [{
604
+ type: Input
605
+ }], emptyStateContent: [{
606
+ type: Input
607
+ }], emptyStateAction: [{
608
+ type: Input
609
+ }], emptyStateFilteredHeader: [{
610
+ type: Input
611
+ }], emptyStateFilteredContent: [{
612
+ type: Input
613
+ }], emptyStateActionClick: [{
614
+ type: Output
615
+ }], headerCustomFilterTemplate: [{
616
+ type: ContentChild,
617
+ args: [TableCustomFilterDirective, {
618
+ read: TemplateRef,
619
+ static: true,
620
+ }]
621
+ }], columnDefinitions: [{
622
+ type: ContentChildren,
623
+ args: [TableColumn]
624
+ }], filterModalTemplate: [{
625
+ type: ContentChild,
626
+ args: [TableFilterModalDirective, {
627
+ read: TemplateRef,
628
+ static: true,
629
+ }]
630
+ }], filterModalHeaderText: [{
631
+ type: Input
632
+ }], filterModalSaveText: [{
633
+ type: Input
634
+ }], filterModalCancelText: [{
635
+ type: Input
636
+ }], filterModalResetText: [{
637
+ type: Input
638
+ }], filterModalShowReset: [{
639
+ type: Input
640
+ }], filterModalShowResetMobile: [{
641
+ type: Input
642
+ }], filterModalShow: [{
643
+ type: Output
644
+ }], filterModalSave: [{
645
+ type: Output
646
+ }], filterModalReset: [{
647
+ type: Output
648
+ }], keyDown: [{
649
+ type: HostListener,
650
+ args: ['document:keydown', ['$event']]
651
+ }], keyUp: [{
652
+ type: HostListener,
653
+ args: ['document:keyup', ['$event']]
654
+ }], visibilityChange: [{
655
+ type: HostListener,
656
+ args: ['document:visibilitychange', ['$event']]
657
+ }] } });
658
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhcGVybGVzcy9zcmMvbGliL21vZHVsZXMvdGFibGUvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQ0gsMEJBQTBCLEVBQzFCLHlCQUF5QixHQUM1QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7O0FBU3ZELElBQU0sS0FBSyxHQUFYLE1BQU0sS0FBSztJQXdSZDtRQWxSQTs7V0FFRztRQUNNLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFbEM7O1dBRUc7UUFDTSxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUV4Qzs7V0FFRztRQUNNLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRXhDOztXQUVHO1FBQ00sd0JBQW1CLEdBQVcsQ0FBQyxDQUFDO1FBRXpDOztXQUVHO1FBQ00sdUJBQWtCLEdB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QkFBZixNQUFNO2dCQUtFLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBS0kscUJBQXFCO3NCQUE5QixNQUFNO2dCQWlCQSwwQkFBMEI7c0JBSmhDLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUU7d0JBQ3RDLElBQUksRUFBRSxXQUFXO3dCQUNqQixNQUFNLEVBQUUsSUFBSTtxQkFDZjtnQkFPRyxpQkFBaUI7c0JBRHBCLGVBQWU7dUJBQUMsV0FBVztnQkFjckIsbUJBQW1CO3NCQUp6QixZQUFZO3VCQUFDLHlCQUF5QixFQUFFO3dCQUNyQyxJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLElBQUk7cUJBQ2Y7Z0JBS1EscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFtQ1AsT0FBTztzQkFETixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVU1QyxLQUFLO3NCQURKLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXIsIFJvd0NsaWNrRXZlbnQgfSBmcm9tICdAcGFwZXJsZXNzL2NvcmUnO1xuaW1wb3J0IHsgSWNvblZhcmlhbnQgfSBmcm9tICdAcGFwZXJsZXNzL2NvcmUvZGlzdC90eXBlcy9jb21wb25lbnRzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gICAgVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsXG4gICAgVGFibGVGaWx0ZXJNb2RhbERpcmVjdGl2ZSxcbn0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtbiB9IGZyb20gJy4uL3RhYmxlLWNvbHVtbi90YWJsZS1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IGRlZmF1bHRTaXplLCBkZWZhdWx0U2l6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbkBVbnRpbERlc3Ryb3koeyBjaGVja1Byb3BlcnRpZXM6IHRydWUgfSlcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncC10YWJsZS1uZ3gnLFxuICAgIHRlbXBsYXRlVXJsOiAndGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWyd0YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbXMgdG8gYmUgZmVkIHRvIHRoZSB0YWJsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGl0ZW1zITogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIGRhdGEgaXMgbG9hZGluZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0aGUgaGVhZGVyIHNob3VsZCBzaG93IGxvYWRpbmcgc3RhdGVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBoZWFkZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdGhlIGZvb3RlciBzaG91bGQgc2hvdyBsb2FkaW5nIHN0YXRlXG4gICAgICovXG4gICAgQElucHV0KCkgZm9vdGVyTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBsb2FkaW5nIHJvd3MgdG8gc2hvd1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGFtb3VudE9mTG9hZGluZ1Jvd3M6IG51bWJlciA9IDY7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHNlbGVjdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHJvdyBjbGlja2luZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd0NsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBpdGVtc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkUm93czogYW55W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkUm93c0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIGRldGVybWluZSBpZiBhIHJvdyBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGlvbktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQSBrZXkgdG8gZGV0ZXJtaW5lIGlmIGEgcm93IGNhbiBiZSBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNhblNlbGVjdEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dDbGljazogRXZlbnRFbWl0dGVyPFJvd0NsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgZGVzZWxlY3RlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dEZXNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKiBTVEFSVCBIRUFERVIgKi9cblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBzaG93IHRoZSBoZWFkZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogUXVpY2sgZmlsdGVycyB0byBzaG93XG4gICAgICovXG4gICAgQElucHV0KCkgcXVpY2tGaWx0ZXJzOiBRdWlja0ZpbHRlcltdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBBY3RpdmUgcXVpY2sgZmlsdGVyIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBhY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBzaG93IHRoZSBzZWFyY2ggaW5wdXRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IHRvIHNob3cgaW4gdGhlIHNlYXJjaCBiYXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBxdWVyeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIGZpbHRlciBidXR0b25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmaWx0ZXJzIGJlaW5nIHNlbGVjdGVkXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0ZWRGaWx0ZXJzQW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBmaWx0ZXIgYnV0dG9uIHRleHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBmaWx0ZXJCdXR0b25UZW1wbGF0ZTogYW55O1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIGVkaXQgYnV0dG9uXG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlRWRpdDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdCBidXR0b24gaWNvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVkaXRCdXR0b25JY29uOiBJY29uVmFyaWFudCA9ICdwZW5jaWwnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXQgYnV0dG9uIHRleHQgaWYgY2hhbmdlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVkaXRCdXR0b25UZXh0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRlbXBsYXRlIGZvciB0aGUgZWRpdCBidXR0b24gdGV4dFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVkaXRCdXR0b25UZW1wbGF0ZTogYW55O1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbiBvbmUgb2YgdGhlIHF1aWNrIGZpbHRlcnMgaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBxdWlja0ZpbHRlcjogRXZlbnRFbWl0dGVyPFF1aWNrRmlsdGVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIHF1ZXJ5IGNoYW5nZXNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcXVlcnlDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbiB0aGUgZmlsdGVyIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIGZpbHRlcjogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbiB0aGUgZWRpdCBidXR0b24gaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBlZGl0OiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiogU1RBUlQgRk9PVEVSICovXG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gc2hvdyB0aGUgZm9vdGVyXG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlRm9vdGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBlbmFibGUgcGFnZSBzaXplIHNlbGVjdFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVBhZ2VTaXplOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBlbmFibGUgcGFnaW5hdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVBhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIGVuYWJsZSBleHBvcnRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVFeHBvcnQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgcGFnZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHBhZ2U6IG51bWJlciA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGl0ZW1zXG4gICAgICovXG4gICAgQElucHV0KCkgdG90YWwhOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHBhZ2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBpdGVtcyBwZXIgcGFnZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSBkZWZhdWx0U2l6ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHRpb25zIGZvciB0aGUgcGFnZSBzaXplXG4gICAgICovXG4gICAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IGRlZmF1bHRTaXplT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBwYWdlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcGFnZVNpemVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgdGhlIHBhZ2UgY2hhbmdlc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBleHBvcnQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIGhpZGUgd2hlbiB0aGVyZSBpcyBvbmx5IDEgcGFnZSBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBoaWRlT25TaW5nbGVQYWdlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qIEVtcHR5IHN0YXRlIHN0YXJ0ICovXG4gICAgQElucHV0KCkgZW1wdHlTdGF0ZVR5cGU6ICdub19maWx0ZXInIHwgJ2ZpbHRlcmVkJyA9ICdub19maWx0ZXInO1xuXG4gICAgQElucHV0KCkgZW1wdHlTdGF0ZUhlYWRlciE6IHN0cmluZztcbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlQ29udGVudCE6IHN0cmluZztcbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlQWN0aW9uITogc3RyaW5nO1xuXG4gICAgQElucHV0KCkgZW1wdHlTdGF0ZUZpbHRlcmVkSGVhZGVyITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVGaWx0ZXJlZENvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuZXZlciB0aGUgZW1wdHkgc3RhdGUgaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBlbXB0eVN0YXRlQWN0aW9uQ2xpY2s6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qIEVtcHR5IHN0YXRlIGVuZCAqL1xuXG4gICAgcHVibGljIGNvbHVtbnM6IGFueVtdID0gW107XG4gICAgcHVibGljIHBhcnNlZEl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyBsb2FkaW5nUm93cyA9IEFycmF5LmZyb20oe1xuICAgICAgICBsZW5ndGg6IHRoaXMuYW1vdW50T2ZMb2FkaW5nUm93cyxcbiAgICB9KTtcbiAgICBwcml2YXRlIF9jdHJsRG93biA9IGZhbHNlO1xuXG4gICAgLy8gQW5ndWxhciBzdHVmZlxuICAgIC8vIGN1c3RvbSBmaWx0ZXIgdGVtcGxhdGVcbiAgICBAQ29udGVudENoaWxkKFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlLCB7XG4gICAgICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgICAgICBzdGF0aWM6IHRydWUsXG4gICAgfSlcbiAgICBwdWJsaWMgaGVhZGVyQ3VzdG9tRmlsdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBjb2x1bW4gdGVtcGxhdGVzXG4gICAgcHJpdmF0ZSBfY29sdW1uRGVmaW5pdGlvbnMhOiBRdWVyeUxpc3Q8VGFibGVDb2x1bW4+O1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihUYWJsZUNvbHVtbilcbiAgICBzZXQgY29sdW1uRGVmaW5pdGlvbnModjogUXVlcnlMaXN0PFRhYmxlQ29sdW1uPikge1xuICAgICAgICB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyA9IHY7XG4gICAgICAgIHRoaXMuX2dlbmVyYXRlQ29sdW1ucygpO1xuICAgIH1cbiAgICBnZXQgY29sdW1uRGVmaW5pdGlvbnMoKTogUXVlcnlMaXN0PFRhYmxlQ29sdW1uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5EZWZpbml0aW9ucztcbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgbW9kYWxcbiAgICBAQ29udGVudENoaWxkKFRhYmxlRmlsdGVyTW9kYWxEaXJlY3RpdmUsIHtcbiAgICAgICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gICAgICAgIHN0YXRpYzogdHJ1ZSxcbiAgICB9KVxuICAgIHB1YmxpYyBmaWx0ZXJNb2RhbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gICAgcHVibGljIGZpbHRlck1vZGFsU2hvdyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAgIEBJbnB1dCgpIGZpbHRlck1vZGFsSGVhZGVyVGV4dDogc3RyaW5nID0gJ0ZpbHRlcnMnO1xuICAgIEBJbnB1dCgpIGZpbHRlck1vZGFsU2F2ZVRleHQ6IHN0cmluZyA9ICdTYXZlJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbENhbmNlbFRleHQ6IHN0cmluZyA9ICdDYW5jZWwnO1xuICAgIEBJbnB1dCgpIGZpbHRlck1vZGFsUmVzZXRUZXh0OiBzdHJpbmcgPSAnUmVzZXQgZmlsdGVycyc7XG5cbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFNob3dSZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGZpbHRlck1vZGFsU2hvd1Jlc2V0TW9iaWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAT3V0cHV0KCkgZmlsdGVyTW9kYWxTaG93OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGZpbHRlck1vZGFsU2F2ZTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBmaWx0ZXJNb2RhbFJlc2V0OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5fcGFyc2VJdGVtcyh0aGlzLml0ZW1zKTtcblxuICAgICAgICB0aGlzLmxvYWRpbmdSb3dzID0gQXJyYXkuZnJvbSh7XG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMuYW1vdW50T2ZMb2FkaW5nUm93cyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFNob3ckXG4gICAgICAgICAgICAucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLmZpbHRlck1vZGFsU2hvdy5uZXh0KHZhbHVlKSk7XG4gICAgICAgIC8vIHRoaXMuX2dlbmVyYXRlQ29sdW1ucygpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10pIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlSXRlbXMoY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXNbJ2Ftb3VudE9mTG9hZGluZ1Jvd3MnXSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nUm93cyA9IEFycmF5LmZyb20oe1xuICAgICAgICAgICAgICAgIGxlbmd0aDogY2hhbmdlc1snYW1vdW50T2ZMb2FkaW5nUm93cyddLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gIEBIb3N0TGlzdGVuZXIoJ2JvZHk6dGFibGVEZWZpbml0aW9uQ2hhbmdlZCcsIHsgdGFyZ2V0OiAnYm9keScgfSlcbiAgICAvLyAgb25UYWJsZURlZmluaXRpb25VcGRhdGVkKCkge1xuICAgIC8vICAgICAgdGhpcy5fZ2VuZXJhdGVDb2x1bW5zKCk7XG4gICAgLy8gIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxuICAgIGtleURvd24oeyBrZXkgfTogeyBrZXk6IHN0cmluZyB9KSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdDb250cm9sJyB8fCB0aGlzLl9jdHJsRG93biA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3RybERvd24gPSB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleXVwJywgWyckZXZlbnQnXSlcbiAgICBrZXlVcCh7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcbiAgICAgICAgaWYgKGtleSAhPT0gJ0NvbnRyb2wnIHx8IHRoaXMuX2N0cmxEb3duID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3RybERvd24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp2aXNpYmlsaXR5Y2hhbmdlJywgWyckZXZlbnQnXSlcbiAgICB2aXNpYmlsaXR5Q2hhbmdlKCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlICE9PSAnaGlkZGVuJyB8fCB0aGlzLl9jdHJsRG93biA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N0cmxEb3duID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25RdWVyeUNoYW5nZSh7IGRldGFpbCB9OiBDdXN0b21FdmVudDxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMucXVlcnlDaGFuZ2UuZW1pdChkZXRhaWwpO1xuICAgIH1cblxuICAgIG9uUXVpY2tGaWx0ZXIoeyBkZXRhaWwgfTogQ3VzdG9tRXZlbnQ8YW55Pikge1xuICAgICAgICB0aGlzLnF1aWNrRmlsdGVyLmVtaXQoZGV0YWlsKTtcbiAgICB9XG5cbiAgICBvblBhZ2VTaXplQ2hhbmdlKHsgZGV0YWlsIH06IEN1c3RvbUV2ZW50PG51bWJlcj4pIHtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZUNoYW5nZS5lbWl0KGRldGFpbCk7XG4gICAgfVxuXG4gICAgb25QYWdlQ2hhbmdlKHsgZGV0YWlsIH06IEN1c3RvbUV2ZW50PG51bWJlcj4pIHtcbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoZGV0YWlsKTtcbiAgICB9XG5cbiAgICBvbkZpbHRlck1vZGFsU2F2ZSgpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFNhdmUubmV4dCgpO1xuICAgICAgICB0aGlzLmZpbHRlck1vZGFsU2hvdyQubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgb25GaWx0ZXJNb2RhbFJlc2V0KHJlc2V0UXVpY2tGaWx0ZXIgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmZpbHRlck1vZGFsUmVzZXQubmV4dChyZXNldFF1aWNrRmlsdGVyKTtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlSXRlbXMoaXRlbXM6IHN0cmluZykge1xuICAgICAgICBpZiAoIWl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gW107XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkSXRlbXMgPSBpdGVtcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyc2VkSXRlbXMgPSBKU09OLnBhcnNlKGl0ZW1zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZW5lcmF0ZUNvbHVtbnMoKSB7XG4gICAgICAgIC8vIGNvbnN0IGRlZmluaXRpb25zID1cbiAgICAgICAgLy8gXHR0aGlzLl9lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3AtdGFibGUtZGVmaW5pdGlvbicpO1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBBcnJheS5mcm9tKHRoaXMuX2NvbHVtbkRlZmluaXRpb25zKTtcbiAgICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0SGVhZGVyKCkge1xuICAgIC8vICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICA8cC10YWJsZS1yb3cgdmFyaWFudD1cImhlYWRlclwiPlxuICAgIC8vICAgICAgICAgICAgICB7dGhpcy5fY29sdW1ucy5tYXAoKGNvbDogVGFibGVEZWZpbml0aW9uLCBpbmRleCkgPT4gKFxuICAgIC8vICAgICAgICAgICAgICAgICAgPHAtdGFibGUtY29sdW1uXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbj17Y29sfVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb2wubmFtZX1cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiaGVhZGVyXCJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveD17dGhpcy5fZ2V0Q2hlY2tib3goaW5kZXgsIG51bGwsICdoZWFkZXInKX1cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgLy8gICAgICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNvbHVtbj5cbiAgICAvLyAgICAgICAgICAgICAgKSl9XG4gICAgLy8gICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAvLyAgICAgICk7XG4gICAgLy8gIH1cblxuICAgIC8vICBwcml2YXRlIF9nZXRSb3dzKCkge1xuICAgIC8vICAgICAgaWYgKHRoaXMubG9hZGluZykge1xuICAgIC8vICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgIC8vICAgICAgICAgICAgICB7XG4gICAgLy8gICAgICAgICAgICAgICAgICBsZW5ndGg6IHRoaXMuYW1vdW50T2ZMb2FkaW5nUm93cyxcbiAgICAvLyAgICAgICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgICAgICAgKF8sIGkpID0+IChcbiAgICAvLyAgICAgICAgICAgICAgICAgIDxwLXRhYmxlLXJvd1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUhvdmVyPXtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24gfHwgdGhpcy5lbmFibGVSb3dDbGlja1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICAgICAgID5cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5fZ2V0TG9hZGluZ0NvbHVtbnMoaSl9XG4gICAgLy8gICAgICAgICAgICAgICAgICA8L3AtdGFibGUtcm93PlxuICAgIC8vICAgICAgICAgICAgICApXG4gICAgLy8gICAgICAgICAgKTtcbiAgICAvLyAgICAgIH1cblxuICAgIC8vICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IChcbiAgICAvLyAgICAgICAgICA8cC10YWJsZS1yb3dcbiAgICAvLyAgICAgICAgICAgICAgZW5hYmxlSG92ZXI9e3RoaXMuZW5hYmxlUm93U2VsZWN0aW9uIHx8IHRoaXMuZW5hYmxlUm93Q2xpY2t9XG4gICAgLy8gICAgICAgICAgICAgIG9uQ2xpY2s9eyhldikgPT4gdGhpcy5fcm93Q2xpY2soZXYsIGluZGV4KX1cbiAgICAvLyAgICAgICAgICA+XG4gICAgLy8gICAgICAgICAgICAgIHt0aGlzLl9nZXRSb3dDb2x1bW5zKGl0ZW0sIGluZGV4KX1cbiAgICAvLyAgICAgICAgICA8L3AtdGFibGUtcm93PlxuICAgIC8vICAgICAgKSk7XG4gICAgLy8gIH1cblxuICAgIC8vICBwcml2YXRlIF9nZXRSb3dDb2x1bW5zKGl0ZW0sIGluZGV4KSB7XG4gICAgLy8gICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5tYXAoKGNvbDogVGFibGVEZWZpbml0aW9uLCBjb2xJbmRleCkgPT4ge1xuICAgIC8vICAgICAgICAgIHJldHVybiAoXG4gICAgLy8gICAgICAgICAgICAgIDxwLXRhYmxlLWNvbHVtblxuICAgIC8vICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbj17Y29sfVxuICAgIC8vICAgICAgICAgICAgICAgICAgaXRlbT17aXRlbX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGNoZWNrYm94PXt0aGlzLl9nZXRDaGVja2JveChjb2xJbmRleCwgaW5kZXgpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgaW5kZXg9e2NvbEluZGV4fVxuICAgIC8vICAgICAgICAgICAgICAgICAgcm93SW5kZXg9e2luZGV4fVxuICAgIC8vICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNvbHVtbj5cbiAgICAvLyAgICAgICAgICApO1xuICAgIC8vICAgICAgfSk7XG4gICAgLy8gIH1cblxuICAgIC8vICBwcml2YXRlIF9nZXRMb2FkaW5nQ29sdW1ucyhpbmRleCkge1xuICAgIC8vICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMubWFwKChjb2w6IFRhYmxlRGVmaW5pdGlvbiwgY29sSW5kZXgpID0+IHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgICAgICA8cC10YWJsZS1jb2x1bW5cbiAgICAvLyAgICAgICAgICAgICAgICAgIGRlZmluaXRpb249e2NvbH1cbiAgICAvLyAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJsb2FkaW5nXCJcbiAgICAvLyAgICAgICAgICAgICAgICAgIGNoZWNrYm94PXt0aGlzLl9nZXRDaGVja2JveChjb2xJbmRleCwgaW5kZXgsICdsb2FkaW5nJyl9XG4gICAgLy8gICAgICAgICAgICAgICAgICBpbmRleD17Y29sSW5kZXh9XG4gICAgLy8gICAgICAgICAgICAgICAgICByb3dJbmRleD17aW5kZXh9XG4gICAgLy8gICAgICAgICAgICAgID48L3AtdGFibGUtY29sdW1uPlxuICAgIC8vICAgICAgICAgICk7XG4gICAgLy8gICAgICB9KTtcbiAgICAvLyAgfVxuXG4gICAgLy8gIHByaXZhdGUgX2dldENoZWNrYm94KFxuICAgIC8vICAgICAgaW5kZXgsXG4gICAgLy8gICAgICByb3dJbmRleCxcbiAgICAvLyAgICAgIHZhcmlhbnQ6ICdoZWFkZXInIHwgJ2RlZmF1bHQnIHwgJ2xvYWRpbmcnID0gJ2RlZmF1bHQnXG4gICAgLy8gICkge1xuICAgIC8vICAgICAgaWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCAhdGhpcy5zZWxlY3Rpb25LZXkgfHwgaW5kZXggIT09IDApIHtcbiAgICAvLyAgICAgICAgICByZXR1cm47XG4gICAgLy8gICAgICB9XG5cbiAgICAvLyAgICAgIGlmICh2YXJpYW50ID09PSAnbG9hZGluZycpIHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gPHAtbG9hZGVyIHZhcmlhbnQ9XCJnaG9zdFwiIGNsYXNzPVwicm91bmRlZCB3LTYgaC02XCIgLz47XG4gICAgLy8gICAgICB9XG5cbiAgICAvLyAgICAgIGlmICh2YXJpYW50ID09PSAnaGVhZGVyJykge1xuICAgIC8vICAgICAgICAgIHJldHVybiAoXG4gICAgLy8gICAgICAgICAgICAgIDxpbnB1dFxuICAgIC8vICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0XCJcbiAgICAvLyAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgLy8gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2KSA9PiB0aGlzLl9zZWxlY3RBbGxDaGFuZ2UoZXYpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgY2hlY2tlZD17dGhpcy5fc2VsZWN0aW9uQ29udGFpbnNBbGwoKX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU9e3RoaXMuX3NlbGVjdGlvbkluZGV0ZXJtaW5hdGUoKX1cbiAgICAvLyAgICAgICAgICAgICAgLz5cbiAgICAvLyAgICAgICAgICApO1xuICAgIC8vICAgICAgfVxuXG4gICAgLy8gICAgICBjb25zdCBpdGVtID0gdGhpcy5faXRlbXNbcm93SW5kZXhdO1xuXG4gICAgLy8gICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgIDxpbnB1dFxuICAgIC8vICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRcIlxuICAgIC8vICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgIC8vICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2KSA9PiB0aGlzLl9jaGVja2JveENoYW5nZShldj8udGFyZ2V0LCByb3dJbmRleCl9XG4gICAgLy8gICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLmNhblNlbGVjdEtleSAmJiAhaXRlbVt0aGlzLmNhblNlbGVjdEtleV19XG4gICAgLy8gICAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIHJvd0luZGV4KX1cbiAgICAvLyAgICAgICAgICAvPlxuICAgIC8vICAgICAgKTtcbiAgICAvLyAgfVxuXG4gICAgcHVibGljIF9jaGVja2JveERpc2FibGVkKGl0ZW06IGFueSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5TZWxlY3RLZXkgJiYgIWl0ZW1bdGhpcy5jYW5TZWxlY3RLZXldO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2VsZWN0QWxsQ2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0Q2hlY2tlZFZhbHVlKCRldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQWRkID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLnBhcnNlZEl0ZW1zW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhblNlbGVjdEtleSAmJiAhcm93W3RoaXMuY2FuU2VsZWN0S2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0aW9uQ29udGFpbnMocm93LCBpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0b0FkZC5wdXNoKHJvdyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHJvdyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzLCAuLi50b0FkZF07XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93c0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3RlZFJvd3NbaV07XG4gICAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLnBhcnNlZEl0ZW1zLmZpbmQoXG4gICAgICAgICAgICAgICAgKGQpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKGQsIGkpID09PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZSh2YWx1ZSwgaSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm93RGVzZWxlY3RlZC5lbWl0KHJvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93c0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX2NoZWNrYm94Q2hhbmdlKHRhcmdldDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMucGFyc2VkSXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIGlmICh0aGlzLmNhblNlbGVjdEtleSAmJiAhcm93W3RoaXMuY2FuU2VsZWN0S2V5XSkge1xuICAgICAgICAgICAgdGFyZ2V0LmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0Q2hlY2tlZFZhbHVlKHRhcmdldCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbLi4udGhpcy5zZWxlY3RlZFJvd3MsIHJvd107XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93c0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dzKTtcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChyb3cpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXhPZlRvUmVtb3ZlID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMocm93LCBpbmRleCwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gd2UgbmVlZCB0byBkbyB0aGlzLCBiZWNhdXNlIHNwbGljZSBkb2VzIG5vdCB0cmlnZ2VyIHRoZSBzZWxlY3Rpb24gc2V0dGVyLlxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBbLi4udGhpcy5zZWxlY3RlZFJvd3NdO1xuICAgICAgICBzZWxlY3Rpb24uc3BsaWNlKGluZGV4T2ZUb1JlbW92ZSwgMSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93c0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dzKTtcbiAgICAgICAgdGhpcy5yb3dEZXNlbGVjdGVkLmVtaXQocm93KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRDaGVja2VkVmFsdWUodGFyZ2V0OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldD8uY2hlY2tlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTZWxlY3Rpb25WYWx1ZShyb3c6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25LZXkgPyByb3c/Llt0aGlzLnNlbGVjdGlvbktleV0gfHwgaW5kZXggOiBpbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NlbGVjdGlvbkNvbnRhaW5zKFxuICAgICAgICByb3c6IGFueSxcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgcmV0dXJuSW5kZXggPSBmYWxzZVxuICAgICk6IGFueSB7XG4gICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gdGhpcy5zZWxlY3RlZFJvd3MuZmluZEluZGV4KFxuICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VsZWN0aW9uVmFsdWUocm93LCBpbmRleCkgPT09XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VsZWN0aW9uVmFsdWUoaXRlbSwgaW5kZXgpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiAhcmV0dXJuSW5kZXggPyByZXR1cm5WYWx1ZSA+PSAwIDogcmV0dXJuVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZWxlY3Rpb25Db250YWluc0FsbCgpIHtcbiAgICAgICAgbGV0IHJldHVyblZhbHVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2ldO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbnMgPSB0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCBpKTtcblxuICAgICAgICAgICAgaWYgKCFjb250YWlucykge1xuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZWxlY3Rpb25JbmRldGVybWluYXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aCB8fCAhdGhpcy5zZWxlY3RlZFJvd3M/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRhaW5zQ291bnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgaSk7XG5cbiAgICAgICAgICAgIGlmIChjb250YWlucykge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5zQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250YWluc0NvdW50ID4gMCAmJiBjb250YWluc0NvdW50ICE9PSB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3Jvd0NsaWNrKCRldmVudDogeyB0YXJnZXQ6IGFueSB9LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9ICRldmVudC50YXJnZXQ7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyB8fFxuICAgICAgICAgICAgdGFyZ2V0LnR5cGUgPT09ICdjaGVja2JveCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3cgPSB0aGlzLl9maW5kUm93KCRldmVudC50YXJnZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVJvd0NsaWNrKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLl9maW5kUm93QWN0aW9uKCRldmVudC50YXJnZXQpO1xuXG4gICAgICAgICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpbmRleF07XG4gICAgICAgICAgICB0aGlzLnJvd0NsaWNrLmVtaXQoe1xuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgY3RybERvd246IHRoaXMuX2N0cmxEb3duLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGVja2JveCA9IHJvdz8ucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJyk7XG5cbiAgICAgICAgaWYgKCFjaGVja2JveCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9ICFjaGVja2JveC5jaGVja2VkO1xuICAgICAgICB0aGlzLl9jaGVja2JveENoYW5nZShjaGVja2JveCwgaW5kZXgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2ZpbmRSb3coZWw6IEhUTUxFbGVtZW50IHwgbnVsbCk6IGFueSB7XG4gICAgICAgIGlmICghZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbD8udGFnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3AtdGFibGUtcm93Jykge1xuICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRSb3coZWw/LnBhcmVudEVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2ZpbmRSb3dBY3Rpb24oZWw6IEhUTUxFbGVtZW50IHwgbnVsbCk6IGFueSB7XG4gICAgICAgIGlmICghZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWlzLWFjdGlvbicpICE9PSBudWxsICYmXG4gICAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaXMtYWN0aW9uJykgIT09ICdmYWxzZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWw/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdwLXRhYmxlLXJvdycpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRSb3dBY3Rpb24oZWw/LnBhcmVudEVsZW1lbnQpO1xuICAgIH1cbn1cbiIsIjxwLXRhYmxlLWNvbnRhaW5lcj5cbiAgICA8cC10YWJsZS1oZWFkZXJcbiAgICAgICAgKm5nSWY9XCJlbmFibGVIZWFkZXJcIlxuICAgICAgICBbcXVpY2tGaWx0ZXJzXT1cInF1aWNrRmlsdGVyc1wiXG4gICAgICAgIFthY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXJdPVwiYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyXCJcbiAgICAgICAgKHF1aWNrRmlsdGVyKT1cIihvblF1aWNrRmlsdGVyKVwiXG4gICAgICAgIFtlbmFibGVTZWFyY2hdPVwiZW5hYmxlU2VhcmNoXCJcbiAgICAgICAgW3F1ZXJ5XT1cInF1ZXJ5XCJcbiAgICAgICAgKHF1ZXJ5Q2hhbmdlKT1cIihvblF1ZXJ5Q2hhbmdlKVwiXG4gICAgICAgIFtlbmFibGVGaWx0ZXJdPVwiZW5hYmxlRmlsdGVyXCJcbiAgICAgICAgW3NlbGVjdGVkRmlsdGVyc0Ftb3VudF09XCJzZWxlY3RlZEZpbHRlcnNBbW91bnRcIlxuICAgICAgICBbZmlsdGVyQnV0dG9uVGVtcGxhdGVdPVwiZmlsdGVyQnV0dG9uVGVtcGxhdGVcIlxuICAgICAgICAoZmlsdGVyKT1cImZpbHRlck1vZGFsU2hvdyQubmV4dCh0cnVlKVwiXG4gICAgICAgIFtlbmFibGVFZGl0XT1cImVuYWJsZUVkaXRcIlxuICAgICAgICBbY2FuRWRpdF09XCIhIXNlbGVjdGVkUm93cy5sZW5ndGhcIlxuICAgICAgICBbZWRpdEJ1dHRvblRlbXBsYXRlXT1cImVkaXRCdXR0b25UZW1wbGF0ZVwiXG4gICAgICAgIFtlZGl0VGV4dF09XCJlZGl0QnV0dG9uVGV4dFwiXG4gICAgICAgIFtlZGl0SWNvbl09XCJlZGl0QnV0dG9uSWNvblwiXG4gICAgICAgIChlZGl0KT1cImVkaXQuZW1pdCgpXCJcbiAgICAgICAgW2l0ZW1zU2VsZWN0ZWRBbW91bnRdPVwic2VsZWN0ZWRSb3dzLmxlbmd0aFwiXG4gICAgICAgIFtsb2FkaW5nXT1cImhlYWRlckxvYWRpbmdcIlxuICAgID5cbiAgICAgICAgPGRpdiAqbmdJZj1cImhlYWRlckN1c3RvbUZpbHRlclRlbXBsYXRlXCIgc2xvdD1cImN1c3RvbS1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlckN1c3RvbUZpbHRlclRlbXBsYXRlXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9wLXRhYmxlLWhlYWRlcj5cblxuICAgIDxwLXRhYmxlLXJvdyB2YXJpYW50PVwiaGVhZGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICAgPHAtdGFibGUtY2VsbC1uZ3hcbiAgICAgICAgICAgICAgICBbZGVmaW5pdGlvbl09XCJjb2xcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImhlYWRlclwiXG4gICAgICAgICAgICAgICAgW2luZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tib3hdPVwiXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSAwICYmIGVuYWJsZVJvd1NlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjaGVja2JveFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9wLXRhYmxlLWNlbGwtbmd4PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIl9zZWxlY3RBbGxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIl9zZWxlY3Rpb25Db250YWluc0FsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiX3NlbGVjdGlvbkluZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvcC10YWJsZS1yb3c+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZzsgZWxzZSBjb250ZW50VGVtcGxhdGVcIj5cbiAgICAgICAgICAgIDxwLXRhYmxlLXJvd1xuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByIG9mIGxvYWRpbmdSb3dzOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2VuYWJsZUhvdmVyXT1cImVuYWJsZVJvd1NlbGVjdGlvbiB8fCBlbmFibGVSb3dDbGlja1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlLWNlbGwtbmd4XG4gICAgICAgICAgICAgICAgICAgICAgICBbZGVmaW5pdGlvbl09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrYm94XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSAwICYmIGVuYWJsZVJvd1NlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNoZWNrYm94VGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0luZGV4XT1cInJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcC10YWJsZS1jZWxsLW5neD5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbG9hZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtNiB3LTYgcm91bmRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9wLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvcC10YWJsZS1yb3c+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudFRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1zPy5sZW5ndGg7IGVsc2UgZW1wdHlTdGF0ZVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPHAtdGFibGUtcm93XG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgcm93SW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtlbmFibGVIb3Zlcl09XCJlbmFibGVSb3dTZWxlY3Rpb24gfHwgZW5hYmxlUm93Q2xpY2tcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiX3Jvd0NsaWNrKCRldmVudCwgcm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC10YWJsZS1jZWxsLW5neFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrYm94XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9PT0gMCAmJiBlbmFibGVSb3dTZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2hlY2tib3hUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0luZGV4XT1cInJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sLnRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3AtdGFibGUtY2VsbC1uZ3g+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tib3hUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGVja2JveENoYW5nZSgkZXZlbnQudGFyZ2V0LCByb3dJbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIl9jaGVja2JveERpc2FibGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIHJvd0luZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvcC10YWJsZS1yb3c+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cblxuICAgIDxwLXRhYmxlLWZvb3RlclxuICAgICAgICAqbmdJZj1cImVuYWJsZUZvb3RlclwiXG4gICAgICAgIFtoaWRlT25TaW5nbGVQYWdlXT1cImhpZGVPblNpbmdsZVBhZ2VcIlxuICAgICAgICBbZW5hYmxlUGFnZVNpemVdPVwiZW5hYmxlUGFnZVNpemVcIlxuICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCIocGFnZVNpemVDaGFuZ2UpXCJcbiAgICAgICAgW2VuYWJsZVBhZ2luYXRpb25dPVwiZW5hYmxlUGFnaW5hdGlvblwiXG4gICAgICAgIFtwYWdlXT1cInBhZ2VcIlxuICAgICAgICBbdG90YWxdPVwidG90YWxcIlxuICAgICAgICAocGFnZUNoYW5nZSk9XCIocGFnZUNoYW5nZSlcIlxuICAgICAgICBbZW5hYmxlRXhwb3J0XT1cImVuYWJsZUV4cG9ydFwiXG4gICAgICAgIChleHBvcnQpPVwiZXhwb3J0LmVtaXQoKVwiXG4gICAgICAgIFtsb2FkaW5nXT1cImZvb3RlckxvYWRpbmdcIlxuICAgID48L3AtdGFibGUtZm9vdGVyPlxuPC9wLXRhYmxlLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlck1vZGFsVGVtcGxhdGVcIj5cbiAgICA8cC1tb2RhbFxuICAgICAgICBbaGVhZGVyXT1cImZpbHRlck1vZGFsSGVhZGVyVGV4dFwiXG4gICAgICAgIFtzaG93XT1cImZpbHRlck1vZGFsU2hvdyQgfCBhc3luY1wiXG4gICAgICAgIChjbG9zZSk9XCJmaWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpXCJcbiAgICA+XG4gICAgICAgIDxkaXYgc2xvdD1cImNvbnRlbnRcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlck1vZGFsVGVtcGxhdGVcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzbG90PVwiZm9vdGVyXCIgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXRNb2JpbGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgdGFibGV0OnctYXV0byBkZXNrdG9wLXhzOmhpZGRlblwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFJlc2V0KHRydWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBmaWx0ZXJNb2RhbFJlc2V0VGV4dCB9fVxuICAgICAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuIHctZnVsbCB0YWJsZXQ6dy1hdXRvIGRlc2t0b3AteHM6ZmxleFwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFJlc2V0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGZpbHRlck1vZGFsUmVzZXRUZXh0IH19XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtbC1hdXRvIHctZnVsbCB0YWJsZXQ6dy1hdXRvXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2hlY2ttYXJrXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkZpbHRlck1vZGFsU2F2ZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBmaWx0ZXJNb2RhbFNhdmVUZXh0IH19XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3AtbW9kYWw+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVN0YXRlVGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgICAqbmdJZj1cImVtcHR5U3RhdGVUeXBlID09PSAnZmlsdGVyZWQnOyBlbHNlIGVtcHR5U3RhdGVOb25GaWx0ZXJUZW1wbGF0ZVwiXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICBmbGV4XG4gICAgICAgICAgICBtYXgtdy1bMjByZW1dXG4gICAgICAgICAgICBmbGV4LWNvbFxuICAgICAgICAgICAgaXRlbXMtY2VudGVyXG4gICAgICAgICAgICBzZWxmLWNlbnRlclxuICAgICAgICAgICAgcHktMjRcbiAgICAgICAgICAgIHRleHQtY2VudGVyXG4gICAgICAgIFwiXG4gICAgPlxuICAgICAgICA8cC1pbGx1c3RyYXRpb25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJlbXB0eS1zdGF0ZS1zZWFyY2hcIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi02XCJcbiAgICAgICAgPjwvcC1pbGx1c3RyYXRpb24+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1zdG9ybS1kZWZhdWx0IGZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVGaWx0ZXJlZEhlYWRlciB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwIGNsYXNzPVwibWItMTQgdGV4dC1zbSB0ZXh0LXN0b3JtLW1lZGl1bVwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUZpbHRlcmVkQ29udGVudCB9fVxuICAgICAgICA8L3A+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5U3RhdGVOb25GaWx0ZXJUZW1wbGF0ZT5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICBmbGV4XG4gICAgICAgICAgICBtYXgtdy1bMjByZW1dXG4gICAgICAgICAgICBmbGV4LWNvbFxuICAgICAgICAgICAgaXRlbXMtY2VudGVyXG4gICAgICAgICAgICBzZWxmLWNlbnRlclxuICAgICAgICAgICAgcHktMjRcbiAgICAgICAgICAgIHRleHQtY2VudGVyXG4gICAgICAgIFwiXG4gICAgPlxuICAgICAgICA8cC1pbGx1c3RyYXRpb25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJlbXB0eS1zdGF0ZS1vdmVydmlld1wiXG4gICAgICAgICAgICBjbGFzcz1cIm1iLTYgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgKG9uQ2xpY2spPVwiZW1wdHlTdGF0ZUFjdGlvbkNsaWNrLmVtaXQoKVwiXG4gICAgICAgID48L3AtaWxsdXN0cmF0aW9uPlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtc3Rvcm0tZGVmYXVsdCBmb250LXNlbWlib2xkXCI+XG4gICAgICAgICAgICB7eyBlbXB0eVN0YXRlSGVhZGVyIH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJtYi02IHRleHQtc20gdGV4dC1zdG9ybS1tZWRpdW1cIj5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVDb250ZW50IH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIGljb249XCJwbHVzXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAob25DbGljayk9XCJlbXB0eVN0YXRlQWN0aW9uQ2xpY2suZW1pdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUFjdGlvbiB9fVxuICAgICAgICA8L3AtYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==