@libs-ui/components-dropdown 0.2.10-6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dropdown.component.d.ts +131 -0
- package/esm2022/dropdown.component.mjs +451 -0
- package/esm2022/index.mjs +3 -0
- package/esm2022/interfaces/dropdown.interface.mjs +2 -0
- package/esm2022/interfaces/function-control-event.interface.mjs +2 -0
- package/esm2022/interfaces/index.mjs +3 -0
- package/esm2022/libs-ui-components-dropdown.mjs +5 -0
- package/esm2022/tabs/tabs.component.mjs +23 -0
- package/fesm2022/libs-ui-components-dropdown.mjs +476 -0
- package/fesm2022/libs-ui-components-dropdown.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/interfaces/dropdown.interface.d.ts +55 -0
- package/interfaces/function-control-event.interface.d.ts +11 -0
- package/interfaces/index.d.ts +2 -0
- package/package.json +25 -0
- package/tabs/tabs.component.d.ts +12 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { AsyncPipe } from '@angular/common';
|
|
3
|
+
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, output, signal, untracked } from '@angular/core';
|
|
4
|
+
import { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';
|
|
5
|
+
import { LibsUiComponentsLabelComponent } from '@libs-ui/components-label';
|
|
6
|
+
import { getFieldKeyByType, LibsUiComponentsListComponent } from '@libs-ui/components-list';
|
|
7
|
+
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
8
|
+
import { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';
|
|
9
|
+
import { LibsUiHttpRequestService } from '@libs-ui/services-http-request';
|
|
10
|
+
import { CHARACTER_DATA_EMPTY, cloneDeep, ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_VALID, get, isNil, set } from '@libs-ui/utils';
|
|
11
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
12
|
+
import { LibsUiComponentsDropdownTabsComponent } from './tabs/tabs.component';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@ngx-translate/core";
|
|
15
|
+
export class LibsUiComponentsDropdownComponent {
|
|
16
|
+
/* PROPERTY */
|
|
17
|
+
error = signal(undefined);
|
|
18
|
+
showList = signal(false);
|
|
19
|
+
itemsSelected = signal(undefined);
|
|
20
|
+
loadingDetail = signal(false);
|
|
21
|
+
loadingList = signal(false);
|
|
22
|
+
items = signal([]);
|
|
23
|
+
fieldLabel = signal('labelDisplay');
|
|
24
|
+
popoverItemSelected = signal(undefined);
|
|
25
|
+
labelItemSelectedComputed = computed(this.getLabelItemSelected.bind(this));
|
|
26
|
+
autoSelectedFirstItemCallOutsideBefore = signal(false);
|
|
27
|
+
keysSelected = signal([]);
|
|
28
|
+
popoverFunctionControl = signal(undefined);
|
|
29
|
+
fieldKey = signal('id');
|
|
30
|
+
listFunctionControl = signal(undefined);
|
|
31
|
+
/* INPUT */
|
|
32
|
+
useXssFilter = input(false);
|
|
33
|
+
popoverElementRefCustom = input();
|
|
34
|
+
classInclude = input();
|
|
35
|
+
ignoreStopPropagationEvent = input(false);
|
|
36
|
+
flagMouse = model({ isMouseEnter: false, isMouseEnterContent: false });
|
|
37
|
+
flagMouseContent = model();
|
|
38
|
+
popoverCustomConfig = input();
|
|
39
|
+
isNgContent = input();
|
|
40
|
+
zIndex = input();
|
|
41
|
+
convertItemSelected = input(this.defaultConvertItemSelected.bind(this));
|
|
42
|
+
getPopoverItemSelected = input();
|
|
43
|
+
httpRequestDetailItemById = input();
|
|
44
|
+
lengthKeys = model(0);
|
|
45
|
+
textDisplayWhenNoSelect = input('i18n_select_value');
|
|
46
|
+
textDisplayWhenMultiSelect = input('i18n_selecting_options');
|
|
47
|
+
classIncludeTextDisplayWhenNoSelect = input('libs-ui-font-h5r');
|
|
48
|
+
fieldGetLabel = input();
|
|
49
|
+
labelPopoverConfig = input();
|
|
50
|
+
labelPopoverFullWidth = input(true);
|
|
51
|
+
hasContentUnitRight = input();
|
|
52
|
+
listSearchNoDataTemplateRef = input();
|
|
53
|
+
fieldGetImage = input();
|
|
54
|
+
imageSize = input(16);
|
|
55
|
+
typeShape = input('circle');
|
|
56
|
+
fieldGetIcon = input();
|
|
57
|
+
fieldGetTextAvatar = input('username');
|
|
58
|
+
fieldGetColorAvatar = input();
|
|
59
|
+
classAvatarInclude = input('mr-[8px]', { transform: value => value || 'mr-[8px]' });
|
|
60
|
+
getLastTextAfterSpace = input();
|
|
61
|
+
linkImageError = input();
|
|
62
|
+
showError = input(true);
|
|
63
|
+
showBorderError = model();
|
|
64
|
+
disable = input();
|
|
65
|
+
readonly = input();
|
|
66
|
+
labelConfig = input();
|
|
67
|
+
listSearchConfig = input({ noBorder: true }, { transform: value => value || { noBorder: true } });
|
|
68
|
+
isSearchOnline = input(false);
|
|
69
|
+
listHiddenInputSearch = input();
|
|
70
|
+
listSearchPadding = input();
|
|
71
|
+
listKeySearch = input();
|
|
72
|
+
listDividerClassInclude = input();
|
|
73
|
+
listConfig = input();
|
|
74
|
+
listButtonsOther = input();
|
|
75
|
+
listHasButtonUnSelectOption = input();
|
|
76
|
+
listClickExactly = input();
|
|
77
|
+
listBackgroundCustom = input();
|
|
78
|
+
listMaxItemShow = input(6);
|
|
79
|
+
listKeySelected = model();
|
|
80
|
+
listMultiKeySelected = model();
|
|
81
|
+
listKeysDisable = input(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll
|
|
82
|
+
listKeysHidden = input(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll
|
|
83
|
+
validRequired = input();
|
|
84
|
+
validMaxItemSelected = input();
|
|
85
|
+
changeValidUndefinedResetError = input();
|
|
86
|
+
allowSelectItemMultiple = input();
|
|
87
|
+
focusInputSearch = input(true);
|
|
88
|
+
onlyEmitDataWhenReset = input(); // true khi muốn emit sự kiện thay đổi key
|
|
89
|
+
resetKeyWhenSelectAllKey = input();
|
|
90
|
+
listConfigHasDivider = input(true);
|
|
91
|
+
classIncludeIcon = input('ml-[8px]', { transform: value => value || 'ml-[8px]' });
|
|
92
|
+
classIncludeContent = input();
|
|
93
|
+
listIgnoreClassDisableDefaultWhenUseKeysDisableItem = input(); // bỏ chế độ disable item trên html list view để disable từng phần trong rows
|
|
94
|
+
tabKeyActive = model();
|
|
95
|
+
tabsConfig = input();
|
|
96
|
+
ignoreBorderBottom = input();
|
|
97
|
+
/* OUTPUT */
|
|
98
|
+
outSelectKey = output(); // sử dụng cho type chọn 1.
|
|
99
|
+
outSelectMultiKey = output(); // sử dụng cho type cho phép chọn nhiều.
|
|
100
|
+
outFunctionsControl = output();
|
|
101
|
+
outValidEvent = output();
|
|
102
|
+
outChangStageFlagMouse = output();
|
|
103
|
+
outDataChange = output();
|
|
104
|
+
outClickButtonOther = output();
|
|
105
|
+
outShowList = output();
|
|
106
|
+
outChangeTabKeyActive = output();
|
|
107
|
+
/* INJECT*/
|
|
108
|
+
translate = inject(TranslateService);
|
|
109
|
+
httpRequestService = inject(LibsUiHttpRequestService);
|
|
110
|
+
constructor() {
|
|
111
|
+
effect(() => {
|
|
112
|
+
const listConfig = this.listConfig();
|
|
113
|
+
if (listConfig) {
|
|
114
|
+
untracked(() => this.fieldKey.set(getFieldKeyByType(listConfig, 'id')));
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
effect(() => {
|
|
118
|
+
if (this.listKeySelected() && !this.itemsSelected()) {
|
|
119
|
+
untracked(() => {
|
|
120
|
+
this.handlerSelectedKey({ key: this.listKeySelected(), item: undefined, isClickManual: false });
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
effect(() => {
|
|
125
|
+
if (this.changeValidUndefinedResetError() && this.validRequired()) {
|
|
126
|
+
untracked(() => this.resetError());
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
effect(() => {
|
|
130
|
+
if (this.listMultiKeySelected()) {
|
|
131
|
+
untracked(() => {
|
|
132
|
+
const previousValue = this.keysSelected() || [];
|
|
133
|
+
const currentValue = this.listMultiKeySelected() || [];
|
|
134
|
+
if (previousValue.length !== currentValue.length) {
|
|
135
|
+
this.handlerSelectMultiKey({ keys: currentValue, mapKeys: [], isClickManual: false });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
for (const keyPrevious of previousValue) {
|
|
139
|
+
if (!currentValue.some(keyCurrent => keyCurrent === keyPrevious)) {
|
|
140
|
+
this.handlerSelectMultiKey({ keys: currentValue, mapKeys: [], isClickManual: false });
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
async ngOnInit() {
|
|
149
|
+
const listConfig = this.listConfig();
|
|
150
|
+
if (!this.lengthKeys() && listConfig && (listConfig.autoSelectFirstItem || listConfig.configTemplateCheckbox?.()?.autoSelectAllItem || listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect) && listConfig.httpRequestData) {
|
|
151
|
+
try {
|
|
152
|
+
this.loadingDetail.set(true);
|
|
153
|
+
const httpRequestData = listConfig.httpRequestData();
|
|
154
|
+
const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestData;
|
|
155
|
+
this.httpRequestService.updateArguments(argumentsValue, { ...this.httpRequestService.fakeResponsePagingApi(), dropdownTabKeyActive: this.tabKeyActive }, {}, '', true, false, guideAutoUpdateArgumentsValue);
|
|
156
|
+
const result = await this.httpRequestService.callApi(httpRequestData);
|
|
157
|
+
this.loadingDetail.set(false);
|
|
158
|
+
if (result?.data) {
|
|
159
|
+
this.items.set(result.data);
|
|
160
|
+
this.emitAutoSelectKey(result.data, listConfig.type);
|
|
161
|
+
this.autoSelectedFirstItemCallOutsideBefore.set(true);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.log(error);
|
|
166
|
+
this.items.set([]);
|
|
167
|
+
this.loadingDetail.set(false);
|
|
168
|
+
}
|
|
169
|
+
this.outDataChange.emit(this.items());
|
|
170
|
+
}
|
|
171
|
+
this.outFunctionsControl.emit({
|
|
172
|
+
reset: this.reset.bind(this),
|
|
173
|
+
valid: this.valid.bind(this),
|
|
174
|
+
resetError: this.resetError.bind(this),
|
|
175
|
+
setError: this.setError.bind(this),
|
|
176
|
+
removeList: async () => this.popoverFunctionControl()?.removePopoverOverlay(),
|
|
177
|
+
getDisable: async () => this.disable() ?? false,
|
|
178
|
+
updateLabelItemSelected: async (label) => this.itemsSelected.update(value => ({ ...value, [this.fieldLabel()]: this.translate.instant(label) })),
|
|
179
|
+
refreshList: async () => this.listFunctionControl()?.refresh(),
|
|
180
|
+
setItemSelectedByKey: this.setItemSelectedByKey.bind(this)
|
|
181
|
+
});
|
|
182
|
+
this.checkValid(true);
|
|
183
|
+
}
|
|
184
|
+
/* FUNCTIONS */
|
|
185
|
+
defaultConvertItemSelected(item) {
|
|
186
|
+
if (!item) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const fieldGetLabel = this.fieldGetLabel();
|
|
190
|
+
const value = fieldGetLabel ? get(item, fieldGetLabel) : undefined;
|
|
191
|
+
set(item, this.fieldLabel(), value ?? get(item, 'label') ?? get(item, 'name') ?? ' ');
|
|
192
|
+
}
|
|
193
|
+
getLabelItemSelected() {
|
|
194
|
+
let label = ' ';
|
|
195
|
+
if (!this.lengthKeys()) {
|
|
196
|
+
label = this.textDisplayWhenNoSelect();
|
|
197
|
+
}
|
|
198
|
+
if (this.lengthKeys() > 1) {
|
|
199
|
+
label = this.textDisplayWhenMultiSelect();
|
|
200
|
+
}
|
|
201
|
+
if (this.lengthKeys() === 1) {
|
|
202
|
+
label = this.itemsSelected()?.[this.fieldLabel()] || this.textDisplayWhenNoSelect();
|
|
203
|
+
}
|
|
204
|
+
return label;
|
|
205
|
+
}
|
|
206
|
+
emitAutoSelectKey(items, type) {
|
|
207
|
+
const listConfig = this.listConfig();
|
|
208
|
+
if (!items || !items.length || !listConfig || (!listConfig.autoSelectFirstItem && !listConfig.configTemplateCheckbox?.()?.autoSelectAllItem && !listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect)) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const flatItemsSupportAutoSelect = listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect;
|
|
212
|
+
if (type === 'group' && flatItemsSupportAutoSelect) {
|
|
213
|
+
items = flatItemsSupportAutoSelect(items);
|
|
214
|
+
}
|
|
215
|
+
if (listConfig.autoSelectFirstItem) {
|
|
216
|
+
const item = items[0];
|
|
217
|
+
const key = get(item, this.fieldKey());
|
|
218
|
+
if (type === 'radio' || type === 'text') {
|
|
219
|
+
this.handlerSelectedKey({ key, item, isClickManual: false });
|
|
220
|
+
this.listKeySelected.set(key);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
this.handlerSelectMultiKey({ keys: [key], mapKeys: [{ key, item, isClickManual: false }], isClickManual: false });
|
|
224
|
+
this.listMultiKeySelected.set([key]);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (type !== 'checkbox' && type !== 'group') {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const keys = [];
|
|
231
|
+
const mapKeys = [];
|
|
232
|
+
items.forEach(item => {
|
|
233
|
+
const key = get(item, this.fieldKey());
|
|
234
|
+
if (isNil(key)) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
keys.push(key);
|
|
238
|
+
mapKeys.push({ key, item, isClickManual: false });
|
|
239
|
+
});
|
|
240
|
+
this.handlerSelectMultiKey({ keys, mapKeys, isClickManual: false });
|
|
241
|
+
this.listMultiKeySelected.set(keys);
|
|
242
|
+
}
|
|
243
|
+
handlerEvent(type) {
|
|
244
|
+
if (type === 'click') {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (type === 'remove') {
|
|
248
|
+
this.showList.set(false);
|
|
249
|
+
this.outShowList.emit(this.showList());
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
this.showList.set(true);
|
|
253
|
+
this.outShowList.emit(this.showList());
|
|
254
|
+
}
|
|
255
|
+
handlerDataChange(items) {
|
|
256
|
+
this.items.set(items);
|
|
257
|
+
this.popoverFunctionControl()?.updatePopoverOverlayPosition();
|
|
258
|
+
this.outDataChange.emit(this.items());
|
|
259
|
+
}
|
|
260
|
+
handlerChangeFlagMouse(event) {
|
|
261
|
+
this.flagMouseContent.set(event);
|
|
262
|
+
this.mergeFlagMouse();
|
|
263
|
+
}
|
|
264
|
+
handlerClickButtonOther(button) {
|
|
265
|
+
this.outClickButtonOther.emit(button);
|
|
266
|
+
this.popoverFunctionControl()?.removePopoverOverlay();
|
|
267
|
+
}
|
|
268
|
+
handlerPopoverControlEvent(event) {
|
|
269
|
+
this.popoverFunctionControl.set(event);
|
|
270
|
+
}
|
|
271
|
+
async handlerSelectedKey(event) {
|
|
272
|
+
const key = event?.key;
|
|
273
|
+
const item = event?.item;
|
|
274
|
+
const isClickManual = event?.isClickManual;
|
|
275
|
+
this.lengthKeys.set(!(isNil(key) || (typeof key === 'string' && key === '')) ? 1 : 0);
|
|
276
|
+
this.listKeySelected.set(key);
|
|
277
|
+
if (!this.allowSelectItemMultiple() && this.itemsSelected() && get(this.itemsSelected(), this.fieldKey()) === key) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (isClickManual) {
|
|
281
|
+
if (!(isNil(key) || (typeof key === 'string' && key === '')) && (item || this.itemsSelected())) {
|
|
282
|
+
this.popoverFunctionControl()?.removePopoverOverlay();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
this.checkValid();
|
|
286
|
+
if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {
|
|
287
|
+
let itemSelected = await this.setItemSelectedByKey(key);
|
|
288
|
+
if (!itemSelected) {
|
|
289
|
+
itemSelected = {
|
|
290
|
+
[this.fieldKey()]: key,
|
|
291
|
+
[this.fieldLabel()]: CHARACTER_DATA_EMPTY
|
|
292
|
+
};
|
|
293
|
+
this.itemsSelected.set(itemSelected);
|
|
294
|
+
}
|
|
295
|
+
if (event) {
|
|
296
|
+
event.item = itemSelected;
|
|
297
|
+
}
|
|
298
|
+
this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
this.itemsSelected.set(cloneDeep(item));
|
|
302
|
+
this.buildDisplay();
|
|
303
|
+
this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
|
|
304
|
+
}
|
|
305
|
+
async handlerSelectMultiKey(event, isClickManual = false) {
|
|
306
|
+
if (this.listConfig()?.configTemplateGroup?.()?.singleSelectItem && event?.mapKeys?.length) {
|
|
307
|
+
const itemClickManual = event.mapKeys.find(mapKey => mapKey.item && mapKey.item.isCheckManual);
|
|
308
|
+
if (itemClickManual) {
|
|
309
|
+
setTimeout(() => itemClickManual.item.isCheckManual = false);
|
|
310
|
+
event.keys = [itemClickManual.key];
|
|
311
|
+
event.mapKeys = [itemClickManual];
|
|
312
|
+
this.popoverFunctionControl()?.removePopoverOverlay();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
this.keysSelected.set([...(event?.keys || [])]);
|
|
316
|
+
this.listMultiKeySelected.set([...(event?.keys || [])]);
|
|
317
|
+
this.lengthKeys.set(event?.keys?.length || 0);
|
|
318
|
+
this.checkValid();
|
|
319
|
+
if (this.lengthKeys() > 1) {
|
|
320
|
+
this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const key = event?.keys[0];
|
|
324
|
+
let item = event?.mapKeys?.find(item => item.key === key)?.item;
|
|
325
|
+
if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {
|
|
326
|
+
item = await this.setItemSelectedByKey(key);
|
|
327
|
+
this.outSelectMultiKey.emit({ keys: [key], mapKeys: [{ key, item }], isClickManual, tabKeyActive: this.tabKeyActive() });
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
this.itemsSelected.set(cloneDeep(item));
|
|
331
|
+
this.buildDisplay();
|
|
332
|
+
this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });
|
|
333
|
+
}
|
|
334
|
+
async setItemSelectedByKey(key) {
|
|
335
|
+
const httpRequestDetailItemById = this.httpRequestDetailItemById();
|
|
336
|
+
if (!httpRequestDetailItemById || this.loadingDetail()) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
try {
|
|
340
|
+
this.loadingDetail.set(true);
|
|
341
|
+
const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestDetailItemById;
|
|
342
|
+
this.httpRequestService.updateArguments(argumentsValue, { key, dropdownTabKeyActive: this.tabKeyActive() }, {}, '', false, false, guideAutoUpdateArgumentsValue);
|
|
343
|
+
const result = await this.httpRequestService.callApi(httpRequestDetailItemById);
|
|
344
|
+
const item = cloneDeep(result.data[0] || result.data);
|
|
345
|
+
this.itemsSelected.set(item);
|
|
346
|
+
this.buildDisplay();
|
|
347
|
+
this.loadingDetail.set(false);
|
|
348
|
+
return item;
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
console.log(error);
|
|
352
|
+
this.loadingDetail.set(false);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
handlerChangeTab() {
|
|
357
|
+
this.outChangeTabKeyActive.emit(this.tabKeyActive());
|
|
358
|
+
}
|
|
359
|
+
handlerLoadingList(event) {
|
|
360
|
+
this.loadingList.set(event);
|
|
361
|
+
}
|
|
362
|
+
async setError(error) {
|
|
363
|
+
this.error.set({ message: error });
|
|
364
|
+
this.showBorderError.set(true);
|
|
365
|
+
}
|
|
366
|
+
async valid() {
|
|
367
|
+
if (this.error()?.message) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
return this.checkValid();
|
|
371
|
+
}
|
|
372
|
+
checkValid(validateDefault) {
|
|
373
|
+
this.error.set(undefined);
|
|
374
|
+
const valid = { required: true, limitMaxItemSelect: true };
|
|
375
|
+
const validMaxItemSelected = this.validMaxItemSelected();
|
|
376
|
+
if (this.validRequired() && !this.lengthKeys()) {
|
|
377
|
+
valid.required = false;
|
|
378
|
+
}
|
|
379
|
+
if (validMaxItemSelected && this.lengthKeys() > validMaxItemSelected.value) {
|
|
380
|
+
valid.limitMaxItemSelect = false;
|
|
381
|
+
}
|
|
382
|
+
if (!validateDefault && valid.required === false) {
|
|
383
|
+
const validRequired = this.validRequired();
|
|
384
|
+
this.error.set({ ...(validRequired || {}), message: validRequired?.message || ERROR_MESSAGE_EMPTY_VALID });
|
|
385
|
+
}
|
|
386
|
+
if (!validateDefault && !this.error() && valid.limitMaxItemSelect === false) {
|
|
387
|
+
const validMaxItemSelected = this.validMaxItemSelected();
|
|
388
|
+
this.error.set({ ...(validMaxItemSelected || {}), message: validMaxItemSelected?.message || ERROR_MESSAGE_MAX_VALID, interpolateParams: { value: validMaxItemSelected?.value } });
|
|
389
|
+
}
|
|
390
|
+
this.outValidEvent.emit(valid.required && valid.limitMaxItemSelect);
|
|
391
|
+
return valid.required && valid.limitMaxItemSelect;
|
|
392
|
+
}
|
|
393
|
+
async resetError() {
|
|
394
|
+
this.error.set(undefined);
|
|
395
|
+
this.showBorderError.set(false);
|
|
396
|
+
}
|
|
397
|
+
handlerListFunctionsControl(event) {
|
|
398
|
+
this.listFunctionControl.set(event);
|
|
399
|
+
}
|
|
400
|
+
handlerChangStageFlagMouse(flag) {
|
|
401
|
+
this.flagMouse.set(flag);
|
|
402
|
+
this.mergeFlagMouse();
|
|
403
|
+
}
|
|
404
|
+
async reset() {
|
|
405
|
+
this.itemsSelected.set(undefined);
|
|
406
|
+
this.lengthKeys.set(0);
|
|
407
|
+
this.listFunctionControl()?.resetKeySelected();
|
|
408
|
+
if (!this.showList() && this.onlyEmitDataWhenReset()) {
|
|
409
|
+
this.outSelectKey.emit(undefined);
|
|
410
|
+
this.outSelectMultiKey.emit(undefined);
|
|
411
|
+
}
|
|
412
|
+
this.listKeySelected.set(undefined);
|
|
413
|
+
this.listMultiKeySelected.set(undefined);
|
|
414
|
+
this.keysSelected.set([]);
|
|
415
|
+
this.error.set(undefined);
|
|
416
|
+
}
|
|
417
|
+
async buildDisplay() {
|
|
418
|
+
if (this.itemsSelected()) {
|
|
419
|
+
this.convertItemSelected()(this.itemsSelected(), this.translate);
|
|
420
|
+
const getPopoverItemSelected = this.getPopoverItemSelected();
|
|
421
|
+
if (getPopoverItemSelected) {
|
|
422
|
+
this.popoverItemSelected.set(await getPopoverItemSelected(this.itemsSelected, this.translate));
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
mergeFlagMouse() {
|
|
427
|
+
const flag = { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false };
|
|
428
|
+
if (this.flagMouseContent()?.isMouseEnter || this.flagMouse().isMouseEnter) {
|
|
429
|
+
flag.isMouseEnter = true;
|
|
430
|
+
}
|
|
431
|
+
if (this.flagMouseContent()?.isMouseEnterContent || this.flagMouse().isMouseEnterContent) {
|
|
432
|
+
flag.isMouseEnterContent = true;
|
|
433
|
+
}
|
|
434
|
+
if (this.flagMouseContent()?.isContainerHasScroll || this.flagMouse().isContainerHasScroll) {
|
|
435
|
+
flag.isContainerHasScroll = true;
|
|
436
|
+
}
|
|
437
|
+
this.outChangStageFlagMouse.emit(flag);
|
|
438
|
+
}
|
|
439
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
440
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsDropdownComponent, isStandalone: true, selector: "libs_ui-components-dropdown", inputs: { useXssFilter: { classPropertyName: "useXssFilter", publicName: "useXssFilter", isSignal: true, isRequired: false, transformFunction: null }, popoverElementRefCustom: { classPropertyName: "popoverElementRefCustom", publicName: "popoverElementRefCustom", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, flagMouse: { classPropertyName: "flagMouse", publicName: "flagMouse", isSignal: true, isRequired: false, transformFunction: null }, flagMouseContent: { classPropertyName: "flagMouseContent", publicName: "flagMouseContent", isSignal: true, isRequired: false, transformFunction: null }, popoverCustomConfig: { classPropertyName: "popoverCustomConfig", publicName: "popoverCustomConfig", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, convertItemSelected: { classPropertyName: "convertItemSelected", publicName: "convertItemSelected", isSignal: true, isRequired: false, transformFunction: null }, getPopoverItemSelected: { classPropertyName: "getPopoverItemSelected", publicName: "getPopoverItemSelected", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDetailItemById: { classPropertyName: "httpRequestDetailItemById", publicName: "httpRequestDetailItemById", isSignal: true, isRequired: false, transformFunction: null }, lengthKeys: { classPropertyName: "lengthKeys", publicName: "lengthKeys", isSignal: true, isRequired: false, transformFunction: null }, textDisplayWhenNoSelect: { classPropertyName: "textDisplayWhenNoSelect", publicName: "textDisplayWhenNoSelect", isSignal: true, isRequired: false, transformFunction: null }, textDisplayWhenMultiSelect: { classPropertyName: "textDisplayWhenMultiSelect", publicName: "textDisplayWhenMultiSelect", isSignal: true, isRequired: false, transformFunction: null }, classIncludeTextDisplayWhenNoSelect: { classPropertyName: "classIncludeTextDisplayWhenNoSelect", publicName: "classIncludeTextDisplayWhenNoSelect", isSignal: true, isRequired: false, transformFunction: null }, fieldGetLabel: { classPropertyName: "fieldGetLabel", publicName: "fieldGetLabel", isSignal: true, isRequired: false, transformFunction: null }, labelPopoverConfig: { classPropertyName: "labelPopoverConfig", publicName: "labelPopoverConfig", isSignal: true, isRequired: false, transformFunction: null }, labelPopoverFullWidth: { classPropertyName: "labelPopoverFullWidth", publicName: "labelPopoverFullWidth", isSignal: true, isRequired: false, transformFunction: null }, hasContentUnitRight: { classPropertyName: "hasContentUnitRight", publicName: "hasContentUnitRight", isSignal: true, isRequired: false, transformFunction: null }, listSearchNoDataTemplateRef: { classPropertyName: "listSearchNoDataTemplateRef", publicName: "listSearchNoDataTemplateRef", isSignal: true, isRequired: false, transformFunction: null }, fieldGetImage: { classPropertyName: "fieldGetImage", publicName: "fieldGetImage", isSignal: true, isRequired: false, transformFunction: null }, imageSize: { classPropertyName: "imageSize", publicName: "imageSize", isSignal: true, isRequired: false, transformFunction: null }, typeShape: { classPropertyName: "typeShape", publicName: "typeShape", isSignal: true, isRequired: false, transformFunction: null }, fieldGetIcon: { classPropertyName: "fieldGetIcon", publicName: "fieldGetIcon", isSignal: true, isRequired: false, transformFunction: null }, fieldGetTextAvatar: { classPropertyName: "fieldGetTextAvatar", publicName: "fieldGetTextAvatar", isSignal: true, isRequired: false, transformFunction: null }, fieldGetColorAvatar: { classPropertyName: "fieldGetColorAvatar", publicName: "fieldGetColorAvatar", isSignal: true, isRequired: false, transformFunction: null }, classAvatarInclude: { classPropertyName: "classAvatarInclude", publicName: "classAvatarInclude", isSignal: true, isRequired: false, transformFunction: null }, getLastTextAfterSpace: { classPropertyName: "getLastTextAfterSpace", publicName: "getLastTextAfterSpace", isSignal: true, isRequired: false, transformFunction: null }, linkImageError: { classPropertyName: "linkImageError", publicName: "linkImageError", isSignal: true, isRequired: false, transformFunction: null }, showError: { classPropertyName: "showError", publicName: "showError", isSignal: true, isRequired: false, transformFunction: null }, showBorderError: { classPropertyName: "showBorderError", publicName: "showBorderError", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, listSearchConfig: { classPropertyName: "listSearchConfig", publicName: "listSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, listHiddenInputSearch: { classPropertyName: "listHiddenInputSearch", publicName: "listHiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null }, listSearchPadding: { classPropertyName: "listSearchPadding", publicName: "listSearchPadding", isSignal: true, isRequired: false, transformFunction: null }, listKeySearch: { classPropertyName: "listKeySearch", publicName: "listKeySearch", isSignal: true, isRequired: false, transformFunction: null }, listDividerClassInclude: { classPropertyName: "listDividerClassInclude", publicName: "listDividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, listConfig: { classPropertyName: "listConfig", publicName: "listConfig", isSignal: true, isRequired: false, transformFunction: null }, listButtonsOther: { classPropertyName: "listButtonsOther", publicName: "listButtonsOther", isSignal: true, isRequired: false, transformFunction: null }, listHasButtonUnSelectOption: { classPropertyName: "listHasButtonUnSelectOption", publicName: "listHasButtonUnSelectOption", isSignal: true, isRequired: false, transformFunction: null }, listClickExactly: { classPropertyName: "listClickExactly", publicName: "listClickExactly", isSignal: true, isRequired: false, transformFunction: null }, listBackgroundCustom: { classPropertyName: "listBackgroundCustom", publicName: "listBackgroundCustom", isSignal: true, isRequired: false, transformFunction: null }, listMaxItemShow: { classPropertyName: "listMaxItemShow", publicName: "listMaxItemShow", isSignal: true, isRequired: false, transformFunction: null }, listKeySelected: { classPropertyName: "listKeySelected", publicName: "listKeySelected", isSignal: true, isRequired: false, transformFunction: null }, listMultiKeySelected: { classPropertyName: "listMultiKeySelected", publicName: "listMultiKeySelected", isSignal: true, isRequired: false, transformFunction: null }, listKeysDisable: { classPropertyName: "listKeysDisable", publicName: "listKeysDisable", isSignal: true, isRequired: false, transformFunction: null }, listKeysHidden: { classPropertyName: "listKeysHidden", publicName: "listKeysHidden", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMaxItemSelected: { classPropertyName: "validMaxItemSelected", publicName: "validMaxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, changeValidUndefinedResetError: { classPropertyName: "changeValidUndefinedResetError", publicName: "changeValidUndefinedResetError", isSignal: true, isRequired: false, transformFunction: null }, allowSelectItemMultiple: { classPropertyName: "allowSelectItemMultiple", publicName: "allowSelectItemMultiple", isSignal: true, isRequired: false, transformFunction: null }, focusInputSearch: { classPropertyName: "focusInputSearch", publicName: "focusInputSearch", isSignal: true, isRequired: false, transformFunction: null }, onlyEmitDataWhenReset: { classPropertyName: "onlyEmitDataWhenReset", publicName: "onlyEmitDataWhenReset", isSignal: true, isRequired: false, transformFunction: null }, resetKeyWhenSelectAllKey: { classPropertyName: "resetKeyWhenSelectAllKey", publicName: "resetKeyWhenSelectAllKey", isSignal: true, isRequired: false, transformFunction: null }, listConfigHasDivider: { classPropertyName: "listConfigHasDivider", publicName: "listConfigHasDivider", isSignal: true, isRequired: false, transformFunction: null }, classIncludeIcon: { classPropertyName: "classIncludeIcon", publicName: "classIncludeIcon", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContent: { classPropertyName: "classIncludeContent", publicName: "classIncludeContent", isSignal: true, isRequired: false, transformFunction: null }, listIgnoreClassDisableDefaultWhenUseKeysDisableItem: { classPropertyName: "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", publicName: "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, tabKeyActive: { classPropertyName: "tabKeyActive", publicName: "tabKeyActive", isSignal: true, isRequired: false, transformFunction: null }, tabsConfig: { classPropertyName: "tabsConfig", publicName: "tabsConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderBottom: { classPropertyName: "ignoreBorderBottom", publicName: "ignoreBorderBottom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { flagMouse: "flagMouseChange", flagMouseContent: "flagMouseContentChange", lengthKeys: "lengthKeysChange", showBorderError: "showBorderErrorChange", listKeySelected: "listKeySelectedChange", listMultiKeySelected: "listMultiKeySelectedChange", tabKeyActive: "tabKeyActiveChange", outSelectKey: "outSelectKey", outSelectMultiKey: "outSelectMultiKey", outFunctionsControl: "outFunctionsControl", outValidEvent: "outValidEvent", outChangStageFlagMouse: "outChangStageFlagMouse", outDataChange: "outDataChange", outClickButtonOther: "outClickButtonOther", outShowList: "outShowList", outChangeTabKeyActive: "outChangeTabKeyActive" }, ngImport: i0, template: "<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as label) {\n <libs_ui-components-label [classInclude]=\"label.classInclude\"\n [labelLeft]=\"label.labelLeft\"\n [labelLeftClass]=\"label.labelLeftClass\"\n [required]=\"label.required \"\n [description]=\"label.description\"\n [descriptionClass]=\"label.descriptionClass\"\n [labelRight]=\"label.labelRight\"\n [labelRightClass]=\"label.labelRightClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [buttonsLeft]=\"label.buttonsLeft\"\n [buttonsRight]=\"label.buttonsRight\"\n [disableButtonsLeft]=\"label.disableButtonsLeft || disable() || loadingDetail()\"\n [disableButtonsRight]=\"label.disableButtonsRight || disable() || loadingDetail()\"\n [hasToggle]=\"label.hasToggle\"\n [toggleActive]=\"label.toggleActive\"\n [toggleDisable]=\"label.toggleDisable || disable() || loadingDetail()\"\n [popover]=\"label.popover\"\n [iconPopoverClass]=\"label.iconPopoverClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [limitLength]=\"label.limitLength\"\n [buttonsDescription]=\"label.buttonsDescription\"\n [disableButtonsDescription]=\"label.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"label.buttonsDescriptionContainerClass\"\n [count]=\"label.count\" />\n }\n <libs_ui-components-popover [ignoreShowPopover]=\"disable() || readonly() || loadingDetail()\"\n [class]=\"classInclude() || 'w-full'\"\n [mode]=\"'click-toggle'\"\n [flagMouse]=\"flagMouse()\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [elementRefCustom]=\"popoverElementRefCustom()\"\n [config]=\"{\n animationConfig: popoverCustomConfig()?.animationConfig || {},\n zIndex: zIndex() ?? 1000,\n widthByParent: popoverCustomConfig()?.widthByParent ?? true,\n parentBorderWidth: popoverCustomConfig()?.parentBorderWidth ?? 0,\n maxHeight: popoverCustomConfig()?.maxHeight ?? 2048,\n maxWidth: popoverCustomConfig()?.maxWidth ?? 2048,\n direction: popoverCustomConfig()?.direction ?? 'bottom',\n template: listViewEl,\n whiteTheme: true,\n timerDestroy: popoverCustomConfig()?.timerDestroy ?? 0,\n ignoreArrow: popoverCustomConfig()?.ignoreArrow ?? true,\n directionDistance: 2,\n classInclude: 'rounded-[4px] ' + (popoverCustomConfig()?.classInclude ?? 'libs-ui-border-general ') + ((listConfig()?.type === 'text' && listConfig()?.configTemplateText?.()?.notUseVirtualScroll) ? ' overflow-hidden' : ''),\n position: popoverCustomConfig()?.position || { mode: 'start', distance: 0 },\n width: popoverCustomConfig()?.width\n }\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outEvent)=\"handlerEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n @if (!isNgContent()) {\n <div [class]=\"'libs-ui-dropdown ' + classIncludeContent()\"\n [class.libs-ui-border-general]=\"!error() && !showBorderError() && !showList()\"\n [class.libs-ui-border-primary-focus-general]=\"!error() && !showBorderError() && showList()\"\n [class.libs-ui-border-error-general]=\"error() || showBorderError()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.cursor-pointer]=\"!(disable() || loadingDetail() || readonly())\"\n [class.libs-ui-disable]=\"disable() || loadingDetail()\"\n [class.libs-ui-disable-background]=\"disable() || loadingDetail()\"\n [class.pointer-events-none]=\"loadingDetail()\"\n [class.rounded-tr-0]=\"hasContentUnitRight()\"\n [class.rounded-br-0]=\"hasContentUnitRight()\">\n <div class=\"flex items-center w-full\">\n <div class=\"flex items-center w-full relative\">\n <div class=\"flex items-center w-full absolute\">\n @if (lengthKeys() === 1) {\n @if (itemsSelected(); as itemsSelected) {\n @if (fieldGetImage(); as fieldGetImage) {\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude()\"\n [typeShape]=\"typeShape()\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"itemsSelected[fieldGetImage]\"\n [linkAvatarError]=\"linkImageError()\"\n [idGenColor]=\"itemsSelected[fieldGetColorAvatar() || fieldGetTextAvatar()]\"\n [textAvatar]=\"itemsSelected[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n }\n @if (fieldGetIcon(); as fieldGetIcon) {\n <i [class]=\"itemsSelected[fieldGetIcon] + ' mr-[8px]'\"></i>\n }\n }\n }\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"(labelPopoverFullWidth() ? 'w-100 ' : '') + classIncludeTextDisplayWhenNoSelect()\"\n [innerHTML]=\"labelItemSelectedComputed() | translate:{value: lengthKeys()} | LibsUiPipesSecurityTrustPipe:'html':useXssFilter() | async\"\n [config]=\"{maxWidth: labelPopoverConfig()?.maxWidth || 250, direction: 'top', zIndex: labelPopoverConfig()?.zIndex, timerDestroy: labelPopoverConfig()?.timerDestroy || 0}\"\n [ignoreStopPropagationEvent]=\"true\" />\n @if (popoverItemSelected(); as popoverItemSelected) {\n <libs_ui-components-popover [type]=\"popoverItemSelected.type || 'other'\"\n [config]=\"popoverItemSelected.config || {}\">\n @if (popoverItemSelected.dataView) {\n <div [innerHtml]=\"popoverItemSelected.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline text-[16px] mx-[8px]\"> </i>\n }\n </libs_ui-components-popover>\n }\n </div>\n </div>\n <i class=\"text-[16px] libs-ui-icon-move-right rotate-90 {{ classIncludeIcon() }}\"\n [class.text-[#6a7383]]=\"!readonly() && !classIncludeIcon()\"\n [class.text-[#9ca2ad]]=\"(readonly() || disable()) && !classIncludeIcon()\"></i>\n </div>\n </div>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n @if (showError()) {\n @if (error(); as error) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\"\n [innerHtml]=\"(error.message || ' ') | translate:(error.interpolateParams || {})\">\n </div>\n }\n }\n</div>\n<ng-template #listViewEl>\n <div style=\"display: flex; flex-direction: column;\">\n @if (tabsConfig()) {\n <libs_ui-components-dropdown-tabs [tabsConfig]=\"tabsConfig()\"\n [(tabKeyActive)]=\"tabKeyActive\"\n [ignoreBorderBottom]=\"ignoreBorderBottom()\"\n [disable]=\"disable() || loadingDetail() || loadingList()\"\n (outChange)=\"handlerChangeTab()\" />\n }\n <libs_ui-components-list [searchConfig]=\"listSearchConfig()\"\n [isSearchOnline]=\"isSearchOnline()\"\n [dropdownTabKeyActive]=\"tabKeyActive()\"\n [keySearch]=\"listKeySearch()\"\n [config]=\"listConfig()\"\n [autoSelectedFirstItemCallOutsideBefore]=\"autoSelectedFirstItemCallOutsideBefore()\"\n [paddingLeftItem]=\"popoverCustomConfig()?.paddingLeftItem ?? true\"\n [disable]=\"disable() || loadingDetail()\"\n [hiddenInputSearch]=\"listHiddenInputSearch()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"(listConfig()?.type === 'text' && listConfig()?.configTemplateText?.()?.notUseVirtualScroll) ? 0 : listMaxItemShow()\"\n [keySelected]=\"listKeySelected()\"\n [multiKeySelected]=\"listMultiKeySelected()\"\n [clickExactly]=\"popoverCustomConfig()?.clickExactly ?? false\"\n [dividerClassInclude]=\"listSearchConfig() ? listDividerClassInclude() : 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundCustom()\"\n [keysDisableItem]=\"listKeysDisable()\"\n [keysHiddenItem]=\"listKeysHidden()\"\n [hasButtonUnSelectOption]=\"listHasButtonUnSelectOption() ?? (!popoverCustomConfig() && !labelConfig()?.required && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [focusInputSearch]=\"focusInputSearch()\"\n [zIndex]=\"zIndex()\"\n [resetKeyWhenSelectAllKeyDropdown]=\"resetKeyWhenSelectAllKey()\"\n [ignoreClassDisableDefaultWhenUseKeysDisableItem]=\"listIgnoreClassDisableDefaultWhenUseKeysDisableItem()\"\n [hasDivider]=\"listConfigHasDivider()\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event, true)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outFunctionsControl)=\"handlerListFunctionsControl($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoadingList($event)\" />\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:flex;flex-direction:column}:host .libs-ui-dropdown{position:relative;width:100%;min-height:32px;display:flex;align-items:center;background-color:#fff;padding:0 16px;border-radius:4px;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["getLastTextAfterSpace", "typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "idGenColor", "textAvatar", "classImageInclude"], outputs: ["outAvatarError"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "itemChangeUnSelect", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }, { kind: "component", type: LibsUiComponentsDropdownTabsComponent, selector: "libs_ui-components-dropdown-tabs", inputs: ["ignoreBorderBottom", "tabsConfig", "tabKeyActive", "disable"], outputs: ["tabKeyActiveChange", "outChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
441
|
+
}
|
|
442
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDropdownComponent, decorators: [{
|
|
443
|
+
type: Component,
|
|
444
|
+
args: [{ selector: 'libs_ui-components-dropdown', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
445
|
+
TranslateModule, LibsUiPipesSecurityTrustPipe, AsyncPipe,
|
|
446
|
+
LibsUiComponentsLabelComponent, LibsUiComponentsPopoverComponent,
|
|
447
|
+
LibsUiComponentsAvatarComponent, LibsUiComponentsListComponent,
|
|
448
|
+
LibsUiComponentsDropdownTabsComponent
|
|
449
|
+
], template: "<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as label) {\n <libs_ui-components-label [classInclude]=\"label.classInclude\"\n [labelLeft]=\"label.labelLeft\"\n [labelLeftClass]=\"label.labelLeftClass\"\n [required]=\"label.required \"\n [description]=\"label.description\"\n [descriptionClass]=\"label.descriptionClass\"\n [labelRight]=\"label.labelRight\"\n [labelRightClass]=\"label.labelRightClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [buttonsLeft]=\"label.buttonsLeft\"\n [buttonsRight]=\"label.buttonsRight\"\n [disableButtonsLeft]=\"label.disableButtonsLeft || disable() || loadingDetail()\"\n [disableButtonsRight]=\"label.disableButtonsRight || disable() || loadingDetail()\"\n [hasToggle]=\"label.hasToggle\"\n [toggleActive]=\"label.toggleActive\"\n [toggleDisable]=\"label.toggleDisable || disable() || loadingDetail()\"\n [popover]=\"label.popover\"\n [iconPopoverClass]=\"label.iconPopoverClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [limitLength]=\"label.limitLength\"\n [buttonsDescription]=\"label.buttonsDescription\"\n [disableButtonsDescription]=\"label.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"label.buttonsDescriptionContainerClass\"\n [count]=\"label.count\" />\n }\n <libs_ui-components-popover [ignoreShowPopover]=\"disable() || readonly() || loadingDetail()\"\n [class]=\"classInclude() || 'w-full'\"\n [mode]=\"'click-toggle'\"\n [flagMouse]=\"flagMouse()\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [elementRefCustom]=\"popoverElementRefCustom()\"\n [config]=\"{\n animationConfig: popoverCustomConfig()?.animationConfig || {},\n zIndex: zIndex() ?? 1000,\n widthByParent: popoverCustomConfig()?.widthByParent ?? true,\n parentBorderWidth: popoverCustomConfig()?.parentBorderWidth ?? 0,\n maxHeight: popoverCustomConfig()?.maxHeight ?? 2048,\n maxWidth: popoverCustomConfig()?.maxWidth ?? 2048,\n direction: popoverCustomConfig()?.direction ?? 'bottom',\n template: listViewEl,\n whiteTheme: true,\n timerDestroy: popoverCustomConfig()?.timerDestroy ?? 0,\n ignoreArrow: popoverCustomConfig()?.ignoreArrow ?? true,\n directionDistance: 2,\n classInclude: 'rounded-[4px] ' + (popoverCustomConfig()?.classInclude ?? 'libs-ui-border-general ') + ((listConfig()?.type === 'text' && listConfig()?.configTemplateText?.()?.notUseVirtualScroll) ? ' overflow-hidden' : ''),\n position: popoverCustomConfig()?.position || { mode: 'start', distance: 0 },\n width: popoverCustomConfig()?.width\n }\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outEvent)=\"handlerEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n @if (!isNgContent()) {\n <div [class]=\"'libs-ui-dropdown ' + classIncludeContent()\"\n [class.libs-ui-border-general]=\"!error() && !showBorderError() && !showList()\"\n [class.libs-ui-border-primary-focus-general]=\"!error() && !showBorderError() && showList()\"\n [class.libs-ui-border-error-general]=\"error() || showBorderError()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.cursor-pointer]=\"!(disable() || loadingDetail() || readonly())\"\n [class.libs-ui-disable]=\"disable() || loadingDetail()\"\n [class.libs-ui-disable-background]=\"disable() || loadingDetail()\"\n [class.pointer-events-none]=\"loadingDetail()\"\n [class.rounded-tr-0]=\"hasContentUnitRight()\"\n [class.rounded-br-0]=\"hasContentUnitRight()\">\n <div class=\"flex items-center w-full\">\n <div class=\"flex items-center w-full relative\">\n <div class=\"flex items-center w-full absolute\">\n @if (lengthKeys() === 1) {\n @if (itemsSelected(); as itemsSelected) {\n @if (fieldGetImage(); as fieldGetImage) {\n <libs_ui-components-avatar [classInclude]=\"classAvatarInclude()\"\n [typeShape]=\"typeShape()\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"itemsSelected[fieldGetImage]\"\n [linkAvatarError]=\"linkImageError()\"\n [idGenColor]=\"itemsSelected[fieldGetColorAvatar() || fieldGetTextAvatar()]\"\n [textAvatar]=\"itemsSelected[fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\" />\n }\n @if (fieldGetIcon(); as fieldGetIcon) {\n <i [class]=\"itemsSelected[fieldGetIcon] + ' mr-[8px]'\"></i>\n }\n }\n }\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"(labelPopoverFullWidth() ? 'w-100 ' : '') + classIncludeTextDisplayWhenNoSelect()\"\n [innerHTML]=\"labelItemSelectedComputed() | translate:{value: lengthKeys()} | LibsUiPipesSecurityTrustPipe:'html':useXssFilter() | async\"\n [config]=\"{maxWidth: labelPopoverConfig()?.maxWidth || 250, direction: 'top', zIndex: labelPopoverConfig()?.zIndex, timerDestroy: labelPopoverConfig()?.timerDestroy || 0}\"\n [ignoreStopPropagationEvent]=\"true\" />\n @if (popoverItemSelected(); as popoverItemSelected) {\n <libs_ui-components-popover [type]=\"popoverItemSelected.type || 'other'\"\n [config]=\"popoverItemSelected.config || {}\">\n @if (popoverItemSelected.dataView) {\n <div [innerHtml]=\"popoverItemSelected.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline text-[16px] mx-[8px]\"> </i>\n }\n </libs_ui-components-popover>\n }\n </div>\n </div>\n <i class=\"text-[16px] libs-ui-icon-move-right rotate-90 {{ classIncludeIcon() }}\"\n [class.text-[#6a7383]]=\"!readonly() && !classIncludeIcon()\"\n [class.text-[#9ca2ad]]=\"(readonly() || disable()) && !classIncludeIcon()\"></i>\n </div>\n </div>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n @if (showError()) {\n @if (error(); as error) {\n <div class=\"mt-[8px] text-[#ee2d41] libs-ui-font-h7r\"\n [innerHtml]=\"(error.message || ' ') | translate:(error.interpolateParams || {})\">\n </div>\n }\n }\n</div>\n<ng-template #listViewEl>\n <div style=\"display: flex; flex-direction: column;\">\n @if (tabsConfig()) {\n <libs_ui-components-dropdown-tabs [tabsConfig]=\"tabsConfig()\"\n [(tabKeyActive)]=\"tabKeyActive\"\n [ignoreBorderBottom]=\"ignoreBorderBottom()\"\n [disable]=\"disable() || loadingDetail() || loadingList()\"\n (outChange)=\"handlerChangeTab()\" />\n }\n <libs_ui-components-list [searchConfig]=\"listSearchConfig()\"\n [isSearchOnline]=\"isSearchOnline()\"\n [dropdownTabKeyActive]=\"tabKeyActive()\"\n [keySearch]=\"listKeySearch()\"\n [config]=\"listConfig()\"\n [autoSelectedFirstItemCallOutsideBefore]=\"autoSelectedFirstItemCallOutsideBefore()\"\n [paddingLeftItem]=\"popoverCustomConfig()?.paddingLeftItem ?? true\"\n [disable]=\"disable() || loadingDetail()\"\n [hiddenInputSearch]=\"listHiddenInputSearch()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"(listConfig()?.type === 'text' && listConfig()?.configTemplateText?.()?.notUseVirtualScroll) ? 0 : listMaxItemShow()\"\n [keySelected]=\"listKeySelected()\"\n [multiKeySelected]=\"listMultiKeySelected()\"\n [clickExactly]=\"popoverCustomConfig()?.clickExactly ?? false\"\n [dividerClassInclude]=\"listSearchConfig() ? listDividerClassInclude() : 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundCustom()\"\n [keysDisableItem]=\"listKeysDisable()\"\n [keysHiddenItem]=\"listKeysHidden()\"\n [hasButtonUnSelectOption]=\"listHasButtonUnSelectOption() ?? (!popoverCustomConfig() && !labelConfig()?.required && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [focusInputSearch]=\"focusInputSearch()\"\n [zIndex]=\"zIndex()\"\n [resetKeyWhenSelectAllKeyDropdown]=\"resetKeyWhenSelectAllKey()\"\n [ignoreClassDisableDefaultWhenUseKeysDisableItem]=\"listIgnoreClassDisableDefaultWhenUseKeysDisableItem()\"\n [hasDivider]=\"listConfigHasDivider()\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event, true)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outFunctionsControl)=\"handlerListFunctionsControl($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoadingList($event)\" />\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:flex;flex-direction:column}:host .libs-ui-dropdown{position:relative;width:100%;min-height:32px;display:flex;align-items:center;background-color:#fff;padding:0 16px;border-radius:4px;cursor:pointer}\n"] }]
|
|
450
|
+
}], ctorParameters: () => [] });
|
|
451
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNKLE9BQU8sRUFBRSwrQkFBK0IsRUFBOEMsTUFBTSw0QkFBNEIsQ0FBQztBQUl6SCxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXVGLDZCQUE2QixFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBQ2hNLE9BQU8sRUFBdUUsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDeEssT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxFQUFzQix3QkFBd0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0SSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHeEUsT0FBTyxFQUFFLHFDQUFx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O3FCQUN0QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCwgVFlQRV9TSEFQRV9BVkFUQVIsIFRZUEVfU0laRV9BVkFUQVJfQ09ORklHIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1hdmF0YXInO1xuaW1wb3J0IHsgSUJ1dHRvbiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUlucHV0U2VhcmNoQ29uZmlnIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoJztcbmltcG9ydCB7IElWYWxpZCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXZhbGlkJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBnZXRGaWVsZEtleUJ5VHlwZSwgSUxpc3REYXRhRW1pdEtleSwgSUxpc3REYXRhRW1pdE11bHRpS2V5LCBJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJTGlzdENvbmZpZ0l0ZW0sIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50LCBUWVBFX1RFTVBMQVRFIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElGbGFnTW91c2UsIElQb3BvdmVyLCBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJUG9wb3Zlck92ZXJsYXksIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLXNlY3VyaXR5LXRydXN0JztcbmltcG9ydCB7IElIdHRwUmVxdWVzdENvbmZpZywgTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0JztcbmltcG9ydCB7IENIQVJBQ1RFUl9EQVRBX0VNUFRZLCBjbG9uZURlZXAsIEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIEVSUk9SX01FU1NBR0VfTUFYX1ZBTElELCBnZXQsIGlzTmlsLCBzZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElEcm9wZG93blRhYnNJdGVtLCBJRW1pdE11bHRpS2V5LCBJRW1pdFNlbGVjdEtleSwgSVBvcG92ZXJDdXN0b21Db25maWcsIElWYWxpZE1heEl0ZW1TZWxlY3RlZCB9IGZyb20gJy4vaW50ZXJmYWNlcy9kcm9wZG93bi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duVGFic0NvbXBvbmVudCB9IGZyb20gJy4vdGFicy90YWJzLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kcm9wZG93bi5jb21wb25lbnQuc2NzcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLCBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlLCBBc3luY1BpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25UYWJzQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgZXJyb3IgPSBzaWduYWw8SVZhbGlkIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgc2hvd0xpc3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgaXRlbXNTZWxlY3RlZCA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsb2FkaW5nRGV0YWlsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdMaXN0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByb3RlY3RlZCBmaWVsZExhYmVsID0gc2lnbmFsPHN0cmluZz4oJ2xhYmVsRGlzcGxheScpO1xuICBwcm90ZWN0ZWQgcG9wb3Zlckl0ZW1TZWxlY3RlZCA9IHNpZ25hbDxJUG9wb3ZlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxhYmVsSXRlbVNlbGVjdGVkQ29tcHV0ZWQgPSBjb21wdXRlZCh0aGlzLmdldExhYmVsSXRlbVNlbGVjdGVkLmJpbmQodGhpcykpO1xuICBwcm90ZWN0ZWQgYXV0b1NlbGVjdGVkRmlyc3RJdGVtQ2FsbE91dHNpZGVCZWZvcmUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByaXZhdGUgcG9wb3ZlckZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGZpZWxkS2V5ID0gc2lnbmFsPHN0cmluZz4oJ2lkJyk7XG4gIHByaXZhdGUgbGlzdEZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qIElOUFVUICovXG4gIHJlYWRvbmx5IHVzZVhzc0ZpbHRlciA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgcG9wb3ZlckVsZW1lbnRSZWZDdXN0b20gPSBpbnB1dDxIVE1MRWxlbWVudD4oKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgZmxhZ01vdXNlID0gbW9kZWw8SUZsYWdNb3VzZT4oeyBpc01vdXNlRW50ZXI6IGZhbHNlLCBpc01vdXNlRW50ZXJDb250ZW50OiBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgZmxhZ01vdXNlQ29udGVudCA9IG1vZGVsPElGbGFnTW91c2U+KCk7XG4gIHJlYWRvbmx5IHBvcG92ZXJDdXN0b21Db25maWcgPSBpbnB1dDxJUG9wb3ZlckN1c3RvbUNvbmZpZz4oKTtcbiAgcmVhZG9ubHkgaXNOZ0NvbnRlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGNvbnZlcnRJdGVtU2VsZWN0ZWQgPSBpbnB1dDwoaXRlbTogdW5rbm93biwgdHJhbnNsYXRlPzogVHJhbnNsYXRlU2VydmljZSkgPT4gdm9pZD4odGhpcy5kZWZhdWx0Q29udmVydEl0ZW1TZWxlY3RlZC5iaW5kKHRoaXMpKTtcbiAgcmVhZG9ubHkgZ2V0UG9wb3Zlckl0ZW1TZWxlY3RlZCA9IGlucHV0PChpdGVtOiB1bmtub3duLCB0cmFuc2xhdGU/OiBUcmFuc2xhdGVTZXJ2aWNlKSA9PiBQcm9taXNlPElQb3BvdmVyIHwgdW5kZWZpbmVkPj4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgbGVuZ3RoS2V5cyA9IG1vZGVsPG51bWJlcj4oMCk7XG4gIHJlYWRvbmx5IHRleHREaXNwbGF5V2hlbk5vU2VsZWN0ID0gaW5wdXQ8c3RyaW5nPignaTE4bl9zZWxlY3RfdmFsdWUnKTtcbiAgcmVhZG9ubHkgdGV4dERpc3BsYXlXaGVuTXVsdGlTZWxlY3QgPSBpbnB1dDxzdHJpbmc+KCdpMThuX3NlbGVjdGluZ19vcHRpb25zJyk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZVRleHREaXNwbGF5V2hlbk5vU2VsZWN0ID0gaW5wdXQ8c3RyaW5nPignbGlicy11aS1mb250LWg1cicpO1xuICByZWFkb25seSBmaWVsZEdldExhYmVsID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsYWJlbFBvcG92ZXJDb25maWcgPSBpbnB1dDxJUG9wb3Zlck92ZXJsYXk+KCk7XG4gIHJlYWRvbmx5IGxhYmVsUG9wb3ZlckZ1bGxXaWR0aCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBoYXNDb250ZW50VW5pdFJpZ2h0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdFNlYXJjaE5vRGF0YVRlbXBsYXRlUmVmID0gaW5wdXQ8VGVtcGxhdGVSZWY8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IGZpZWxkR2V0SW1hZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGltYWdlU2l6ZSA9IGlucHV0PFRZUEVfU0laRV9BVkFUQVJfQ09ORklHPigxNik7XG4gIHJlYWRvbmx5IHR5cGVTaGFwZSA9IGlucHV0PFRZUEVfU0hBUEVfQVZBVEFSPignY2lyY2xlJyk7XG4gIHJlYWRvbmx5IGZpZWxkR2V0SWNvbiA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRUZXh0QXZhdGFyID0gaW5wdXQ8c3RyaW5nPigndXNlcm5hbWUnKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRDb2xvckF2YXRhciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NBdmF0YXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdtci1bOHB4XScsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSB8fCAnbXItWzhweF0nIH0pO1xuICByZWFkb25seSBnZXRMYXN0VGV4dEFmdGVyU3BhY2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaW5rSW1hZ2VFcnJvciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2hvd0Vycm9yID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNob3dCb3JkZXJFcnJvciA9IG1vZGVsPGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuXG4gIHJlYWRvbmx5IGxpc3RTZWFyY2hDb25maWcgPSBpbnB1dDxJSW5wdXRTZWFyY2hDb25maWcsIElJbnB1dFNlYXJjaENvbmZpZyB8IHVuZGVmaW5lZD4oeyBub0JvcmRlcjogdHJ1ZSB9LCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgfHwgeyBub0JvcmRlcjogdHJ1ZSB9IH0pO1xuICByZWFkb25seSBpc1NlYXJjaE9ubGluZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbGlzdEhpZGRlbklucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbj4oKVxuICByZWFkb25seSBsaXN0U2VhcmNoUGFkZGluZyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RLZXlTZWFyY2ggPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxpc3REaXZpZGVyQ2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0Q29uZmlnID0gaW5wdXQ8SUxpc3RDb25maWdJdGVtPigpO1xuICByZWFkb25seSBsaXN0QnV0dG9uc090aGVyID0gaW5wdXQ8QXJyYXk8SUJ1dHRvbj4+KCk7XG4gIHJlYWRvbmx5IGxpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbiA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RDbGlja0V4YWN0bHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0QmFja2dyb3VuZEN1c3RvbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGlzdE1heEl0ZW1TaG93ID0gaW5wdXQ8bnVtYmVyPig2LCk7XG4gIHJlYWRvbmx5IGxpc3RLZXlTZWxlY3RlZCA9IG1vZGVsPHVua25vd24+KCk7XG4gIHJlYWRvbmx5IGxpc3RNdWx0aUtleVNlbGVjdGVkID0gbW9kZWw8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IGxpc3RLZXlzRGlzYWJsZSA9IGlucHV0PEFycmF5PHN0cmluZz4+KCk7IC8vIGtow7RuZyBkw7luZyBnacOhIHRy4buLIG7DoHkga+G6v3QgaOG7o3AgduG7m2kgdGVtcGxhdGUgY2hlY2tib3ggY8OzIGNvbmZpZyBjaOG7qWEgY29uZmlnQ2hlY2tib3hDaGVja0FsbFxuICByZWFkb25seSBsaXN0S2V5c0hpZGRlbiA9IGlucHV0PEFycmF5PHN0cmluZz4+KCk7IC8vIGtow7RuZyBkw7luZyBnacOhIHRy4buLIG7DoHkga+G6v3QgaOG7o3AgduG7m2kgdGVtcGxhdGUgY2hlY2tib3ggY8OzIGNvbmZpZyBjaOG7qWEgY29uZmlnQ2hlY2tib3hDaGVja0FsbFxuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkPigpO1xuICByZWFkb25seSB2YWxpZE1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PElWYWxpZE1heEl0ZW1TZWxlY3RlZD4oKTtcbiAgcmVhZG9ubHkgY2hhbmdlVmFsaWRVbmRlZmluZWRSZXNldEVycm9yID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYWxsb3dTZWxlY3RJdGVtTXVsdGlwbGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBmb2N1c0lucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IG9ubHlFbWl0RGF0YVdoZW5SZXNldCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRydWUga2hpIG114buRbiBlbWl0IHPhu7Ega2nhu4duIHRoYXkgxJHhu5VpIGtleVxuICByZWFkb25seSByZXNldEtleVdoZW5TZWxlY3RBbGxLZXkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0Q29uZmlnSGFzRGl2aWRlciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVJY29uID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdtbC1bOHB4XScsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSB8fCAnbWwtWzhweF0nIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVDb250ZW50ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0SWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW0gPSBpbnB1dDxib29sZWFuPigpOyAvLyBi4buPIGNo4bq/IMSR4buZIGRpc2FibGUgaXRlbSB0csOqbiBodG1sIGxpc3QgdmlldyDEkeG7gyBkaXNhYmxlIHThu6tuZyBwaOG6p24gdHJvbmcgcm93c1xuICByZWFkb25seSB0YWJLZXlBY3RpdmUgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHRhYnNDb25maWcgPSBpbnB1dDxBcnJheTxJRHJvcGRvd25UYWJzSXRlbT4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUJvcmRlckJvdHRvbSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgLyogT1VUUFVUICovXG4gIHJlYWRvbmx5IG91dFNlbGVjdEtleSA9IG91dHB1dDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIHR5cGUgY2jhu41uIDEuXG4gIHJlYWRvbmx5IG91dFNlbGVjdE11bHRpS2V5ID0gb3V0cHV0PElFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQ+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNobyBwaMOpcCBjaOG7jW4gbmhp4buBdS5cbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0VmFsaWRFdmVudCA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIHJlYWRvbmx5IG91dERhdGFDaGFuZ2UgPSBvdXRwdXQ8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IG91dENsaWNrQnV0dG9uT3RoZXIgPSBvdXRwdXQ8SUJ1dHRvbj4oKTtcbiAgcmVhZG9ubHkgb3V0U2hvd0xpc3QgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVGFiS2V5QWN0aXZlID0gb3V0cHV0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuICAvKiBJTkpFQ1QqL1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBodHRwUmVxdWVzdFNlcnZpY2UgPSBpbmplY3QoTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdENvbmZpZyA9IHRoaXMubGlzdENvbmZpZygpO1xuICAgICAgaWYgKGxpc3RDb25maWcpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuZmllbGRLZXkuc2V0KGdldEZpZWxkS2V5QnlUeXBlKGxpc3RDb25maWcsICdpZCcpKSk7XG4gICAgICB9XG4gICAgfSlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubGlzdEtleVNlbGVjdGVkKCkgJiYgIXRoaXMuaXRlbXNTZWxlY3RlZCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0ZWRLZXkoeyBrZXk6IHRoaXMubGlzdEtleVNlbGVjdGVkKCksIGl0ZW06IHVuZGVmaW5lZCwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNoYW5nZVZhbGlkVW5kZWZpbmVkUmVzZXRFcnJvcigpICYmIHRoaXMudmFsaWRSZXF1aXJlZCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLnJlc2V0RXJyb3IoKSk7XG4gICAgICB9XG4gICAgfSlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLmtleXNTZWxlY3RlZCgpIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKSB8fCBbXTtcblxuICAgICAgICAgIGlmIChwcmV2aW91c1ZhbHVlLmxlbmd0aCAhPT0gY3VycmVudFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzOiBjdXJyZW50VmFsdWUsIG1hcEtleXM6IFtdLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGtleVByZXZpb3VzIG9mIHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudFZhbHVlLnNvbWUoa2V5Q3VycmVudCA9PiBrZXlDdXJyZW50ID09PSBrZXlQcmV2aW91cykpIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzOiBjdXJyZW50VmFsdWUsIG1hcEtleXM6IFtdLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBsaXN0Q29uZmlnID0gdGhpcy5saXN0Q29uZmlnKCk7XG4gICAgaWYgKCF0aGlzLmxlbmd0aEtleXMoKSAmJiBsaXN0Q29uZmlnICYmIChsaXN0Q29uZmlnLmF1dG9TZWxlY3RGaXJzdEl0ZW0gfHwgbGlzdENvbmZpZy5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py4oKT8uYXV0b1NlbGVjdEFsbEl0ZW0gfHwgbGlzdENvbmZpZy5jb25maWdUZW1wbGF0ZUdyb3VwPy4oKT8uZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3QpICYmIGxpc3RDb25maWcuaHR0cFJlcXVlc3REYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KHRydWUpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdERhdGEgPSBsaXN0Q29uZmlnLmh0dHBSZXF1ZXN0RGF0YSgpO1xuICAgICAgICBjb25zdCB7IGFyZ3VtZW50c1ZhbHVlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB9ID0gaHR0cFJlcXVlc3REYXRhO1xuICAgICAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsgLi4udGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuZmFrZVJlc3BvbnNlUGFnaW5nQXBpKCksIGRyb3Bkb3duVGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSB9LCB7fSwgJycsIHRydWUsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkoaHR0cFJlcXVlc3REYXRhKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldChmYWxzZSk7XG4gICAgICAgIGlmIChyZXN1bHQ/LmRhdGEpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnNldChyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgdGhpcy5lbWl0QXV0b1NlbGVjdEtleShyZXN1bHQuZGF0YSwgbGlzdENvbmZpZy50eXBlKTtcbiAgICAgICAgICB0aGlzLmF1dG9TZWxlY3RlZEZpcnN0SXRlbUNhbGxPdXRzaWRlQmVmb3JlLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXREYXRhQ2hhbmdlLmVtaXQodGhpcy5pdGVtcygpKTtcbiAgICB9XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoe1xuICAgICAgcmVzZXQ6IHRoaXMucmVzZXQuYmluZCh0aGlzKSxcbiAgICAgIHZhbGlkOiB0aGlzLnZhbGlkLmJpbmQodGhpcyksXG4gICAgICByZXNldEVycm9yOiB0aGlzLnJlc2V0RXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIHNldEVycm9yOiB0aGlzLnNldEVycm9yLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVMaXN0OiBhc3luYyAoKSA9PiB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKSxcbiAgICAgIGdldERpc2FibGU6IGFzeW5jICgpID0+IHRoaXMuZGlzYWJsZSgpID8/IGZhbHNlLFxuICAgICAgdXBkYXRlTGFiZWxJdGVtU2VsZWN0ZWQ6IGFzeW5jIChsYWJlbCkgPT4gdGhpcy5pdGVtc1NlbGVjdGVkLnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgW3RoaXMuZmllbGRMYWJlbCgpXTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChsYWJlbCkgfSkpLFxuICAgICAgcmVmcmVzaExpc3Q6IGFzeW5jICgpID0+IHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbCgpPy5yZWZyZXNoKCksXG4gICAgICBzZXRJdGVtU2VsZWN0ZWRCeUtleTogdGhpcy5zZXRJdGVtU2VsZWN0ZWRCeUtleS5iaW5kKHRoaXMpXG4gICAgfSk7XG4gICAgdGhpcy5jaGVja1ZhbGlkKHRydWUpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByaXZhdGUgZGVmYXVsdENvbnZlcnRJdGVtU2VsZWN0ZWQoaXRlbTogdW5rbm93bikge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZEdldExhYmVsID0gdGhpcy5maWVsZEdldExhYmVsKCk7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZEdldExhYmVsID8gZ2V0KGl0ZW0sIGZpZWxkR2V0TGFiZWwpIDogdW5kZWZpbmVkO1xuICAgIHNldChpdGVtLCB0aGlzLmZpZWxkTGFiZWwoKSwgdmFsdWUgPz8gZ2V0KGl0ZW0sICdsYWJlbCcpID8/IGdldChpdGVtLCAnbmFtZScpID8/ICcgJyk7XG4gIH1cblxuICBwcml2YXRlIGdldExhYmVsSXRlbVNlbGVjdGVkKCkge1xuICAgIGxldCBsYWJlbCA9ICcgJztcbiAgICBpZiAoIXRoaXMubGVuZ3RoS2V5cygpKSB7XG4gICAgICBsYWJlbCA9IHRoaXMudGV4dERpc3BsYXlXaGVuTm9TZWxlY3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpID4gMSkge1xuICAgICAgbGFiZWwgPSB0aGlzLnRleHREaXNwbGF5V2hlbk11bHRpU2VsZWN0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxlbmd0aEtleXMoKSA9PT0gMSkge1xuICAgICAgbGFiZWwgPSB0aGlzLml0ZW1zU2VsZWN0ZWQoKT8uW3RoaXMuZmllbGRMYWJlbCgpXSB8fCB0aGlzLnRleHREaXNwbGF5V2hlbk5vU2VsZWN0KCk7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEF1dG9TZWxlY3RLZXkoaXRlbXM6IEFycmF5PHVua25vd24+LCB0eXBlOiBUWVBFX1RFTVBMQVRFKSB7XG4gICAgY29uc3QgbGlzdENvbmZpZyA9IHRoaXMubGlzdENvbmZpZygpO1xuICAgIGlmICghaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCB8fCAhbGlzdENvbmZpZyB8fCAoIWxpc3RDb25maWcuYXV0b1NlbGVjdEZpcnN0SXRlbSAmJiAhbGlzdENvbmZpZy5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py4oKT8uYXV0b1NlbGVjdEFsbEl0ZW0gJiYgIWxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVHcm91cD8uKCk/LmZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmbGF0SXRlbXNTdXBwb3J0QXV0b1NlbGVjdCA9IGxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVHcm91cD8uKCk/LmZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0O1xuICAgIGlmICh0eXBlID09PSAnZ3JvdXAnICYmIGZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KSB7XG4gICAgICBpdGVtcyA9IGZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KGl0ZW1zKTtcbiAgICB9XG4gICAgaWYgKGxpc3RDb25maWcuYXV0b1NlbGVjdEZpcnN0SXRlbSkge1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgY29uc3Qga2V5ID0gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSk7XG4gICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJyB8fCB0eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0ZWRLZXkoeyBrZXksIGl0ZW0sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLmxpc3RLZXlTZWxlY3RlZC5zZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzOiBba2V5XSwgbWFwS2V5czogW3sga2V5LCBpdGVtLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9XSwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldChba2V5XSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlICE9PSAnY2hlY2tib3gnICYmIHR5cGUgIT09ICdncm91cCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IG1hcEtleXM6IEFycmF5PElMaXN0RGF0YUVtaXRLZXk+ID0gW107XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpO1xuICAgICAgaWYgKGlzTmlsKGtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICBtYXBLZXlzLnB1c2goeyBrZXksIGl0ZW0sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuaGFuZGxlclNlbGVjdE11bHRpS2V5KHsga2V5cywgbWFwS2V5cywgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgdGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZC5zZXQoa2V5cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50KHR5cGU6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIGlmICh0eXBlID09PSAnY2xpY2snKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAncmVtb3ZlJykge1xuICAgICAgdGhpcy5zaG93TGlzdC5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRTaG93TGlzdC5lbWl0KHRoaXMuc2hvd0xpc3QoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2hvd0xpc3Quc2V0KHRydWUpO1xuICAgIHRoaXMub3V0U2hvd0xpc3QuZW1pdCh0aGlzLnNob3dMaXN0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEYXRhQ2hhbmdlKGl0ZW1zOiBBcnJheTx1bmtub3duPikge1xuICAgIHRoaXMuaXRlbXMuc2V0KGl0ZW1zKTtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8udXBkYXRlUG9wb3Zlck92ZXJsYXlQb3NpdGlvbigpO1xuICAgIHRoaXMub3V0RGF0YUNoYW5nZS5lbWl0KHRoaXMuaXRlbXMoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUZsYWdNb3VzZShldmVudDogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMuZmxhZ01vdXNlQ29udGVudC5zZXQoZXZlbnQpO1xuICAgIHRoaXMubWVyZ2VGbGFnTW91c2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcihidXR0b246IElCdXR0b24pIHtcbiAgICB0aGlzLm91dENsaWNrQnV0dG9uT3RoZXIuZW1pdChidXR0b24pO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyQ29udHJvbEV2ZW50KGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sLnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdGVkS2V5KGV2ZW50OiBJTGlzdERhdGFFbWl0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2V5ID0gZXZlbnQ/LmtleTtcbiAgICBjb25zdCBpdGVtID0gZXZlbnQ/Lml0ZW07XG4gICAgY29uc3QgaXNDbGlja01hbnVhbCA9IGV2ZW50Py5pc0NsaWNrTWFudWFsO1xuICAgIHRoaXMubGVuZ3RoS2V5cy5zZXQoIShpc05pbChrZXkpIHx8ICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkgPT09ICcnKSkgPyAxIDogMCk7XG4gICAgdGhpcy5saXN0S2V5U2VsZWN0ZWQuc2V0KGtleSk7XG4gICAgaWYgKCF0aGlzLmFsbG93U2VsZWN0SXRlbU11bHRpcGxlKCkgJiYgdGhpcy5pdGVtc1NlbGVjdGVkKCkgJiYgZ2V0KHRoaXMuaXRlbXNTZWxlY3RlZCgpLCB0aGlzLmZpZWxkS2V5KCkpID09PSBrZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzQ2xpY2tNYW51YWwpIHtcbiAgICAgIGlmICghKGlzTmlsKGtleSkgfHwgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleSA9PT0gJycpKSAmJiAoaXRlbSB8fCB0aGlzLml0ZW1zU2VsZWN0ZWQoKSkpIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIGlmICh0aGlzLmxlbmd0aEtleXMoKSAmJiAhaXRlbSAmJiB0aGlzLmh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQoKSkge1xuICAgICAgbGV0IGl0ZW1TZWxlY3RlZCA9IGF3YWl0IHRoaXMuc2V0SXRlbVNlbGVjdGVkQnlLZXkoa2V5KTtcbiAgICAgIGlmICghaXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIGl0ZW1TZWxlY3RlZCA9IHtcbiAgICAgICAgICBbdGhpcy5maWVsZEtleSgpXToga2V5LFxuICAgICAgICAgIFt0aGlzLmZpZWxkTGFiZWwoKV06IENIQVJBQ1RFUl9EQVRBX0VNUFRZXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoaXRlbVNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5pdGVtID0gaXRlbVNlbGVjdGVkO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh7IC4uLmV2ZW50LCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoY2xvbmVEZWVwKGl0ZW0pKTtcbiAgICB0aGlzLmJ1aWxkRGlzcGxheSgpO1xuICAgIHRoaXMub3V0U2VsZWN0S2V5LmVtaXQoeyAuLi5ldmVudCwgdGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RNdWx0aUtleShldmVudDogSUxpc3REYXRhRW1pdE11bHRpS2V5IHwgdW5kZWZpbmVkLCBpc0NsaWNrTWFudWFsID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5saXN0Q29uZmlnKCk/LmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpPy5zaW5nbGVTZWxlY3RJdGVtICYmIGV2ZW50Py5tYXBLZXlzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGl0ZW1DbGlja01hbnVhbCA9IGV2ZW50Lm1hcEtleXMuZmluZChtYXBLZXkgPT4gbWFwS2V5Lml0ZW0gJiYgbWFwS2V5Lml0ZW0uaXNDaGVja01hbnVhbCk7XG4gICAgICBpZiAoaXRlbUNsaWNrTWFudWFsKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gaXRlbUNsaWNrTWFudWFsLml0ZW0uaXNDaGVja01hbnVhbCA9IGZhbHNlKTtcbiAgICAgICAgZXZlbnQua2V5cyA9IFtpdGVtQ2xpY2tNYW51YWwua2V5XTtcbiAgICAgICAgZXZlbnQubWFwS2V5cyA9IFtpdGVtQ2xpY2tNYW51YWxdO1xuICAgICAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFsuLi4oZXZlbnQ/LmtleXMgfHwgW10pXSk7XG4gICAgdGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZC5zZXQoWy4uLihldmVudD8ua2V5cyB8fCBbXSldKTtcbiAgICB0aGlzLmxlbmd0aEtleXMuc2V0KGV2ZW50Py5rZXlzPy5sZW5ndGggfHwgMCk7XG4gICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpID4gMSkge1xuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KHsgLi4uKGV2ZW50IHx8IHt9KSwgaXNDbGlja01hbnVhbCwgdGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSgpIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBldmVudD8ua2V5c1swXTtcbiAgICBsZXQgaXRlbSA9IGV2ZW50Py5tYXBLZXlzPy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGtleSk/Lml0ZW07XG5cbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgJiYgIWl0ZW0gJiYgdGhpcy5odHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKCkpIHtcbiAgICAgIGl0ZW0gPSBhd2FpdCB0aGlzLnNldEl0ZW1TZWxlY3RlZEJ5S2V5KGtleSk7XG4gICAgICB0aGlzLm91dFNlbGVjdE11bHRpS2V5LmVtaXQoeyBrZXlzOiBba2V5XSwgbWFwS2V5czogW3sga2V5LCBpdGVtIH1dLCBpc0NsaWNrTWFudWFsLCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoY2xvbmVEZWVwKGl0ZW0pKTtcbiAgICB0aGlzLmJ1aWxkRGlzcGxheSgpO1xuICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh7IC4uLihldmVudCB8fCB7fSksIGlzQ2xpY2tNYW51YWwsIHRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0SXRlbVNlbGVjdGVkQnlLZXkoa2V5OiB1bmtub3duKSB7XG4gICAgY29uc3QgaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCA9IHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCgpO1xuICAgIGlmICghaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCB8fCB0aGlzLmxvYWRpbmdEZXRhaWwoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldCh0cnVlKTtcbiAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkO1xuICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IGtleSwgZHJvcGRvd25UYWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSwge30sICcnLCBmYWxzZSwgZmFsc2UsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmNhbGxBcGkoaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCk7XG4gICAgICBjb25zdCBpdGVtID0gY2xvbmVEZWVwKHJlc3VsdC5kYXRhWzBdIHx8IHJlc3VsdC5kYXRhKTtcbiAgICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoaXRlbSk7XG4gICAgICB0aGlzLmJ1aWxkRGlzcGxheSgpO1xuICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldChmYWxzZSk7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldChmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VUYWIoKSB7XG4gICAgdGhpcy5vdXRDaGFuZ2VUYWJLZXlBY3RpdmUuZW1pdCh0aGlzLnRhYktleUFjdGl2ZSgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTG9hZGluZ0xpc3QoZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmxvYWRpbmdMaXN0LnNldChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldEVycm9yKGVycm9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVycm9yLnNldCh7IG1lc3NhZ2U6IGVycm9yIH0pO1xuICAgIHRoaXMuc2hvd0JvcmRlckVycm9yLnNldCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWQoKSB7XG4gICAgaWYgKHRoaXMuZXJyb3IoKT8ubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jaGVja1ZhbGlkKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrVmFsaWQodmFsaWRhdGVEZWZhdWx0PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIHRoaXMuZXJyb3Iuc2V0KHVuZGVmaW5lZCk7XG4gICAgY29uc3QgdmFsaWQgPSB7IHJlcXVpcmVkOiB0cnVlLCBsaW1pdE1heEl0ZW1TZWxlY3Q6IHRydWUgfTtcbiAgICBjb25zdCB2YWxpZE1heEl0ZW1TZWxlY3RlZCA9IHRoaXMudmFsaWRNYXhJdGVtU2VsZWN0ZWQoKTtcbiAgICBpZiAodGhpcy52YWxpZFJlcXVpcmVkKCkgJiYgIXRoaXMubGVuZ3RoS2V5cygpKSB7XG4gICAgICB2YWxpZC5yZXF1aXJlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodmFsaWRNYXhJdGVtU2VsZWN0ZWQgJiYgdGhpcy5sZW5ndGhLZXlzKCkgPiB2YWxpZE1heEl0ZW1TZWxlY3RlZC52YWx1ZSkge1xuICAgICAgdmFsaWQubGltaXRNYXhJdGVtU2VsZWN0ID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdmFsaWRhdGVEZWZhdWx0ICYmIHZhbGlkLnJlcXVpcmVkID09PSBmYWxzZSkge1xuICAgICAgY29uc3QgdmFsaWRSZXF1aXJlZCA9IHRoaXMudmFsaWRSZXF1aXJlZCgpO1xuICAgICAgdGhpcy5lcnJvci5zZXQoeyAuLi4odmFsaWRSZXF1aXJlZCB8fCB7fSksIG1lc3NhZ2U6IHZhbGlkUmVxdWlyZWQ/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCB9KTtcbiAgICB9XG4gICAgaWYgKCF2YWxpZGF0ZURlZmF1bHQgJiYgIXRoaXMuZXJyb3IoKSAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB2YWxpZE1heEl0ZW1TZWxlY3RlZCA9IHRoaXMudmFsaWRNYXhJdGVtU2VsZWN0ZWQoKTtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KHsgLi4uKHZhbGlkTWF4SXRlbVNlbGVjdGVkIHx8IHt9KSwgbWVzc2FnZTogdmFsaWRNYXhJdGVtU2VsZWN0ZWQ/Lm1lc3NhZ2UgfHwgRVJST1JfTUVTU0FHRV9NQVhfVkFMSUQsIGludGVycG9sYXRlUGFyYW1zOiB7IHZhbHVlOiB2YWxpZE1heEl0ZW1TZWxlY3RlZD8udmFsdWUgfSB9KVxuICAgIH1cbiAgICB0aGlzLm91dFZhbGlkRXZlbnQuZW1pdCh2YWxpZC5yZXF1aXJlZCAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QpO1xuICAgIHJldHVybiB2YWxpZC5yZXF1aXJlZCAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3Q7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0RXJyb3IoKSB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnNob3dCb3JkZXJFcnJvci5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMaXN0RnVuY3Rpb25zQ29udHJvbChldmVudDogSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKGZsYWc6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLmZsYWdNb3VzZS5zZXQoZmxhZyk7XG4gICAgdGhpcy5tZXJnZUZsYWdNb3VzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNldCgpIHtcbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5sZW5ndGhLZXlzLnNldCgwKTtcbiAgICB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2woKT8ucmVzZXRLZXlTZWxlY3RlZCgpO1xuICAgIGlmICghdGhpcy5zaG93TGlzdCgpICYmIHRoaXMub25seUVtaXREYXRhV2hlblJlc2V0KCkpIHtcbiAgICAgIHRoaXMub3V0U2VsZWN0S2V5LmVtaXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLmxpc3RLZXlTZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGREaXNwbGF5KCkge1xuICAgIGlmICh0aGlzLml0ZW1zU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5jb252ZXJ0SXRlbVNlbGVjdGVkKCkodGhpcy5pdGVtc1NlbGVjdGVkKCksIHRoaXMudHJhbnNsYXRlKTtcbiAgICAgIGNvbnN0IGdldFBvcG92ZXJJdGVtU2VsZWN0ZWQgPSB0aGlzLmdldFBvcG92ZXJJdGVtU2VsZWN0ZWQoKTtcbiAgICAgIGlmIChnZXRQb3BvdmVySXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMucG9wb3Zlckl0ZW1TZWxlY3RlZC5zZXQoYXdhaXQgZ2V0UG9wb3Zlckl0ZW1TZWxlY3RlZCh0aGlzLml0ZW1zU2VsZWN0ZWQsIHRoaXMudHJhbnNsYXRlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUZsYWdNb3VzZSgpIHtcbiAgICBjb25zdCBmbGFnOiBJRmxhZ01vdXNlID0geyBpc01vdXNlRW50ZXI6IGZhbHNlLCBpc01vdXNlRW50ZXJDb250ZW50OiBmYWxzZSwgaXNDb250YWluZXJIYXNTY3JvbGw6IGZhbHNlIH07XG4gICAgaWYgKHRoaXMuZmxhZ01vdXNlQ29udGVudCgpPy5pc01vdXNlRW50ZXIgfHwgdGhpcy5mbGFnTW91c2UoKS5pc01vdXNlRW50ZXIpIHtcbiAgICAgIGZsYWcuaXNNb3VzZUVudGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmxhZ01vdXNlQ29udGVudCgpPy5pc01vdXNlRW50ZXJDb250ZW50IHx8IHRoaXMuZmxhZ01vdXNlKCkuaXNNb3VzZUVudGVyQ29udGVudCkge1xuICAgICAgZmxhZy5pc01vdXNlRW50ZXJDb250ZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmxhZ01vdXNlQ29udGVudCgpPy5pc0NvbnRhaW5lckhhc1Njcm9sbCB8fCB0aGlzLmZsYWdNb3VzZSgpLmlzQ29udGFpbmVySGFzU2Nyb2xsKSB7XG4gICAgICBmbGFnLmlzQ29udGFpbmVySGFzU2Nyb2xsID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoZmxhZyk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsXCI+XG4gIEBpZiAobGFiZWxDb25maWcoKTsgYXMgbGFiZWwpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsIFtjbGFzc0luY2x1ZGVdPVwibGFiZWwuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWwubGFiZWxMZWZ0XCJcbiAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbC5sYWJlbExlZnRDbGFzc1wiXG4gICAgICBbcmVxdWlyZWRdPVwibGFiZWwucmVxdWlyZWQgXCJcbiAgICAgIFtkZXNjcmlwdGlvbl09XCJsYWJlbC5kZXNjcmlwdGlvblwiXG4gICAgICBbZGVzY3JpcHRpb25DbGFzc109XCJsYWJlbC5kZXNjcmlwdGlvbkNsYXNzXCJcbiAgICAgIFtsYWJlbFJpZ2h0XT1cImxhYmVsLmxhYmVsUmlnaHRcIlxuICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbC5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWwub25seVNob3dDb3VudFwiXG4gICAgICBbYnV0dG9uc0xlZnRdPVwibGFiZWwuYnV0dG9uc0xlZnRcIlxuICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbC5idXR0b25zUmlnaHRcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJsYWJlbC5kaXNhYmxlQnV0dG9uc0xlZnQgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJsYWJlbC5kaXNhYmxlQnV0dG9uc1JpZ2h0IHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW2hhc1RvZ2dsZV09XCJsYWJlbC5oYXNUb2dnbGVcIlxuICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbC50b2dnbGVBY3RpdmVcIlxuICAgICAgW3RvZ2dsZURpc2FibGVdPVwibGFiZWwudG9nZ2xlRGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtwb3BvdmVyXT1cImxhYmVsLnBvcG92ZXJcIlxuICAgICAgW2ljb25Qb3BvdmVyQ2xhc3NdPVwibGFiZWwuaWNvblBvcG92ZXJDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbC5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtsaW1pdExlbmd0aF09XCJsYWJlbC5saW1pdExlbmd0aFwiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsLmJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbC5kaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uIHx8IGRpc2FibGUoKVwiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NdPVwibGFiZWwuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgW2NvdW50XT1cImxhYmVsLmNvdW50XCIgLz5cbiAgfVxuICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW2lnbm9yZVNob3dQb3BvdmVyXT1cImRpc2FibGUoKSB8fCByZWFkb25seSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgW2NsYXNzXT1cImNsYXNzSW5jbHVkZSgpIHx8ICd3LWZ1bGwnXCJcbiAgICBbbW9kZV09XCInY2xpY2stdG9nZ2xlJ1wiXG4gICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgW2lnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmVdPVwidHJ1ZVwiXG4gICAgW2lnbm9yZUN1cnNvclBvaW50ZXJNb2RlTGlrZUNsaWNrXT1cInRydWVcIlxuICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudCgpXCJcbiAgICBbZWxlbWVudFJlZkN1c3RvbV09XCJwb3BvdmVyRWxlbWVudFJlZkN1c3RvbSgpXCJcbiAgICBbY29uZmlnXT1cIntcbiAgICAgIGFuaW1hdGlvbkNvbmZpZzogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5hbmltYXRpb25Db25maWcgfHwge30sXG4gICAgICB6SW5kZXg6IHpJbmRleCgpID8/IDEwMDAsXG4gICAgICB3aWR0aEJ5UGFyZW50OiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LndpZHRoQnlQYXJlbnQgPz8gdHJ1ZSxcbiAgICAgIHBhcmVudEJvcmRlcldpZHRoOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LnBhcmVudEJvcmRlcldpZHRoID8/IDAsXG4gICAgICBtYXhIZWlnaHQ6IHBvcG92ZXJDdXN0b21Db25maWcoKT8ubWF4SGVpZ2h0ID8/IDIwNDgsXG4gICAgICBtYXhXaWR0aDogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5tYXhXaWR0aCA/PyAyMDQ4LFxuICAgICAgZGlyZWN0aW9uOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LmRpcmVjdGlvbiA/PyAnYm90dG9tJyxcbiAgICAgIHRlbXBsYXRlOiBsaXN0Vmlld0VsLFxuICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgIHRpbWVyRGVzdHJveTogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy50aW1lckRlc3Ryb3kgPz8gMCxcbiAgICAgIGlnbm9yZUFycm93OiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/Lmlnbm9yZUFycm93ID8/IHRydWUsXG4gICAgICBkaXJlY3Rpb25EaXN0YW5jZTogMixcbiAgICAgIGNsYXNzSW5jbHVkZTogJ3JvdW5kZWQtWzRweF0gJyArIChwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LmNsYXNzSW5jbHVkZSA/PyAnbGlicy11aS1ib3JkZXItZ2VuZXJhbCAnKSArICgobGlzdENvbmZpZygpPy50eXBlID09PSAndGV4dCcgJiYgbGlzdENvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRleHQ/LigpPy5ub3RVc2VWaXJ0dWFsU2Nyb2xsKSA/ICcgb3ZlcmZsb3ctaGlkZGVuJyA6ICcnKSxcbiAgICAgIHBvc2l0aW9uOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LnBvc2l0aW9uIHx8IHsgbW9kZTogJ3N0YXJ0JywgZGlzdGFuY2U6IDAgfSxcbiAgICAgIHdpZHRoOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LndpZHRoXG4gICAgfVwiXG4gICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dEV2ZW50KT1cImhhbmRsZXJFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKCRldmVudClcIj5cbiAgICBAaWYgKCFpc05nQ29udGVudCgpKSB7XG4gICAgICA8ZGl2IFtjbGFzc109XCInbGlicy11aS1kcm9wZG93biAnICsgY2xhc3NJbmNsdWRlQ29udGVudCgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWdlbmVyYWxdPVwiIWVycm9yKCkgJiYgIXNob3dCb3JkZXJFcnJvcigpICYmICFzaG93TGlzdCgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXByaW1hcnktZm9jdXMtZ2VuZXJhbF09XCIhZXJyb3IoKSAmJiAhc2hvd0JvcmRlckVycm9yKCkgJiYgc2hvd0xpc3QoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1lcnJvci1nZW5lcmFsXT1cImVycm9yKCkgfHwgc2hvd0JvcmRlckVycm9yKClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1yZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHktYmFja2dyb3VuZF09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiEoZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKSB8fCByZWFkb25seSgpKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGUtYmFja2dyb3VuZF09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwibG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgW2NsYXNzLnJvdW5kZWQtdHItMF09XCJoYXNDb250ZW50VW5pdFJpZ2h0KClcIlxuICAgICAgICBbY2xhc3Mucm91bmRlZC1ici0wXT1cImhhc0NvbnRlbnRVbml0UmlnaHQoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHctZnVsbCByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHctZnVsbCBhYnNvbHV0ZVwiPlxuICAgICAgICAgICAgICBAaWYgKGxlbmd0aEtleXMoKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIEBpZiAoaXRlbXNTZWxlY3RlZCgpOyBhcyBpdGVtc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkR2V0SW1hZ2UoKTsgYXMgZmllbGRHZXRJbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWF2YXRhciBbY2xhc3NJbmNsdWRlXT1cImNsYXNzQXZhdGFySW5jbHVkZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdHlwZVNoYXBlXT1cInR5cGVTaGFwZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCJpbWFnZVNpemUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xpbmtBdmF0YXJdPVwiaXRlbXNTZWxlY3RlZFtmaWVsZEdldEltYWdlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xpbmtBdmF0YXJFcnJvcl09XCJsaW5rSW1hZ2VFcnJvcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaWRHZW5Db2xvcl09XCJpdGVtc1NlbGVjdGVkW2ZpZWxkR2V0Q29sb3JBdmF0YXIoKSB8fCBmaWVsZEdldFRleHRBdmF0YXIoKV1cIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0QXZhdGFyXT1cIml0ZW1zU2VsZWN0ZWRbZmllbGRHZXRUZXh0QXZhdGFyKCldXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZ2V0TGFzdFRleHRBZnRlclNwYWNlXT1cImdldExhc3RUZXh0QWZ0ZXJTcGFjZSgpXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRHZXRJY29uKCk7IGFzIGZpZWxkR2V0SWNvbikge1xuICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiaXRlbXNTZWxlY3RlZFtmaWVsZEdldEljb25dICsgJyBtci1bOHB4XSdcIj48L2k+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiKGxhYmVsUG9wb3ZlckZ1bGxXaWR0aCgpID8gJ3ctMTAwICcgOiAnJykgKyBjbGFzc0luY2x1ZGVUZXh0RGlzcGxheVdoZW5Ob1NlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImxhYmVsSXRlbVNlbGVjdGVkQ29tcHV0ZWQoKSB8IHRyYW5zbGF0ZTp7dmFsdWU6IGxlbmd0aEtleXMoKX0gfCBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlOidodG1sJzp1c2VYc3NGaWx0ZXIoKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnXT1cInttYXhXaWR0aDogbGFiZWxQb3BvdmVyQ29uZmlnKCk/Lm1heFdpZHRoIHx8IDI1MCwgZGlyZWN0aW9uOiAndG9wJywgekluZGV4OiBsYWJlbFBvcG92ZXJDb25maWcoKT8uekluZGV4LCB0aW1lckRlc3Ryb3k6IGxhYmVsUG9wb3ZlckNvbmZpZygpPy50aW1lckRlc3Ryb3kgfHwgMH1cIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgQGlmIChwb3BvdmVySXRlbVNlbGVjdGVkKCk7IGFzIHBvcG92ZXJJdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwicG9wb3Zlckl0ZW1TZWxlY3RlZC50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJwb3BvdmVySXRlbVNlbGVjdGVkLmNvbmZpZyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChwb3BvdmVySXRlbVNlbGVjdGVkLmRhdGFWaWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySHRtbF09XCJwb3BvdmVySXRlbVNlbGVjdGVkLmRhdGFWaWV3IHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tdG9vbHRpcC1vdXRsaW5lIHRleHQtWzE2cHhdIG14LVs4cHhdXCI+IDwvaT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aSBjbGFzcz1cInRleHQtWzE2cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCB7eyBjbGFzc0luY2x1ZGVJY29uKCkgfX1cIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFyZWFkb25seSgpICYmICFjbGFzc0luY2x1ZGVJY29uKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIihyZWFkb25seSgpIHx8IGRpc2FibGUoKSkgJiYgIWNsYXNzSW5jbHVkZUljb24oKVwiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICB9XG4gIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gIEBpZiAoc2hvd0Vycm9yKCkpIHtcbiAgICBAaWYgKGVycm9yKCk7IGFzIGVycm9yKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtWzhweF0gdGV4dC1bI2VlMmQ0MV0gbGlicy11aS1mb250LWg3clwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwiKGVycm9yLm1lc3NhZ2UgfHwgJyAnKSB8IHRyYW5zbGF0ZTooZXJyb3IuaW50ZXJwb2xhdGVQYXJhbXMgfHwge30pXCI+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNsaXN0Vmlld0VsPlxuICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cbiAgICBAaWYgKHRhYnNDb25maWcoKSkge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bi10YWJzIFt0YWJzQ29uZmlnXT1cInRhYnNDb25maWcoKVwiXG4gICAgICAgIFsodGFiS2V5QWN0aXZlKV09XCJ0YWJLZXlBY3RpdmVcIlxuICAgICAgICBbaWdub3JlQm9yZGVyQm90dG9tXT1cImlnbm9yZUJvcmRlckJvdHRvbSgpXCJcbiAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKSB8fCBsb2FkaW5nTGlzdCgpXCJcbiAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGFiKClcIiAvPlxuICAgIH1cbiAgICA8bGlic191aS1jb21wb25lbnRzLWxpc3QgW3NlYXJjaENvbmZpZ109XCJsaXN0U2VhcmNoQ29uZmlnKClcIlxuICAgICAgW2lzU2VhcmNoT25saW5lXT1cImlzU2VhcmNoT25saW5lKClcIlxuICAgICAgW2Ryb3Bkb3duVGFiS2V5QWN0aXZlXT1cInRhYktleUFjdGl2ZSgpXCJcbiAgICAgIFtrZXlTZWFyY2hdPVwibGlzdEtleVNlYXJjaCgpXCJcbiAgICAgIFtjb25maWddPVwibGlzdENvbmZpZygpXCJcbiAgICAgIFthdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZV09XCJhdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZSgpXCJcbiAgICAgIFtwYWRkaW5nTGVmdEl0ZW1dPVwicG9wb3ZlckN1c3RvbUNvbmZpZygpPy5wYWRkaW5nTGVmdEl0ZW0gPz8gdHJ1ZVwiXG4gICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtoaWRkZW5JbnB1dFNlYXJjaF09XCJsaXN0SGlkZGVuSW5wdXRTZWFyY2goKVwiXG4gICAgICBbc2VhcmNoUGFkZGluZ109XCJsaXN0U2VhcmNoUGFkZGluZygpXCJcbiAgICAgIFttYXhJdGVtU2hvd109XCIobGlzdENvbmZpZygpPy50eXBlID09PSAndGV4dCcgJiYgbGlzdENvbmZpZygpPy5jb25maWdUZW1wbGF0ZVRleHQ/LigpPy5ub3RVc2VWaXJ0dWFsU2Nyb2xsKSA/IDAgOiBsaXN0TWF4SXRlbVNob3coKVwiXG4gICAgICBba2V5U2VsZWN0ZWRdPVwibGlzdEtleVNlbGVjdGVkKClcIlxuICAgICAgW211bHRpS2V5U2VsZWN0ZWRdPVwibGlzdE11bHRpS2V5U2VsZWN0ZWQoKVwiXG4gICAgICBbY2xpY2tFeGFjdGx5XT1cInBvcG92ZXJDdXN0b21Db25maWcoKT8uY2xpY2tFeGFjdGx5ID8/IGZhbHNlXCJcbiAgICAgIFtkaXZpZGVyQ2xhc3NJbmNsdWRlXT1cImxpc3RTZWFyY2hDb25maWcoKSA/IGxpc3REaXZpZGVyQ2xhc3NJbmNsdWRlKCkgOiAnaGlkZGVuJ1wiXG4gICAgICBbYnV0dG9uc090aGVyXT1cImxpc3RCdXR0b25zT3RoZXIoKVwiXG4gICAgICBbYmFja2dyb3VuZExpc3RDdXN0b21dPVwibGlzdEJhY2tncm91bmRDdXN0b20oKVwiXG4gICAgICBba2V5c0Rpc2FibGVJdGVtXT1cImxpc3RLZXlzRGlzYWJsZSgpXCJcbiAgICAgIFtrZXlzSGlkZGVuSXRlbV09XCJsaXN0S2V5c0hpZGRlbigpXCJcbiAgICAgIFtoYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb24oKSA/PyAoIXBvcG92ZXJDdXN0b21Db25maWcoKSAmJiAhbGFiZWxDb25maWcoKT8ucmVxdWlyZWQgJiYgKGxpc3RDb25maWcoKT8udHlwZSA9PT0gJ3RleHQnIHx8IGxpc3RDb25maWcoKT8udHlwZSA9PT0gJ3JhZGlvJykpXCJcbiAgICAgIFt0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YV09XCJsaXN0U2VhcmNoTm9EYXRhVGVtcGxhdGVSZWYoKVwiXG4gICAgICBbZm9jdXNJbnB1dFNlYXJjaF09XCJmb2N1c0lucHV0U2VhcmNoKClcIlxuICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICBbcmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5RHJvcGRvd25dPVwicmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5KClcIlxuICAgICAgW2lnbm9yZUNsYXNzRGlzYWJsZURlZmF1bHRXaGVuVXNlS2V5c0Rpc2FibGVJdGVtXT1cImxpc3RJZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbSgpXCJcbiAgICAgIFtoYXNEaXZpZGVyXT1cImxpc3RDb25maWdIYXNEaXZpZGVyKClcIlxuICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRLZXkoJGV2ZW50KVwiXG4gICAgICAob3V0U2VsZWN0TXVsdGlLZXkpPVwiaGFuZGxlclNlbGVjdE11bHRpS2V5KCRldmVudCwgdHJ1ZSlcIlxuICAgICAgKG91dENoYW5nZVZpZXcpPVwiaGFuZGxlckRhdGFDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAob3V0Q2xpY2tCdXR0b25PdGhlcik9XCJoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcigkZXZlbnQpXCJcbiAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJMaXN0RnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCJcbiAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9XCJoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgIChvdXRMb2FkaW5nKT1cImhhbmRsZXJMb2FkaW5nTGlzdCgkZXZlbnQpXCIgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|