ng-tailwind 6.3.0 → 6.4.1

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 (107) hide show
  1. package/components/ngt-multi-select/ngt-multi-select.component.d.ts +2 -1
  2. package/fesm2022/ng-tailwind.mjs +361 -346
  3. package/fesm2022/ng-tailwind.mjs.map +1 -1
  4. package/package.json +1 -3
  5. package/esm2022/animations/ngt-angular-animations.mjs +0 -34
  6. package/esm2022/base/ngt-base-ng-model.mjs +0 -90
  7. package/esm2022/components/ngt-action/ngt-action.component.mjs +0 -96
  8. package/esm2022/components/ngt-action/ngt-action.module.mjs +0 -28
  9. package/esm2022/components/ngt-button/ngt-button.component.mjs +0 -142
  10. package/esm2022/components/ngt-button/ngt-button.module.mjs +0 -28
  11. package/esm2022/components/ngt-checkbox/ngt-checkbox.component.mjs +0 -192
  12. package/esm2022/components/ngt-checkbox/ngt-checkbox.module.mjs +0 -28
  13. package/esm2022/components/ngt-content/ngt-content.component.mjs +0 -32
  14. package/esm2022/components/ngt-content/ngt-content.module.mjs +0 -20
  15. package/esm2022/components/ngt-context-menu/ngt-context-menu.component.mjs +0 -25
  16. package/esm2022/components/ngt-context-menu/ngt-context-menu.directive.mjs +0 -89
  17. package/esm2022/components/ngt-context-menu/ngt-context-menu.module.mjs +0 -33
  18. package/esm2022/components/ngt-datatable/ngt-datatable.component.mjs +0 -472
  19. package/esm2022/components/ngt-datatable/ngt-datatable.module.mjs +0 -99
  20. package/esm2022/components/ngt-datatable/ngt-tbody/ngt-tbody.component.mjs +0 -57
  21. package/esm2022/components/ngt-datatable/ngt-td/ngt-td.component.mjs +0 -62
  22. package/esm2022/components/ngt-datatable/ngt-td-check/ngt-td-check.component.mjs +0 -113
  23. package/esm2022/components/ngt-datatable/ngt-th/ngt-th.component.mjs +0 -228
  24. package/esm2022/components/ngt-datatable/ngt-th-check/ngt-th-check.component.mjs +0 -127
  25. package/esm2022/components/ngt-datatable/ngt-thead/ngt-thead.component.mjs +0 -55
  26. package/esm2022/components/ngt-datatable/ngt-tr/ngt-tr.component.mjs +0 -86
  27. package/esm2022/components/ngt-date/ngt-date.component.mjs +0 -435
  28. package/esm2022/components/ngt-date/ngt-date.module.mjs +0 -40
  29. package/esm2022/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.mjs +0 -19
  30. package/esm2022/components/ngt-dropdown/ngt-dropdown.component.mjs +0 -205
  31. package/esm2022/components/ngt-dropdown/ngt-dropdown.module.mjs +0 -21
  32. package/esm2022/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.mjs +0 -54
  33. package/esm2022/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.mjs +0 -66
  34. package/esm2022/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.mjs +0 -94
  35. package/esm2022/components/ngt-dropzone/ngt-dropzone.component.mjs +0 -496
  36. package/esm2022/components/ngt-dropzone/ngt-dropzone.meta.mjs +0 -24
  37. package/esm2022/components/ngt-dropzone/ngt-dropzone.module.mjs +0 -55
  38. package/esm2022/components/ngt-floating-button/ngt-floating-button.component.mjs +0 -119
  39. package/esm2022/components/ngt-floating-button/ngt-floating-button.module.mjs +0 -28
  40. package/esm2022/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.mjs +0 -22
  41. package/esm2022/components/ngt-form/ngt-form.component.mjs +0 -207
  42. package/esm2022/components/ngt-form/ngt-form.module.mjs +0 -29
  43. package/esm2022/components/ngt-header-nav/ngt-header-nav.component.mjs +0 -39
  44. package/esm2022/components/ngt-header-nav/ngt-header-nav.module.mjs +0 -20
  45. package/esm2022/components/ngt-helper/ngt-helper.component.mjs +0 -69
  46. package/esm2022/components/ngt-helper/ngt-helper.module.mjs +0 -28
  47. package/esm2022/components/ngt-input/ngt-input.component.mjs +0 -844
  48. package/esm2022/components/ngt-input/ngt-input.module.mjs +0 -47
  49. package/esm2022/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.mjs +0 -46
  50. package/esm2022/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.mjs +0 -33
  51. package/esm2022/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.mjs +0 -40
  52. package/esm2022/components/ngt-modal/ngt-modal.component.mjs +0 -122
  53. package/esm2022/components/ngt-modal/ngt-modal.module.mjs +0 -39
  54. package/esm2022/components/ngt-multi-select/ngt-multi-select.component.mjs +0 -503
  55. package/esm2022/components/ngt-multi-select/ngt-multi-select.module.mjs +0 -52
  56. package/esm2022/components/ngt-pagination/ngt-pagination.component.mjs +0 -162
  57. package/esm2022/components/ngt-pagination/ngt-pagination.module.mjs +0 -36
  58. package/esm2022/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.mjs +0 -59
  59. package/esm2022/components/ngt-popover/ngt-popover.component.mjs +0 -85
  60. package/esm2022/components/ngt-popover/ngt-popover.directive.mjs +0 -130
  61. package/esm2022/components/ngt-popover/ngt-popover.module.mjs +0 -36
  62. package/esm2022/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.mjs +0 -34
  63. package/esm2022/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.mjs +0 -35
  64. package/esm2022/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.mjs +0 -57
  65. package/esm2022/components/ngt-portlet/ngt-portlet.component.mjs +0 -74
  66. package/esm2022/components/ngt-portlet/ngt-portlet.module.mjs +0 -47
  67. package/esm2022/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.mjs +0 -19
  68. package/esm2022/components/ngt-radio-button/ngt-radio-button.component.mjs +0 -153
  69. package/esm2022/components/ngt-radio-button/ngt-radio-button.module.mjs +0 -29
  70. package/esm2022/components/ngt-section/ngt-section.component.mjs +0 -151
  71. package/esm2022/components/ngt-section/ngt-section.module.mjs +0 -32
  72. package/esm2022/components/ngt-select/ngt-select.component.mjs +0 -670
  73. package/esm2022/components/ngt-select/ngt-select.directive.mjs +0 -36
  74. package/esm2022/components/ngt-select/ngt-select.module.mjs +0 -65
  75. package/esm2022/components/ngt-shining/ngt-shining.component.mjs +0 -40
  76. package/esm2022/components/ngt-shining/ngt-shining.module.mjs +0 -20
  77. package/esm2022/components/ngt-sidenav/ngt-sidenav.component.mjs +0 -132
  78. package/esm2022/components/ngt-sidenav/ngt-sidenav.module.mjs +0 -20
  79. package/esm2022/components/ngt-slider/ngt-slider.component.mjs +0 -100
  80. package/esm2022/components/ngt-slider/ngt-slider.module.mjs +0 -24
  81. package/esm2022/components/ngt-svg/ngt-svg.component.mjs +0 -53
  82. package/esm2022/components/ngt-svg/ngt-svg.module.mjs +0 -24
  83. package/esm2022/components/ngt-tag/ngt-tag.component.mjs +0 -37
  84. package/esm2022/components/ngt-tag/ngt-tag.module.mjs +0 -24
  85. package/esm2022/components/ngt-textarea/ngt-textarea.component.mjs +0 -238
  86. package/esm2022/components/ngt-textarea/ngt-textarea.module.mjs +0 -43
  87. package/esm2022/components/ngt-validation/ngt-validation.component.mjs +0 -26
  88. package/esm2022/components/ngt-validation/ngt-validation.module.mjs +0 -20
  89. package/esm2022/directives/ngt-stylizable/ngt-stylizable.directive.mjs +0 -299
  90. package/esm2022/directives/ngt-stylizable/ngt-stylizable.module.mjs +0 -20
  91. package/esm2022/enums/size.enum.mjs +0 -11
  92. package/esm2022/helpers/enum/enum.mjs +0 -7
  93. package/esm2022/helpers/form/form.mjs +0 -14
  94. package/esm2022/helpers/input-mask/input-mask.helper.mjs +0 -26
  95. package/esm2022/helpers/promise/promise-helper.mjs +0 -4
  96. package/esm2022/helpers/routing/route.mjs +0 -11
  97. package/esm2022/helpers/uuid.mjs +0 -10
  98. package/esm2022/ng-tailwind.mjs +0 -5
  99. package/esm2022/public-api.mjs +0 -127
  100. package/esm2022/services/http/ngt-attachment-http.service.mjs +0 -3
  101. package/esm2022/services/http/ngt-http-form.service.mjs +0 -3
  102. package/esm2022/services/http/ngt-http-resource.service.mjs +0 -3
  103. package/esm2022/services/http/ngt-http-validation.service.mjs +0 -3
  104. package/esm2022/services/http/ngt-http.service.mjs +0 -3
  105. package/esm2022/services/http/ngt-translate.service.mjs +0 -3
  106. package/esm2022/services/ngt-stylizable/ngt-stylizable.service.mjs +0 -279
  107. package/esm2022/services/validation/ngt-ability-validation.service.mjs +0 -3
@@ -1,472 +0,0 @@
1
- import { Component, EventEmitter, Input, Optional, Output, ViewChild, } from '@angular/core';
2
- import { getEnumFromString } from '../../helpers/enum/enum';
3
- import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../services/http/ngt-http.service";
6
- import * as i2 from "../../services/http/ngt-translate.service";
7
- import * as i3 from "@angular/common";
8
- import * as i4 from "../ngt-shining/ngt-shining.component";
9
- import * as i5 from "../ngt-pagination/ngt-pagination.component";
10
- import * as i6 from "../ngt-modal/ngt-modal.component";
11
- import * as i7 from "../ngt-tag/ngt-tag.component";
12
- import * as i8 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
13
- export var NgtDatatableType;
14
- (function (NgtDatatableType) {
15
- NgtDatatableType["REMOTE"] = "REMOTE";
16
- NgtDatatableType["FIXED"] = "FIXED";
17
- })(NgtDatatableType || (NgtDatatableType = {}));
18
- export var NgtDatatableSearchType;
19
- (function (NgtDatatableSearchType) {
20
- NgtDatatableSearchType["DEFAULT"] = "DEFAULT";
21
- NgtDatatableSearchType["SILENT"] = "SILENT";
22
- })(NgtDatatableSearchType || (NgtDatatableSearchType = {}));
23
- export var NgtDatatableParam;
24
- (function (NgtDatatableParam) {
25
- NgtDatatableParam[NgtDatatableParam["STAY_IN_PAGE"] = 1] = "STAY_IN_PAGE";
26
- NgtDatatableParam[NgtDatatableParam["RESET_PAGE"] = 0] = "RESET_PAGE";
27
- NgtDatatableParam[NgtDatatableParam["ENABLE_LOADER"] = 1] = "ENABLE_LOADER";
28
- NgtDatatableParam[NgtDatatableParam["DISABLE_LOADER"] = 0] = "DISABLE_LOADER";
29
- })(NgtDatatableParam || (NgtDatatableParam = {}));
30
- export class NgtCheckedElement {
31
- }
32
- export class NgtCustomFilter {
33
- }
34
- export class NgtDatatableComponent {
35
- constructor(injector, ngtHttpService, changeDetector, ngtTranslateService) {
36
- this.injector = injector;
37
- this.ngtHttpService = ngtHttpService;
38
- this.changeDetector = changeDetector;
39
- this.ngtTranslateService = ngtTranslateService;
40
- this.type = NgtDatatableType.REMOTE;
41
- this.filterTagBgColor = 'bg-blue-500';
42
- this.filterTagMargin = 'mb-4';
43
- this.paginationMargin = 'mt-2 md:mt-8';
44
- this.searchDelay = 500;
45
- this.searchTermMinLength = 1;
46
- this.searchTermOnEnter = true;
47
- this.defaultFilters = {};
48
- this.filtersDescription = {};
49
- this.canSelectAllRegisters = false;
50
- this.onDataChange = new EventEmitter();
51
- this.onClearFilter = new EventEmitter();
52
- this.onClearSelectedElements = new EventEmitter();
53
- this.onSelectedElementsChange = new EventEmitter();
54
- this.onToogleAllCheckboxes = new EventEmitter();
55
- this.onToogleCheckbox = new EventEmitter();
56
- this.onSelectAllRegisters = new EventEmitter();
57
- this.onOpenSearchModal = new EventEmitter();
58
- this.onSearch = new EventEmitter();
59
- this.data = [];
60
- this.loading = false;
61
- this.cleaningFilter = false;
62
- this.componentReady = false;
63
- this.filtersTranslated = [];
64
- this.columnCount = [];
65
- this.selectedElements = [];
66
- this.filterModalStyle = new NgtStylizableService();
67
- this.subscriptions = [];
68
- this.currentState = {
69
- filters: {
70
- defaultFilters: {},
71
- silentFilters: {},
72
- qualifiedFilters: {},
73
- },
74
- sort: {
75
- field: '',
76
- direction: ''
77
- }
78
- };
79
- this.filterModalStyle.load(this.injector, 'FilterModal', {
80
- w: 'md:max-w-md',
81
- py: 'py-4',
82
- px: 'px-6',
83
- border: 'border border-teal-500',
84
- overflow: 'overflow-visible',
85
- color: {}
86
- });
87
- }
88
- ngOnInit() {
89
- if (this.table && this.table.nativeElement && this.table.nativeElement.rows
90
- && this.table.nativeElement.rows[0] && this.table.nativeElement.rows[0].cells) {
91
- this.columnCount = this.table.nativeElement.rows[0].cells;
92
- }
93
- if (this.inputSearch) {
94
- this.initSearchWithInput();
95
- }
96
- this.initCheckboxEvent();
97
- if (this.searchDelay == 500) {
98
- this.searchDelay = this.injector.get('NgtDatatableSearchDelay', 500);
99
- }
100
- if (this.searchTermMinLength == 1) {
101
- this.searchTermMinLength = this.injector.get('NgtDatatableSearchTermMinLength', 1);
102
- }
103
- }
104
- ngOnDestroy() {
105
- this.destroySubscriptions();
106
- }
107
- setSearchModalTemplate(template) {
108
- this.searchModalTemplate = template;
109
- }
110
- openSearchModal(reference) {
111
- this.searchModal.open();
112
- this.onOpenSearchModal.emit(reference);
113
- }
114
- clearSelectedElements() {
115
- this.selectedElements = [];
116
- this.onClearSelectedElements.emit();
117
- }
118
- getCurrentState() {
119
- return this.currentState;
120
- }
121
- init() {
122
- this.componentReady = true;
123
- }
124
- async search(filters, searchType = NgtDatatableSearchType.DEFAULT, applyDelayOnSearch = true) {
125
- if (this.canApplyFilters(filters)) {
126
- this.onSearch.emit(filters);
127
- if (searchType == NgtDatatableSearchType.DEFAULT) {
128
- this.currentState.filters.defaultFilters = { ...this.currentState.filters.defaultFilters, ...filters };
129
- }
130
- else {
131
- this.currentState.filters.silentFilters = { ...this.currentState.filters.silentFilters, ...filters };
132
- }
133
- this.applyFiltersDescription();
134
- return this.apply(1, applyDelayOnSearch);
135
- }
136
- }
137
- async sort(field, direction) {
138
- this.currentState.sort = {
139
- field: field,
140
- direction: direction
141
- };
142
- return this.apply(this.ngtPagination.getCurrentPage());
143
- }
144
- async refresh(stayInPage = NgtDatatableParam.RESET_PAGE, loader = NgtDatatableParam.ENABLE_LOADER) {
145
- return this.apply(stayInPage ? this.ngtPagination.getCurrentPage() : 1, false, loader).then(() => !this.data?.length ? this.apply(1, false) : null);
146
- }
147
- getData() {
148
- return this.data;
149
- }
150
- getCurrentSort() {
151
- return this.currentState.sort;
152
- }
153
- setPerPage(perPage) {
154
- this.ngtPagination.onRegistersPerPageChange(perPage);
155
- }
156
- applyFiltersDescription() {
157
- if (!this.cleaningFilter) {
158
- this.filtersTranslated = [];
159
- for (let reference in this.currentState.filters.defaultFilters) {
160
- if (this.filtersDescription[reference] && this.currentState.filters.defaultFilters[reference]) {
161
- this.filtersTranslated.push({
162
- reference: reference,
163
- value: this.currentState.filters.defaultFilters[reference],
164
- translation: this.filtersDescription[reference]
165
- });
166
- }
167
- }
168
- }
169
- }
170
- setFilterDescription(reference, description) {
171
- this.filtersDescription[reference] = description;
172
- }
173
- async removeFilter(reference, refresh = true) {
174
- return new Promise(resolve => {
175
- if (reference && !this.hasAppliedFilter(reference)) {
176
- return resolve();
177
- }
178
- this.cleaningFilter = true;
179
- if (!reference) {
180
- this.currentState.filters.defaultFilters = {};
181
- this.currentState.filters.silentFilters = {};
182
- this.filtersTranslated = [];
183
- }
184
- else {
185
- delete this.currentState.filters.defaultFilters[reference];
186
- delete this.currentState.filters.silentFilters[reference];
187
- this.filtersTranslated = this.filtersTranslated.filter(element => element && element.reference !== reference);
188
- }
189
- this.onClearFilter.emit(reference);
190
- if (this.inputSearch && (reference === 'term' || !reference)) {
191
- this.inputSearch.clearInput();
192
- }
193
- if (refresh) {
194
- return this.apply(this.ngtPagination.getCurrentPage(), false)
195
- .then(() => {
196
- this.cleaningFilter = false;
197
- resolve();
198
- });
199
- }
200
- resolve();
201
- });
202
- }
203
- hasAppliedFilter(filter) {
204
- const reference = typeof filter === 'string' ? filter : Object.keys(filter ?? {})[0];
205
- const appliedFilters = this.currentState.filters.qualifiedFilters;
206
- return !!Object.keys(appliedFilters).find(key => key == reference);
207
- }
208
- hasAppliedFilters(searchType = NgtDatatableSearchType.DEFAULT) {
209
- let appliedFilters = {};
210
- if (searchType == NgtDatatableSearchType.DEFAULT) {
211
- appliedFilters = this.currentState.filters.defaultFilters;
212
- }
213
- else if (searchType == NgtDatatableSearchType.SILENT) {
214
- appliedFilters = this.currentState.filters.silentFilters;
215
- }
216
- else {
217
- appliedFilters = { ...this.currentState.filters.defaultFilters, ...this.currentState.filters.silentFilters };
218
- }
219
- return !!Object.values(appliedFilters)?.find(filter => !!filter);
220
- }
221
- ngOnChanges(changes) {
222
- if (changes.inputSearch) {
223
- if (changes.inputSearch.currentValue) {
224
- this.initSearchWithInput();
225
- }
226
- }
227
- if (changes.type) {
228
- this.type = getEnumFromString(changes.type.currentValue, NgtDatatableType);
229
- }
230
- }
231
- async apply(page = 1, applyDelayOnSearch = true, loader = NgtDatatableParam.ENABLE_LOADER) {
232
- return new Promise(resolve => {
233
- if (!this.componentReady) {
234
- return resolve();
235
- }
236
- else if (this.searchTimeout) {
237
- clearTimeout(this.searchTimeout);
238
- }
239
- this.ngtPagination.displayPagination = false;
240
- this.selectedElements = [];
241
- if (this.type === NgtDatatableType.REMOTE) {
242
- if (this.remoteResource) {
243
- if (loader) {
244
- this.loading = true;
245
- this.bindVisibilityAttributes();
246
- }
247
- if (applyDelayOnSearch) {
248
- this.searchTimeout = setTimeout(() => {
249
- this.loadData(page).then(() => resolve());
250
- }, this.searchDelay);
251
- }
252
- else {
253
- this.loadData(page).then(() => resolve());
254
- }
255
- }
256
- else {
257
- console.error('The property [remoteResource] needs to be present to be able to make remote search');
258
- }
259
- }
260
- else if (this.type == NgtDatatableType.FIXED) {
261
- this.bindVisibilityAttributes();
262
- resolve();
263
- }
264
- });
265
- }
266
- getTagFilterValue(filter) {
267
- const filtersTag = this.getFiltersTagArray(filter);
268
- return filtersTag.length > 1
269
- ? filtersTag[0] + " +"
270
- : filtersTag[0];
271
- }
272
- getTitle(filter) {
273
- const filtersTag = this.getFiltersTagArray(filter);
274
- return filtersTag.length > 1
275
- ? filtersTag.slice(1).join(",")
276
- : '';
277
- }
278
- getFiltersTagArray(filter) {
279
- const tag = filter?.value?.tagValue ? filter.value.tagValue : filter.value;
280
- return tag.split(",");
281
- }
282
- loadData(page) {
283
- return new Promise((resolve, reject) => {
284
- const pagination = { ...this.ngtPagination.getPagination(), ...{ page: page } };
285
- this.currentState.filters.qualifiedFilters = this.getQualifiedFilters();
286
- this.searching = true;
287
- if (this.inputSearch) {
288
- this.inputSearch.isDisabled = true;
289
- }
290
- this.subscriptions.push(this.ngtHttpService.get(this.remoteResource, this.currentState.filters.qualifiedFilters, pagination, this.currentState.sort).subscribe((response) => {
291
- this.proccessRemoteResponse(response.data);
292
- if (response.meta) {
293
- this.ngtPagination.proccessPagination(response.meta);
294
- }
295
- this.searching = false;
296
- this.loading = false;
297
- if (this.inputSearch) {
298
- this.inputSearch.isDisabled = false;
299
- }
300
- this.onDataChange.emit(this.data);
301
- this.bindVisibilityAttributes();
302
- resolve();
303
- }, (error) => {
304
- console.error(error);
305
- this.loading = false;
306
- this.inputSearch.isDisabled = false;
307
- this.changeDetector.detectChanges();
308
- reject();
309
- }));
310
- });
311
- }
312
- getQualifiedFilters() {
313
- const qualifiedFilters = {};
314
- const requestedFilters = { ...this.currentState.filters.defaultFilters, ...this.currentState.filters.silentFilters };
315
- if (requestedFilters) {
316
- for (const reference in requestedFilters) {
317
- if (Object.prototype.hasOwnProperty.call(requestedFilters, reference)) {
318
- const filter = requestedFilters[reference];
319
- if (this.isValidFilter(filter, reference)) {
320
- if (filter instanceof NgtCustomFilter) {
321
- if (filter.tagLabel) {
322
- this.filtersDescription[reference] = filter.tagLabel;
323
- this.applyFiltersDescription();
324
- }
325
- qualifiedFilters[reference] = filter.term;
326
- }
327
- else {
328
- qualifiedFilters[reference] = filter;
329
- }
330
- }
331
- }
332
- }
333
- }
334
- return qualifiedFilters;
335
- }
336
- bindVisibilityAttributes() {
337
- this.changeDetector.detectChanges();
338
- if (this.type == NgtDatatableType.REMOTE && !this.data.length && !this.loading) {
339
- this.emptyStateVisible = true;
340
- }
341
- else if (this.type == NgtDatatableType.FIXED) {
342
- this.emptyStateVisible = false;
343
- }
344
- else {
345
- this.emptyStateVisible = false;
346
- }
347
- this.changeDetector.detectChanges();
348
- }
349
- proccessRemoteResponse(response) {
350
- this.data = response;
351
- }
352
- initSearchWithInput() {
353
- this.subscriptions.push(this.inputSearch.onValueChange().subscribe((value) => {
354
- if (this.currentState.filters.defaultFilters['term']) {
355
- if (!value) {
356
- this.removeFilter('term');
357
- }
358
- else if (value.length < this.searchTermMinLength) {
359
- delete this.currentState.filters.defaultFilters['term'];
360
- this.search({ term: '' });
361
- }
362
- }
363
- if (value.length >= this.searchTermMinLength) {
364
- this.search({ term: value });
365
- }
366
- }));
367
- if (this.searchTermOnEnter) {
368
- this.inputSearch.element.nativeElement.addEventListener('keydown', (event) => {
369
- event.stopImmediatePropagation();
370
- if (event.keyCode == 13) {
371
- if (this.inputSearch.value && this.inputSearch.value.length >= this.searchTermMinLength) {
372
- this.apply(1, false);
373
- }
374
- }
375
- });
376
- }
377
- }
378
- initCheckboxEvent() {
379
- this.subscriptions.push(this.onToogleCheckbox.subscribe((checkedElement) => {
380
- this.selectedElements = this.selectedElements.filter(item => item.id !== checkedElement.id);
381
- if (checkedElement.checked) {
382
- this.selectedElements.push(checkedElement);
383
- }
384
- this.onSelectedElementsChange.emit(this.selectedElements);
385
- }));
386
- this.subscriptions.push(this.onSelectAllRegisters.subscribe(() => {
387
- this.hasSelectedAllElements = !this.hasSelectedAllElements;
388
- if (!this.hasSelectedAllElements) {
389
- this.selectedElements = [];
390
- }
391
- }));
392
- }
393
- canApplyFilters(filters) {
394
- if (!this.searching) {
395
- for (const reference in filters) {
396
- if (this.isValidFilter(filters[reference], reference)) {
397
- return true;
398
- }
399
- }
400
- }
401
- return false;
402
- }
403
- isValidFilter(filter, reference) {
404
- const hasValue = !!((filter instanceof NgtCustomFilter && filter.term) || filter);
405
- const isApplied = this.hasAppliedFilter(reference);
406
- return isApplied || (!isApplied && hasValue);
407
- }
408
- destroySubscriptions() {
409
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
410
- this.subscriptions = [];
411
- }
412
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgtDatatableComponent, deps: [{ token: i0.Injector }, { token: i1.NgtHttpService }, { token: i0.ChangeDetectorRef }, { token: i2.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
413
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NgtDatatableComponent, selector: "ngt-datatable", inputs: { remoteResource: "remoteResource", type: "type", filterTagBgColor: "filterTagBgColor", filterTagMargin: "filterTagMargin", paginationMargin: "paginationMargin", inputSearch: "inputSearch", searchDelay: "searchDelay", searchTermMinLength: "searchTermMinLength", searchTermOnEnter: "searchTermOnEnter", defaultFilters: "defaultFilters", filtersDescription: "filtersDescription", canSelectAllRegisters: "canSelectAllRegisters" }, outputs: { onDataChange: "onDataChange", onClearFilter: "onClearFilter", onClearSelectedElements: "onClearSelectedElements", onSelectedElementsChange: "onSelectedElementsChange", onToogleAllCheckboxes: "onToogleAllCheckboxes", onToogleCheckbox: "onToogleCheckbox", onSelectAllRegisters: "onSelectAllRegisters", onOpenSearchModal: "onOpenSearchModal", onSearch: "onSearch" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }, { propertyName: "ngtPagination", first: true, predicate: ["ngtPagination"], descendants: true, static: true }, { propertyName: "searchModal", first: true, predicate: ["searchModal"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"w-full\">\n <div class=\"flex flex-wrap w-full\">\n <ngt-tag *ngIf=\"hasAppliedFilters()\" class=\"w-full sm:w-auto {{ filterTagMargin }}\"\n [class.sm:mr-4]=\"filterTagMargin == 'mb-4'\" color.bg=\"bg-red-500\" (click)=\"removeFilter()\" ngt-stylizable>\n Limpar Filtros\n </ngt-tag>\n\n <ng-container *ngIf=\"hasAppliedFilters()\">\n <ng-container *ngFor=\"let filter of filtersTranslated\">\n <ngt-tag class=\"w-full sm:w-auto {{ filterTagMargin }}\" [class.sm:mr-4]=\"filterTagMargin == 'mb-4'\"\n [color.bg]=\"filterTagBgColor\" (click)=\"removeFilter(filter.reference)\" ngt-stylizable\n [title]=\"getTitle(filter)\">\n {{ filter.translation + ': ' + getTagFilterValue(filter) }}\n </ngt-tag>\n </ng-container>\n </ng-container>\n </div>\n\n <table style=\"display: table;\" class=\"text-left w-full border-collapse table-responsive\" #table>\n <ng-content></ng-content>\n </table>\n\n <p *ngIf=\"emptyStateVisible\" class=\"mt-8 mx-auto self-center text-center text-xl\">\n {{ ngtTranslateService.ngtDatatableNoDataFound }}\n </p>\n\n <div *ngIf=\"loading\">\n <div *ngFor=\"let i of [1, 2, 3, 4]\" class=\"flex w-full mt-3\">\n <ng-container *ngIf=\"columnCount.length >= 2\">\n <ng-container *ngFor=\"let j of columnCount; let last = last\">\n <ng-container *ngIf=\"last\">\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n </ng-container>\n\n <ng-container *ngIf=\"!last\">\n <ngt-shining class=\"h-10 w-full mr-10\"></ngt-shining>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"columnCount.length < 2\">\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n <ngt-shining class=\"h-10 w-full mr-10 ml-10\"></ngt-shining>\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n </ng-container>\n </div>\n </div>\n</div>\n\n<div class=\"clearfix {{ paginationMargin }}\" [hidden]='!data || data.length == 0'>\n <ngt-pagination [pagesInterval]='4' (onPageChange)='apply($event, false)' (onPerPageChange)='apply(1, false)'\n #ngtPagination>\n </ngt-pagination>\n</div>\n\n<ngt-modal [customLayout]=\"true\" [isDisabled]=\"false\" [ngtStyle]=\"filterModalStyle\" #searchModal>\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\n</ngt-modal>", styles: ["@media (max-width: 767px){.table-responsive{display:block;position:relative;width:100%}.table-responsive thead,.table-responsive tbody,.table-responsive th,.table-responsive td,.table-responsive tr{display:block}.table-responsive td,.table-responsive th{height:50px}.table-responsive thead{float:left;margin-bottom:15px}.table-responsive tbody{width:auto;position:relative;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:nowrap}.table-responsive tbody tr{display:inline-block;min-width:100%}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i5.NgtPaginationComponent, selector: "ngt-pagination", inputs: ["pagesInterval"], outputs: ["onPageChange", "onPerPageChange"] }, { kind: "component", type: i6.NgtModalComponent, selector: "ngt-modal", inputs: ["customLayout", "disableDefaultCloses", "isDisabled", "ngtStyle"], outputs: ["onCloseModal", "onOpenModal"] }, { kind: "component", type: i7.NgtTagComponent, selector: "ngt-tag", inputs: ["icon"] }, { kind: "directive", type: i8.NgtStylizableDirective, selector: "[ngt-stylizable]", inputs: ["color", "color.text", "color.bg", "color.border", "h", "w", "p", "px", "py", "pt", "pr", "pb", "pl", "m", "mx", "my", "mt", "mr", "mb", "ml", "gap", "border", "shadow", "rounded", "font", "text", "breakWords", "overflow", "position", "justifyContent", "cursor", "fontCase"] }] }); }
414
- }
415
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NgtDatatableComponent, decorators: [{
416
- type: Component,
417
- args: [{ selector: 'ngt-datatable', template: "<div class=\"w-full\">\n <div class=\"flex flex-wrap w-full\">\n <ngt-tag *ngIf=\"hasAppliedFilters()\" class=\"w-full sm:w-auto {{ filterTagMargin }}\"\n [class.sm:mr-4]=\"filterTagMargin == 'mb-4'\" color.bg=\"bg-red-500\" (click)=\"removeFilter()\" ngt-stylizable>\n Limpar Filtros\n </ngt-tag>\n\n <ng-container *ngIf=\"hasAppliedFilters()\">\n <ng-container *ngFor=\"let filter of filtersTranslated\">\n <ngt-tag class=\"w-full sm:w-auto {{ filterTagMargin }}\" [class.sm:mr-4]=\"filterTagMargin == 'mb-4'\"\n [color.bg]=\"filterTagBgColor\" (click)=\"removeFilter(filter.reference)\" ngt-stylizable\n [title]=\"getTitle(filter)\">\n {{ filter.translation + ': ' + getTagFilterValue(filter) }}\n </ngt-tag>\n </ng-container>\n </ng-container>\n </div>\n\n <table style=\"display: table;\" class=\"text-left w-full border-collapse table-responsive\" #table>\n <ng-content></ng-content>\n </table>\n\n <p *ngIf=\"emptyStateVisible\" class=\"mt-8 mx-auto self-center text-center text-xl\">\n {{ ngtTranslateService.ngtDatatableNoDataFound }}\n </p>\n\n <div *ngIf=\"loading\">\n <div *ngFor=\"let i of [1, 2, 3, 4]\" class=\"flex w-full mt-3\">\n <ng-container *ngIf=\"columnCount.length >= 2\">\n <ng-container *ngFor=\"let j of columnCount; let last = last\">\n <ng-container *ngIf=\"last\">\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n </ng-container>\n\n <ng-container *ngIf=\"!last\">\n <ngt-shining class=\"h-10 w-full mr-10\"></ngt-shining>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"columnCount.length < 2\">\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n <ngt-shining class=\"h-10 w-full mr-10 ml-10\"></ngt-shining>\n <ngt-shining class=\"h-10 w-full\"></ngt-shining>\n </ng-container>\n </div>\n </div>\n</div>\n\n<div class=\"clearfix {{ paginationMargin }}\" [hidden]='!data || data.length == 0'>\n <ngt-pagination [pagesInterval]='4' (onPageChange)='apply($event, false)' (onPerPageChange)='apply(1, false)'\n #ngtPagination>\n </ngt-pagination>\n</div>\n\n<ngt-modal [customLayout]=\"true\" [isDisabled]=\"false\" [ngtStyle]=\"filterModalStyle\" #searchModal>\n <ng-container *ngTemplateOutlet=\"searchModalTemplate\"></ng-container>\n</ngt-modal>", styles: ["@media (max-width: 767px){.table-responsive{display:block;position:relative;width:100%}.table-responsive thead,.table-responsive tbody,.table-responsive th,.table-responsive td,.table-responsive tr{display:block}.table-responsive td,.table-responsive th{height:50px}.table-responsive thead{float:left;margin-bottom:15px}.table-responsive tbody{width:auto;position:relative;overflow-x:auto;-webkit-overflow-scrolling:touch;white-space:nowrap}.table-responsive tbody tr{display:inline-block;min-width:100%}}\n"] }]
418
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.NgtHttpService }, { type: i0.ChangeDetectorRef }, { type: i2.NgtTranslateService, decorators: [{
419
- type: Optional
420
- }] }], propDecorators: { table: [{
421
- type: ViewChild,
422
- args: ['table', { static: true }]
423
- }], ngtPagination: [{
424
- type: ViewChild,
425
- args: ['ngtPagination', { static: true }]
426
- }], searchModal: [{
427
- type: ViewChild,
428
- args: ['searchModal', { static: true }]
429
- }], remoteResource: [{
430
- type: Input
431
- }], type: [{
432
- type: Input
433
- }], filterTagBgColor: [{
434
- type: Input
435
- }], filterTagMargin: [{
436
- type: Input
437
- }], paginationMargin: [{
438
- type: Input
439
- }], inputSearch: [{
440
- type: Input
441
- }], searchDelay: [{
442
- type: Input
443
- }], searchTermMinLength: [{
444
- type: Input
445
- }], searchTermOnEnter: [{
446
- type: Input
447
- }], defaultFilters: [{
448
- type: Input
449
- }], filtersDescription: [{
450
- type: Input
451
- }], canSelectAllRegisters: [{
452
- type: Input
453
- }], onDataChange: [{
454
- type: Output
455
- }], onClearFilter: [{
456
- type: Output
457
- }], onClearSelectedElements: [{
458
- type: Output
459
- }], onSelectedElementsChange: [{
460
- type: Output
461
- }], onToogleAllCheckboxes: [{
462
- type: Output
463
- }], onToogleCheckbox: [{
464
- type: Output
465
- }], onSelectAllRegisters: [{
466
- type: Output
467
- }], onOpenSearchModal: [{
468
- type: Output
469
- }], onSearch: [{
470
- type: Output
471
- }] } });
472
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWRhdGF0YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10YWlsd2luZC9zcmMvY29tcG9uZW50cy9uZ3QtZGF0YXRhYmxlL25ndC1kYXRhdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWRhdGF0YWJsZS9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxTQUFTLEVBRVQsWUFBWSxFQUVaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUdOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU01RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7OztBQUU1RixNQUFNLENBQU4sSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQ3hCLHFDQUFpQixDQUFBO0lBQ2pCLG1DQUFlLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFHM0I7QUFFRCxNQUFNLENBQU4sSUFBWSxzQkFHWDtBQUhELFdBQVksc0JBQXNCO0lBQzlCLDZDQUFtQixDQUFBO0lBQ25CLDJDQUFpQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxzQkFBc0IsS0FBdEIsc0JBQXNCLFFBR2pDO0FBRUQsTUFBTSxDQUFOLElBQVksaUJBS1g7QUFMRCxXQUFZLGlCQUFpQjtJQUN6Qix5RUFBZ0IsQ0FBQTtJQUNoQixxRUFBYyxDQUFBO0lBQ2QsMkVBQWlCLENBQUE7SUFDakIsNkVBQWtCLENBQUE7QUFDdEIsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUI7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0NB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Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBQ1UscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUVXLFlBQVk7c0JBQTVCLE1BQU07Z0JBQ1UsYUFBYTtzQkFBN0IsTUFBTTtnQkFDVSx1QkFBdUI7c0JBQXZDLE1BQU07Z0JBQ1Usd0JBQXdCO3NCQUF4QyxNQUFNO2dCQUNVLHFCQUFxQjtzQkFBckMsTUFBTTtnQkFDVSxnQkFBZ0I7c0JBQWhDLE1BQU07Z0JBQ1Usb0JBQW9CO3NCQUFwQyxNQUFNO2dCQUNVLGlCQUFpQjtzQkFBakMsTUFBTTtnQkFDVSxRQUFRO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGdldEVudW1Gcm9tU3RyaW5nIH0gZnJvbSAnLi4vLi4vaGVscGVycy9lbnVtL2VudW0nO1xuaW1wb3J0IHsgTmd0SHR0cFBhZ2luYXRpb24sIE5ndEh0dHBSZXNwb25zZSwgTmd0SHR0cFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0VHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LXRyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd0TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtbW9kYWwvbmd0LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ3RQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LXBhZ2luYXRpb24vbmd0LXBhZ2luYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmd0LXN0eWxpemFibGUvbmd0LXN0eWxpemFibGUuc2VydmljZSc7XG5cbmV4cG9ydCBlbnVtIE5ndERhdGF0YWJsZVR5cGUge1xuICAgIFJFTU9URSA9ICdSRU1PVEUnLFxuICAgIEZJWEVEID0gJ0ZJWEVEJ1xufVxuXG5leHBvcnQgZW51bSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlIHtcbiAgICBERUZBVUxUID0gJ0RFRkFVTFQnLFxuICAgIFNJTEVOVCA9ICdTSUxFTlQnLFxufVxuXG5leHBvcnQgZW51bSBOZ3REYXRhdGFibGVQYXJhbSB7XG4gICAgU1RBWV9JTl9QQUdFID0gMSxcbiAgICBSRVNFVF9QQUdFID0gMCxcbiAgICBFTkFCTEVfTE9BREVSID0gMSxcbiAgICBESVNBQkxFX0xPQURFUiA9IDBcbn1cblxuZXhwb3J0IGNsYXNzIE5ndENoZWNrZWRFbGVtZW50IHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgICBwdWJsaWMgY2hlY2tlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVmZXJlbmNlOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBOZ3RDdXN0b21GaWx0ZXIge1xuICAgIHB1YmxpYyB0ZXJtOiBzdHJpbmc7XG4gICAgcHVibGljIHRhZ1ZhbHVlOiBzdHJpbmc7XG4gICAgcHVibGljIHRhZ0xhYmVsPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndC1kYXRhdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtZGF0YXRhYmxlLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3REYXRhdGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQFZpZXdDaGlsZCgndGFibGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgdGFibGU6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnbmd0UGFnaW5hdGlvbicsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBuZ3RQYWdpbmF0aW9uOiBOZ3RQYWdpbmF0aW9uQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaE1vZGFsJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIHNlYXJjaE1vZGFsOiBOZ3RNb2RhbENvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyByZW1vdGVSZXNvdXJjZTogYW55O1xuICAgIEBJbnB1dCgpIHB1YmxpYyB0eXBlOiBOZ3REYXRhdGFibGVUeXBlID0gTmd0RGF0YXRhYmxlVHlwZS5SRU1PVEU7XG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlclRhZ0JnQ29sb3I6IHN0cmluZyA9ICdiZy1ibHVlLTUwMCc7XG4gICAgQElucHV0KCkgcHVibGljIGZpbHRlclRhZ01hcmdpbjogc3RyaW5nID0gJ21iLTQnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwYWdpbmF0aW9uTWFyZ2luOiBzdHJpbmcgPSAnbXQtMiBtZDptdC04JztcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXRTZWFyY2g6IE5ndElucHV0Q29tcG9uZW50O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hEZWxheTogbnVtYmVyID0gNTAwO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hUZXJtTWluTGVuZ3RoOiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWFyY2hUZXJtT25FbnRlcjogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgcHVibGljIGRlZmF1bHRGaWx0ZXJzOiBhbnkgPSB7fTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZmlsdGVyc0Rlc2NyaXB0aW9uID0ge307XG4gICAgQElucHV0KCkgcHVibGljIGNhblNlbGVjdEFsbFJlZ2lzdGVyczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkRhdGFDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGVhckZpbHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNsZWFyU2VsZWN0ZWRFbGVtZW50czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblNlbGVjdGVkRWxlbWVudHNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxBcnJheTxOZ3RDaGVja2VkRWxlbWVudD4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25Ub29nbGVBbGxDaGVja2JveGVzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uVG9vZ2xlQ2hlY2tib3g6IEV2ZW50RW1pdHRlcjxOZ3RDaGVja2VkRWxlbWVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblNlbGVjdEFsbFJlZ2lzdGVyczogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25PcGVuU2VhcmNoTW9kYWw6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25TZWFyY2g6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIHNlYXJjaE1vZGFsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgcHVibGljIGRhdGEgPSBbXTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBjbGVhbmluZ0ZpbHRlciA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb21wb25lbnRSZWFkeSA9IGZhbHNlO1xuICAgIHB1YmxpYyBmaWx0ZXJzVHJhbnNsYXRlZCA9IFtdO1xuICAgIHB1YmxpYyBlbXB0eVN0YXRlVmlzaWJsZTogYm9vbGVhbjtcbiAgICBwdWJsaWMgY29sdW1uQ291bnQgPSBbXTtcbiAgICBwdWJsaWMgaGFzU2VsZWN0ZWRBbGxFbGVtZW50czogYm9vbGVhbjtcbiAgICBwdWJsaWMgc2VsZWN0ZWRFbGVtZW50czogQXJyYXk8Tmd0Q2hlY2tlZEVsZW1lbnQ+ID0gW107XG5cbiAgICBwdWJsaWMgZmlsdGVyTW9kYWxTdHlsZTogTmd0U3R5bGl6YWJsZVNlcnZpY2UgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcblxuICAgIHByaXZhdGUgc2VhcmNoaW5nOiBib29sZWFuO1xuICAgIHByaXZhdGUgc2VhcmNoVGltZW91dDogYW55O1xuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuICAgIHByaXZhdGUgY3VycmVudFN0YXRlID0ge1xuICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICBkZWZhdWx0RmlsdGVyczoge30sXG4gICAgICAgICAgICBzaWxlbnRGaWx0ZXJzOiB7fSxcbiAgICAgICAgICAgIHF1YWxpZmllZEZpbHRlcnM6IHt9LFxuICAgICAgICB9LFxuICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgICBmaWVsZDogJycsXG4gICAgICAgICAgICBkaXJlY3Rpb246ICcnXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBuZ3RIdHRwU2VydmljZTogTmd0SHR0cFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBwdWJsaWMgbmd0VHJhbnNsYXRlU2VydmljZTogTmd0VHJhbnNsYXRlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmZpbHRlck1vZGFsU3R5bGUubG9hZCh0aGlzLmluamVjdG9yLCAnRmlsdGVyTW9kYWwnLCB7XG4gICAgICAgICAgICB3OiAnbWQ6bWF4LXctbWQnLFxuICAgICAgICAgICAgcHk6ICdweS00JyxcbiAgICAgICAgICAgIHB4OiAncHgtNicsXG4gICAgICAgICAgICBib3JkZXI6ICdib3JkZXIgYm9yZGVyLXRlYWwtNTAwJyxcbiAgICAgICAgICAgIG92ZXJmbG93OiAnb3ZlcmZsb3ctdmlzaWJsZScsXG4gICAgICAgICAgICBjb2xvcjoge31cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodGhpcy50YWJsZSAmJiB0aGlzLnRhYmxlLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NcbiAgICAgICAgICAgICYmIHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzWzBdICYmIHRoaXMudGFibGUubmF0aXZlRWxlbWVudC5yb3dzWzBdLmNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbkNvdW50ID0gdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50LnJvd3NbMF0uY2VsbHM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5pbml0U2VhcmNoV2l0aElucHV0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRDaGVja2JveEV2ZW50KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoRGVsYXkgPT0gNTAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaERlbGF5ID0gdGhpcy5pbmplY3Rvci5nZXQoJ05ndERhdGF0YWJsZVNlYXJjaERlbGF5JywgNTAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoID0gdGhpcy5pbmplY3Rvci5nZXQoJ05ndERhdGF0YWJsZVNlYXJjaFRlcm1NaW5MZW5ndGgnLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTZWFyY2hNb2RhbFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoTW9kYWxUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuU2VhcmNoTW9kYWwocmVmZXJlbmNlPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoTW9kYWwub3BlbigpO1xuICAgICAgICB0aGlzLm9uT3BlblNlYXJjaE1vZGFsLmVtaXQocmVmZXJlbmNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJTZWxlY3RlZEVsZW1lbnRzKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5vbkNsZWFyU2VsZWN0ZWRFbGVtZW50cy5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KCkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoKFxuICAgICAgICBmaWx0ZXJzOiBPYmplY3QsXG4gICAgICAgIHNlYXJjaFR5cGU6IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUgPSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlLkRFRkFVTFQsXG4gICAgICAgIGFwcGx5RGVsYXlPblNlYXJjaDogYm9vbGVhbiA9IHRydWVcbiAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQXBwbHlGaWx0ZXJzKGZpbHRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoLmVtaXQoZmlsdGVycyk7XG5cbiAgICAgICAgICAgIGlmIChzZWFyY2hUeXBlID09IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUuREVGQVVMVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnMsIC4uLmZpbHRlcnMgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0geyAuLi50aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnMsIC4uLmZpbHRlcnMgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNEZXNjcmlwdGlvbigpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseSgxLCBhcHBseURlbGF5T25TZWFyY2gpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNvcnQoZmllbGQ6IGFueSwgZGlyZWN0aW9uOiBhbnkpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuc29ydCA9IHtcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkodGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWZyZXNoKHN0YXlJblBhZ2U6IE5ndERhdGF0YWJsZVBhcmFtID0gTmd0RGF0YXRhYmxlUGFyYW0uUkVTRVRfUEFHRSwgbG9hZGVyOiBOZ3REYXRhdGFibGVQYXJhbSA9IE5ndERhdGF0YWJsZVBhcmFtLkVOQUJMRV9MT0FERVIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHkoXG4gICAgICAgICAgICBzdGF5SW5QYWdlID8gdGhpcy5uZ3RQYWdpbmF0aW9uLmdldEN1cnJlbnRQYWdlKCkgOiAxLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBsb2FkZXJcbiAgICAgICAgKS50aGVuKCgpID0+ICF0aGlzLmRhdGE/Lmxlbmd0aCA/IHRoaXMuYXBwbHkoMSwgZmFsc2UpIDogbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1cnJlbnRTb3J0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUuc29ydDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UGVyUGFnZShwZXJQYWdlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLm9uUmVnaXN0ZXJzUGVyUGFnZUNoYW5nZShwZXJQYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHlGaWx0ZXJzRGVzY3JpcHRpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5jbGVhbmluZ0ZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzVHJhbnNsYXRlZCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCByZWZlcmVuY2UgaW4gdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdICYmIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbcmVmZXJlbmNlXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb246IHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpbHRlckRlc2NyaXB0aW9uKHJlZmVyZW5jZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyc0Rlc2NyaXB0aW9uW3JlZmVyZW5jZV0gPSBkZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlRmlsdGVyKHJlZmVyZW5jZT86IHN0cmluZywgcmVmcmVzaDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZmVyZW5jZSAmJiAhdGhpcy5oYXNBcHBsaWVkRmlsdGVyKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNsZWFuaW5nRmlsdGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKCFyZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLmRlZmF1bHRGaWx0ZXJzID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzVHJhbnNsYXRlZCA9IFtdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVyc1tyZWZlcmVuY2VdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnNbcmVmZXJlbmNlXTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc1RyYW5zbGF0ZWQgPSB0aGlzLmZpbHRlcnNUcmFuc2xhdGVkLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQgJiYgZWxlbWVudC5yZWZlcmVuY2UgIT09IHJlZmVyZW5jZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub25DbGVhckZpbHRlci5lbWl0KHJlZmVyZW5jZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VhcmNoICYmIChyZWZlcmVuY2UgPT09ICd0ZXJtJyB8fCAhcmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guY2xlYXJJbnB1dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVmcmVzaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5KHRoaXMubmd0UGFnaW5hdGlvbi5nZXRDdXJyZW50UGFnZSgpLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhbmluZ0ZpbHRlciA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNBcHBsaWVkRmlsdGVyKGZpbHRlcjogT2JqZWN0IHwgTmd0Q3VzdG9tRmlsdGVyIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZTogc3RyaW5nID0gdHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycgPyBmaWx0ZXIgOiBPYmplY3Qua2V5cyhmaWx0ZXIgPz8ge30pWzBdO1xuICAgICAgICBjb25zdCBhcHBsaWVkRmlsdGVycyA9IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMucXVhbGlmaWVkRmlsdGVycztcblxuICAgICAgICByZXR1cm4gISFPYmplY3Qua2V5cyhhcHBsaWVkRmlsdGVycykuZmluZChrZXkgPT4ga2V5ID09IHJlZmVyZW5jZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0FwcGxpZWRGaWx0ZXJzKHNlYXJjaFR5cGU6IE5ndERhdGF0YWJsZVNlYXJjaFR5cGUgPSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlLkRFRkFVTFQpIHtcbiAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0ge307XG5cbiAgICAgICAgaWYgKHNlYXJjaFR5cGUgPT0gTmd0RGF0YXRhYmxlU2VhcmNoVHlwZS5ERUZBVUxUKSB7XG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVycyA9IHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnM7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VhcmNoVHlwZSA9PSBOZ3REYXRhdGFibGVTZWFyY2hUeXBlLlNJTEVOVCkge1xuICAgICAgICAgICAgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnNpbGVudEZpbHRlcnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVycyA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycywgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISFPYmplY3QudmFsdWVzKGFwcGxpZWRGaWx0ZXJzKT8uZmluZChmaWx0ZXIgPT4gISFmaWx0ZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmlucHV0U2VhcmNoKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5pbnB1dFNlYXJjaC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWFyY2hXaXRoSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLnR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IGdldEVudW1Gcm9tU3RyaW5nKGNoYW5nZXMudHlwZS5jdXJyZW50VmFsdWUsIE5ndERhdGF0YWJsZVR5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFwcGx5KHBhZ2UgPSAxLCBhcHBseURlbGF5T25TZWFyY2g6IGJvb2xlYW4gPSB0cnVlLCBsb2FkZXI6IE5ndERhdGF0YWJsZVBhcmFtID0gTmd0RGF0YXRhYmxlUGFyYW0uRU5BQkxFX0xPQURFUikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50UmVhZHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5uZ3RQYWdpbmF0aW9uLmRpc3BsYXlQYWdpbmF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gTmd0RGF0YXRhYmxlVHlwZS5SRU1PVEUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW1vdGVSZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kVmlzaWJpbGl0eUF0dHJpYnV0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHBseURlbGF5T25TZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZERhdGEocGFnZSkudGhlbigoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5zZWFyY2hEZWxheSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWREYXRhKHBhZ2UpLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBwcm9wZXJ0eSBbcmVtb3RlUmVzb3VyY2VdIG5lZWRzIHRvIGJlIHByZXNlbnQgdG8gYmUgYWJsZSB0byBtYWtlIHJlbW90ZSBzZWFyY2gnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PSBOZ3REYXRhdGFibGVUeXBlLkZJWEVEKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVmlzaWJpbGl0eUF0dHJpYnV0ZXMoKTtcblxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRhZ0ZpbHRlclZhbHVlKGZpbHRlcjogYW55KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZmlsdGVyc1RhZyA9IHRoaXMuZ2V0RmlsdGVyc1RhZ0FycmF5KGZpbHRlcik7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcnNUYWcubGVuZ3RoID4gMVxuICAgICAgICAgICAgPyBmaWx0ZXJzVGFnWzBdICsgXCIgK1wiXG4gICAgICAgICAgICA6IGZpbHRlcnNUYWdbMF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRpdGxlKGZpbHRlcjogYW55KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgZmlsdGVyc1RhZyA9IHRoaXMuZ2V0RmlsdGVyc1RhZ0FycmF5KGZpbHRlcik7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcnNUYWcubGVuZ3RoID4gMVxuICAgICAgICAgICAgPyBmaWx0ZXJzVGFnLnNsaWNlKDEpLmpvaW4oXCIsXCIpXG4gICAgICAgICAgICA6ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmlsdGVyc1RhZ0FycmF5KGZpbHRlcjogYW55KTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCB0YWcgPSBmaWx0ZXI/LnZhbHVlPy50YWdWYWx1ZSA/IGZpbHRlci52YWx1ZS50YWdWYWx1ZSA6IGZpbHRlci52YWx1ZTtcblxuICAgICAgICByZXR1cm4gdGFnLnNwbGl0KFwiLFwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWREYXRhKHBhZ2U6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFnaW5hdGlvbjogTmd0SHR0cFBhZ2luYXRpb24gPSB7IC4uLnRoaXMubmd0UGFnaW5hdGlvbi5nZXRQYWdpbmF0aW9uKCksIC4uLnsgcGFnZTogcGFnZSB9IH07XG5cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMucXVhbGlmaWVkRmlsdGVycyA9IHRoaXMuZ2V0UXVhbGlmaWVkRmlsdGVycygpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRTZWFyY2guaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubmd0SHR0cFNlcnZpY2UuZ2V0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW90ZVJlc291cmNlLCB0aGlzLmN1cnJlbnRTdGF0ZS5maWx0ZXJzLnF1YWxpZmllZEZpbHRlcnMsIHBhZ2luYXRpb24sIHRoaXMuY3VycmVudFN0YXRlLnNvcnRcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlOiBOZ3RIdHRwUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Nlc3NSZW1vdGVSZXNwb25zZShyZXNwb25zZS5kYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ndFBhZ2luYXRpb24ucHJvY2Nlc3NQYWdpbmF0aW9uKHJlc3BvbnNlLm1ldGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5pc0Rpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhQ2hhbmdlLmVtaXQodGhpcy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5pc0Rpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFF1YWxpZmllZEZpbHRlcnMoKSB7XG4gICAgICAgIGNvbnN0IHF1YWxpZmllZEZpbHRlcnMgPSB7fTtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkRmlsdGVycyA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5kZWZhdWx0RmlsdGVycywgLi4udGhpcy5jdXJyZW50U3RhdGUuZmlsdGVycy5zaWxlbnRGaWx0ZXJzIH07XG5cbiAgICAgICAgaWYgKHJlcXVlc3RlZEZpbHRlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIGluIHJlcXVlc3RlZEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlcXVlc3RlZEZpbHRlcnMsIHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdGVkRmlsdGVyc1tyZWZlcmVuY2VdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRGaWx0ZXIoZmlsdGVyLCByZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmd0Q3VzdG9tRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci50YWdMYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNEZXNjcmlwdGlvbltyZWZlcmVuY2VdID0gZmlsdGVyLnRhZ0xhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0Rlc2NyaXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkRmlsdGVyc1tyZWZlcmVuY2VdID0gZmlsdGVyLnRlcm07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZEZpbHRlcnNbcmVmZXJlbmNlXSA9IGZpbHRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWFsaWZpZWRGaWx0ZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZFZpc2liaWxpdHlBdHRyaWJ1dGVzKCkge1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICBpZiAodGhpcy50eXBlID09IE5ndERhdGF0YWJsZVR5cGUuUkVNT1RFICYmICF0aGlzLmRhdGEubGVuZ3RoICYmICF0aGlzLmxvYWRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZW1wdHlTdGF0ZVZpc2libGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PSBOZ3REYXRhdGFibGVUeXBlLkZJWEVEKSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5U3RhdGVWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2NjZXNzUmVtb3RlUmVzcG9uc2UocmVzcG9uc2U6IGFueSkge1xuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRTZWFyY2hXaXRoSW5wdXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5vblZhbHVlQ2hhbmdlKCkuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbJ3Rlcm0nXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcigndGVybScpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMuc2VhcmNoVGVybU1pbkxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY3VycmVudFN0YXRlLmZpbHRlcnMuZGVmYXVsdEZpbHRlcnNbJ3Rlcm0nXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goeyB0ZXJtOiAnJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gdGhpcy5zZWFyY2hUZXJtTWluTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKHsgdGVybTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtT25FbnRlcikge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFNlYXJjaC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dFNlYXJjaC52YWx1ZSAmJiB0aGlzLmlucHV0U2VhcmNoLnZhbHVlLmxlbmd0aCA+PSB0aGlzLnNlYXJjaFRlcm1NaW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHkoMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRDaGVja2JveEV2ZW50KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMub25Ub29nbGVDaGVja2JveC5zdWJzY3JpYmUoKGNoZWNrZWRFbGVtZW50OiBOZ3RDaGVja2VkRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBjaGVja2VkRWxlbWVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZEVsZW1lbnQuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMucHVzaChjaGVja2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkRWxlbWVudHNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRWxlbWVudHMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3RBbGxSZWdpc3RlcnMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1NlbGVjdGVkQWxsRWxlbWVudHMgPSAhdGhpcy5oYXNTZWxlY3RlZEFsbEVsZW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1NlbGVjdGVkQWxsRWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbkFwcGx5RmlsdGVycyhmaWx0ZXJzOiBPYmplY3QpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaGluZykge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWZlcmVuY2UgaW4gZmlsdGVycykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRGaWx0ZXIoZmlsdGVyc1tyZWZlcmVuY2VdLCByZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcgfCBOZ3RDdXN0b21GaWx0ZXIsIHJlZmVyZW5jZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGhhc1ZhbHVlOiBib29sZWFuID0gISEoKGZpbHRlciBpbnN0YW5jZW9mIE5ndEN1c3RvbUZpbHRlciAmJiBmaWx0ZXIudGVybSkgfHwgZmlsdGVyKTtcbiAgICAgICAgY29uc3QgaXNBcHBsaWVkOiBib29sZWFuID0gdGhpcy5oYXNBcHBsaWVkRmlsdGVyKHJlZmVyZW5jZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzQXBwbGllZCB8fCAoIWlzQXBwbGllZCAmJiBoYXNWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95U3Vic2NyaXB0aW9ucygpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCB3LWZ1bGxcIj5cbiAgICAgICAgPG5ndC10YWcgKm5nSWY9XCJoYXNBcHBsaWVkRmlsdGVycygpXCIgY2xhc3M9XCJ3LWZ1bGwgc206dy1hdXRvIHt7IGZpbHRlclRhZ01hcmdpbiB9fVwiXG4gICAgICAgICAgICBbY2xhc3Muc206bXItNF09XCJmaWx0ZXJUYWdNYXJnaW4gPT0gJ21iLTQnXCIgY29sb3IuYmc9XCJiZy1yZWQtNTAwXCIgKGNsaWNrKT1cInJlbW92ZUZpbHRlcigpXCIgbmd0LXN0eWxpemFibGU+XG4gICAgICAgICAgICBMaW1wYXIgRmlsdHJvc1xuICAgICAgICA8L25ndC10YWc+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0FwcGxpZWRGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBmaWx0ZXJzVHJhbnNsYXRlZFwiPlxuICAgICAgICAgICAgICAgIDxuZ3QtdGFnIGNsYXNzPVwidy1mdWxsIHNtOnctYXV0byB7eyBmaWx0ZXJUYWdNYXJnaW4gfX1cIiBbY2xhc3Muc206bXItNF09XCJmaWx0ZXJUYWdNYXJnaW4gPT0gJ21iLTQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yLmJnXT1cImZpbHRlclRhZ0JnQ29sb3JcIiAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGZpbHRlci5yZWZlcmVuY2UpXCIgbmd0LXN0eWxpemFibGVcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldFRpdGxlKGZpbHRlcilcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyLnRyYW5zbGF0aW9uICsgJzogJyArIGdldFRhZ0ZpbHRlclZhbHVlKGZpbHRlcikgfX1cbiAgICAgICAgICAgICAgICA8L25ndC10YWc+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8dGFibGUgc3R5bGU9XCJkaXNwbGF5OiB0YWJsZTtcIiBjbGFzcz1cInRleHQtbGVmdCB3LWZ1bGwgYm9yZGVyLWNvbGxhcHNlIHRhYmxlLXJlc3BvbnNpdmVcIiAjdGFibGU+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L3RhYmxlPlxuXG4gICAgPHAgKm5nSWY9XCJlbXB0eVN0YXRlVmlzaWJsZVwiIGNsYXNzPVwibXQtOCBteC1hdXRvIHNlbGYtY2VudGVyIHRleHQtY2VudGVyIHRleHQteGxcIj5cbiAgICAgICAge3sgbmd0VHJhbnNsYXRlU2VydmljZS5uZ3REYXRhdGFibGVOb0RhdGFGb3VuZCB9fVxuICAgIDwvcD5cblxuICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGkgb2YgWzEsIDIsIDMsIDRdXCIgY2xhc3M9XCJmbGV4IHctZnVsbCBtdC0zXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uQ291bnQubGVuZ3RoID49IDJcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBqIG9mIGNvbHVtbkNvdW50OyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3Qtc2hpbmluZyBjbGFzcz1cImgtMTAgdy1mdWxsXCI+PC9uZ3Qtc2hpbmluZz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd0LXNoaW5pbmcgY2xhc3M9XCJoLTEwIHctZnVsbCBtci0xMFwiPjwvbmd0LXNoaW5pbmc+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5Db3VudC5sZW5ndGggPCAyXCI+XG4gICAgICAgICAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwiaC0xMCB3LWZ1bGxcIj48L25ndC1zaGluaW5nPlxuICAgICAgICAgICAgICAgIDxuZ3Qtc2hpbmluZyBjbGFzcz1cImgtMTAgdy1mdWxsIG1yLTEwIG1sLTEwXCI+PC9uZ3Qtc2hpbmluZz5cbiAgICAgICAgICAgICAgICA8bmd0LXNoaW5pbmcgY2xhc3M9XCJoLTEwIHctZnVsbFwiPjwvbmd0LXNoaW5pbmc+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImNsZWFyZml4IHt7IHBhZ2luYXRpb25NYXJnaW4gfX1cIiBbaGlkZGVuXT0nIWRhdGEgfHwgZGF0YS5sZW5ndGggPT0gMCc+XG4gICAgPG5ndC1wYWdpbmF0aW9uIFtwYWdlc0ludGVydmFsXT0nNCcgKG9uUGFnZUNoYW5nZSk9J2FwcGx5KCRldmVudCwgZmFsc2UpJyAob25QZXJQYWdlQ2hhbmdlKT0nYXBwbHkoMSwgZmFsc2UpJ1xuICAgICAgICAjbmd0UGFnaW5hdGlvbj5cbiAgICA8L25ndC1wYWdpbmF0aW9uPlxuPC9kaXY+XG5cbjxuZ3QtbW9kYWwgW2N1c3RvbUxheW91dF09XCJ0cnVlXCIgW2lzRGlzYWJsZWRdPVwiZmFsc2VcIiBbbmd0U3R5bGVdPVwiZmlsdGVyTW9kYWxTdHlsZVwiICNzZWFyY2hNb2RhbD5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VhcmNoTW9kYWxUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuPC9uZ3QtbW9kYWw+Il19