@paperless/angular 0.1.0-alpha.436 → 0.1.0-alpha.438

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 (87) hide show
  1. package/esm2022/lib/base/form.component.mjs +103 -0
  2. package/esm2022/lib/base/upload.component.mjs +58 -0
  3. package/esm2022/lib/base/value-accessor.mjs +44 -0
  4. package/esm2022/lib/directives/p-datepicker.directive.mjs +37 -0
  5. package/esm2022/lib/directives/p-page-size-select.directive.mjs +42 -0
  6. package/esm2022/lib/directives/p-pagination.directive.mjs +42 -0
  7. package/esm2022/lib/directives/p-select.directive.mjs +37 -0
  8. package/{esm2020 → esm2022}/lib/modules/overlay/overlay.module.mjs +15 -15
  9. package/esm2022/lib/modules/overlay/overlay.ref.mjs +14 -0
  10. package/esm2022/lib/modules/overlay/services/overlay.service.mjs +77 -0
  11. package/esm2022/lib/modules/table/base/table.component.mjs +203 -0
  12. package/esm2022/lib/modules/table/components/table/table.component.mjs +730 -0
  13. package/esm2022/lib/modules/table/components/table-cell/table-cell.component.mjs +215 -0
  14. package/esm2022/lib/modules/table/components/table-column/table-column.component.mjs +40 -0
  15. package/{esm2020 → esm2022}/lib/modules/table/directives/p-table-custom-filter.directive.mjs +4 -4
  16. package/{esm2020 → esm2022}/lib/modules/table/directives/p-table-filter-modal.directive.mjs +4 -4
  17. package/esm2022/lib/modules/table/directives/p-table-footer.directive.mjs +52 -0
  18. package/esm2022/lib/modules/table/directives/p-table-header.directive.mjs +60 -0
  19. package/esm2022/lib/modules/table/directives/p-table-ngx.directive.mjs +122 -0
  20. package/esm2022/lib/modules/table/directives/p-table.directive.mjs +78 -0
  21. package/{esm2020 → esm2022}/lib/modules/table/table.module.mjs +5 -5
  22. package/esm2022/lib/modules/toast/components/toast-container/toast-container.component.mjs +39 -0
  23. package/esm2022/lib/modules/toast/directives/toast.directive.mjs +51 -0
  24. package/esm2022/lib/modules/toast/services/toast.service.mjs +51 -0
  25. package/{esm2020 → esm2022}/lib/modules/toast/toast.module.mjs +5 -5
  26. package/{esm2020 → esm2022}/lib/paperless.module.mjs +5 -5
  27. package/esm2022/lib/pipes/currency.pipe.mjs +21 -0
  28. package/esm2022/lib/pipes/date.pipe.mjs +21 -0
  29. package/esm2022/lib/pipes/safe.pipe.mjs +34 -0
  30. package/esm2022/lib/stencil/components.mjs +1554 -0
  31. package/esm2022/lib/stencil.module.mjs +17 -0
  32. package/{fesm2020 → fesm2022}/paperless-angular.mjs +799 -570
  33. package/fesm2022/paperless-angular.mjs.map +1 -0
  34. package/package.json +6 -12
  35. package/paperless.css +48 -0
  36. package/esm2020/lib/base/form.component.mjs +0 -105
  37. package/esm2020/lib/base/upload.component.mjs +0 -57
  38. package/esm2020/lib/base/value-accessor.mjs +0 -42
  39. package/esm2020/lib/directives/p-datepicker.directive.mjs +0 -37
  40. package/esm2020/lib/directives/p-page-size-select.directive.mjs +0 -42
  41. package/esm2020/lib/directives/p-pagination.directive.mjs +0 -42
  42. package/esm2020/lib/directives/p-select.directive.mjs +0 -37
  43. package/esm2020/lib/modules/overlay/overlay.ref.mjs +0 -12
  44. package/esm2020/lib/modules/overlay/services/overlay.service.mjs +0 -74
  45. package/esm2020/lib/modules/table/base/table.component.mjs +0 -201
  46. package/esm2020/lib/modules/table/components/table/table.component.mjs +0 -679
  47. package/esm2020/lib/modules/table/components/table-cell/table-cell.component.mjs +0 -167
  48. package/esm2020/lib/modules/table/components/table-column/table-column.component.mjs +0 -37
  49. package/esm2020/lib/modules/table/directives/p-table-footer.directive.mjs +0 -52
  50. package/esm2020/lib/modules/table/directives/p-table-header.directive.mjs +0 -60
  51. package/esm2020/lib/modules/table/directives/p-table-ngx.directive.mjs +0 -121
  52. package/esm2020/lib/modules/table/directives/p-table.directive.mjs +0 -78
  53. package/esm2020/lib/modules/toast/components/toast-container/toast-container.component.mjs +0 -36
  54. package/esm2020/lib/modules/toast/directives/toast.directive.mjs +0 -51
  55. package/esm2020/lib/modules/toast/services/toast.service.mjs +0 -53
  56. package/esm2020/lib/pipes/currency.pipe.mjs +0 -20
  57. package/esm2020/lib/pipes/date.pipe.mjs +0 -20
  58. package/esm2020/lib/pipes/safe.pipe.mjs +0 -33
  59. package/esm2020/lib/stencil/components.mjs +0 -1440
  60. package/esm2020/lib/stencil.module.mjs +0 -17
  61. package/fesm2015/paperless-angular.mjs +0 -3673
  62. package/fesm2015/paperless-angular.mjs.map +0 -1
  63. package/fesm2020/paperless-angular.mjs.map +0 -1
  64. /package/{esm2020 → esm2022}/lib/animations/fade.mjs +0 -0
  65. /package/{esm2020 → esm2022}/lib/animations/index.mjs +0 -0
  66. /package/{esm2020 → esm2022}/lib/animations/slide.mjs +0 -0
  67. /package/{esm2020 → esm2022}/lib/base/index.mjs +0 -0
  68. /package/{esm2020 → esm2022}/lib/directives/index.mjs +0 -0
  69. /package/{esm2020 → esm2022}/lib/modules/index.mjs +0 -0
  70. /package/{esm2020 → esm2022}/lib/modules/overlay/index.mjs +0 -0
  71. /package/{esm2020 → esm2022}/lib/modules/overlay/services/index.mjs +0 -0
  72. /package/{esm2020 → esm2022}/lib/modules/table/base/index.mjs +0 -0
  73. /package/{esm2020 → esm2022}/lib/modules/table/components/index.mjs +0 -0
  74. /package/{esm2020 → esm2022}/lib/modules/table/components/table/constants.mjs +0 -0
  75. /package/{esm2020 → esm2022}/lib/modules/table/directives/index.mjs +0 -0
  76. /package/{esm2020 → esm2022}/lib/modules/table/index.mjs +0 -0
  77. /package/{esm2020 → esm2022}/lib/modules/table/utils.mjs +0 -0
  78. /package/{esm2020 → esm2022}/lib/modules/toast/components/index.mjs +0 -0
  79. /package/{esm2020 → esm2022}/lib/modules/toast/directives/index.mjs +0 -0
  80. /package/{esm2020 → esm2022}/lib/modules/toast/index.mjs +0 -0
  81. /package/{esm2020 → esm2022}/lib/modules/toast/services/index.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/modules/toast/types.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/pipes/index.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/stencil/angular-component-lib/utils.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/stencil/index.mjs +0 -0
  86. /package/{esm2020 → esm2022}/paperless-angular.mjs +0 -0
  87. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -0,0 +1,730 @@
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
+ /**
16
+ * The items to be fed to the table
17
+ */
18
+ items;
19
+ /**
20
+ * Wether data is loading
21
+ */
22
+ loading = false;
23
+ /**
24
+ * Wether the header should show loading state
25
+ */
26
+ headerLoading = false;
27
+ /**
28
+ * Wether the footer should show loading state
29
+ */
30
+ footerLoading = false;
31
+ /**
32
+ * The amount of loading rows to show
33
+ */
34
+ amountOfLoadingRows = 6;
35
+ /**
36
+ * Wether to enable selection
37
+ */
38
+ enableRowSelection = true;
39
+ /**
40
+ * Wether to enable row clicking
41
+ */
42
+ enableRowClick = true;
43
+ /**
44
+ * The current selection of items
45
+ */
46
+ selectedRows = [];
47
+ /**
48
+ * Event whenever the current selection changes
49
+ */
50
+ selectedRowsChange = new EventEmitter();
51
+ /**
52
+ * The key to determine if a row is selected
53
+ */
54
+ selectionKey;
55
+ /**
56
+ * A key to determine if a row can be selected
57
+ */
58
+ canSelectKey;
59
+ /**
60
+ * Event whenever a row is clicked
61
+ */
62
+ rowClick = new EventEmitter();
63
+ /**
64
+ * Event whenever a row is selected
65
+ */
66
+ rowSelected = new EventEmitter();
67
+ /**
68
+ * Event whenever a row is deselected
69
+ */
70
+ rowDeselected = new EventEmitter();
71
+ /** START HEADER */
72
+ /**
73
+ * Wether to show the header
74
+ */
75
+ enableHeader = true;
76
+ /**
77
+ * Quick filters to show
78
+ */
79
+ quickFilters = [];
80
+ /**
81
+ * Active quick filter identifier
82
+ */
83
+ activeQuickFilterIdentifier;
84
+ /**
85
+ * Wether to show the search input
86
+ */
87
+ enableSearch = true;
88
+ /**
89
+ * The query to show in the search bar
90
+ */
91
+ query;
92
+ /**
93
+ * Wether to show the filter button
94
+ */
95
+ enableFilter = true;
96
+ /**
97
+ * The amount of filters being selected
98
+ */
99
+ selectedFiltersAmount;
100
+ /**
101
+ * The template for the filter button text
102
+ */
103
+ filterButtonTemplate;
104
+ /**
105
+ * Wether to show the edit button
106
+ */
107
+ enableEdit = true;
108
+ /**
109
+ * Wether the edit button is loading
110
+ */
111
+ editButtonLoading = false;
112
+ /**
113
+ * The edit button icon
114
+ */
115
+ editButtonIcon = 'pencil';
116
+ /**
117
+ * The edit button text if changed
118
+ */
119
+ editButtonText;
120
+ /**
121
+ * The template for the edit button text
122
+ */
123
+ editButtonTemplate;
124
+ /**
125
+ * Event when one of the quick filters is clicked
126
+ */
127
+ quickFilter = new EventEmitter();
128
+ /**
129
+ * Event when the query changes
130
+ */
131
+ queryChange = new EventEmitter();
132
+ /**
133
+ * Event when the filter button is clicked
134
+ */
135
+ filter = new EventEmitter();
136
+ /**
137
+ * Event when the edit button is clicked
138
+ */
139
+ edit = new EventEmitter();
140
+ /** START FOOTER */
141
+ /**
142
+ * Wether to show the footer
143
+ */
144
+ enableFooter = true;
145
+ /**
146
+ * Wether to enable page size select
147
+ */
148
+ enablePageSize = true;
149
+ /**
150
+ * Wether to enable pagination
151
+ */
152
+ enablePagination = true;
153
+ /**
154
+ * Wether to enable export
155
+ */
156
+ enableExport = true;
157
+ /**
158
+ * The current page
159
+ */
160
+ page = 1;
161
+ /**
162
+ * The total amount of items
163
+ */
164
+ total;
165
+ /**
166
+ * Event whenever the page changes
167
+ */
168
+ pageChange = new EventEmitter();
169
+ /**
170
+ * The amount of items per page
171
+ */
172
+ pageSize = defaultSize;
173
+ /**
174
+ * The options for the page size
175
+ */
176
+ pageSizeOptions = defaultSizeOptions;
177
+ /**
178
+ * Event whenever the page changes
179
+ */
180
+ pageSizeChange = new EventEmitter();
181
+ /**
182
+ * Event whenever the page changes
183
+ */
184
+ export = new EventEmitter();
185
+ /**
186
+ * Wether to hide when there is only 1 page available
187
+ */
188
+ hideOnSinglePage = true;
189
+ /* Empty state start */
190
+ emptyStateType = 'no_filter';
191
+ emptyStateIllustration = 'empty-state-add';
192
+ emptyStateHeader;
193
+ emptyStateContent;
194
+ emptyStateAction;
195
+ enableEmptyStateAction = true;
196
+ emptyStateFilteredIllustration = 'empty-state-search';
197
+ emptyStateFilteredHeader;
198
+ emptyStateFilteredContent;
199
+ /**
200
+ * Event whenever the empty state is clicked
201
+ */
202
+ emptyStateActionClick = new EventEmitter();
203
+ /* Empty state end */
204
+ columns = [];
205
+ parsedItems = [];
206
+ loadingRows = Array.from({
207
+ length: this.amountOfLoadingRows,
208
+ });
209
+ _ctrlDown = false;
210
+ // Angular stuff
211
+ // custom filter template
212
+ headerCustomFilterTemplate;
213
+ // column templates
214
+ _columnDefinitions;
215
+ set columnDefinitions(v) {
216
+ this._columnDefinitions = v;
217
+ this._generateColumns();
218
+ }
219
+ get columnDefinitions() {
220
+ return this._columnDefinitions;
221
+ }
222
+ // filter modal
223
+ filterModalTemplate;
224
+ filterModalShow$ = new BehaviorSubject(false);
225
+ filterModalHeaderText = 'Filters';
226
+ filterModalSaveText = 'Save';
227
+ filterModalCancelText = 'Cancel';
228
+ filterModalResetText = 'Reset filters';
229
+ filterModalShowReset = false;
230
+ filterModalShowResetMobile = false;
231
+ filterModalShow = new EventEmitter();
232
+ filterModalSave = new EventEmitter();
233
+ filterModalReset = new EventEmitter();
234
+ constructor() { }
235
+ ngOnInit() {
236
+ this._parseItems(this.items);
237
+ this.loadingRows = Array.from({
238
+ length: this.amountOfLoadingRows,
239
+ });
240
+ this.filterModalShow$
241
+ .pipe(untilDestroyed(this), distinctUntilChanged())
242
+ .subscribe((value) => this.filterModalShow.next(value));
243
+ // this._generateColumns();
244
+ }
245
+ ngOnChanges(changes) {
246
+ if (changes['items']) {
247
+ this._parseItems(changes['items'].currentValue);
248
+ }
249
+ if (changes['amountOfLoadingRows']) {
250
+ this.loadingRows = Array.from({
251
+ length: changes['amountOfLoadingRows'].currentValue,
252
+ });
253
+ }
254
+ }
255
+ // @HostListener('body:tableDefinitionChanged', { target: 'body' })
256
+ // onTableDefinitionUpdated() {
257
+ // this._generateColumns();
258
+ // }
259
+ keyDown({ key }) {
260
+ if (key !== 'Control' || this._ctrlDown === true) {
261
+ return;
262
+ }
263
+ this._ctrlDown = true;
264
+ }
265
+ keyUp({ key }) {
266
+ if (key !== 'Control' || this._ctrlDown === false) {
267
+ return;
268
+ }
269
+ this._ctrlDown = false;
270
+ }
271
+ visibilityChange() {
272
+ if (document.visibilityState !== 'hidden' || this._ctrlDown === false) {
273
+ return;
274
+ }
275
+ this._ctrlDown = false;
276
+ }
277
+ onQueryChange({ detail }) {
278
+ this.queryChange.emit(detail);
279
+ }
280
+ onQuickFilter({ detail }) {
281
+ this.quickFilter.emit(detail);
282
+ }
283
+ onPageSizeChange({ detail }) {
284
+ this.pageSizeChange.emit(detail);
285
+ }
286
+ onPageChange({ detail }) {
287
+ this.pageChange.emit(detail);
288
+ }
289
+ onFilterModalSave() {
290
+ this.filterModalSave.next();
291
+ this.filterModalShow$.next(false);
292
+ }
293
+ onFilterModalReset(resetQuickFilter = false) {
294
+ this.filterModalReset.next(resetQuickFilter);
295
+ this.filterModalShow$.next(false);
296
+ }
297
+ emptyStateClicked() {
298
+ if (!this.enableEmptyStateAction) {
299
+ return;
300
+ }
301
+ this.emptyStateActionClick.emit();
302
+ }
303
+ _parseItems(items) {
304
+ if (!items) {
305
+ this.parsedItems = [];
306
+ return;
307
+ }
308
+ if (Array.isArray(items)) {
309
+ this.parsedItems = items;
310
+ return;
311
+ }
312
+ this.parsedItems = JSON.parse(items);
313
+ }
314
+ _generateColumns() {
315
+ // const definitions =
316
+ // this._el.nativeElement.querySelectorAll('p-table-definition');
317
+ this.columns = Array.from(this._columnDefinitions);
318
+ }
319
+ // private _getHeader() {
320
+ // return (
321
+ // <p-table-row variant="header">
322
+ // {this._columns.map((col: TableDefinition, index) => (
323
+ // <p-table-column
324
+ // definition={col}
325
+ // value={col.name}
326
+ // variant="header"
327
+ // checkbox={this._getCheckbox(index, null, 'header')}
328
+ // index={index}
329
+ // ></p-table-column>
330
+ // ))}
331
+ // </p-table-row>
332
+ // );
333
+ // }
334
+ // private _getRows() {
335
+ // if (this.loading) {
336
+ // return Array.from(
337
+ // {
338
+ // length: this.amountOfLoadingRows,
339
+ // },
340
+ // (_, i) => (
341
+ // <p-table-row
342
+ // enableHover={
343
+ // this.enableRowSelection || this.enableRowClick
344
+ // }
345
+ // >
346
+ // {this._getLoadingColumns(i)}
347
+ // </p-table-row>
348
+ // )
349
+ // );
350
+ // }
351
+ // return this._items.map((item, index) => (
352
+ // <p-table-row
353
+ // enableHover={this.enableRowSelection || this.enableRowClick}
354
+ // onClick={(ev) => this._rowClick(ev, index)}
355
+ // >
356
+ // {this._getRowColumns(item, index)}
357
+ // </p-table-row>
358
+ // ));
359
+ // }
360
+ // private _getRowColumns(item, index) {
361
+ // return this._columns.map((col: TableDefinition, colIndex) => {
362
+ // return (
363
+ // <p-table-column
364
+ // definition={col}
365
+ // item={item}
366
+ // checkbox={this._getCheckbox(colIndex, index)}
367
+ // index={colIndex}
368
+ // rowIndex={index}
369
+ // ></p-table-column>
370
+ // );
371
+ // });
372
+ // }
373
+ // private _getLoadingColumns(index) {
374
+ // return this._columns.map((col: TableDefinition, colIndex) => {
375
+ // return (
376
+ // <p-table-column
377
+ // definition={col}
378
+ // variant="loading"
379
+ // checkbox={this._getCheckbox(colIndex, index, 'loading')}
380
+ // index={colIndex}
381
+ // rowIndex={index}
382
+ // ></p-table-column>
383
+ // );
384
+ // });
385
+ // }
386
+ // private _getCheckbox(
387
+ // index,
388
+ // rowIndex,
389
+ // variant: 'header' | 'default' | 'loading' = 'default'
390
+ // ) {
391
+ // if (!this.enableRowSelection || !this.selectionKey || index !== 0) {
392
+ // return;
393
+ // }
394
+ // if (variant === 'loading') {
395
+ // return <p-loader variant="ghost" class="rounded w-6 h-6" />;
396
+ // }
397
+ // if (variant === 'header') {
398
+ // return (
399
+ // <input
400
+ // class="p-input"
401
+ // type="checkbox"
402
+ // onChange={(ev) => this._selectAllChange(ev)}
403
+ // checked={this._selectionContainsAll()}
404
+ // indeterminate={this._selectionIndeterminate()}
405
+ // />
406
+ // );
407
+ // }
408
+ // const item = this._items[rowIndex];
409
+ // return (
410
+ // <input
411
+ // class="p-input"
412
+ // type="checkbox"
413
+ // onChange={(ev) => this._checkboxChange(ev?.target, rowIndex)}
414
+ // disabled={this.canSelectKey && !item[this.canSelectKey]}
415
+ // checked={this._selectionContains(item, rowIndex)}
416
+ // />
417
+ // );
418
+ // }
419
+ _checkboxDisabled(item) {
420
+ return this.canSelectKey && !item[this.canSelectKey];
421
+ }
422
+ _selectAllChange($event) {
423
+ if (!this.enableRowSelection) {
424
+ return;
425
+ }
426
+ const value = this._getCheckedValue($event.target);
427
+ if (value) {
428
+ const toAdd = [];
429
+ for (let i = 0; i < this.parsedItems.length; i++) {
430
+ const row = this.parsedItems[i];
431
+ if (this.canSelectKey && !row[this.canSelectKey]) {
432
+ continue;
433
+ }
434
+ if (this._selectionContains(row, i)) {
435
+ continue;
436
+ }
437
+ toAdd.push(row);
438
+ this.rowSelected.emit(row);
439
+ }
440
+ this.selectedRows = [...this.selectedRows, ...toAdd];
441
+ this.selectedRowsChange.emit(this.selectedRows);
442
+ return;
443
+ }
444
+ for (let i = 0; i < this.selectedRows.length; i++) {
445
+ const value = this.selectedRows[i];
446
+ const row = this.parsedItems.find((d) => this._getSelectionValue(d, i) ===
447
+ this._getSelectionValue(value, i));
448
+ if (!row) {
449
+ continue;
450
+ }
451
+ this.rowDeselected.emit(row);
452
+ }
453
+ this.selectedRows = [];
454
+ this.selectedRowsChange.emit(this.selectedRows);
455
+ }
456
+ _checkboxChange(target, index) {
457
+ if (!this.enableRowSelection) {
458
+ return;
459
+ }
460
+ const row = this.parsedItems[index];
461
+ if (this.canSelectKey && !row[this.canSelectKey]) {
462
+ target.checked = false;
463
+ return;
464
+ }
465
+ const value = this._getCheckedValue(target);
466
+ if (value) {
467
+ this.selectedRows = [...this.selectedRows, row];
468
+ this.selectedRowsChange.emit(this.selectedRows);
469
+ this.rowSelected.emit(row);
470
+ return;
471
+ }
472
+ const indexOfToRemove = this._selectionContains(row, index, true);
473
+ // we need to do this, because splice does not trigger the selection setter.
474
+ const selection = [...this.selectedRows];
475
+ selection.splice(indexOfToRemove, 1);
476
+ this.selectedRows = selection;
477
+ this.selectedRowsChange.emit(this.selectedRows);
478
+ this.rowDeselected.emit(row);
479
+ }
480
+ _getCheckedValue(target) {
481
+ return target?.checked;
482
+ }
483
+ _getSelectionValue(row, index) {
484
+ return this.selectionKey ? row?.[this.selectionKey] || index : index;
485
+ }
486
+ _selectionContains(row, index, returnIndex = false) {
487
+ const returnValue = this.selectedRows.findIndex((item) => this._getSelectionValue(row, index) ===
488
+ this._getSelectionValue(item, index));
489
+ return !returnIndex ? returnValue >= 0 : returnValue;
490
+ }
491
+ _selectionContainsAll() {
492
+ let returnValue = true;
493
+ if (!this.parsedItems?.length) {
494
+ return false;
495
+ }
496
+ for (let i = 0; i < this.parsedItems?.length; i++) {
497
+ const item = this.parsedItems[i];
498
+ const contains = this._selectionContains(item, i);
499
+ if (!contains) {
500
+ returnValue = false;
501
+ break;
502
+ }
503
+ }
504
+ return returnValue;
505
+ }
506
+ _selectionIndeterminate() {
507
+ if (!this.parsedItems?.length || !this.selectedRows?.length) {
508
+ return false;
509
+ }
510
+ let containsCount = 0;
511
+ for (let i = 0; i < this.parsedItems?.length; i++) {
512
+ const item = this.parsedItems[i];
513
+ const contains = this._selectionContains(item, i);
514
+ if (contains) {
515
+ containsCount++;
516
+ }
517
+ }
518
+ return containsCount > 0 && containsCount !== this.parsedItems.length;
519
+ }
520
+ _rowClick($event, index) {
521
+ const target = $event.target;
522
+ if (target.tagName.toLowerCase() === 'input' ||
523
+ target.type === 'checkbox') {
524
+ return;
525
+ }
526
+ const row = this._findRow($event.target);
527
+ if (this.enableRowClick) {
528
+ const action = this._findRowAction($event.target);
529
+ if (action) {
530
+ return;
531
+ }
532
+ const item = this.parsedItems[index];
533
+ this.rowClick.emit({
534
+ item,
535
+ ctrlDown: this._ctrlDown,
536
+ });
537
+ return;
538
+ }
539
+ if (!this.enableRowSelection) {
540
+ return;
541
+ }
542
+ const checkbox = row?.querySelector('input[type="checkbox"]');
543
+ if (!checkbox) {
544
+ return;
545
+ }
546
+ checkbox.checked = !checkbox.checked;
547
+ this._checkboxChange(checkbox, index);
548
+ }
549
+ _findRow(el) {
550
+ if (!el) {
551
+ return el;
552
+ }
553
+ if (el?.tagName?.toLowerCase() === 'p-table-row') {
554
+ return el;
555
+ }
556
+ return this._findRow(el?.parentElement);
557
+ }
558
+ _findRowAction(el) {
559
+ if (!el) {
560
+ return null;
561
+ }
562
+ if (el.getAttribute('data-is-action') !== null &&
563
+ el.getAttribute('data-is-action') !== 'false') {
564
+ return el;
565
+ }
566
+ if (el?.tagName?.toLowerCase() === 'p-table-row') {
567
+ return null;
568
+ }
569
+ return this._findRowAction(el?.parentElement);
570
+ }
571
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Table, deps: [], target: i0.ɵɵFactoryTarget.Component });
572
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", 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", editButtonLoading: "editButtonLoading", 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", emptyStateIllustration: "emptyStateIllustration", emptyStateHeader: "emptyStateHeader", emptyStateContent: "emptyStateContent", emptyStateAction: "emptyStateAction", enableEmptyStateAction: "enableEmptyStateAction", emptyStateFilteredIllustration: "emptyStateFilteredIllustration", 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 [editLoading]=\"editButtonLoading\"\n [editText]=\"editButtonText\"\n [editIcon]=\"editButtonIcon\"\n (edit)=\"edit.emit()\"\n [itemsSelectedAmount]=\"selectedRows.length\"\n [loading]=\"headerLoading\"\n >\n <ng-container *ngIf=\"headerCustomFilterTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerCustomFilterTemplate\"\n ></ng-container>\n </ng-container>\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 (closed)=\"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]=\"emptyStateFilteredIllustration\"\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 [class.cursor-pointer]=\"enableEmptyStateAction\"\n (click)=\"emptyStateClicked()\"\n >\n <p-illustration\n [variant]=\"emptyStateIllustration\"\n class=\"mb-6\"\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 *ngIf=\"enableEmptyStateAction\"\n variant=\"secondary\"\n icon=\"plus\"\n size=\"small\"\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", "editLoading", "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 });
573
+ };
574
+ Table = __decorate([
575
+ UntilDestroy({ checkProperties: true })
576
+ ], Table);
577
+ export { Table };
578
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: Table, decorators: [{
579
+ type: Component,
580
+ 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 [editLoading]=\"editButtonLoading\"\n [editText]=\"editButtonText\"\n [editIcon]=\"editButtonIcon\"\n (edit)=\"edit.emit()\"\n [itemsSelectedAmount]=\"selectedRows.length\"\n [loading]=\"headerLoading\"\n >\n <ng-container *ngIf=\"headerCustomFilterTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerCustomFilterTemplate\"\n ></ng-container>\n </ng-container>\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 (closed)=\"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]=\"emptyStateFilteredIllustration\"\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 [class.cursor-pointer]=\"enableEmptyStateAction\"\n (click)=\"emptyStateClicked()\"\n >\n <p-illustration\n [variant]=\"emptyStateIllustration\"\n class=\"mb-6\"\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 *ngIf=\"enableEmptyStateAction\"\n variant=\"secondary\"\n icon=\"plus\"\n size=\"small\"\n >\n {{ emptyStateAction }}\n </p-button>\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column}\n"] }]
581
+ }], ctorParameters: function () { return []; }, propDecorators: { items: [{
582
+ type: Input
583
+ }], loading: [{
584
+ type: Input
585
+ }], headerLoading: [{
586
+ type: Input
587
+ }], footerLoading: [{
588
+ type: Input
589
+ }], amountOfLoadingRows: [{
590
+ type: Input
591
+ }], enableRowSelection: [{
592
+ type: Input
593
+ }], enableRowClick: [{
594
+ type: Input
595
+ }], selectedRows: [{
596
+ type: Input
597
+ }], selectedRowsChange: [{
598
+ type: Output
599
+ }], selectionKey: [{
600
+ type: Input
601
+ }], canSelectKey: [{
602
+ type: Input
603
+ }], rowClick: [{
604
+ type: Output
605
+ }], rowSelected: [{
606
+ type: Output
607
+ }], rowDeselected: [{
608
+ type: Output
609
+ }], enableHeader: [{
610
+ type: Input
611
+ }], quickFilters: [{
612
+ type: Input
613
+ }], activeQuickFilterIdentifier: [{
614
+ type: Input
615
+ }], enableSearch: [{
616
+ type: Input
617
+ }], query: [{
618
+ type: Input
619
+ }], enableFilter: [{
620
+ type: Input
621
+ }], selectedFiltersAmount: [{
622
+ type: Input
623
+ }], filterButtonTemplate: [{
624
+ type: Input
625
+ }], enableEdit: [{
626
+ type: Input
627
+ }], editButtonLoading: [{
628
+ type: Input
629
+ }], editButtonIcon: [{
630
+ type: Input
631
+ }], editButtonText: [{
632
+ type: Input
633
+ }], editButtonTemplate: [{
634
+ type: Input
635
+ }], quickFilter: [{
636
+ type: Output
637
+ }], queryChange: [{
638
+ type: Output
639
+ }], filter: [{
640
+ type: Output
641
+ }], edit: [{
642
+ type: Output
643
+ }], enableFooter: [{
644
+ type: Input
645
+ }], enablePageSize: [{
646
+ type: Input
647
+ }], enablePagination: [{
648
+ type: Input
649
+ }], enableExport: [{
650
+ type: Input
651
+ }], page: [{
652
+ type: Input
653
+ }], total: [{
654
+ type: Input
655
+ }], pageChange: [{
656
+ type: Output
657
+ }], pageSize: [{
658
+ type: Input
659
+ }], pageSizeOptions: [{
660
+ type: Input
661
+ }], pageSizeChange: [{
662
+ type: Output
663
+ }], export: [{
664
+ type: Output
665
+ }], hideOnSinglePage: [{
666
+ type: Input
667
+ }], emptyStateType: [{
668
+ type: Input
669
+ }], emptyStateIllustration: [{
670
+ type: Input
671
+ }], emptyStateHeader: [{
672
+ type: Input
673
+ }], emptyStateContent: [{
674
+ type: Input
675
+ }], emptyStateAction: [{
676
+ type: Input
677
+ }], enableEmptyStateAction: [{
678
+ type: Input
679
+ }], emptyStateFilteredIllustration: [{
680
+ type: Input
681
+ }], emptyStateFilteredHeader: [{
682
+ type: Input
683
+ }], emptyStateFilteredContent: [{
684
+ type: Input
685
+ }], emptyStateActionClick: [{
686
+ type: Output
687
+ }], headerCustomFilterTemplate: [{
688
+ type: ContentChild,
689
+ args: [TableCustomFilterDirective, {
690
+ read: TemplateRef,
691
+ static: true,
692
+ }]
693
+ }], columnDefinitions: [{
694
+ type: ContentChildren,
695
+ args: [TableColumn]
696
+ }], filterModalTemplate: [{
697
+ type: ContentChild,
698
+ args: [TableFilterModalDirective, {
699
+ read: TemplateRef,
700
+ static: true,
701
+ }]
702
+ }], filterModalHeaderText: [{
703
+ type: Input
704
+ }], filterModalSaveText: [{
705
+ type: Input
706
+ }], filterModalCancelText: [{
707
+ type: Input
708
+ }], filterModalResetText: [{
709
+ type: Input
710
+ }], filterModalShowReset: [{
711
+ type: Input
712
+ }], filterModalShowResetMobile: [{
713
+ type: Input
714
+ }], filterModalShow: [{
715
+ type: Output
716
+ }], filterModalSave: [{
717
+ type: Output
718
+ }], filterModalReset: [{
719
+ type: Output
720
+ }], keyDown: [{
721
+ type: HostListener,
722
+ args: ['document:keydown', ['$event']]
723
+ }], keyUp: [{
724
+ type: HostListener,
725
+ args: ['document:keyup', ['$event']]
726
+ }], visibilityChange: [{
727
+ type: HostListener,
728
+ args: ['document:visibilitychange', ['$event']]
729
+ }] } });
730
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFwZXJsZXNzL3NyYy9saWIvbW9kdWxlcy90YWJsZS9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3BhcGVybGVzcy9zcmMvbGliL21vZHVsZXMvdGFibGUvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sV0FBVyxHQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQ0gsMEJBQTBCLEVBQzFCLHlCQUF5QixHQUM1QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7O0FBU3ZELElBQU0sS0FBSyxHQUFYLE1BQU0sS0FBSztJQUNkOztPQUVHO0lBQ00sS0FBSyxDQUFVO0lBRXhCOztPQUVHO0lBQ00sT0FBTyxHQUFZLEtBQUssQ0FBQztJQUVsQzs7T0FFRztJQUNNLGFBQWEsR0FBWSxLQUFLLENBQUM7SUFFeEM7O09BRUc7SUFDTSxhQUFhLEdBQVksS0FBSyxDQUFDO0lBRXhDOztPQUVHO0lBQ00sbUJBQW1CLEdBQVcsQ0FBQyxDQUFDO0lBRXpDOztP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LEtBQUs7Z0JBRUcsOEJBQThCO3NCQUF0QyxLQUFLO2dCQUVHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBS0kscUJBQXFCO3NCQUE5QixNQUFNO2dCQWlCQSwwQkFBMEI7c0JBSmhDLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUU7d0JBQ3RDLElBQUksRUFBRSxXQUFXO3dCQUNqQixNQUFNLEVBQUUsSUFBSTtxQkFDZjtnQkFPRyxpQkFBaUI7c0JBRHBCLGVBQWU7dUJBQUMsV0FBVztnQkFjckIsbUJBQW1CO3NCQUp6QixZQUFZO3VCQUFDLHlCQUF5QixFQUFFO3dCQUNyQyxJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLElBQUk7cUJBQ2Y7Z0JBS1EscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFtQ1AsT0FBTztzQkFETixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVU1QyxLQUFLO3NCQURKLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBVTFDLGdCQUFnQjtzQkFEZixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSwgdW50aWxEZXN0cm95ZWQgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgUXVpY2tGaWx0ZXIsIFJvd0NsaWNrRXZlbnQgfSBmcm9tICdAcGFwZXJsZXNzL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBJY29uVmFyaWFudCxcbiAgICBJbGx1c3RyYXRpb25WYXJpYW50LFxufSBmcm9tICdAcGFwZXJsZXNzL2NvcmUvZGlzdC90eXBlcy9jb21wb25lbnRzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gICAgVGFibGVDdXN0b21GaWx0ZXJEaXJlY3RpdmUsXG4gICAgVGFibGVGaWx0ZXJNb2RhbERpcmVjdGl2ZSxcbn0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtbiB9IGZyb20gJy4uL3RhYmxlLWNvbHVtbi90YWJsZS1jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IGRlZmF1bHRTaXplLCBkZWZhdWx0U2l6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbkBVbnRpbERlc3Ryb3koeyBjaGVja1Byb3BlcnRpZXM6IHRydWUgfSlcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncC10YWJsZS1uZ3gnLFxuICAgIHRlbXBsYXRlVXJsOiAndGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWyd0YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbXMgdG8gYmUgZmVkIHRvIHRoZSB0YWJsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGl0ZW1zITogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIGRhdGEgaXMgbG9hZGluZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0aGUgaGVhZGVyIHNob3VsZCBzaG93IGxvYWRpbmcgc3RhdGVcbiAgICAgKi9cbiAgICBASW5wdXQoKSBoZWFkZXJMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdGhlIGZvb3RlciBzaG91bGQgc2hvdyBsb2FkaW5nIHN0YXRlXG4gICAgICovXG4gICAgQElucHV0KCkgZm9vdGVyTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBsb2FkaW5nIHJvd3MgdG8gc2hvd1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGFtb3VudE9mTG9hZGluZ1Jvd3M6IG51bWJlciA9IDY7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHNlbGVjdGlvblxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHJvdyBjbGlja2luZ1xuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZVJvd0NsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiBpdGVtc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkUm93czogYW55W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkUm93c0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIGRldGVybWluZSBpZiBhIHJvdyBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNlbGVjdGlvbktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQSBrZXkgdG8gZGV0ZXJtaW5lIGlmIGEgcm93IGNhbiBiZSBzZWxlY3RlZFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNhblNlbGVjdEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dDbGljazogRXZlbnRFbWl0dGVyPFJvd0NsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcm93U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgYSByb3cgaXMgZGVzZWxlY3RlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByb3dEZXNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKiBTVEFSVCBIRUFERVIgKi9cblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBzaG93IHRoZSBoZWFkZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVIZWFkZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogUXVpY2sgZmlsdGVycyB0byBzaG93XG4gICAgICovXG4gICAgQElucHV0KCkgcXVpY2tGaWx0ZXJzOiBRdWlja0ZpbHRlcltdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBBY3RpdmUgcXVpY2sgZmlsdGVyIGlkZW50aWZpZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBhY3RpdmVRdWlja0ZpbHRlcklkZW50aWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBzaG93IHRoZSBzZWFyY2ggaW5wdXRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IHRvIHNob3cgaW4gdGhlIHNlYXJjaCBiYXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBxdWVyeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIGZpbHRlciBidXR0b25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmaWx0ZXJzIGJlaW5nIHNlbGVjdGVkXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0ZWRGaWx0ZXJzQW1vdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBmaWx0ZXIgYnV0dG9uIHRleHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBmaWx0ZXJCdXR0b25UZW1wbGF0ZTogYW55O1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIGVkaXQgYnV0dG9uXG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlRWRpdDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdGhlIGVkaXQgYnV0dG9uIGlzIGxvYWRpbmdcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVkaXQgYnV0dG9uIGljb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uSWNvbjogSWNvblZhcmlhbnQgPSAncGVuY2lsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0IGJ1dHRvbiB0ZXh0IGlmIGNoYW5nZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uVGV4dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGVkaXQgYnV0dG9uIHRleHRcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlZGl0QnV0dG9uVGVtcGxhdGU6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gb25lIG9mIHRoZSBxdWljayBmaWx0ZXJzIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcXVpY2tGaWx0ZXI6IEV2ZW50RW1pdHRlcjxRdWlja0ZpbHRlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuIHRoZSBxdWVyeSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHF1ZXJ5Q2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIGZpbHRlciBidXR0b24gaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBmaWx0ZXI6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW4gdGhlIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZWRpdDogRXZlbnRFbWl0dGVyPG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLyoqIFNUQVJUIEZPT1RFUiAqL1xuXG4gICAgLyoqXG4gICAgICogV2V0aGVyIHRvIHNob3cgdGhlIGZvb3RlclxuICAgICAqL1xuICAgIEBJbnB1dCgpIGVuYWJsZUZvb3RlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHBhZ2Ugc2l6ZSBzZWxlY3RcbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVQYWdlU2l6ZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXZXRoZXIgdG8gZW5hYmxlIHBhZ2luYXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKSBlbmFibGVQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBlbmFibGUgZXhwb3J0XG4gICAgICovXG4gICAgQElucHV0KCkgZW5hYmxlRXhwb3J0OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHBhZ2VcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYWdlOiBudW1iZXIgPSAxO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBpdGVtc1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHRvdGFsITogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgdGhlIHBhZ2UgY2hhbmdlc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwYWdlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgaXRlbXMgcGVyIHBhZ2VcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYWdlU2l6ZTogbnVtYmVyID0gZGVmYXVsdFNpemU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3B0aW9ucyBmb3IgdGhlIHBhZ2Ugc2l6ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBkZWZhdWx0U2l6ZU9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGVuZXZlciB0aGUgcGFnZSBjaGFuZ2VzXG4gICAgICovXG4gICAgQE91dHB1dCgpIHBhZ2VTaXplQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoZW5ldmVyIHRoZSBwYWdlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZXhwb3J0OiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8qKlxuICAgICAqIFdldGhlciB0byBoaWRlIHdoZW4gdGhlcmUgaXMgb25seSAxIHBhZ2UgYXZhaWxhYmxlXG4gICAgICovXG4gICAgQElucHV0KCkgaGlkZU9uU2luZ2xlUGFnZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiBFbXB0eSBzdGF0ZSBzdGFydCAqL1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVUeXBlOiAnbm9fZmlsdGVyJyB8ICdmaWx0ZXJlZCcgPSAnbm9fZmlsdGVyJztcblxuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVJbGx1c3RyYXRpb246IElsbHVzdHJhdGlvblZhcmlhbnQgPSAnZW1wdHktc3RhdGUtYWRkJztcbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlSGVhZGVyITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVDb250ZW50ITogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVBY3Rpb24hOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKSBlbmFibGVFbXB0eVN0YXRlQWN0aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVGaWx0ZXJlZElsbHVzdHJhdGlvbjogSWxsdXN0cmF0aW9uVmFyaWFudCA9XG4gICAgICAgICdlbXB0eS1zdGF0ZS1zZWFyY2gnO1xuICAgIEBJbnB1dCgpIGVtcHR5U3RhdGVGaWx0ZXJlZEhlYWRlciE6IHN0cmluZztcbiAgICBASW5wdXQoKSBlbXB0eVN0YXRlRmlsdGVyZWRDb250ZW50ITogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hlbmV2ZXIgdGhlIGVtcHR5IHN0YXRlIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZW1wdHlTdGF0ZUFjdGlvbkNsaWNrOiBFdmVudEVtaXR0ZXI8bnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiBFbXB0eSBzdGF0ZSBlbmQgKi9cblxuICAgIHB1YmxpYyBjb2x1bW5zOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyBwYXJzZWRJdGVtczogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgbG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG4gICAgfSk7XG4gICAgcHJpdmF0ZSBfY3RybERvd24gPSBmYWxzZTtcblxuICAgIC8vIEFuZ3VsYXIgc3R1ZmZcbiAgICAvLyBjdXN0b20gZmlsdGVyIHRlbXBsYXRlXG4gICAgQENvbnRlbnRDaGlsZChUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwge1xuICAgICAgICByZWFkOiBUZW1wbGF0ZVJlZixcbiAgICAgICAgc3RhdGljOiB0cnVlLFxuICAgIH0pXG4gICAgcHVibGljIGhlYWRlckN1c3RvbUZpbHRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gY29sdW1uIHRlbXBsYXRlc1xuICAgIHByaXZhdGUgX2NvbHVtbkRlZmluaXRpb25zITogUXVlcnlMaXN0PFRhYmxlQ29sdW1uPjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGFibGVDb2x1bW4pXG4gICAgc2V0IGNvbHVtbkRlZmluaXRpb25zKHY6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4pIHtcbiAgICAgICAgdGhpcy5fY29sdW1uRGVmaW5pdGlvbnMgPSB2O1xuICAgICAgICB0aGlzLl9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICB9XG4gICAgZ2V0IGNvbHVtbkRlZmluaXRpb25zKCk6IFF1ZXJ5TGlzdDxUYWJsZUNvbHVtbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uRGVmaW5pdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gZmlsdGVyIG1vZGFsXG4gICAgQENvbnRlbnRDaGlsZChUYWJsZUZpbHRlck1vZGFsRGlyZWN0aXZlLCB7XG4gICAgICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgICAgICBzdGF0aWM6IHRydWUsXG4gICAgfSlcbiAgICBwdWJsaWMgZmlsdGVyTW9kYWxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBmaWx0ZXJNb2RhbFNob3ckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbEhlYWRlclRleHQ6IHN0cmluZyA9ICdGaWx0ZXJzJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFNhdmVUZXh0OiBzdHJpbmcgPSAnU2F2ZSc7XG4gICAgQElucHV0KCkgZmlsdGVyTW9kYWxDYW5jZWxUZXh0OiBzdHJpbmcgPSAnQ2FuY2VsJztcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFJlc2V0VGV4dDogc3RyaW5nID0gJ1Jlc2V0IGZpbHRlcnMnO1xuXG4gICAgQElucHV0KCkgZmlsdGVyTW9kYWxTaG93UmVzZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBmaWx0ZXJNb2RhbFNob3dSZXNldE1vYmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIGZpbHRlck1vZGFsU2hvdzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBmaWx0ZXJNb2RhbFNhdmU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZmlsdGVyTW9kYWxSZXNldDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX3BhcnNlSXRlbXModGhpcy5pdGVtcyk7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nUm93cyA9IEFycmF5LmZyb20oe1xuICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93JFxuICAgICAgICAgICAgLnBpcGUodW50aWxEZXN0cm95ZWQodGhpcyksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5maWx0ZXJNb2RhbFNob3cubmV4dCh2YWx1ZSkpO1xuICAgICAgICAvLyB0aGlzLl9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydpdGVtcyddKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUl0ZW1zKGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzWydhbW91bnRPZkxvYWRpbmdSb3dzJ10pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1Jvd3MgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGNoYW5nZXNbJ2Ftb3VudE9mTG9hZGluZ1Jvd3MnXS5jdXJyZW50VmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICBASG9zdExpc3RlbmVyKCdib2R5OnRhYmxlRGVmaW5pdGlvbkNoYW5nZWQnLCB7IHRhcmdldDogJ2JvZHknIH0pXG4gICAgLy8gIG9uVGFibGVEZWZpbml0aW9uVXBkYXRlZCgpIHtcbiAgICAvLyAgICAgIHRoaXMuX2dlbmVyYXRlQ29sdW1ucygpO1xuICAgIC8vICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBrZXlEb3duKHsga2V5IH06IHsga2V5OiBzdHJpbmcgfSkge1xuICAgICAgICBpZiAoa2V5ICE9PSAnQ29udHJvbCcgfHwgdGhpcy5fY3RybERvd24gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N0cmxEb3duID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gICAga2V5VXAoeyBrZXkgfTogeyBrZXk6IHN0cmluZyB9KSB7XG4gICAgICAgIGlmIChrZXkgIT09ICdDb250cm9sJyB8fCB0aGlzLl9jdHJsRG93biA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2N0cmxEb3duID0gZmFsc2U7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dmlzaWJpbGl0eWNoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgdmlzaWJpbGl0eUNoYW5nZSgpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAhPT0gJ2hpZGRlbicgfHwgdGhpcy5fY3RybERvd24gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jdHJsRG93biA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uUXVlcnlDaGFuZ2UoeyBkZXRhaWwgfTogQ3VzdG9tRXZlbnQ8c3RyaW5nPikge1xuICAgICAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQoZGV0YWlsKTtcbiAgICB9XG5cbiAgICBvblF1aWNrRmlsdGVyKHsgZGV0YWlsIH06IEN1c3RvbUV2ZW50PGFueT4pIHtcbiAgICAgICAgdGhpcy5xdWlja0ZpbHRlci5lbWl0KGRldGFpbCk7XG4gICAgfVxuXG4gICAgb25QYWdlU2l6ZUNoYW5nZSh7IGRldGFpbCB9OiBDdXN0b21FdmVudDxudW1iZXI+KSB7XG4gICAgICAgIHRoaXMucGFnZVNpemVDaGFuZ2UuZW1pdChkZXRhaWwpO1xuICAgIH1cblxuICAgIG9uUGFnZUNoYW5nZSh7IGRldGFpbCB9OiBDdXN0b21FdmVudDxudW1iZXI+KSB7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KGRldGFpbCk7XG4gICAgfVxuXG4gICAgb25GaWx0ZXJNb2RhbFNhdmUoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTYXZlLm5leHQoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIG9uRmlsdGVyTW9kYWxSZXNldChyZXNldFF1aWNrRmlsdGVyID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RhbFJlc2V0Lm5leHQocmVzZXRRdWlja0ZpbHRlcik7XG4gICAgICAgIHRoaXMuZmlsdGVyTW9kYWxTaG93JC5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBlbXB0eVN0YXRlQ2xpY2tlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZUVtcHR5U3RhdGVBY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1wdHlTdGF0ZUFjdGlvbkNsaWNrLmVtaXQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUl0ZW1zKGl0ZW1zOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFpdGVtcykge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gaXRlbXM7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gSlNPTi5wYXJzZShpdGVtcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2VuZXJhdGVDb2x1bW5zKCkge1xuICAgICAgICAvLyBjb25zdCBkZWZpbml0aW9ucyA9XG4gICAgICAgIC8vIFx0dGhpcy5fZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwLXRhYmxlLWRlZmluaXRpb24nKTtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gQXJyYXkuZnJvbSh0aGlzLl9jb2x1bW5EZWZpbml0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gIHByaXZhdGUgX2dldEhlYWRlcigpIHtcbiAgICAvLyAgICAgIHJldHVybiAoXG4gICAgLy8gICAgICAgICAgPHAtdGFibGUtcm93IHZhcmlhbnQ9XCJoZWFkZXJcIj5cbiAgICAvLyAgICAgICAgICAgICAge3RoaXMuX2NvbHVtbnMubWFwKChjb2w6IFRhYmxlRGVmaW5pdGlvbiwgaW5kZXgpID0+IChcbiAgICAvLyAgICAgICAgICAgICAgICAgIDxwLXRhYmxlLWNvbHVtblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb249e2NvbH1cbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29sLm5hbWV9XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImhlYWRlclwiXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3g9e3RoaXMuX2dldENoZWNrYm94KGluZGV4LCBudWxsLCAnaGVhZGVyJyl9XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgIC8vICAgICAgICAgICAgICAgICAgPjwvcC10YWJsZS1jb2x1bW4+XG4gICAgLy8gICAgICAgICAgICAgICkpfVxuICAgIC8vICAgICAgICAgIDwvcC10YWJsZS1yb3c+XG4gICAgLy8gICAgICApO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0Um93cygpIHtcbiAgICAvLyAgICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAvLyAgICAgICAgICAgICAge1xuICAgIC8vICAgICAgICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmFtb3VudE9mTG9hZGluZ1Jvd3MsXG4gICAgLy8gICAgICAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICAgICAgIChfLCBpKSA9PiAoXG4gICAgLy8gICAgICAgICAgICAgICAgICA8cC10YWJsZS1yb3dcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICBlbmFibGVIb3Zlcj17XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlUm93U2VsZWN0aW9uIHx8IHRoaXMuZW5hYmxlUm93Q2xpY2tcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgICAgICA+XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAge3RoaXMuX2dldExvYWRpbmdDb2x1bW5zKGkpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAvLyAgICAgICAgICAgICAgKVxuICAgIC8vICAgICAgICAgICk7XG4gICAgLy8gICAgICB9XG5cbiAgICAvLyAgICAgIHJldHVybiB0aGlzLl9pdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoXG4gICAgLy8gICAgICAgICAgPHAtdGFibGUtcm93XG4gICAgLy8gICAgICAgICAgICAgIGVuYWJsZUhvdmVyPXt0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCB0aGlzLmVuYWJsZVJvd0NsaWNrfVxuICAgIC8vICAgICAgICAgICAgICBvbkNsaWNrPXsoZXYpID0+IHRoaXMuX3Jvd0NsaWNrKGV2LCBpbmRleCl9XG4gICAgLy8gICAgICAgICAgPlxuICAgIC8vICAgICAgICAgICAgICB7dGhpcy5fZ2V0Um93Q29sdW1ucyhpdGVtLCBpbmRleCl9XG4gICAgLy8gICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAvLyAgICAgICkpO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0Um93Q29sdW1ucyhpdGVtLCBpbmRleCkge1xuICAgIC8vICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnMubWFwKChjb2w6IFRhYmxlRGVmaW5pdGlvbiwgY29sSW5kZXgpID0+IHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgICAgICA8cC10YWJsZS1jb2x1bW5cbiAgICAvLyAgICAgICAgICAgICAgICAgIGRlZmluaXRpb249e2NvbH1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGl0ZW09e2l0ZW19XG4gICAgLy8gICAgICAgICAgICAgICAgICBjaGVja2JveD17dGhpcy5fZ2V0Q2hlY2tib3goY29sSW5kZXgsIGluZGV4KX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGluZGV4PXtjb2xJbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgICAgIHJvd0luZGV4PXtpbmRleH1cbiAgICAvLyAgICAgICAgICAgICAgPjwvcC10YWJsZS1jb2x1bW4+XG4gICAgLy8gICAgICAgICAgKTtcbiAgICAvLyAgICAgIH0pO1xuICAgIC8vICB9XG5cbiAgICAvLyAgcHJpdmF0ZSBfZ2V0TG9hZGluZ0NvbHVtbnMoaW5kZXgpIHtcbiAgICAvLyAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLm1hcCgoY29sOiBUYWJsZURlZmluaXRpb24sIGNvbEluZGV4KSA9PiB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICAgICAgPHAtdGFibGUtY29sdW1uXG4gICAgLy8gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uPXtjb2x9XG4gICAgLy8gICAgICAgICAgICAgICAgICB2YXJpYW50PVwibG9hZGluZ1wiXG4gICAgLy8gICAgICAgICAgICAgICAgICBjaGVja2JveD17dGhpcy5fZ2V0Q2hlY2tib3goY29sSW5kZXgsIGluZGV4LCAnbG9hZGluZycpfVxuICAgIC8vICAgICAgICAgICAgICAgICAgaW5kZXg9e2NvbEluZGV4fVxuICAgIC8vICAgICAgICAgICAgICAgICAgcm93SW5kZXg9e2luZGV4fVxuICAgIC8vICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNvbHVtbj5cbiAgICAvLyAgICAgICAgICApO1xuICAgIC8vICAgICAgfSk7XG4gICAgLy8gIH1cblxuICAgIC8vICBwcml2YXRlIF9nZXRDaGVja2JveChcbiAgICAvLyAgICAgIGluZGV4LFxuICAgIC8vICAgICAgcm93SW5kZXgsXG4gICAgLy8gICAgICB2YXJpYW50OiAnaGVhZGVyJyB8ICdkZWZhdWx0JyB8ICdsb2FkaW5nJyA9ICdkZWZhdWx0J1xuICAgIC8vICApIHtcbiAgICAvLyAgICAgIGlmICghdGhpcy5lbmFibGVSb3dTZWxlY3Rpb24gfHwgIXRoaXMuc2VsZWN0aW9uS2V5IHx8IGluZGV4ICE9PSAwKSB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICAgfVxuXG4gICAgLy8gICAgICBpZiAodmFyaWFudCA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgLy8gICAgICAgICAgcmV0dXJuIDxwLWxvYWRlciB2YXJpYW50PVwiZ2hvc3RcIiBjbGFzcz1cInJvdW5kZWQgdy02IGgtNlwiIC8+O1xuICAgIC8vICAgICAgfVxuXG4gICAgLy8gICAgICBpZiAodmFyaWFudCA9PT0gJ2hlYWRlcicpIHtcbiAgICAvLyAgICAgICAgICByZXR1cm4gKFxuICAgIC8vICAgICAgICAgICAgICA8aW5wdXRcbiAgICAvLyAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dFwiXG4gICAgLy8gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgIC8vICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldikgPT4gdGhpcy5fc2VsZWN0QWxsQ2hhbmdlKGV2KX1cbiAgICAvLyAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMuX3NlbGVjdGlvbkNvbnRhaW5zQWxsKCl9XG4gICAgLy8gICAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlPXt0aGlzLl9zZWxlY3Rpb25JbmRldGVybWluYXRlKCl9XG4gICAgLy8gICAgICAgICAgICAgIC8+XG4gICAgLy8gICAgICAgICAgKTtcbiAgICAvLyAgICAgIH1cblxuICAgIC8vICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2l0ZW1zW3Jvd0luZGV4XTtcblxuICAgIC8vICAgICAgcmV0dXJuIChcbiAgICAvLyAgICAgICAgICA8aW5wdXRcbiAgICAvLyAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0XCJcbiAgICAvLyAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAvLyAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldikgPT4gdGhpcy5fY2hlY2tib3hDaGFuZ2UoZXY/LnRhcmdldCwgcm93SW5kZXgpfVxuICAgIC8vICAgICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5jYW5TZWxlY3RLZXkgJiYgIWl0ZW1bdGhpcy5jYW5TZWxlY3RLZXldfVxuICAgIC8vICAgICAgICAgICAgICBjaGVja2VkPXt0aGlzLl9zZWxlY3Rpb25Db250YWlucyhpdGVtLCByb3dJbmRleCl9XG4gICAgLy8gICAgICAgICAgLz5cbiAgICAvLyAgICAgICk7XG4gICAgLy8gIH1cblxuICAgIHB1YmxpYyBfY2hlY2tib3hEaXNhYmxlZChpdGVtOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuU2VsZWN0S2V5ICYmICFpdGVtW3RoaXMuY2FuU2VsZWN0S2V5XTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NlbGVjdEFsbENoYW5nZSgkZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2dldENoZWNrZWRWYWx1ZSgkZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB0b0FkZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG9BZGQucHVzaChyb3cpO1xuICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdChyb3cpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFsuLi50aGlzLnNlbGVjdGVkUm93cywgLi4udG9BZGRdO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRSb3dzW2ldO1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5wYXJzZWRJdGVtcy5maW5kKFxuICAgICAgICAgICAgICAgIChkKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRTZWxlY3Rpb25WYWx1ZShkLCBpKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0U2VsZWN0aW9uVmFsdWUodmFsdWUsIGkpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvd0Rlc2VsZWN0ZWQuZW1pdChyb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgfVxuXG4gICAgcHVibGljIF9jaGVja2JveENoYW5nZSh0YXJnZXQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlUm93U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3cgPSB0aGlzLnBhcnNlZEl0ZW1zW2luZGV4XTtcblxuICAgICAgICBpZiAodGhpcy5jYW5TZWxlY3RLZXkgJiYgIXJvd1t0aGlzLmNhblNlbGVjdEtleV0pIHtcbiAgICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2dldENoZWNrZWRWYWx1ZSh0YXJnZXQpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzLCByb3ddO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQocm93KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4T2ZUb1JlbW92ZSA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKHJvdywgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZG8gdGhpcywgYmVjYXVzZSBzcGxpY2UgZG9lcyBub3QgdHJpZ2dlciB0aGUgc2VsZWN0aW9uIHNldHRlci5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gWy4uLnRoaXMuc2VsZWN0ZWRSb3dzXTtcbiAgICAgICAgc2VsZWN0aW9uLnNwbGljZShpbmRleE9mVG9SZW1vdmUsIDEpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3NDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUm93cyk7XG4gICAgICAgIHRoaXMucm93RGVzZWxlY3RlZC5lbWl0KHJvdyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q2hlY2tlZFZhbHVlKHRhcmdldDogYW55KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ/LmNoZWNrZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2VsZWN0aW9uVmFsdWUocm93OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uS2V5ID8gcm93Py5bdGhpcy5zZWxlY3Rpb25LZXldIHx8IGluZGV4IDogaW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIF9zZWxlY3Rpb25Db250YWlucyhcbiAgICAgICAgcm93OiBhbnksXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHJldHVybkluZGV4ID0gZmFsc2VcbiAgICApOiBhbnkge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHRoaXMuc2VsZWN0ZWRSb3dzLmZpbmRJbmRleChcbiAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKHJvdywgaW5kZXgpID09PVxuICAgICAgICAgICAgICAgIHRoaXMuX2dldFNlbGVjdGlvblZhbHVlKGl0ZW0sIGluZGV4KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gIXJldHVybkluZGV4ID8gcmV0dXJuVmFsdWUgPj0gMCA6IHJldHVyblZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2VsZWN0aW9uQ29udGFpbnNBbGwoKSB7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWRJdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFyc2VkSXRlbXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5zID0gdGhpcy5fc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgaSk7XG5cbiAgICAgICAgICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGggfHwgIXRoaXMuc2VsZWN0ZWRSb3dzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb250YWluc0NvdW50ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEl0ZW1zPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaV07XG4gICAgICAgICAgICBjb25zdCBjb250YWlucyA9IHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5zKGl0ZW0sIGkpO1xuXG4gICAgICAgICAgICBpZiAoY29udGFpbnMpIHtcbiAgICAgICAgICAgICAgICBjb250YWluc0NvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbnNDb3VudCA+IDAgJiYgY29udGFpbnNDb3VudCAhPT0gdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIF9yb3dDbGljaygkZXZlbnQ6IHsgdGFyZ2V0OiBhbnkgfSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgfHxcbiAgICAgICAgICAgIHRhcmdldC50eXBlID09PSAnY2hlY2tib3gnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5fZmluZFJvdygkZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICBpZiAodGhpcy5lbmFibGVSb3dDbGljaykge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5fZmluZFJvd0FjdGlvbigkZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5yb3dDbGljay5lbWl0KHtcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIGN0cmxEb3duOiB0aGlzLl9jdHJsRG93bixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVJvd1NlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tib3ggPSByb3c/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO1xuXG4gICAgICAgIGlmICghY2hlY2tib3gpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSAhY2hlY2tib3guY2hlY2tlZDtcbiAgICAgICAgdGhpcy5fY2hlY2tib3hDaGFuZ2UoY2hlY2tib3gsIGluZGV4KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maW5kUm93KGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWw/LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdwLXRhYmxlLXJvdycpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kUm93KGVsPy5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maW5kUm93QWN0aW9uKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpOiBhbnkge1xuICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pcy1hY3Rpb24nKSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWlzLWFjdGlvbicpICE9PSAnZmFsc2UnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAncC10YWJsZS1yb3cnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9maW5kUm93QWN0aW9uKGVsPy5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG59XG4iLCI8cC10YWJsZS1jb250YWluZXI+XG4gICAgPHAtdGFibGUtaGVhZGVyXG4gICAgICAgICpuZ0lmPVwiZW5hYmxlSGVhZGVyXCJcbiAgICAgICAgW3F1aWNrRmlsdGVyc109XCJxdWlja0ZpbHRlcnNcIlxuICAgICAgICBbYWN0aXZlUXVpY2tGaWx0ZXJJZGVudGlmaWVyXT1cImFjdGl2ZVF1aWNrRmlsdGVySWRlbnRpZmllclwiXG4gICAgICAgIChxdWlja0ZpbHRlcik9XCIob25RdWlja0ZpbHRlcilcIlxuICAgICAgICBbZW5hYmxlU2VhcmNoXT1cImVuYWJsZVNlYXJjaFwiXG4gICAgICAgIFtxdWVyeV09XCJxdWVyeVwiXG4gICAgICAgIChxdWVyeUNoYW5nZSk9XCIob25RdWVyeUNoYW5nZSlcIlxuICAgICAgICBbZW5hYmxlRmlsdGVyXT1cImVuYWJsZUZpbHRlclwiXG4gICAgICAgIFtzZWxlY3RlZEZpbHRlcnNBbW91bnRdPVwic2VsZWN0ZWRGaWx0ZXJzQW1vdW50XCJcbiAgICAgICAgW2ZpbHRlckJ1dHRvblRlbXBsYXRlXT1cImZpbHRlckJ1dHRvblRlbXBsYXRlXCJcbiAgICAgICAgKGZpbHRlcik9XCJmaWx0ZXJNb2RhbFNob3ckLm5leHQodHJ1ZSlcIlxuICAgICAgICBbZW5hYmxlRWRpdF09XCJlbmFibGVFZGl0XCJcbiAgICAgICAgW2NhbkVkaXRdPVwiISFzZWxlY3RlZFJvd3MubGVuZ3RoXCJcbiAgICAgICAgW2VkaXRCdXR0b25UZW1wbGF0ZV09XCJlZGl0QnV0dG9uVGVtcGxhdGVcIlxuICAgICAgICBbZWRpdExvYWRpbmddPVwiZWRpdEJ1dHRvbkxvYWRpbmdcIlxuICAgICAgICBbZWRpdFRleHRdPVwiZWRpdEJ1dHRvblRleHRcIlxuICAgICAgICBbZWRpdEljb25dPVwiZWRpdEJ1dHRvbkljb25cIlxuICAgICAgICAoZWRpdCk9XCJlZGl0LmVtaXQoKVwiXG4gICAgICAgIFtpdGVtc1NlbGVjdGVkQW1vdW50XT1cInNlbGVjdGVkUm93cy5sZW5ndGhcIlxuICAgICAgICBbbG9hZGluZ109XCJoZWFkZXJMb2FkaW5nXCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoZWFkZXJDdXN0b21GaWx0ZXJUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQ3VzdG9tRmlsdGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L3AtdGFibGUtaGVhZGVyPlxuXG4gICAgPHAtdGFibGUtcm93IHZhcmlhbnQ9XCJoZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICA8cC10YWJsZS1jZWxsLW5neFxuICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbaW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjaGVja2JveF09XCJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDAgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGNoZWNrYm94VGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L3AtdGFibGUtY2VsbC1uZ3g+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiX3NlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiX3NlbGVjdGlvbkNvbnRhaW5zQWxsKClcIlxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJfc2VsZWN0aW9uSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9wLXRhYmxlLXJvdz5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nOyBlbHNlIGNvbnRlbnRUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPHAtdGFibGUtcm93XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgbG9hZGluZ1Jvd3M7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbZW5hYmxlSG92ZXJdPVwiZW5hYmxlUm93U2VsZWN0aW9uIHx8IGVuYWJsZVJvd0NsaWNrXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGUtY2VsbC1uZ3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZpbml0aW9uXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwibG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDAgJiYgZW5hYmxlUm93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2hlY2tib3hUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+PC9wLXRhYmxlLWNlbGwtbmd4PlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1sb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC02IHctNiByb3VuZGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3AtbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjb250ZW50VGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXM/Lmxlbmd0aDsgZWxzZSBlbXB0eVN0YXRlVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICA8cC10YWJsZS1yb3dcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCByb3dJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2VuYWJsZUhvdmVyXT1cImVuYWJsZVJvd1NlbGVjdGlvbiB8fCBlbmFibGVSb3dDbGlja1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJfcm93Q2xpY2soJGV2ZW50LCByb3dJbmRleClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlLWNlbGwtbmd4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiY29sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tib3hdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSAwICYmIGVuYWJsZVJvd1NlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjaGVja2JveFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2wudGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC10YWJsZS1jZWxsLW5neD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja2JveFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NoZWNrYm94Q2hhbmdlKCRldmVudC50YXJnZXQsIHJvd0luZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiX2NoZWNrYm94RGlzYWJsZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJfc2VsZWN0aW9uQ29udGFpbnMoaXRlbSwgcm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlLXJvdz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPHAtdGFibGUtZm9vdGVyXG4gICAgICAgICpuZ0lmPVwiZW5hYmxlRm9vdGVyXCJcbiAgICAgICAgW2hpZGVPblNpbmdsZVBhZ2VdPVwiaGlkZU9uU2luZ2xlUGFnZVwiXG4gICAgICAgIFtlbmFibGVQYWdlU2l6ZV09XCJlbmFibGVQYWdlU2l6ZVwiXG4gICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIihwYWdlU2l6ZUNoYW5nZSlcIlxuICAgICAgICBbZW5hYmxlUGFnaW5hdGlvbl09XCJlbmFibGVQYWdpbmF0aW9uXCJcbiAgICAgICAgW3BhZ2VdPVwicGFnZVwiXG4gICAgICAgIFt0b3RhbF09XCJ0b3RhbFwiXG4gICAgICAgIChwYWdlQ2hhbmdlKT1cIihwYWdlQ2hhbmdlKVwiXG4gICAgICAgIFtlbmFibGVFeHBvcnRdPVwiZW5hYmxlRXhwb3J0XCJcbiAgICAgICAgKGV4cG9ydCk9XCJleHBvcnQuZW1pdCgpXCJcbiAgICAgICAgW2xvYWRpbmddPVwiZm9vdGVyTG9hZGluZ1wiXG4gICAgPjwvcC10YWJsZS1mb290ZXI+XG48L3AtdGFibGUtY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyTW9kYWxUZW1wbGF0ZVwiPlxuICAgIDxwLW1vZGFsXG4gICAgICAgIFtoZWFkZXJdPVwiZmlsdGVyTW9kYWxIZWFkZXJUZXh0XCJcbiAgICAgICAgW3Nob3ddPVwiZmlsdGVyTW9kYWxTaG93JCB8IGFzeW5jXCJcbiAgICAgICAgKGNsb3NlZCk9XCJmaWx0ZXJNb2RhbFNob3ckLm5leHQoZmFsc2UpXCJcbiAgICA+XG4gICAgICAgIDxkaXYgc2xvdD1cImNvbnRlbnRcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlck1vZGFsVGVtcGxhdGVcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzbG90PVwiZm9vdGVyXCIgY2xhc3M9XCJmbGV4IHctZnVsbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXRNb2JpbGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgdGFibGV0OnctYXV0byBkZXNrdG9wLXhzOmhpZGRlblwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFJlc2V0KHRydWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBmaWx0ZXJNb2RhbFJlc2V0VGV4dCB9fVxuICAgICAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyTW9kYWxTaG93UmVzZXRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuIHctZnVsbCB0YWJsZXQ6dy1hdXRvIGRlc2t0b3AteHM6ZmxleFwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25GaWx0ZXJNb2RhbFJlc2V0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGZpbHRlck1vZGFsUmVzZXRUZXh0IH19XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtbC1hdXRvIHctZnVsbCB0YWJsZXQ6dy1hdXRvXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2hlY2ttYXJrXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkZpbHRlck1vZGFsU2F2ZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBmaWx0ZXJNb2RhbFNhdmVUZXh0IH19XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L3AtbW9kYWw+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVN0YXRlVGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgICAqbmdJZj1cImVtcHR5U3RhdGVUeXBlID09PSAnZmlsdGVyZWQnOyBlbHNlIGVtcHR5U3RhdGVOb25GaWx0ZXJUZW1wbGF0ZVwiXG4gICAgICAgIGNsYXNzPVwiXG4gICAgICAgICAgICBmbGV4XG4gICAgICAgICAgICBtYXgtdy1bMjByZW1dXG4gICAgICAgICAgICBmbGV4LWNvbFxuICAgICAgICAgICAgaXRlbXMtY2VudGVyXG4gICAgICAgICAgICBzZWxmLWNlbnRlclxuICAgICAgICAgICAgcHktMjRcbiAgICAgICAgICAgIHRleHQtY2VudGVyXG4gICAgICAgIFwiXG4gICAgPlxuICAgICAgICA8cC1pbGx1c3RyYXRpb25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cImVtcHR5U3RhdGVGaWx0ZXJlZElsbHVzdHJhdGlvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1iLTZcIlxuICAgICAgICA+PC9wLWlsbHVzdHJhdGlvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXN0b3JtLWRlZmF1bHQgZm9udC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUZpbHRlcmVkSGVhZGVyIH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJtYi0xNCB0ZXh0LXNtIHRleHQtc3Rvcm0tbWVkaXVtXCI+XG4gICAgICAgICAgICB7eyBlbXB0eVN0YXRlRmlsdGVyZWRDb250ZW50IH19XG4gICAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlTdGF0ZU5vbkZpbHRlclRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJcbiAgICAgICAgICAgIGZsZXhcbiAgICAgICAgICAgIG1heC13LVsyMHJlbV1cbiAgICAgICAgICAgIGZsZXgtY29sXG4gICAgICAgICAgICBpdGVtcy1jZW50ZXJcbiAgICAgICAgICAgIHNlbGYtY2VudGVyXG4gICAgICAgICAgICBweS0yNFxuICAgICAgICAgICAgdGV4dC1jZW50ZXJcbiAgICAgICAgXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cImVuYWJsZUVtcHR5U3RhdGVBY3Rpb25cIlxuICAgICAgICAoY2xpY2spPVwiZW1wdHlTdGF0ZUNsaWNrZWQoKVwiXG4gICAgPlxuICAgICAgICA8cC1pbGx1c3RyYXRpb25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cImVtcHR5U3RhdGVJbGx1c3RyYXRpb25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi02XCJcbiAgICAgICAgPjwvcC1pbGx1c3RyYXRpb24+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1zdG9ybS1kZWZhdWx0IGZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVIZWFkZXIgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cIm1iLTYgdGV4dC1zbSB0ZXh0LXN0b3JtLW1lZGl1bVwiPlxuICAgICAgICAgICAge3sgZW1wdHlTdGF0ZUNvbnRlbnQgfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiZW5hYmxlRW1wdHlTdGF0ZUFjdGlvblwiXG4gICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIGljb249XCJwbHVzXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IGVtcHR5U3RhdGVBY3Rpb24gfX1cbiAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=