i-tech-shared-components 1.1.6 → 1.1.8

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 (113) hide show
  1. package/.npmignore +2 -0
  2. package/esm2022/i-tech-shared-components.mjs +5 -0
  3. package/esm2022/lib/components/autocomplete-select/autocomplete-select.component.mjs +409 -0
  4. package/esm2022/lib/components/button/button.component.mjs +122 -0
  5. package/esm2022/lib/components/clear-value/clear-value.component.mjs +34 -0
  6. package/esm2022/lib/components/date-picker/date-picker.component.mjs +97 -0
  7. package/esm2022/lib/components/date-range-datepicker/date-range-datepicker.component.mjs +118 -0
  8. package/esm2022/lib/components/icon-button/icon-button.component.mjs +49 -0
  9. package/esm2022/lib/components/text/text-input.component.mjs +73 -0
  10. package/esm2022/lib/directives/date-mask.directive.mjs +92 -0
  11. package/esm2022/lib/directives/input-mask.directive.mjs +92 -0
  12. package/esm2022/lib/interfaces/app-input.interface.mjs +2 -0
  13. package/esm2022/lib/interfaces/autocomplete-configs.interface.mjs +2 -0
  14. package/esm2022/lib/interfaces/button-types.enum.mjs +17 -0
  15. package/esm2022/lib/pipes/array-to-string.pipe.mjs +17 -0
  16. package/esm2022/lib/pipes/generate-error-messages.pipe.mjs +31 -0
  17. package/esm2022/lib/pipes/get-value-by-key-from-object.pipe.mjs +45 -0
  18. package/esm2022/lib/services/input.service.mjs +29 -0
  19. package/esm2022/public-api.mjs +19 -0
  20. package/fesm2022/i-tech-shared-components.mjs +1149 -0
  21. package/fesm2022/i-tech-shared-components.mjs.map +1 -0
  22. package/index.d.ts +5 -0
  23. package/lib/components/autocomplete-select/autocomplete-select.component.d.ts +84 -0
  24. package/lib/components/button/button.component.d.ts +65 -0
  25. package/lib/components/clear-value/clear-value.component.d.ts +9 -0
  26. package/lib/components/date-picker/date-picker.component.d.ts +32 -0
  27. package/lib/components/date-range-datepicker/date-range-datepicker.component.d.ts +36 -0
  28. package/lib/components/icon-button/icon-button.component.d.ts +14 -0
  29. package/lib/components/text/text-input.component.d.ts +21 -0
  30. package/lib/directives/date-mask.directive.d.ts +25 -0
  31. package/lib/directives/input-mask.directive.d.ts +21 -0
  32. package/lib/interfaces/app-input.interface.d.ts +31 -0
  33. package/lib/interfaces/autocomplete-configs.interface.d.ts +37 -0
  34. package/lib/interfaces/button-types.enum.d.ts +15 -0
  35. package/lib/pipes/array-to-string.pipe.d.ts +7 -0
  36. package/lib/pipes/generate-error-messages.pipe.d.ts +10 -0
  37. package/lib/pipes/get-value-by-key-from-object.pipe.d.ts +7 -0
  38. package/lib/services/input.service.d.ts +7 -0
  39. package/package.json +32 -19
  40. package/{src/public-api.ts → public-api.d.ts} +15 -20
  41. package/theme.scss +2 -4
  42. package/docs/README.md +0 -87
  43. package/docs/components/autocomplete-select/autocomplete-select.component/README.md +0 -13
  44. package/docs/components/autocomplete-select/autocomplete-select.component/classes/AutocompleteSelectComponent.md +0 -793
  45. package/docs/components/button/button.component/README.md +0 -13
  46. package/docs/components/button/button.component/classes/ButtonComponent.md +0 -191
  47. package/docs/components/button/button.component.spec/README.md +0 -7
  48. package/docs/components/clear-value/clear-value.component/README.md +0 -13
  49. package/docs/components/clear-value/clear-value.component/classes/ClearValueComponent.md +0 -47
  50. package/docs/components/date-picker/date-picker.component/README.md +0 -13
  51. package/docs/components/date-picker/date-picker.component/classes/DatePickerComponent.md +0 -253
  52. package/docs/components/date-range-datepicker/date-range-datepicker.component/README.md +0 -13
  53. package/docs/components/date-range-datepicker/date-range-datepicker.component/classes/DateRangeDatepickerComponent.md +0 -341
  54. package/docs/components/icon-button/icon-button.component/README.md +0 -13
  55. package/docs/components/icon-button/icon-button.component/classes/IconButtonComponent.md +0 -107
  56. package/docs/components/label/label.component/README.md +0 -13
  57. package/docs/components/label/label.component/classes/LabelComponent.md +0 -97
  58. package/docs/components/menu/menu.component/README.md +0 -13
  59. package/docs/components/menu/menu.component/classes/MenuComponent.md +0 -139
  60. package/docs/components/text/text-input.component/README.md +0 -13
  61. package/docs/components/text/text-input.component/classes/TextInputComponent.md +0 -133
  62. package/docs/interfaces/app-input.interface/README.md +0 -13
  63. package/docs/interfaces/app-input.interface/interfaces/AppInputInterface.md +0 -297
  64. package/docs/interfaces/autocomplete-configs.interface/README.md +0 -13
  65. package/docs/interfaces/autocomplete-configs.interface/interfaces/AutocompleteConfigsInterface.md +0 -357
  66. package/docs/interfaces/button-types.enum/README.md +0 -13
  67. package/docs/interfaces/button-types.enum/enumerations/ButtonType.md +0 -69
  68. package/docs/interfaces/dropdown-selection.constants/README.md +0 -17
  69. package/docs/interfaces/dropdown-selection.constants/enumerations/DropdownSelectionType.md +0 -37
  70. package/docs/interfaces/dropdown-selection.constants/variables/DropdownItemIcon.md +0 -27
  71. package/docs/interfaces/label-type.enum/README.md +0 -13
  72. package/docs/interfaces/label-type.enum/enumerations/LabelTypeEnum.md +0 -127
  73. package/docs/services/input.service/README.md +0 -13
  74. package/docs/services/input.service/classes/InputService.md +0 -31
  75. package/ng-package.json +0 -17
  76. package/src/README.md +0 -0
  77. package/src/lib/components/autocomplete-select/autocomplete-select.component.html +0 -211
  78. package/src/lib/components/autocomplete-select/autocomplete-select.component.scss +0 -58
  79. package/src/lib/components/autocomplete-select/autocomplete-select.component.ts +0 -430
  80. package/src/lib/components/autocomplete-select/loader.svg +0 -6
  81. package/src/lib/components/button/button.component.css +0 -0
  82. package/src/lib/components/button/button.component.html +0 -48
  83. package/src/lib/components/button/button.component.spec.ts +0 -23
  84. package/src/lib/components/button/button.component.ts +0 -106
  85. package/src/lib/components/clear-value/clear-value.component.ts +0 -44
  86. package/src/lib/components/date-picker/date-picker.component.html +0 -61
  87. package/src/lib/components/date-picker/date-picker.component.ts +0 -75
  88. package/src/lib/components/date-range-datepicker/date-range-datepicker.component.html +0 -44
  89. package/src/lib/components/date-range-datepicker/date-range-datepicker.component.ts +0 -105
  90. package/src/lib/components/icon-button/icon-button.component.html +0 -27
  91. package/src/lib/components/icon-button/icon-button.component.scss +0 -0
  92. package/src/lib/components/icon-button/icon-button.component.ts +0 -37
  93. package/src/lib/components/label/label.component.html +0 -15
  94. package/src/lib/components/label/label.component.ts +0 -33
  95. package/src/lib/components/menu/menu.component.html +0 -20
  96. package/src/lib/components/menu/menu.component.scss +0 -9
  97. package/src/lib/components/menu/menu.component.ts +0 -39
  98. package/src/lib/components/text/text-input.component.html +0 -91
  99. package/src/lib/components/text/text-input.component.ts +0 -73
  100. package/src/lib/directives/date-mask.directive.ts +0 -97
  101. package/src/lib/directives/input-mask.directive.ts +0 -93
  102. package/src/lib/interfaces/app-input.interface.ts +0 -32
  103. package/src/lib/interfaces/autocomplete-configs.interface.ts +0 -37
  104. package/src/lib/interfaces/button-types.enum.ts +0 -19
  105. package/src/lib/interfaces/dropdown-selection.constants.ts +0 -11
  106. package/src/lib/interfaces/label-type.enum.ts +0 -14
  107. package/src/lib/pipes/array-to-string.pipe.ts +0 -13
  108. package/src/lib/pipes/generate-error-messages.pipe.ts +0 -31
  109. package/src/lib/pipes/get-value-by-key-from-object.pipe.ts +0 -46
  110. package/src/lib/services/input.service.ts +0 -30
  111. package/tsconfig.lib.json +0 -15
  112. package/tsconfig.lib.prod.json +0 -11
  113. package/tsconfig.spec.json +0 -15
package/.npmignore ADDED
@@ -0,0 +1,2 @@
1
+ # Nested package.json's are only needed for development.
2
+ **/package.json
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaS10ZWNoLXNoYXJlZC1jb21wb25lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvc2hhcmVkLWNvbXBvbmVudHMvc3JjL2ktdGVjaC1zaGFyZWQtY29tcG9uZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,409 @@
1
+ import { Component, ViewChild, Input, Output, EventEmitter, HostListener } from '@angular/core';
2
+ import { MatSelectModule } from "@angular/material/select";
3
+ import { ReactiveFormsModule } from "@angular/forms";
4
+ import { ButtonType } from '../../interfaces/button-types.enum';
5
+ import { NgClass, NgFor, NgIf, NgOptimizedImage } from "@angular/common";
6
+ import { MatTooltip } from "@angular/material/tooltip";
7
+ import { TranslateModule } from "@ngx-translate/core";
8
+ import { IconButtonComponent } from "../icon-button/icon-button.component";
9
+ import { ButtonComponent } from "../button/button.component";
10
+ import { GetValueByKeyFromObjectPipe } from "../../pipes/get-value-by-key-from-object.pipe";
11
+ import { ArrayToStringPipe } from "../../pipes/array-to-string.pipe";
12
+ import { MatIcon } from "@angular/material/icon";
13
+ import { GenerateErrorMessagesPipe } from "../../pipes/generate-error-messages.pipe";
14
+ import { ClearValueComponent } from "../clear-value/clear-value.component";
15
+ import { MatFormFieldModule } from "@angular/material/form-field";
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "../../services/input.service";
18
+ import * as i2 from "@ngx-translate/core";
19
+ import * as i3 from "@angular/forms";
20
+ import * as i4 from "@angular/material/form-field";
21
+ import * as i5 from "@angular/material/select";
22
+ import * as i6 from "@angular/material/core";
23
+ export class AutocompleteSelectComponent {
24
+ /**
25
+ * For working configs.
26
+ */
27
+ set configs(data) {
28
+ this.selectConfig = data;
29
+ if (!data) {
30
+ return;
31
+ }
32
+ if ((typeof this.selectConfig.paginate) === 'function') {
33
+ if (this.firstRequest) {
34
+ return;
35
+ }
36
+ this.getData();
37
+ this.firstRequest = true;
38
+ return;
39
+ }
40
+ this.data = this.selectConfig.paginate;
41
+ this.findAndSetDefaultValueFromData();
42
+ }
43
+ ;
44
+ handleVisibilityChange() {
45
+ this.tabVisibility = !document.hidden;
46
+ if (this.ngControl.control.value) {
47
+ return;
48
+ }
49
+ this.closePanelAndUnsetFocus();
50
+ if (!document.hidden) {
51
+ this.isNeededForRecall = true;
52
+ this.pending = true;
53
+ setTimeout(() => {
54
+ this.pending = false;
55
+ }, 4000);
56
+ }
57
+ }
58
+ constructor(inputService) {
59
+ this.inputService = inputService;
60
+ this.selectionChange = new EventEmitter();
61
+ this.emitAction = new EventEmitter();
62
+ this.pending = false;
63
+ this.data = [];
64
+ this.paginationData = { current: 1, last: 0 };
65
+ this.firstRequest = false;
66
+ this.showPlaceholder = true;
67
+ this.isNeededForRecall = false;
68
+ this.accessToNextRequest = true;
69
+ this.disabled = false;
70
+ this.blockRecallDefaultValueSetter = false;
71
+ this.requestLoading = false;
72
+ this.ButtonType = ButtonType;
73
+ this.customErrorStateMatcher = {
74
+ isErrorState: (control, form) => {
75
+ return !!(control && control.invalid && this.submitValue);
76
+ }
77
+ };
78
+ this.ngControl = this.inputService.injectNgControl();
79
+ }
80
+ ngOnChanges(changes) {
81
+ if (changes['selectConfig'] && this.selectConfig) {
82
+ if ((typeof this.selectConfig.paginate) === 'function') {
83
+ this.getData();
84
+ }
85
+ }
86
+ }
87
+ ngAfterViewInit() {
88
+ this.ngControl.control.valueChanges.subscribe((res) => {
89
+ if (this.data.length && res && !this.blockRecallDefaultValueSetter) {
90
+ this.findAndSetDefaultValueFromData();
91
+ }
92
+ });
93
+ }
94
+ hardReload() {
95
+ this.getData('', true);
96
+ }
97
+ /**
98
+ * Dynamic request for select data.
99
+ * @param searchText - The input value to search options by.
100
+ * @param fromSearch - Access for search .
101
+ * @returns Select data.
102
+ */
103
+ getData(searchText, fromSearch) {
104
+ if (!fromSearch && !this.accessToNextRequest) {
105
+ return;
106
+ }
107
+ if (this.requestLoading) {
108
+ return;
109
+ }
110
+ if (fromSearch) {
111
+ this.paginationData.current = 1;
112
+ this.accessToNextRequest = true;
113
+ }
114
+ const functionToDo = this.selectConfig.paginate(this.paginationData.current, searchText);
115
+ this.requestLoading = true;
116
+ functionToDo?.subscribe((data) => {
117
+ const dataToAdd = ('content' in data) ? data.content : data;
118
+ if ('content' in data) {
119
+ this.accessToNextRequest = !data.last || (data.totalPages > this.paginationData.current);
120
+ }
121
+ this.data = (fromSearch || this.selectConfig?.blockPagination) ? dataToAdd : [...this.data, ...dataToAdd];
122
+ this.pending = false;
123
+ this.requestLoading = false;
124
+ if (!dataToAdd.length) {
125
+ this.paginationData.last = this.paginationData.current;
126
+ return;
127
+ }
128
+ this.paginationData.current += 1;
129
+ this.paginationData.last += 1;
130
+ setTimeout(() => {
131
+ this.findAndSetDefaultValueFromData();
132
+ }, 10);
133
+ }, () => {
134
+ this.pending = false;
135
+ this.requestLoading = false;
136
+ });
137
+ }
138
+ findAndSetDefaultValueFromData() {
139
+ if (this.selectConfig.multiple) {
140
+ if (this.ngControl.value && this.ngControl.value.length == 1) {
141
+ this.setShowingValue(this.data.find((item) => item.id === this.ngControl.value[0]));
142
+ }
143
+ }
144
+ else {
145
+ const isDisabled = this.ngControl.disabled;
146
+ if (isDisabled) {
147
+ // TODO Remove after migrating all selects
148
+ // this.ngControl.control.enable();
149
+ // if (!this.ngControl.value && !this.data.length) {
150
+ // this.ngControl.control.disable();
151
+ // return;
152
+ // }
153
+ // this.setDefaultValue();
154
+ // this.ngControl.control.disable();
155
+ }
156
+ else {
157
+ if (!this.ngControl.value && !this.data) {
158
+ return;
159
+ }
160
+ this.setDefaultValue();
161
+ }
162
+ }
163
+ }
164
+ setDefaultValue() {
165
+ this.defaultValue = this.data.find((item) => item.id === this.ngControl.value);
166
+ this.baseData = this.defaultValue;
167
+ if (!this.defaultValue) {
168
+ return;
169
+ }
170
+ this.selectionChange.emit();
171
+ this.setShowingValue(this.defaultValue);
172
+ }
173
+ optionClick(showingData) {
174
+ this.baseData = showingData;
175
+ if (!this.selectConfig.multiple) {
176
+ this.setShowingValue(showingData);
177
+ this.matSelect.close();
178
+ return;
179
+ }
180
+ if (this.searchInput) {
181
+ if (this.selectConfig.multiple) {
182
+ this.searchInput?.nativeElement?.focus();
183
+ }
184
+ else {
185
+ this.inputFocusOut();
186
+ }
187
+ }
188
+ this.setShowingValue(showingData);
189
+ this.showPlaceholder = false;
190
+ }
191
+ addNewItemEvent() {
192
+ this.isNeededForRecall = true;
193
+ this.emitAction.emit();
194
+ }
195
+ /**
196
+ * Filter and show.
197
+ * @param data - Existing chosen data.
198
+ */
199
+ setShowingValue(data) {
200
+ if (!data) {
201
+ return;
202
+ }
203
+ // TODO refactor this part fully
204
+ let include = data;
205
+ let includeOptional = data;
206
+ if (this.selectConfig.valueToShowByKey) {
207
+ this.selectConfig.valueToShowByKey.forEach((param) => {
208
+ if (typeof param === 'object') {
209
+ param.forEach((key) => {
210
+ include = (include) ? include[key] : null;
211
+ });
212
+ }
213
+ else {
214
+ include = include[param];
215
+ }
216
+ });
217
+ if (this.selectConfig.showFullTextWithOptionalOnSelectedValue) {
218
+ this.selectConfig.valueToShowByParam?.forEach((param) => {
219
+ if (typeof param === 'object') {
220
+ param.forEach((key) => {
221
+ includeOptional = (includeOptional) ? includeOptional[key] : null;
222
+ });
223
+ }
224
+ else {
225
+ includeOptional = includeOptional[param];
226
+ }
227
+ });
228
+ if (this.selectConfig.valueToShowByParam && typeof includeOptional === 'string') {
229
+ include += (this.selectConfig.withParamSymbol || '') + includeOptional;
230
+ }
231
+ }
232
+ }
233
+ this.showingValue = include;
234
+ this.blockRecallDefaultValueSetter = true;
235
+ }
236
+ /**
237
+ * Block another events.
238
+ * @param event - Element click event.
239
+ */
240
+ preventDefault(event) {
241
+ if (!this.selectConfig.multiple) {
242
+ return;
243
+ }
244
+ event.preventDefault();
245
+ }
246
+ registerPanelScrollEvent(element) {
247
+ if (this.selectConfig.paginateOnScroll === false) {
248
+ return;
249
+ }
250
+ const panel = element.panel.nativeElement;
251
+ panel.addEventListener('scroll', (event) => this.loadDataOnScroll(event));
252
+ }
253
+ loadDataOnScroll(event) {
254
+ const pos = (event.target.scrollTop || event.target.scrollTop) + event.target.offsetHeight;
255
+ const max = event.target.scrollHeight;
256
+ if ((pos + 1) >= max) {
257
+ if (this.paginationData.current === this.paginationData.last || this.selectConfig.blockPagination) {
258
+ return;
259
+ }
260
+ this.getData();
261
+ }
262
+ }
263
+ focusSearchInput() {
264
+ if (this.selectConfig.search && this.searchInput) {
265
+ this.searchInput.nativeElement.focus();
266
+ }
267
+ }
268
+ inputFocusOut() {
269
+ this.isNeededForRecall = !!this.searchInput.nativeElement.value;
270
+ this.searchInput.nativeElement.value = '';
271
+ this.showPlaceholder = true;
272
+ this.clearTimeoutForSearch();
273
+ }
274
+ resetValue() {
275
+ this.selectionChange.emit(null);
276
+ this.ngControl.reset(null);
277
+ this.inputFocusOut();
278
+ }
279
+ getDataWithSearch(value, event) {
280
+ this.clearTimeoutForSearch();
281
+ if (value.length >= 1) {
282
+ this.searchTimeoutId = setTimeout(() => {
283
+ this.getData(value, true);
284
+ }, 800);
285
+ }
286
+ else if (value.length <= 1 && event.keyCode === 8) {
287
+ this.getData(value, true);
288
+ }
289
+ }
290
+ clearTimeoutForSearch() {
291
+ if (this.searchTimeoutId) {
292
+ clearTimeout(this.searchTimeoutId);
293
+ this.searchTimeoutId = 0;
294
+ }
295
+ }
296
+ openSelection() {
297
+ if (this.selectConfig.disabled || this.ngControl.control.disabled) {
298
+ return;
299
+ }
300
+ this.showPlaceholder ? this.matSelect.open() : this.closePanelAndUnsetFocus();
301
+ this.showPlaceholder = !this.showPlaceholder;
302
+ if (!this.showPlaceholder) {
303
+ this.reCallData();
304
+ }
305
+ }
306
+ closePanelAndUnsetFocus() {
307
+ this.matSelect.close();
308
+ if (this.searchInput) {
309
+ this.searchInput.nativeElement.blur();
310
+ }
311
+ }
312
+ openedChange(event) {
313
+ if (event) {
314
+ if (this.isNeededForRecall) {
315
+ this.reCallData();
316
+ return;
317
+ }
318
+ if (!this.selectConfig.search) {
319
+ this.pending = false;
320
+ this.reCallData();
321
+ }
322
+ return;
323
+ }
324
+ this.showPlaceholder = true;
325
+ }
326
+ reCallData() {
327
+ // TODO refactor this part
328
+ if (!this.isNeededForRecall) {
329
+ return;
330
+ }
331
+ this.data = [];
332
+ this.pending = true;
333
+ this.paginationData = {
334
+ current: 1,
335
+ last: 0
336
+ };
337
+ this.accessToNextRequest = true;
338
+ if ((typeof this.selectConfig.paginate) === 'function') {
339
+ this.getData();
340
+ }
341
+ else {
342
+ this.pending = false;
343
+ this.data = this.selectConfig.paginate;
344
+ }
345
+ this.isNeededForRecall = false;
346
+ }
347
+ emitSelectionChangeAndClose(event) {
348
+ this.selectionChange.emit(event.value);
349
+ if (this.selectConfig.multiple) {
350
+ if (!event.value?.length) {
351
+ this.ngControl.control.reset();
352
+ }
353
+ return;
354
+ }
355
+ this.matSelect.close();
356
+ }
357
+ iconClick(matSelect, searchInput) {
358
+ matSelect.open();
359
+ searchInput?.nativeElement?.focus();
360
+ }
361
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutocompleteSelectComponent, deps: [{ token: i1.InputService }], target: i0.ɵɵFactoryTarget.Component }); }
362
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AutocompleteSelectComponent, isStandalone: true, selector: "i-tech-autocomplete-select", inputs: { className: "className", submitValue: "submitValue", configs: "configs", detectChanges: "detectChanges" }, outputs: { selectionChange: "selectionChange", emitAction: "emitAction" }, host: { listeners: { "document:visibilitychange": "handleVisibilityChange()" } }, viewQueries: [{ propertyName: "matSelect", first: true, predicate: ["matSelect"], descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "allSelected", first: true, predicate: ["allSelected"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"new-mat-autocomplete\" id=\"mat_autocomplete\"\r\n [ngClass]=\"{\r\n 'mat-select-without_icon': !selectConfig.iconUrl && !selectConfig.activeStateIconUrl,\r\n 'mat-select-with-search': selectConfig.search,\r\n 'without-label': selectConfig.hideLabel,\r\n 'invalid_field': ngControl.control.errors && submitValue,\r\n 'readonly-field': selectConfig.readOnly || ngControl.control.disabled\r\n }\"\r\n [matTooltip]=\"(selectConfig.hover && !ngControl.control.disabled ? ((selectConfig.hover || '') | translate) : '')\"\r\n [matTooltipClass]=\"'mat-mdc-tooltip big-td-mat-tooltip'\"\r\n [matTooltipPosition]=\"'above'\"\r\n *ngIf=\"selectConfig && ngControl\">\r\n\r\n <div class=\"w-100\" *ngIf=\"!selectConfig.hideLabel\">\r\n <mat-label [ngClass]=\"{\r\n 'readonly-color' : selectConfig.readOnly || ngControl.control.disabled,\r\n 'invalid-label-color': !!(ngControl.control.errors && submitValue)\r\n }\">\r\n {{ selectConfig.label | translate }}\r\n </mat-label>\r\n <span *ngIf=\"selectConfig.required\" class=\"required-input\"\r\n [ngClass]=\"{'readonly-color' : ngControl.control.disabled}\">*</span>\r\n </div>\r\n\r\n\r\n <!-- Search Input -->\r\n <div class=\"search-input w-100\"\r\n (click)=\"$event.stopPropagation();$event.preventDefault()\"\r\n [ngClass]=\"{ hide_input_placeholder: showPlaceholder || ngControl.control.disabled }\"\r\n *ngIf=\"selectConfig.search\"\r\n >\r\n <input autocomplete=\"off\"\r\n id=\"searchInput\"\r\n type=\"text\"\r\n [ngClass]=\"{'pr-25': !selectConfig.iconUrl}\"\r\n #searchInput\r\n [disabled]=\"ngControl.control.disabled || selectConfig.hover\"\r\n [placeholder]=\"(ngControl.control.disabled || selectConfig.hover) ? '' : 'Search'\"\r\n (focusout)=\"inputFocusOut()\"\r\n (focus)=\"openSelection()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (keyup)=\"getDataWithSearch(searchInput.value,$event)\">\r\n\r\n <!-- Search Icon -->\r\n <span class=\"search-icon\">\r\n <i-tech-icon-button\r\n class=\"mr-10\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n *ngIf=\"selectConfig.iconPrefix && !showPlaceholder\"\r\n [iconName]=\"selectConfig.iconPrefix || ''\"\r\n [disabled]=\"selectConfig.readOnly || false\"\r\n matPrefix\r\n >\r\n </i-tech-icon-button>\r\n </span>\r\n </div>\r\n\r\n <!-- Placeholder/Selected Value Display -->\r\n <ng-container *ngIf=\"showPlaceholder && selectConfig.search\">\r\n <div class=\"custom-placeholder\"\r\n *ngIf=\"(!ngControl?.value && !ngControl?.value?.length) ||\r\n (selectConfig.multiple && ngControl?.value && !ngControl?.value?.length)\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n >\r\n {{ ((selectConfig.placeholder || '') | translate) }}\r\n </div>\r\n <div class=\"custom-placeholder custom-value ellipsis\"\r\n [ngClass]=\"{\r\n 'pr-42': selectConfig.iconUrl,\r\n 'readonly-color': selectConfig.readOnly || ngControl.control.disabled,\r\n 'default-form-icon-color': !(selectConfig.readOnly || ngControl.control.disabled)\r\n }\"\r\n *ngIf=\"ngControl?.value\"\r\n >\r\n {{ selectConfig?.multiple ? (ngControl.value | arrayToString) : showingValue }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Custom Icon -->\r\n <img class=\"left_icon_new pointer\"\r\n (click)=\"iconClick(matSelect, searchInput)\"\r\n *ngIf=\"!selectConfig.matIconName && (selectConfig.iconUrl || selectConfig.activeStateIconUrl)\"\r\n [src]=\"'assets/images/icons/global/' + (ngControl.control?.value && selectConfig?.activeStateIconUrl ? selectConfig.activeStateIconUrl : selectConfig.iconUrl)\">\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\" (click)=\"selectConfig?.search ? focusSearchInput() : null\">\r\n <!-- Material Select -->\r\n <mat-select #matSelect=\"matSelect\"\r\n [panelClass]=\"'autocomplete-transform-panel-location'\"\r\n [attr.aria-placeholder]=\"(selectConfig.placeholder || '') | translate\"\r\n [aria-label]=\"selectConfig.label | translate\"\r\n [id]=\"selectConfig.filtrationKey || ''\"\r\n (opened)=\"registerPanelScrollEvent(matSelect)\"\r\n (openedChange)=\"openedChange($event)\"\r\n [formControl]=\"ngControl.control\"\r\n [multiple]=\"selectConfig.multiple\"\r\n (selectionChange)=\"emitSelectionChangeAndClose($event)\"\r\n [errorStateMatcher]=\"customErrorStateMatcher\"\r\n [placeholder]=\"(selectConfig.placeholder || '') | translate\"\r\n [disabled]=\"ngControl.control.disabled\"\r\n >\r\n\r\n <!-- Loading State -->\r\n <mat-option *ngIf=\"pending\" class=\"option_loading relative\">\r\n <div class=\"request_loading\">\r\n <img ngSrc=\"./loader.svg\" alt=\"\" height=\"200\" width=\"200\"/>\r\n </div>\r\n </mat-option>\r\n\r\n <!-- Options -->\r\n <ng-container *ngIf=\"data?.length && !pending\">\r\n <!-- Add New Option -->\r\n <mat-option *ngIf=\"selectConfig.actions\"\r\n class=\"pointer add_new\"\r\n disabled\r\n (click)=\"closePanelAndUnsetFocus();addNewItemEvent()\">\r\n <!-- (click)=\"ngControl.control.reset(null);matSelect._onBlur();closePanelAndUnsetFocus();addNewItemEvent()\">-->\r\n <i-tech-button\r\n [type]=\"ButtonType.OUTLINE\"\r\n [fontIcon]=\"'add'\"\r\n [text]=\"('dropdown_add_item' | translate : {INPUT_NAME: (selectConfig.label | translate)}) \"\r\n [customClass]=\"'w-100 mat-autocomplete-select-button'\">\r\n </i-tech-button>\r\n </mat-option>\r\n\r\n <!-- Regular Options -->\r\n <ng-container *ngIf=\"!selectConfig?.changeText && data.length\">\r\n <mat-option *ngFor=\"let item of data\"\r\n [value]=\"selectConfig.valueByKey | getValueByKeyFromObject : item\"\r\n (mouseup)=\"optionClick(item)\"\r\n (mousedown)=\"preventDefault($event)\">\r\n {{ ((selectConfig.valueToShowByKey | getValueByKeyFromObject : item : selectConfig.valueToShowByParam : selectConfig.withParamSymbol) || '') | translate }}\r\n </mat-option>\r\n </ng-container>\r\n\r\n <!-- Custom Text Options -->\r\n <ng-container *ngIf=\"selectConfig?.changeText && data.length\">\r\n <mat-option *ngFor=\"let item of data\"\r\n [value]=\"selectConfig.valueByKey | getValueByKeyFromObject : item\"\r\n (mouseup)=\"optionClick(item)\"\r\n (mousedown)=\"preventDefault($event)\"\r\n [disabled]=\"selectConfig?.changeText[item].disabled\">\r\n {{ selectConfig?.changeText[item].text | translate }}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Empty State -->\r\n <ng-container *ngIf=\"!pending && !data.length\">\r\n <mat-option disabled class=\"empty_selection_state\">\r\n <div class=\"actions_and_tile add_new flex_column w-100 flex_center_align_center\">\r\n <span>{{ 'dropdown_no_items' | translate }}</span>\r\n <div class=\"mt-10\">\r\n <i-tech-button\r\n *ngIf=\"selectConfig?.actions\"\r\n [type]=\"ButtonType.OUTLINE\"\r\n (buttonClick)=\"closePanelAndUnsetFocus();addNewItemEvent()\"\r\n [customClass]=\"'mat-autocomplete-select-button'\"\r\n [fontIcon]=\"'add'\"\r\n [text]=\"('dropdown_add_item' | translate : {INPUT_NAME: (selectConfig.label | translate)}) \">\r\n </i-tech-button>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-icon *ngIf=\"selectConfig.iconPrefix\"\r\n matPrefix\r\n [ngClass]=\"{\r\n 'readonly-color' : !selectConfig['iconPrefixColor'] && (selectConfig.readOnly || ngControl.control.disabled),\r\n 'default-form-icon-color' : !selectConfig['iconPrefixColor'] && !(selectConfig.readOnly || ngControl.control.disabled)\r\n }\"\r\n [matTooltip]=\"((selectConfig?.['iconPrefixTooltip'] || '') | translate)\"\r\n >{{ selectConfig.iconPrefix }}\r\n </mat-icon>\r\n\r\n <mat-icon *ngIf=\"selectConfig['iconPrefixSvg']\"\r\n matPrefix\r\n [matTooltip]=\"((selectConfig?.['iconPrefixTooltip'] || '') | translate)\"\r\n [svgIcon]=\"selectConfig['iconPrefixSvg'] || ''\"\r\n ></mat-icon>\r\n\r\n <i-tech-icon-button\r\n *ngIf=\"selectConfig.search && selectConfig.clearable && !ngControl.control.disabled && !!ngControl.control.value\"\r\n iconName=\"cancel\"\r\n matSuffix\r\n [disabled]=\"selectConfig.readOnly || false\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n (click)=\"$event.stopPropagation();$event.preventDefault();ngControl.control.reset(null);matSelect._onBlur();closePanelAndUnsetFocus()\"\r\n >\r\n </i-tech-icon-button>\r\n <mat-icon\r\n matSuffix\r\n class=\"select-arrow\"\r\n [class.open]=\"matSelect.panelOpen\"\r\n [ngClass]=\"{\r\n 'readonly-color': selectConfig.readOnly || ngControl.control.disabled,\r\n 'default-form-icon-color': !(selectConfig.readOnly || ngControl.control.disabled),\r\n 'mt-8': !!ngControl.control.value && selectConfig.clearable\r\n }\"\r\n >\r\n keyboard_arrow_down\r\n </mat-icon>\r\n <!-- Error Message -->\r\n <mat-error *ngIf=\"!!(ngControl.control.errors && submitValue)\">\r\n {{ ngControl.control | generateErrorMessages : selectConfig.label : selectConfig.defaultPatternKey }}\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <!-- Reset Button -->\r\n <i-tech-clear-value *ngIf=\"selectConfig.reset\" (reset)=\"resetValue()\"></i-tech-clear-value>\r\n</div>\r\n", styles: [".left_icon_new{position:absolute;right:2px;top:1px}::ng-deep .request_loading{width:40px;height:40px;background-color:#fff!important}::ng-deep .request_loading:hover{background-color:var(--primary99)!important}::ng-deep .request_loading:focus{background-color:var(--primary99)!important}::ng-deep .request_loading img{position:absolute;left:50%;top:50%;width:100%;height:100%;transform:translate(-50%,-50%)}::ng-deep .mat-mdc-option.add_new{opacity:1!important;pointer-events:auto!important}::ng-deep .mat-mdc-option.add_new .mat-pseudo-checkbox{display:none!important}::ng-deep .mat-mdc-option.add_new .mdc-list-item__primary-text{display:inline-block!important;width:100%!important}::ng-deep .mat-mdc-option.add_new span{color:unset!important;font-size:unset!important;margin:unset!important;opacity:1!important}@media (min-width: 1920px) and (max-width: 2500px){.mat-autocomplete{height:90px!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: IconButtonComponent, selector: "i-tech-icon-button", inputs: ["size", "type", "iconSvg", "iconName", "tooltip", "disabled"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: ButtonComponent, selector: "i-tech-button", inputs: ["text", "data_cy", "fontIcon", "svgIcon", "type", "customClass", "submit", "disabled", "activated", "color"], outputs: ["buttonClick"] }, { kind: "pipe", type: GetValueByKeyFromObjectPipe, name: "getValueByKeyFromObject" }, { kind: "pipe", type: ArrayToStringPipe, name: "arrayToString" }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: GenerateErrorMessagesPipe, name: "generateErrorMessages" }, { kind: "component", type: ClearValueComponent, selector: "i-tech-clear-value", inputs: ["className", "additionalClass"], outputs: ["reset"] }, { kind: "ngmodule", type: MatFormFieldModule }] }); }
363
+ }
364
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutocompleteSelectComponent, decorators: [{
365
+ type: Component,
366
+ args: [{ selector: 'i-tech-autocomplete-select', imports: [
367
+ NgClass,
368
+ MatTooltip,
369
+ NgIf,
370
+ NgFor,
371
+ TranslateModule,
372
+ IconButtonComponent,
373
+ ReactiveFormsModule,
374
+ MatSelectModule,
375
+ ButtonComponent,
376
+ GetValueByKeyFromObjectPipe,
377
+ ArrayToStringPipe,
378
+ NgOptimizedImage,
379
+ MatIcon,
380
+ GenerateErrorMessagesPipe,
381
+ ClearValueComponent,
382
+ MatFormFieldModule
383
+ ], standalone: true, template: "<div class=\"new-mat-autocomplete\" id=\"mat_autocomplete\"\r\n [ngClass]=\"{\r\n 'mat-select-without_icon': !selectConfig.iconUrl && !selectConfig.activeStateIconUrl,\r\n 'mat-select-with-search': selectConfig.search,\r\n 'without-label': selectConfig.hideLabel,\r\n 'invalid_field': ngControl.control.errors && submitValue,\r\n 'readonly-field': selectConfig.readOnly || ngControl.control.disabled\r\n }\"\r\n [matTooltip]=\"(selectConfig.hover && !ngControl.control.disabled ? ((selectConfig.hover || '') | translate) : '')\"\r\n [matTooltipClass]=\"'mat-mdc-tooltip big-td-mat-tooltip'\"\r\n [matTooltipPosition]=\"'above'\"\r\n *ngIf=\"selectConfig && ngControl\">\r\n\r\n <div class=\"w-100\" *ngIf=\"!selectConfig.hideLabel\">\r\n <mat-label [ngClass]=\"{\r\n 'readonly-color' : selectConfig.readOnly || ngControl.control.disabled,\r\n 'invalid-label-color': !!(ngControl.control.errors && submitValue)\r\n }\">\r\n {{ selectConfig.label | translate }}\r\n </mat-label>\r\n <span *ngIf=\"selectConfig.required\" class=\"required-input\"\r\n [ngClass]=\"{'readonly-color' : ngControl.control.disabled}\">*</span>\r\n </div>\r\n\r\n\r\n <!-- Search Input -->\r\n <div class=\"search-input w-100\"\r\n (click)=\"$event.stopPropagation();$event.preventDefault()\"\r\n [ngClass]=\"{ hide_input_placeholder: showPlaceholder || ngControl.control.disabled }\"\r\n *ngIf=\"selectConfig.search\"\r\n >\r\n <input autocomplete=\"off\"\r\n id=\"searchInput\"\r\n type=\"text\"\r\n [ngClass]=\"{'pr-25': !selectConfig.iconUrl}\"\r\n #searchInput\r\n [disabled]=\"ngControl.control.disabled || selectConfig.hover\"\r\n [placeholder]=\"(ngControl.control.disabled || selectConfig.hover) ? '' : 'Search'\"\r\n (focusout)=\"inputFocusOut()\"\r\n (focus)=\"openSelection()\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (keyup)=\"getDataWithSearch(searchInput.value,$event)\">\r\n\r\n <!-- Search Icon -->\r\n <span class=\"search-icon\">\r\n <i-tech-icon-button\r\n class=\"mr-10\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n *ngIf=\"selectConfig.iconPrefix && !showPlaceholder\"\r\n [iconName]=\"selectConfig.iconPrefix || ''\"\r\n [disabled]=\"selectConfig.readOnly || false\"\r\n matPrefix\r\n >\r\n </i-tech-icon-button>\r\n </span>\r\n </div>\r\n\r\n <!-- Placeholder/Selected Value Display -->\r\n <ng-container *ngIf=\"showPlaceholder && selectConfig.search\">\r\n <div class=\"custom-placeholder\"\r\n *ngIf=\"(!ngControl?.value && !ngControl?.value?.length) ||\r\n (selectConfig.multiple && ngControl?.value && !ngControl?.value?.length)\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n >\r\n {{ ((selectConfig.placeholder || '') | translate) }}\r\n </div>\r\n <div class=\"custom-placeholder custom-value ellipsis\"\r\n [ngClass]=\"{\r\n 'pr-42': selectConfig.iconUrl,\r\n 'readonly-color': selectConfig.readOnly || ngControl.control.disabled,\r\n 'default-form-icon-color': !(selectConfig.readOnly || ngControl.control.disabled)\r\n }\"\r\n *ngIf=\"ngControl?.value\"\r\n >\r\n {{ selectConfig?.multiple ? (ngControl.value | arrayToString) : showingValue }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Custom Icon -->\r\n <img class=\"left_icon_new pointer\"\r\n (click)=\"iconClick(matSelect, searchInput)\"\r\n *ngIf=\"!selectConfig.matIconName && (selectConfig.iconUrl || selectConfig.activeStateIconUrl)\"\r\n [src]=\"'assets/images/icons/global/' + (ngControl.control?.value && selectConfig?.activeStateIconUrl ? selectConfig.activeStateIconUrl : selectConfig.iconUrl)\">\r\n\r\n <mat-form-field appearance=\"outline\" class=\"w-100\" (click)=\"selectConfig?.search ? focusSearchInput() : null\">\r\n <!-- Material Select -->\r\n <mat-select #matSelect=\"matSelect\"\r\n [panelClass]=\"'autocomplete-transform-panel-location'\"\r\n [attr.aria-placeholder]=\"(selectConfig.placeholder || '') | translate\"\r\n [aria-label]=\"selectConfig.label | translate\"\r\n [id]=\"selectConfig.filtrationKey || ''\"\r\n (opened)=\"registerPanelScrollEvent(matSelect)\"\r\n (openedChange)=\"openedChange($event)\"\r\n [formControl]=\"ngControl.control\"\r\n [multiple]=\"selectConfig.multiple\"\r\n (selectionChange)=\"emitSelectionChangeAndClose($event)\"\r\n [errorStateMatcher]=\"customErrorStateMatcher\"\r\n [placeholder]=\"(selectConfig.placeholder || '') | translate\"\r\n [disabled]=\"ngControl.control.disabled\"\r\n >\r\n\r\n <!-- Loading State -->\r\n <mat-option *ngIf=\"pending\" class=\"option_loading relative\">\r\n <div class=\"request_loading\">\r\n <img ngSrc=\"./loader.svg\" alt=\"\" height=\"200\" width=\"200\"/>\r\n </div>\r\n </mat-option>\r\n\r\n <!-- Options -->\r\n <ng-container *ngIf=\"data?.length && !pending\">\r\n <!-- Add New Option -->\r\n <mat-option *ngIf=\"selectConfig.actions\"\r\n class=\"pointer add_new\"\r\n disabled\r\n (click)=\"closePanelAndUnsetFocus();addNewItemEvent()\">\r\n <!-- (click)=\"ngControl.control.reset(null);matSelect._onBlur();closePanelAndUnsetFocus();addNewItemEvent()\">-->\r\n <i-tech-button\r\n [type]=\"ButtonType.OUTLINE\"\r\n [fontIcon]=\"'add'\"\r\n [text]=\"('dropdown_add_item' | translate : {INPUT_NAME: (selectConfig.label | translate)}) \"\r\n [customClass]=\"'w-100 mat-autocomplete-select-button'\">\r\n </i-tech-button>\r\n </mat-option>\r\n\r\n <!-- Regular Options -->\r\n <ng-container *ngIf=\"!selectConfig?.changeText && data.length\">\r\n <mat-option *ngFor=\"let item of data\"\r\n [value]=\"selectConfig.valueByKey | getValueByKeyFromObject : item\"\r\n (mouseup)=\"optionClick(item)\"\r\n (mousedown)=\"preventDefault($event)\">\r\n {{ ((selectConfig.valueToShowByKey | getValueByKeyFromObject : item : selectConfig.valueToShowByParam : selectConfig.withParamSymbol) || '') | translate }}\r\n </mat-option>\r\n </ng-container>\r\n\r\n <!-- Custom Text Options -->\r\n <ng-container *ngIf=\"selectConfig?.changeText && data.length\">\r\n <mat-option *ngFor=\"let item of data\"\r\n [value]=\"selectConfig.valueByKey | getValueByKeyFromObject : item\"\r\n (mouseup)=\"optionClick(item)\"\r\n (mousedown)=\"preventDefault($event)\"\r\n [disabled]=\"selectConfig?.changeText[item].disabled\">\r\n {{ selectConfig?.changeText[item].text | translate }}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Empty State -->\r\n <ng-container *ngIf=\"!pending && !data.length\">\r\n <mat-option disabled class=\"empty_selection_state\">\r\n <div class=\"actions_and_tile add_new flex_column w-100 flex_center_align_center\">\r\n <span>{{ 'dropdown_no_items' | translate }}</span>\r\n <div class=\"mt-10\">\r\n <i-tech-button\r\n *ngIf=\"selectConfig?.actions\"\r\n [type]=\"ButtonType.OUTLINE\"\r\n (buttonClick)=\"closePanelAndUnsetFocus();addNewItemEvent()\"\r\n [customClass]=\"'mat-autocomplete-select-button'\"\r\n [fontIcon]=\"'add'\"\r\n [text]=\"('dropdown_add_item' | translate : {INPUT_NAME: (selectConfig.label | translate)}) \">\r\n </i-tech-button>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-icon *ngIf=\"selectConfig.iconPrefix\"\r\n matPrefix\r\n [ngClass]=\"{\r\n 'readonly-color' : !selectConfig['iconPrefixColor'] && (selectConfig.readOnly || ngControl.control.disabled),\r\n 'default-form-icon-color' : !selectConfig['iconPrefixColor'] && !(selectConfig.readOnly || ngControl.control.disabled)\r\n }\"\r\n [matTooltip]=\"((selectConfig?.['iconPrefixTooltip'] || '') | translate)\"\r\n >{{ selectConfig.iconPrefix }}\r\n </mat-icon>\r\n\r\n <mat-icon *ngIf=\"selectConfig['iconPrefixSvg']\"\r\n matPrefix\r\n [matTooltip]=\"((selectConfig?.['iconPrefixTooltip'] || '') | translate)\"\r\n [svgIcon]=\"selectConfig['iconPrefixSvg'] || ''\"\r\n ></mat-icon>\r\n\r\n <i-tech-icon-button\r\n *ngIf=\"selectConfig.search && selectConfig.clearable && !ngControl.control.disabled && !!ngControl.control.value\"\r\n iconName=\"cancel\"\r\n matSuffix\r\n [disabled]=\"selectConfig.readOnly || false\"\r\n [ngClass]=\"selectConfig.readOnly || ngControl.control.disabled ? 'readonly-color' : 'default-form-icon-color'\"\r\n (click)=\"$event.stopPropagation();$event.preventDefault();ngControl.control.reset(null);matSelect._onBlur();closePanelAndUnsetFocus()\"\r\n >\r\n </i-tech-icon-button>\r\n <mat-icon\r\n matSuffix\r\n class=\"select-arrow\"\r\n [class.open]=\"matSelect.panelOpen\"\r\n [ngClass]=\"{\r\n 'readonly-color': selectConfig.readOnly || ngControl.control.disabled,\r\n 'default-form-icon-color': !(selectConfig.readOnly || ngControl.control.disabled),\r\n 'mt-8': !!ngControl.control.value && selectConfig.clearable\r\n }\"\r\n >\r\n keyboard_arrow_down\r\n </mat-icon>\r\n <!-- Error Message -->\r\n <mat-error *ngIf=\"!!(ngControl.control.errors && submitValue)\">\r\n {{ ngControl.control | generateErrorMessages : selectConfig.label : selectConfig.defaultPatternKey }}\r\n </mat-error>\r\n </mat-form-field>\r\n\r\n <!-- Reset Button -->\r\n <i-tech-clear-value *ngIf=\"selectConfig.reset\" (reset)=\"resetValue()\"></i-tech-clear-value>\r\n</div>\r\n", styles: [".left_icon_new{position:absolute;right:2px;top:1px}::ng-deep .request_loading{width:40px;height:40px;background-color:#fff!important}::ng-deep .request_loading:hover{background-color:var(--primary99)!important}::ng-deep .request_loading:focus{background-color:var(--primary99)!important}::ng-deep .request_loading img{position:absolute;left:50%;top:50%;width:100%;height:100%;transform:translate(-50%,-50%)}::ng-deep .mat-mdc-option.add_new{opacity:1!important;pointer-events:auto!important}::ng-deep .mat-mdc-option.add_new .mat-pseudo-checkbox{display:none!important}::ng-deep .mat-mdc-option.add_new .mdc-list-item__primary-text{display:inline-block!important;width:100%!important}::ng-deep .mat-mdc-option.add_new span{color:unset!important;font-size:unset!important;margin:unset!important;opacity:1!important}@media (min-width: 1920px) and (max-width: 2500px){.mat-autocomplete{height:90px!important}}\n"] }]
384
+ }], ctorParameters: () => [{ type: i1.InputService }], propDecorators: { matSelect: [{
385
+ type: ViewChild,
386
+ args: ['matSelect']
387
+ }], searchInput: [{
388
+ type: ViewChild,
389
+ args: ['searchInput']
390
+ }], className: [{
391
+ type: Input
392
+ }], submitValue: [{
393
+ type: Input
394
+ }], configs: [{
395
+ type: Input
396
+ }], detectChanges: [{
397
+ type: Input
398
+ }], selectionChange: [{
399
+ type: Output
400
+ }], emitAction: [{
401
+ type: Output
402
+ }], allSelected: [{
403
+ type: ViewChild,
404
+ args: ['allSelected']
405
+ }], handleVisibilityChange: [{
406
+ type: HostListener,
407
+ args: ['document:visibilitychange']
408
+ }] } });
409
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlLXNlbGVjdC9hdXRvY29tcGxldGUtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9hdXRvY29tcGxldGUtc2VsZWN0L2F1dG9jb21wbGV0ZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR0EsWUFBWSxFQUMzQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQVksZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFcEUsT0FBTyxFQUFrQixtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUMxRixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FB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Q2hCLE9BQU87d0JBQ1AseUJBQXlCO3dCQUN6QixtQkFBbUI7d0JBQ25CLGtCQUFrQjtxQkFDbkIsY0FDVyxJQUFJO2lGQUdVLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDSSxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ2YsU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlPLE9BQU87c0JBQW5CLEtBQUs7Z0JBbUJHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNtQixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBcUJ4QixzQkFBc0I7c0JBRHJCLFlBQVk7dUJBQUMsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIElucHV0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgQWZ0ZXJWaWV3SW5pdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge01hdFNlbGVjdCwgTWF0U2VsZWN0TW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0XCI7XHJcbmltcG9ydCB7QXV0b2NvbXBsZXRlQ29uZmlnc0ludGVyZmFjZX0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvYXV0b2NvbXBsZXRlLWNvbmZpZ3MuaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7Rm9ybUNvbnRyb2xOYW1lLCBSZWFjdGl2ZUZvcm1zTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgSW5wdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW5wdXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEJ1dHRvblR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2J1dHRvbi10eXBlcy5lbnVtJztcclxuaW1wb3J0IHtOZ0NsYXNzLCBOZ0ZvciwgTmdJZiwgTmdPcHRpbWl6ZWRJbWFnZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge01hdFRvb2x0aXB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwXCI7XHJcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQge0ljb25CdXR0b25Db21wb25lbnR9IGZyb20gXCIuLi9pY29uLWJ1dHRvbi9pY29uLWJ1dHRvbi5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtCdXR0b25Db21wb25lbnR9IGZyb20gXCIuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0dldFZhbHVlQnlLZXlGcm9tT2JqZWN0UGlwZX0gZnJvbSBcIi4uLy4uL3BpcGVzL2dldC12YWx1ZS1ieS1rZXktZnJvbS1vYmplY3QucGlwZVwiO1xyXG5pbXBvcnQge0FycmF5VG9TdHJpbmdQaXBlfSBmcm9tIFwiLi4vLi4vcGlwZXMvYXJyYXktdG8tc3RyaW5nLnBpcGVcIjtcclxuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge0dlbmVyYXRlRXJyb3JNZXNzYWdlc1BpcGV9IGZyb20gXCIuLi8uLi9waXBlcy9nZW5lcmF0ZS1lcnJvci1tZXNzYWdlcy5waXBlXCI7XHJcbmltcG9ydCB7Q2xlYXJWYWx1ZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NsZWFyLXZhbHVlL2NsZWFyLXZhbHVlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge01hdEZvcm1GaWVsZE1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaS10ZWNoLWF1dG9jb21wbGV0ZS1zZWxlY3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUtc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hdXRvY29tcGxldGUtc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdDbGFzcyxcclxuICAgIE1hdFRvb2x0aXAsXHJcbiAgICBOZ0lmLFxyXG4gICAgTmdGb3IsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBJY29uQnV0dG9uQ29tcG9uZW50LFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIEJ1dHRvbkNvbXBvbmVudCxcclxuICAgIEdldFZhbHVlQnlLZXlGcm9tT2JqZWN0UGlwZSxcclxuICAgIEFycmF5VG9TdHJpbmdQaXBlLFxyXG4gICAgTmdPcHRpbWl6ZWRJbWFnZSxcclxuICAgIE1hdEljb24sXHJcbiAgICBHZW5lcmF0ZUVycm9yTWVzc2FnZXNQaXBlLFxyXG4gICAgQ2xlYXJWYWx1ZUNvbXBvbmVudCxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZVxyXG4gIF0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0b2NvbXBsZXRlU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcclxuICAgIEBWaWV3Q2hpbGQoJ21hdFNlbGVjdCcpIG1hdFNlbGVjdCE6IE1hdFNlbGVjdDtcclxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0Jykgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmO1xyXG4gICAgQElucHV0KCkgY2xhc3NOYW1lITogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgc3VibWl0VmFsdWUhOiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIEZvciB3b3JraW5nIGNvbmZpZ3MuXHJcbiAgICovXHJcbiAgICBASW5wdXQoKSBzZXQgY29uZmlncyhkYXRhOiBBdXRvY29tcGxldGVDb25maWdzSW50ZXJmYWNlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RDb25maWcgPSBkYXRhO1xyXG4gICAgICAgIGlmICghZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKHR5cGVvZiB0aGlzLnNlbGVjdENvbmZpZy5wYWdpbmF0ZSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RSZXF1ZXN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RSZXF1ZXN0ID0gdHJ1ZVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLnNlbGVjdENvbmZpZy5wYWdpbmF0ZTtcclxuICAgICAgICB0aGlzLmZpbmRBbmRTZXREZWZhdWx0VmFsdWVGcm9tRGF0YSgpO1xyXG4gICAgfTtcclxuXHJcbiAgICBASW5wdXQoKSBkZXRlY3RDaGFuZ2VzITogYm9vbGVhbjtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBlbWl0QWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAVmlld0NoaWxkKCdhbGxTZWxlY3RlZCcpIGFsbFNlbGVjdGVkITogTWF0U2VsZWN0O1xyXG4gICAgcGVuZGluZyA9IGZhbHNlO1xyXG4gICAgZGVmYXVsdFZhbHVlITogYW55O1xyXG4gICAgZGF0YTogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgcGFnaW5hdGlvbkRhdGE6IGFueSA9IHtjdXJyZW50OiAxLCBsYXN0OiAwfTtcclxuICAgIG5nQ29udHJvbDogRm9ybUNvbnRyb2xOYW1lO1xyXG4gICAgc2VsZWN0Q29uZmlnITogQXV0b2NvbXBsZXRlQ29uZmlnc0ludGVyZmFjZTtcclxuICAgIGZpcnN0UmVxdWVzdCA9IGZhbHNlO1xyXG4gICAgc2hvd1BsYWNlaG9sZGVyID0gdHJ1ZTtcclxuICAgIGlzTmVlZGVkRm9yUmVjYWxsID0gZmFsc2U7XHJcbiAgICBzaG93aW5nVmFsdWU6IGFueTtcclxuICAgIHNlYXJjaFRpbWVvdXRJZDogYW55O1xyXG4gICAgdGFiVmlzaWJpbGl0eSE6IGJvb2xlYW47XHJcbiAgICBhY2Nlc3NUb05leHRSZXF1ZXN0ID0gdHJ1ZTtcclxuICAgIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICBibG9ja1JlY2FsbERlZmF1bHRWYWx1ZVNldHRlciA9IGZhbHNlO1xyXG4gICAgYmFzZURhdGE6IGFueTtcclxuICAgIHJlcXVlc3RMb2FkaW5nID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgQnV0dG9uVHlwZSA9IEJ1dHRvblR5cGU7XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dmlzaWJpbGl0eWNoYW5nZScpXHJcbiAgICBoYW5kbGVWaXNpYmlsaXR5Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGFiVmlzaWJpbGl0eSA9ICFkb2N1bWVudC5oaWRkZW47XHJcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsdWUpIHsgcmV0dXJuO31cclxuICAgICAgICB0aGlzLmNsb3NlUGFuZWxBbmRVbnNldEZvY3VzKCk7XHJcbiAgICAgICAgaWYgKCFkb2N1bWVudC5oaWRkZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5pc05lZWRlZEZvclJlY2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2VcclxuICAgICAgICAgICAgfSwgNDAwMClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBpbnB1dFNlcnZpY2U6IElucHV0U2VydmljZSkge1xyXG4gICAgICAgIHRoaXMubmdDb250cm9sID0gdGhpcy5pbnB1dFNlcnZpY2UuaW5qZWN0TmdDb250cm9sKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RDb25maWcnXSAmJiB0aGlzLnNlbGVjdENvbmZpZykge1xyXG4gICAgICAgICAgICBpZiAoKHR5cGVvZiB0aGlzLnNlbGVjdENvbmZpZy5wYWdpbmF0ZSkgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoICYmIHJlcyAmJiAhdGhpcy5ibG9ja1JlY2FsbERlZmF1bHRWYWx1ZVNldHRlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maW5kQW5kU2V0RGVmYXVsdFZhbHVlRnJvbURhdGEoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgaGFyZFJlbG9hZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdldERhdGEoJycsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAvKipcclxuICAgKiBEeW5hbWljIHJlcXVlc3QgZm9yIHNlbGVjdCBkYXRhLlxyXG4gICAqIEBwYXJhbSBzZWFyY2hUZXh0IC0gVGhlIGlucHV0IHZhbHVlIHRvIHNlYXJjaCBvcHRpb25zIGJ5LlxyXG4gICAqIEBwYXJhbSBmcm9tU2VhcmNoIC0gQWNjZXNzIGZvciBzZWFyY2ggLlxyXG4gICAqIEByZXR1cm5zIFNlbGVjdCBkYXRhLlxyXG4gICAqL1xyXG4gICAgZ2V0RGF0YShzZWFyY2hUZXh0Pzogc3RyaW5nLCBmcm9tU2VhcmNoPzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICghZnJvbVNlYXJjaCAmJiAhdGhpcy5hY2Nlc3NUb05leHRSZXF1ZXN0KSB7IHJldHVybjsgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0TG9hZGluZykgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgaWYgKGZyb21TZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uRGF0YS5jdXJyZW50ID0gMTtcclxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb05leHRSZXF1ZXN0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uVG9EbyA9IHRoaXMuc2VsZWN0Q29uZmlnLnBhZ2luYXRlKHRoaXMucGFnaW5hdGlvbkRhdGEuY3VycmVudCwgc2VhcmNoVGV4dCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVxdWVzdExvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGZ1bmN0aW9uVG9Ebz8uc3Vic2NyaWJlKChkYXRhOiBBcnJheTxhbnk+IHwgYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFUb0FkZCA9ICgnY29udGVudCcgaW4gZGF0YSkgPyBkYXRhLmNvbnRlbnQgOiBkYXRhO1xyXG5cclxuICAgICAgICAgICAgaWYgKCdjb250ZW50JyBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzc1RvTmV4dFJlcXVlc3QgPSAhZGF0YS5sYXN0IHx8IChkYXRhLnRvdGFsUGFnZXMgPiB0aGlzLnBhZ2luYXRpb25EYXRhLmN1cnJlbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSAoZnJvbVNlYXJjaCB8fCB0aGlzLnNlbGVjdENvbmZpZz8uYmxvY2tQYWdpbmF0aW9uKSA/IGRhdGFUb0FkZCA6IFsuLi50aGlzLmRhdGEsIC4uLmRhdGFUb0FkZF07XHJcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWRhdGFUb0FkZC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEubGFzdCA9IHRoaXMucGFnaW5hdGlvbkRhdGEuY3VycmVudDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uRGF0YS5jdXJyZW50ICs9IDE7XHJcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkRhdGEubGFzdCArPSAxO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmluZEFuZFNldERlZmF1bHRWYWx1ZUZyb21EYXRhKCk7XHJcbiAgICAgICAgICAgIH0sMTApXHJcbiAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0TG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZmluZEFuZFNldERlZmF1bHRWYWx1ZUZyb21EYXRhKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdENvbmZpZy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wudmFsdWUgJiYgdGhpcy5uZ0NvbnRyb2wudmFsdWUubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2hvd2luZ1ZhbHVlKHRoaXMuZGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLm5nQ29udHJvbC52YWx1ZVswXSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQ7XHJcbiAgICAgICAgICAgIGlmIChpc0Rpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPIFJlbW92ZSBhZnRlciBtaWdyYXRpbmcgYWxsIHNlbGVjdHNcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoIXRoaXMubmdDb250cm9sLnZhbHVlICYmICF0aGlzLmRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbC52YWx1ZSAmJiAhdGhpcy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGVmYXVsdFZhbHVlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRoaXMubmdDb250cm9sLnZhbHVlKTtcclxuICAgICAgICB0aGlzLmJhc2VEYXRhID0gdGhpcy5kZWZhdWx0VmFsdWVcclxuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdFZhbHVlKSB7IHJldHVybjt9XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCgpXHJcbiAgICAgICAgdGhpcy5zZXRTaG93aW5nVmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9wdGlvbkNsaWNrKHNob3dpbmdEYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmJhc2VEYXRhID0gc2hvd2luZ0RhdGFcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0Q29uZmlnLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd2luZ1ZhbHVlKHNob3dpbmdEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5tYXRTZWxlY3QuY2xvc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RDb25maWcubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRGb2N1c091dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFNob3dpbmdWYWx1ZShzaG93aW5nRGF0YSk7XHJcbiAgICAgICAgdGhpcy5zaG93UGxhY2Vob2xkZXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhZGROZXdJdGVtRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc05lZWRlZEZvclJlY2FsbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5lbWl0QWN0aW9uLmVtaXQoKTtcclxuICAgIH1cclxuICAvKipcclxuICAgKiBGaWx0ZXIgYW5kIHNob3cuXHJcbiAgICogQHBhcmFtIGRhdGEgLSBFeGlzdGluZyBjaG9zZW4gZGF0YS5cclxuICAgKi9cclxuICAgIHNldFNob3dpbmdWYWx1ZShkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPIHJlZmFjdG9yIHRoaXMgcGFydCBmdWxseVxyXG4gICAgICAgIGxldCBpbmNsdWRlID0gZGF0YTtcclxuICAgICAgICBsZXQgaW5jbHVkZU9wdGlvbmFsID0gZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnLnZhbHVlVG9TaG93QnlLZXkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RDb25maWcudmFsdWVUb1Nob3dCeUtleS5mb3JFYWNoKChwYXJhbTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IHN0cmluZykgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW0uZm9yRWFjaCgoa2V5OiBzdHJpbmcgfCBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IChpbmNsdWRlKSA/IGluY2x1ZGVba2V5XSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGluY2x1ZGVbcGFyYW1dO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RDb25maWcuc2hvd0Z1bGxUZXh0V2l0aE9wdGlvbmFsT25TZWxlY3RlZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdENvbmZpZy52YWx1ZVRvU2hvd0J5UGFyYW0/LmZvckVhY2goKHBhcmFtOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgc3RyaW5nKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmZvckVhY2goKGtleTogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlT3B0aW9uYWwgPSAoaW5jbHVkZU9wdGlvbmFsKSA/IGluY2x1ZGVPcHRpb25hbFtrZXldIDogbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlT3B0aW9uYWwgPSBpbmNsdWRlT3B0aW9uYWxbcGFyYW1dO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RDb25maWcudmFsdWVUb1Nob3dCeVBhcmFtICYmIHR5cGVvZiBpbmNsdWRlT3B0aW9uYWwgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSArPSAodGhpcy5zZWxlY3RDb25maWcud2l0aFBhcmFtU3ltYm9sIHx8ICcnKSArIGluY2x1ZGVPcHRpb25hbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNob3dpbmdWYWx1ZSA9IGluY2x1ZGU7XHJcbiAgICAgICAgdGhpcy5ibG9ja1JlY2FsbERlZmF1bHRWYWx1ZVNldHRlciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJsb2NrIGFub3RoZXIgZXZlbnRzLlxyXG4gICAqIEBwYXJhbSBldmVudCAtIEVsZW1lbnQgY2xpY2sgZXZlbnQuXHJcbiAgICovXHJcbiAgICBwcmV2ZW50RGVmYXVsdChldmVudDogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdENvbmZpZy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclBhbmVsU2Nyb2xsRXZlbnQoZWxlbWVudDogTWF0U2VsZWN0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnLnBhZ2luYXRlT25TY3JvbGwgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhbmVsID0gZWxlbWVudC5wYW5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIChldmVudDogYW55KSA9PiB0aGlzLmxvYWREYXRhT25TY3JvbGwoZXZlbnQpKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkRGF0YU9uU2Nyb2xsKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBwb3MgPSAoZXZlbnQudGFyZ2V0LnNjcm9sbFRvcCB8fCBldmVudC50YXJnZXQuc2Nyb2xsVG9wKSArIGV2ZW50LnRhcmdldC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgbWF4ID0gZXZlbnQudGFyZ2V0LnNjcm9sbEhlaWdodDtcclxuICAgICAgICBpZiAoKHBvcyArIDEpID49IG1heCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wYWdpbmF0aW9uRGF0YS5jdXJyZW50ID09PSB0aGlzLnBhZ2luYXRpb25EYXRhLmxhc3QgfHwgdGhpcy5zZWxlY3RDb25maWcuYmxvY2tQYWdpbmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzU2VhcmNoSW5wdXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnLnNlYXJjaCAmJiB0aGlzLnNlYXJjaElucHV0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbnB1dEZvY3VzT3V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNOZWVkZWRGb3JSZWNhbGwgPSAhIXRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZTtcclxuICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICB0aGlzLnNob3dQbGFjZWhvbGRlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jbGVhclRpbWVvdXRGb3JTZWFyY2goKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldFZhbHVlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wucmVzZXQobnVsbCk7XHJcbiAgICAgICAgdGhpcy5pbnB1dEZvY3VzT3V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGF0YVdpdGhTZWFyY2godmFsdWU6IGFueSwgZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0Rm9yU2VhcmNoKCk7XHJcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldERhdGEodmFsdWUsIHRydWUpXHJcbiAgICAgICAgICAgIH0sIDgwMCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPD0gMSAmJiBldmVudC5rZXlDb2RlID09PSA4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSh2YWx1ZSwgdHJ1ZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJUaW1lb3V0Rm9yU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRpbWVvdXRJZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hUaW1lb3V0SWQpO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRpbWVvdXRJZCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5TZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0Q29uZmlnLmRpc2FibGVkIHx8IHRoaXMubmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNob3dQbGFjZWhvbGRlciA/IHRoaXMubWF0U2VsZWN0Lm9wZW4oKSA6IHRoaXMuY2xvc2VQYW5lbEFuZFVuc2V0Rm9jdXMoKTtcclxuICAgICAgICB0aGlzLnNob3dQbGFjZWhvbGRlciA9ICF0aGlzLnNob3dQbGFjZWhvbGRlcjtcclxuICAgICAgICBpZiAoIXRoaXMuc2hvd1BsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVDYWxsRGF0YSgpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlUGFuZWxBbmRVbnNldEZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWF0U2VsZWN0LmNsb3NlKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmJsdXIoKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvcGVuZWRDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc05lZWRlZEZvclJlY2FsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZUNhbGxEYXRhKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdENvbmZpZy5zZWFyY2gpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlQ2FsbERhdGEoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG93UGxhY2Vob2xkZXIgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlQ2FsbERhdGEoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gVE9ETyByZWZhY3RvciB0aGlzIHBhcnRcclxuICAgICAgICBpZiAoIXRoaXMuaXNOZWVkZWRGb3JSZWNhbGwpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgdGhpcy5kYXRhID0gW107XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb25EYXRhID0ge1xyXG4gICAgICAgICAgICBjdXJyZW50OiAxLFxyXG4gICAgICAgICAgICBsYXN0OiAwXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmFjY2Vzc1RvTmV4dFJlcXVlc3QgPSB0cnVlO1xyXG4gICAgICAgIGlmICgodHlwZW9mIHRoaXMuc2VsZWN0Q29uZmlnLnBhZ2luYXRlKSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5zZWxlY3RDb25maWcucGFnaW5hdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNOZWVkZWRGb3JSZWNhbGwgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlQW5kQ2xvc2UoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoZXZlbnQudmFsdWUpO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdENvbmZpZy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50LnZhbHVlPy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wucmVzZXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWF0U2VsZWN0LmNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWNvbkNsaWNrKG1hdFNlbGVjdDogTWF0U2VsZWN0LCBzZWFyY2hJbnB1dD86IEVsZW1lbnRSZWYpOiB2b2lkIHtcclxuICAgICAgICBtYXRTZWxlY3Qub3BlbigpO1xyXG4gICAgICAgIHNlYXJjaElucHV0Py5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGN1c3RvbUVycm9yU3RhdGVNYXRjaGVyID0ge1xyXG4gICAgICAgIGlzRXJyb3JTdGF0ZTogKGNvbnRyb2w6IGFueSwgZm9ybTogYW55KTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhIShjb250cm9sICYmIGNvbnRyb2wuaW52YWxpZCAmJiB0aGlzLnN1Ym1pdFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJuZXctbWF0LWF1dG9jb21wbGV0ZVwiIGlkPVwibWF0X2F1dG9jb21wbGV0ZVwiXHJcbiAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAnbWF0LXNlbGVjdC13aXRob3V0X2ljb24nOiAhc2VsZWN0Q29uZmlnLmljb25VcmwgJiYgIXNlbGVjdENvbmZpZy5hY3RpdmVTdGF0ZUljb25VcmwsXHJcbiAgICAgICAgICAgICdtYXQtc2VsZWN0LXdpdGgtc2VhcmNoJzogc2VsZWN0Q29uZmlnLnNlYXJjaCxcclxuICAgICAgICAgICAgJ3dpdGhvdXQtbGFiZWwnOiBzZWxlY3RDb25maWcuaGlkZUxhYmVsLFxyXG4gICAgICAgICAgICAnaW52YWxpZF9maWVsZCc6IG5nQ29udHJvbC5jb250cm9sLmVycm9ycyAmJiBzdWJtaXRWYWx1ZSxcclxuICAgICAgICAgICAgJ3JlYWRvbmx5LWZpZWxkJzogc2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IG5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkXHJcbiAgICAgICAgIH1cIlxyXG4gICAgIFttYXRUb29sdGlwXT1cIihzZWxlY3RDb25maWcuaG92ZXIgJiYgIW5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkID8gKChzZWxlY3RDb25maWcuaG92ZXIgfHwgJycpIHwgdHJhbnNsYXRlKSA6ICcnKVwiXHJcbiAgICAgW21hdFRvb2x0aXBDbGFzc109XCInbWF0LW1kYy10b29sdGlwIGJpZy10ZC1tYXQtdG9vbHRpcCdcIlxyXG4gICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2Fib3ZlJ1wiXHJcbiAgICAgKm5nSWY9XCJzZWxlY3RDb25maWcgJiYgbmdDb250cm9sXCI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ3LTEwMFwiICpuZ0lmPVwiIXNlbGVjdENvbmZpZy5oaWRlTGFiZWxcIj5cclxuICAgIDxtYXQtbGFiZWwgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgJ3JlYWRvbmx5LWNvbG9yJyA6IHNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCxcclxuICAgICAgICAgICdpbnZhbGlkLWxhYmVsLWNvbG9yJzogISEobmdDb250cm9sLmNvbnRyb2wuZXJyb3JzICYmIHN1Ym1pdFZhbHVlKVxyXG4gICAgICAgIH1cIj5cclxuICAgICAge3sgc2VsZWN0Q29uZmlnLmxhYmVsIHwgdHJhbnNsYXRlIH19XHJcbiAgICA8L21hdC1sYWJlbD5cclxuICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0Q29uZmlnLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZC1pbnB1dFwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J3JlYWRvbmx5LWNvbG9yJyA6IG5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkfVwiPio8L3NwYW4+XHJcbiAgPC9kaXY+XHJcblxyXG5cclxuICA8IS0tIFNlYXJjaCBJbnB1dCAtLT5cclxuICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0IHctMTAwXCJcclxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxyXG4gICAgICAgW25nQ2xhc3NdPVwieyBoaWRlX2lucHV0X3BsYWNlaG9sZGVyOiBzaG93UGxhY2Vob2xkZXIgfHwgbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQgfVwiXHJcbiAgICAgICAqbmdJZj1cInNlbGVjdENvbmZpZy5zZWFyY2hcIlxyXG4gID5cclxuICAgIDxpbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgIGlkPVwic2VhcmNoSW5wdXRcIlxyXG4gICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICBbbmdDbGFzc109XCJ7J3ByLTI1JzogIXNlbGVjdENvbmZpZy5pY29uVXJsfVwiXHJcbiAgICAgICAgICAgI3NlYXJjaElucHV0XHJcbiAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkIHx8IHNlbGVjdENvbmZpZy5ob3ZlclwiXHJcbiAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIihuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCB8fCBzZWxlY3RDb25maWcuaG92ZXIpID8gJycgOiAnU2VhcmNoJ1wiXHJcbiAgICAgICAgICAgKGZvY3Vzb3V0KT1cImlucHV0Rm9jdXNPdXQoKVwiXHJcbiAgICAgICAgICAgKGZvY3VzKT1cIm9wZW5TZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAoa2V5dXApPVwiZ2V0RGF0YVdpdGhTZWFyY2goc2VhcmNoSW5wdXQudmFsdWUsJGV2ZW50KVwiPlxyXG5cclxuICAgIDwhLS0gU2VhcmNoIEljb24gLS0+XHJcbiAgICA8c3BhbiBjbGFzcz1cInNlYXJjaC1pY29uXCI+XHJcbiAgICAgICAgICAgIDxpLXRlY2gtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICBjbGFzcz1cIm1yLTEwXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3RDb25maWcucmVhZE9ubHkgfHwgbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQgPyAncmVhZG9ubHktY29sb3InIDogJ2RlZmF1bHQtZm9ybS1pY29uLWNvbG9yJ1wiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RDb25maWcuaWNvblByZWZpeCAmJiAhc2hvd1BsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICBbaWNvbk5hbWVdPVwic2VsZWN0Q29uZmlnLmljb25QcmVmaXggfHwgJydcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RDb25maWcucmVhZE9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgIG1hdFByZWZpeFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvaS10ZWNoLWljb24tYnV0dG9uPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBQbGFjZWhvbGRlci9TZWxlY3RlZCBWYWx1ZSBEaXNwbGF5IC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93UGxhY2Vob2xkZXIgJiYgc2VsZWN0Q29uZmlnLnNlYXJjaFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImN1c3RvbS1wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICpuZ0lmPVwiKCFuZ0NvbnRyb2w/LnZhbHVlICYmICFuZ0NvbnRyb2w/LnZhbHVlPy5sZW5ndGgpIHx8XHJcbiAgICAgICAgICAgICAgICAgKHNlbGVjdENvbmZpZy5tdWx0aXBsZSAmJiBuZ0NvbnRyb2w/LnZhbHVlICYmICFuZ0NvbnRyb2w/LnZhbHVlPy5sZW5ndGgpXCJcclxuICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IG5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkID8gJ3JlYWRvbmx5LWNvbG9yJyA6ICdkZWZhdWx0LWZvcm0taWNvbi1jb2xvcidcIlxyXG4gICAgPlxyXG4gICAgICB7eyAoKHNlbGVjdENvbmZpZy5wbGFjZWhvbGRlciB8fCAnJykgfCB0cmFuc2xhdGUpIH19XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tcGxhY2Vob2xkZXIgY3VzdG9tLXZhbHVlIGVsbGlwc2lzXCJcclxuICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ3ByLTQyJzogc2VsZWN0Q29uZmlnLmljb25VcmwsXHJcbiAgICAgICAgICAgICAgICAncmVhZG9ubHktY29sb3InOiBzZWxlY3RDb25maWcucmVhZE9ubHkgfHwgbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAnZGVmYXVsdC1mb3JtLWljb24tY29sb3InOiAhKHNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZClcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAqbmdJZj1cIm5nQ29udHJvbD8udmFsdWVcIlxyXG4gICAgPlxyXG4gICAgICB7eyBzZWxlY3RDb25maWc/Lm11bHRpcGxlID8gKG5nQ29udHJvbC52YWx1ZSB8IGFycmF5VG9TdHJpbmcpIDogc2hvd2luZ1ZhbHVlIH19XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSBDdXN0b20gSWNvbiAtLT5cclxuICA8aW1nIGNsYXNzPVwibGVmdF9pY29uX25ldyBwb2ludGVyXCJcclxuICAgICAgIChjbGljayk9XCJpY29uQ2xpY2sobWF0U2VsZWN0LCBzZWFyY2hJbnB1dClcIlxyXG4gICAgICAgKm5nSWY9XCIhc2VsZWN0Q29uZmlnLm1hdEljb25OYW1lICYmIChzZWxlY3RDb25maWcuaWNvblVybCB8fCBzZWxlY3RDb25maWcuYWN0aXZlU3RhdGVJY29uVXJsKVwiXHJcbiAgICAgICBbc3JjXT1cIidhc3NldHMvaW1hZ2VzL2ljb25zL2dsb2JhbC8nICsgKG5nQ29udHJvbC5jb250cm9sPy52YWx1ZSAmJiBzZWxlY3RDb25maWc/LmFjdGl2ZVN0YXRlSWNvblVybCA/IHNlbGVjdENvbmZpZy5hY3RpdmVTdGF0ZUljb25VcmwgOiBzZWxlY3RDb25maWcuaWNvblVybClcIj5cclxuXHJcbiAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LTEwMFwiIChjbGljayk9XCJzZWxlY3RDb25maWc/LnNlYXJjaCA/IGZvY3VzU2VhcmNoSW5wdXQoKSA6IG51bGxcIj5cclxuICAgIDwhLS0gTWF0ZXJpYWwgU2VsZWN0IC0tPlxyXG4gICAgPG1hdC1zZWxlY3QgI21hdFNlbGVjdD1cIm1hdFNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICBbcGFuZWxDbGFzc109XCInYXV0b2NvbXBsZXRlLXRyYW5zZm9ybS1wYW5lbC1sb2NhdGlvbidcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wbGFjZWhvbGRlcl09XCIoc2VsZWN0Q29uZmlnLnBsYWNlaG9sZGVyIHx8ICcnKSB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICBbYXJpYS1sYWJlbF09XCJzZWxlY3RDb25maWcubGFiZWwgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgW2lkXT1cInNlbGVjdENvbmZpZy5maWx0cmF0aW9uS2V5IHx8ICcnXCJcclxuICAgICAgICAgICAgICAgIChvcGVuZWQpPVwicmVnaXN0ZXJQYW5lbFNjcm9sbEV2ZW50KG1hdFNlbGVjdClcIlxyXG4gICAgICAgICAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJvcGVuZWRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibmdDb250cm9sLmNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInNlbGVjdENvbmZpZy5tdWx0aXBsZVwiXHJcbiAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImVtaXRTZWxlY3Rpb25DaGFuZ2VBbmRDbG9zZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtlcnJvclN0YXRlTWF0Y2hlcl09XCJjdXN0b21FcnJvclN0YXRlTWF0Y2hlclwiXHJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiKHNlbGVjdENvbmZpZy5wbGFjZWhvbGRlciB8fCAnJykgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkXCJcclxuICAgID5cclxuXHJcbiAgICAgIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cclxuICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJwZW5kaW5nXCIgY2xhc3M9XCJvcHRpb25fbG9hZGluZyByZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1ZXN0X2xvYWRpbmdcIj5cclxuICAgICAgICAgIDxpbWcgbmdTcmM9XCIuL2xvYWRlci5zdmdcIiBhbHQ9XCJcIiBoZWlnaHQ9XCIyMDBcIiB3aWR0aD1cIjIwMFwiLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9tYXQtb3B0aW9uPlxyXG5cclxuICAgICAgPCEtLSBPcHRpb25zIC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubGVuZ3RoICYmICFwZW5kaW5nXCI+XHJcbiAgICAgICAgPCEtLSBBZGQgTmV3IE9wdGlvbiAtLT5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cInNlbGVjdENvbmZpZy5hY3Rpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXIgYWRkX25ld1wiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VQYW5lbEFuZFVuc2V0Rm9jdXMoKTthZGROZXdJdGVtRXZlbnQoKVwiPlxyXG4gICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmdDb250cm9sLmNvbnRyb2wucmVzZXQobnVsbCk7bWF0U2VsZWN0Ll9vbkJsdXIoKTtjbG9zZVBhbmVsQW5kVW5zZXRGb2N1cygpO2FkZE5ld0l0ZW1FdmVudCgpXCI+LS0+XHJcbiAgICAgICAgICA8aS10ZWNoLWJ1dHRvblxyXG4gICAgICAgICAgICBbdHlwZV09XCJCdXR0b25UeXBlLk9VVExJTkVcIlxyXG4gICAgICAgICAgICBbZm9udEljb25dPVwiJ2FkZCdcIlxyXG4gICAgICAgICAgICBbdGV4dF09XCIoJ2Ryb3Bkb3duX2FkZF9pdGVtJyB8IHRyYW5zbGF0ZSA6IHtJTlBVVF9OQU1FOiAoc2VsZWN0Q29uZmlnLmxhYmVsIHwgdHJhbnNsYXRlKX0pIFwiXHJcbiAgICAgICAgICAgIFtjdXN0b21DbGFzc109XCIndy0xMDAgbWF0LWF1dG9jb21wbGV0ZS1zZWxlY3QtYnV0dG9uJ1wiPlxyXG4gICAgICAgICAgPC9pLXRlY2gtYnV0dG9uPlxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuXHJcbiAgICAgICAgPCEtLSBSZWd1bGFyIE9wdGlvbnMgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZWxlY3RDb25maWc/LmNoYW5nZVRleHQgJiYgZGF0YS5sZW5ndGhcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdENvbmZpZy52YWx1ZUJ5S2V5IHwgZ2V0VmFsdWVCeUtleUZyb21PYmplY3QgOiBpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cIm9wdGlvbkNsaWNrKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwicHJldmVudERlZmF1bHQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICB7eyAoKHNlbGVjdENvbmZpZy52YWx1ZVRvU2hvd0J5S2V5IHwgZ2V0VmFsdWVCeUtleUZyb21PYmplY3QgOiBpdGVtIDogc2VsZWN0Q29uZmlnLnZhbHVlVG9TaG93QnlQYXJhbSA6IHNlbGVjdENvbmZpZy53aXRoUGFyYW1TeW1ib2wpIHx8ICcnKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEN1c3RvbSBUZXh0IE9wdGlvbnMgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdENvbmZpZz8uY2hhbmdlVGV4dCAmJiBkYXRhLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0Q29uZmlnLnZhbHVlQnlLZXkgfCBnZXRWYWx1ZUJ5S2V5RnJvbU9iamVjdCA6IGl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKG1vdXNldXApPVwib3B0aW9uQ2xpY2soaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJwcmV2ZW50RGVmYXVsdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RDb25maWc/LmNoYW5nZVRleHRbaXRlbV0uZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAge3sgc2VsZWN0Q29uZmlnPy5jaGFuZ2VUZXh0W2l0ZW1dLnRleHQgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8IS0tIEVtcHR5IFN0YXRlIC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBlbmRpbmcgJiYgIWRhdGEubGVuZ3RoXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gZGlzYWJsZWQgY2xhc3M9XCJlbXB0eV9zZWxlY3Rpb25fc3RhdGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zX2FuZF90aWxlIGFkZF9uZXcgZmxleF9jb2x1bW4gdy0xMDAgZmxleF9jZW50ZXJfYWxpZ25fY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7ICdkcm9wZG93bl9ub19pdGVtcycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xMFwiPlxyXG4gICAgICAgICAgICAgIDxpLXRlY2gtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdENvbmZpZz8uYWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJCdXR0b25UeXBlLk9VVExJTkVcIlxyXG4gICAgICAgICAgICAgICAgKGJ1dHRvbkNsaWNrKT1cImNsb3NlUGFuZWxBbmRVbnNldEZvY3VzKCk7YWRkTmV3SXRlbUV2ZW50KClcIlxyXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidtYXQtYXV0b2NvbXBsZXRlLXNlbGVjdC1idXR0b24nXCJcclxuICAgICAgICAgICAgICAgIFtmb250SWNvbl09XCInYWRkJ1wiXHJcbiAgICAgICAgICAgICAgICBbdGV4dF09XCIoJ2Ryb3Bkb3duX2FkZF9pdGVtJyB8IHRyYW5zbGF0ZSA6IHtJTlBVVF9OQU1FOiAoc2VsZWN0Q29uZmlnLmxhYmVsIHwgdHJhbnNsYXRlKX0pIFwiPlxyXG4gICAgICAgICAgICAgIDwvaS10ZWNoLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPG1hdC1pY29uICpuZ0lmPVwic2VsZWN0Q29uZmlnLmljb25QcmVmaXhcIlxyXG4gICAgICAgICAgICAgIG1hdFByZWZpeFxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAncmVhZG9ubHktY29sb3InIDogIXNlbGVjdENvbmZpZ1snaWNvblByZWZpeENvbG9yJ10gJiYgKHNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCksXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQtZm9ybS1pY29uLWNvbG9yJyA6ICFzZWxlY3RDb25maWdbJ2ljb25QcmVmaXhDb2xvciddICYmICEoc2VsZWN0Q29uZmlnLnJlYWRPbmx5IHx8IG5nQ29udHJvbC5jb250cm9sLmRpc2FibGVkKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIigoc2VsZWN0Q29uZmlnPy5bJ2ljb25QcmVmaXhUb29sdGlwJ10gfHwgJycpIHwgdHJhbnNsYXRlKVwiXHJcbiAgICA+e3sgc2VsZWN0Q29uZmlnLmljb25QcmVmaXggfX1cclxuICAgIDwvbWF0LWljb24+XHJcblxyXG4gICAgPG1hdC1pY29uICpuZ0lmPVwic2VsZWN0Q29uZmlnWydpY29uUHJlZml4U3ZnJ11cIlxyXG4gICAgICAgICAgICAgIG1hdFByZWZpeFxyXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIigoc2VsZWN0Q29uZmlnPy5bJ2ljb25QcmVmaXhUb29sdGlwJ10gfHwgJycpIHwgdHJhbnNsYXRlKVwiXHJcbiAgICAgICAgICAgICAgW3N2Z0ljb25dPVwic2VsZWN0Q29uZmlnWydpY29uUHJlZml4U3ZnJ10gfHwgJydcIlxyXG4gICAgPjwvbWF0LWljb24+XHJcblxyXG4gICAgPGktdGVjaC1pY29uLWJ1dHRvblxyXG4gICAgICAqbmdJZj1cInNlbGVjdENvbmZpZy5zZWFyY2ggJiYgc2VsZWN0Q29uZmlnLmNsZWFyYWJsZSAmJiAhbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQgJiYgISFuZ0NvbnRyb2wuY29udHJvbC52YWx1ZVwiXHJcbiAgICAgIGljb25OYW1lPVwiY2FuY2VsXCJcclxuICAgICAgbWF0U3VmZml4XHJcbiAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RDb25maWcucmVhZE9ubHkgfHwgZmFsc2VcIlxyXG4gICAgICBbbmdDbGFzc109XCJzZWxlY3RDb25maWcucmVhZE9ubHkgfHwgbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQgPyAncmVhZG9ubHktY29sb3InIDogJ2RlZmF1bHQtZm9ybS1pY29uLWNvbG9yJ1wiXHJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7JGV2ZW50LnByZXZlbnREZWZhdWx0KCk7bmdDb250cm9sLmNvbnRyb2wucmVzZXQobnVsbCk7bWF0U2VsZWN0Ll9vbkJsdXIoKTtjbG9zZVBhbmVsQW5kVW5zZXRGb2N1cygpXCJcclxuICAgID5cclxuICAgIDwvaS10ZWNoLWljb24tYnV0dG9uPlxyXG4gICAgPG1hdC1pY29uXHJcbiAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICBjbGFzcz1cInNlbGVjdC1hcnJvd1wiXHJcbiAgICAgIFtjbGFzcy5vcGVuXT1cIm1hdFNlbGVjdC5wYW5lbE9wZW5cIlxyXG4gICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICdyZWFkb25seS1jb2xvcic6IHNlbGVjdENvbmZpZy5yZWFkT25seSB8fCBuZ0NvbnRyb2wuY29udHJvbC5kaXNhYmxlZCxcclxuICAgICAgICAgICAgJ2RlZmF1bHQtZm9ybS1pY29uLWNvbG9yJzogIShzZWxlY3RDb25maWcucmVhZE9ubHkgfHwgbmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZWQpLFxyXG4gICAgICAgICAgICAnbXQtOCc6ICEhbmdDb250cm9sLmNvbnRyb2wudmFsdWUgJiYgc2VsZWN0Q29uZmlnLmNsZWFyYWJsZVxyXG4gICAgICAgICB9XCJcclxuICAgID5cclxuICAgICAga2V5Ym9hcmRfYXJyb3dfZG93blxyXG4gICAgPC9tYXQtaWNvbj5cclxuICAgIDwhLS0gRXJyb3IgTWVzc2FnZSAtLT5cclxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIhIShuZ0NvbnRyb2wuY29udHJvbC5lcnJvcnMgJiYgc3VibWl0VmFsdWUpXCI+XHJcbiAgICAgIHt7IG5nQ29udHJvbC5jb250cm9sIHwgZ2VuZXJhdGVFcnJvck1lc3NhZ2VzIDogc2VsZWN0Q29uZmlnLmxhYmVsIDogc2VsZWN0Q29uZmlnLmRlZmF1bHRQYXR0ZXJuS2V5IH19XHJcbiAgICA8L21hdC1lcnJvcj5cclxuICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICA8IS0tIFJlc2V0IEJ1dHRvbiAtLT5cclxuICA8aS10ZWNoLWNsZWFyLXZhbHVlICpuZ0lmPVwic2VsZWN0Q29uZmlnLnJlc2V0XCIgKHJlc2V0KT1cInJlc2V0VmFsdWUoKVwiPjwvaS10ZWNoLWNsZWFyLXZhbHVlPlxyXG48L2Rpdj5cclxuIl19