@libs-ui/components-inputs-multi-language 0.2.356-23 → 0.2.356-25
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 +0 -1
- package/esm2022/interfaces/multi-language.interface.mjs +1 -1
- package/esm2022/items/items.component.mjs +62 -75
- package/esm2022/multi-language.component.mjs +137 -127
- package/esm2022/pipes/display-language.pipe.mjs +2 -2
- package/fesm2022/libs-ui-components-inputs-multi-language.mjs +197 -200
- package/fesm2022/libs-ui-components-inputs-multi-language.mjs.map +1 -1
- package/interfaces/multi-language.interface.d.ts +5 -1
- package/items/items.component.d.ts +16 -19
- package/multi-language.component.d.ts +17 -14
- package/package.json +10 -10
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { ChangeDetectionStrategy, Component, computed, effect, input, model, output, signal, untracked } from '@angular/core';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, computed, effect, input, model, output, signal, untracked, viewChildren } from '@angular/core';
|
|
3
3
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
4
4
|
import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
|
|
5
|
-
import {
|
|
5
|
+
import { LibsUiComponentsInputsQuill2xComponent } from '@libs-ui/components-inputs-quill2x';
|
|
6
6
|
import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
|
|
7
7
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
8
8
|
import { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';
|
|
@@ -16,7 +16,6 @@ import { currenciesOptions, currenciesSupport, httpRequestDetail, langOptions, l
|
|
|
16
16
|
import * as i0 from "@angular/core";
|
|
17
17
|
import * as i1 from "@ngx-translate/core";
|
|
18
18
|
export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
19
|
-
// #region PROPERTY
|
|
20
19
|
languageDisplay = signal([]);
|
|
21
20
|
dataLanguageChange = signal({});
|
|
22
21
|
langDefault = signal(languageSupport());
|
|
@@ -25,10 +24,9 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
25
24
|
validRequiredDefault = signal(validRequired());
|
|
26
25
|
listConfigItem = computed(() => listConfigItem(this.options()));
|
|
27
26
|
httpRequestDetail = computed(() => httpRequestDetail(this.options()));
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
inputComponentRefs = viewChildren(LibsUiComponentsInputsValidComponent);
|
|
28
|
+
quillComponentRefs = viewChildren(LibsUiComponentsInputsQuill2xComponent);
|
|
30
29
|
onDestroy = new Subject();
|
|
31
|
-
// #region INPUT
|
|
32
30
|
optionsLanguage = input(langOptions());
|
|
33
31
|
zIndex = input();
|
|
34
32
|
viewType = input('text', { transform: (value) => value ?? 'text' });
|
|
@@ -51,17 +49,16 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
51
49
|
classIncludeKey = input('libs-ui-font-h4r');
|
|
52
50
|
classIncludeValue = input('libs-ui-font-h4s');
|
|
53
51
|
dataLanguage = model({});
|
|
54
|
-
multiLine = input();
|
|
55
52
|
readonly = input();
|
|
56
53
|
acceptNegativeValue = input();
|
|
57
54
|
valueUpDownNumber = input();
|
|
58
55
|
maxValueNumber = input();
|
|
59
56
|
onlyAcceptNegativeValue = input();
|
|
60
57
|
validOneDefaultMultiLanguage = input();
|
|
61
|
-
|
|
58
|
+
classIconAddLanguage = input('libs-ui-icon-add', { transform: (value) => value || 'libs-ui-icon-add' });
|
|
59
|
+
validPattern = input();
|
|
62
60
|
outEventMultiLanguage = output();
|
|
63
61
|
outChangeTypeLanguage = output();
|
|
64
|
-
outFunctionsControl = output();
|
|
65
62
|
outChangeValueInput = output();
|
|
66
63
|
constructor() {
|
|
67
64
|
effect(() => {
|
|
@@ -76,16 +73,18 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
76
73
|
untracked(() => {
|
|
77
74
|
if (viewType === 'integer') {
|
|
78
75
|
this.langDefault.set(currenciesSupport());
|
|
79
|
-
|
|
80
|
-
this.options
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
this.currencyUnits.update((value) => [...value]);
|
|
76
|
+
const opts = currenciesOptions();
|
|
77
|
+
this.options.set(opts);
|
|
78
|
+
this.currencyUnits.set(opts.map((item) => ({
|
|
79
|
+
label: item.label,
|
|
80
|
+
id: item.key,
|
|
81
|
+
type: item.label,
|
|
82
|
+
})));
|
|
83
|
+
return;
|
|
88
84
|
}
|
|
85
|
+
this.langDefault.set(languageSupport());
|
|
86
|
+
this.options.set(this.optionsLanguage());
|
|
87
|
+
this.currencyUnits.set([]);
|
|
89
88
|
});
|
|
90
89
|
});
|
|
91
90
|
effect(() => {
|
|
@@ -93,20 +92,7 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
93
92
|
const dataLanguage = this.dataLanguage();
|
|
94
93
|
this.dataLanguageChange.set(cloneDeep(dataLanguage));
|
|
95
94
|
this.generateData();
|
|
96
|
-
|
|
97
|
-
Object.keys(this.dataLanguageChange()).forEach((key) => {
|
|
98
|
-
if (this.options().find((item) => item.key === key)) {
|
|
99
|
-
optionsSelected.add(key);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
if (this.langDefault().length) {
|
|
103
|
-
this.langDefault().forEach((key) => {
|
|
104
|
-
if (!isNil(get(this.dataLanguageChange, key))) {
|
|
105
|
-
optionsSelected.add(key);
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
this.languageDisplay.set(Array.from(optionsSelected));
|
|
95
|
+
this.languageDisplay.set(this.computeLanguageDisplayKeys());
|
|
110
96
|
});
|
|
111
97
|
});
|
|
112
98
|
effect(() => {
|
|
@@ -117,24 +103,23 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
117
103
|
return;
|
|
118
104
|
}
|
|
119
105
|
const key = this.langDefault()[0];
|
|
120
|
-
this.dataLanguage.update((value) => ({ ...value, [key]: get(this.dataLanguageChange, key) }));
|
|
106
|
+
this.dataLanguage.update((value) => ({ ...value, [key]: get(this.dataLanguageChange(), key) }));
|
|
121
107
|
});
|
|
122
108
|
});
|
|
123
109
|
effect(() => {
|
|
124
|
-
const
|
|
110
|
+
const validRequiredInput = this.validRequired();
|
|
125
111
|
untracked(() => {
|
|
126
|
-
if (!
|
|
112
|
+
if (!validRequiredInput) {
|
|
127
113
|
return;
|
|
128
114
|
}
|
|
129
|
-
this.validRequiredDefault.update((value) => ({ ...value, isRequired:
|
|
130
|
-
if (!
|
|
131
|
-
this.validate();
|
|
115
|
+
this.validRequiredDefault.update((value) => ({ ...value, isRequired: validRequiredInput.isRequired }));
|
|
116
|
+
if (!validRequiredInput.isRequired) {
|
|
117
|
+
void this.validate();
|
|
132
118
|
}
|
|
133
119
|
});
|
|
134
120
|
});
|
|
135
121
|
}
|
|
136
122
|
ngOnInit() {
|
|
137
|
-
this.outFunctionsControl.emit(this.FunctionsControl);
|
|
138
123
|
this.extendClass.update((value) => `${value || ''} ${this.viewPosition() === 'row' ? 'flex-row' : 'flex-col'}`);
|
|
139
124
|
}
|
|
140
125
|
get FunctionsControl() {
|
|
@@ -143,82 +128,94 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
143
128
|
getData: this.getData.bind(this),
|
|
144
129
|
};
|
|
145
130
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
this.
|
|
131
|
+
/** Các key ngôn ngữ / tiền tệ cần hiển thị theo dữ liệu + cấu hình options. */
|
|
132
|
+
computeLanguageDisplayKeys() {
|
|
133
|
+
const dc = this.dataLanguageChange();
|
|
134
|
+
const opts = this.options();
|
|
135
|
+
const langs = this.langDefault();
|
|
136
|
+
const selected = new Set();
|
|
137
|
+
for (const k of Object.keys(dc)) {
|
|
138
|
+
if (opts.some((o) => o.key === k)) {
|
|
139
|
+
selected.add(k);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
for (const k of langs) {
|
|
143
|
+
if (!isNil(get(dc, k))) {
|
|
144
|
+
selected.add(k);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return Array.from(selected);
|
|
151
148
|
}
|
|
152
|
-
|
|
149
|
+
handlerSelectChange(event, keyOld) {
|
|
153
150
|
if (!event || event.key === keyOld) {
|
|
154
151
|
return;
|
|
155
152
|
}
|
|
156
153
|
this.languageDisplay.update((value) => value.map((item) => (item === keyOld ? event.key : item)));
|
|
157
154
|
delete this.dataLanguageChange()[keyOld];
|
|
158
155
|
delete this.dataLanguage()[keyOld];
|
|
159
|
-
this.setDefaultData(event.key);
|
|
156
|
+
void this.setDefaultData(event.key);
|
|
160
157
|
}
|
|
161
|
-
|
|
158
|
+
handlerAddLanguage(event) {
|
|
162
159
|
event.stopPropagation();
|
|
163
160
|
const lang = this.options().find((item) => !this.languageDisplay().includes(item.key));
|
|
164
161
|
if (!lang) {
|
|
165
162
|
return;
|
|
166
163
|
}
|
|
167
164
|
this.languageDisplay.update((value) => [...value, lang.key]);
|
|
168
|
-
this.setDefaultData(lang.key);
|
|
165
|
+
void this.setDefaultData(lang.key);
|
|
169
166
|
if (this.options().length === this.languageDisplay().length) {
|
|
170
167
|
this.ignoreAdd.set(true);
|
|
171
168
|
}
|
|
172
169
|
this.outEventMultiLanguage.emit({ action: 'add', data: this.dataLanguageChange() });
|
|
173
170
|
}
|
|
174
|
-
|
|
171
|
+
handlerRemoveLanguage(event, key) {
|
|
175
172
|
event.stopPropagation();
|
|
176
|
-
this.ignoreAdd.set(
|
|
173
|
+
this.ignoreAdd.set(false);
|
|
177
174
|
this.dataLanguageChange.update((value) => {
|
|
178
175
|
delete value[key];
|
|
179
176
|
return { ...value };
|
|
180
177
|
});
|
|
181
|
-
this.validateIsMultiKey();
|
|
178
|
+
void this.validateIsMultiKey();
|
|
182
179
|
this.languageDisplay.update((value) => value.filter((item) => item !== key));
|
|
183
180
|
this.outEventMultiLanguage.emit({ action: 'remove', data: this.dataLanguageChange() });
|
|
184
|
-
this.inputFunctionControl().delete(key);
|
|
185
181
|
}
|
|
186
|
-
|
|
182
|
+
getData() {
|
|
187
183
|
if (this.singleLanguage()) {
|
|
188
184
|
const key = this.langDefault()[0];
|
|
189
|
-
this.dataLanguage.update((value) => ({ ...value, [key]: get(this.dataLanguageChange, key) }));
|
|
185
|
+
this.dataLanguage.update((value) => ({ ...value, [key]: get(this.dataLanguageChange(), key) }));
|
|
190
186
|
return this.dataLanguage();
|
|
191
187
|
}
|
|
192
188
|
if (this.data().length > 1) {
|
|
189
|
+
const defaultLang = this.langDefault()[0];
|
|
193
190
|
for (const item of this.data()) {
|
|
194
|
-
const
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
if (key && dataByKey && lang && !get(dataByKey, lang) && !get(this.dataLanguageChange, lang)) {
|
|
191
|
+
const keyBind = item.keyBindData;
|
|
192
|
+
const dataByKey = keyBind ? get(this.dataLanguageChange(), keyBind) : undefined;
|
|
193
|
+
if (keyBind && dataByKey && defaultLang && !get(dataByKey, defaultLang) && !get(this.dataLanguageChange(), defaultLang)) {
|
|
198
194
|
return {};
|
|
199
195
|
}
|
|
200
196
|
}
|
|
201
197
|
}
|
|
202
198
|
return this.dataLanguageChange();
|
|
203
199
|
}
|
|
204
|
-
|
|
200
|
+
generateData() {
|
|
205
201
|
const lang = this.langDefault()[0];
|
|
206
|
-
|
|
207
|
-
|
|
202
|
+
const dataItems = this.data();
|
|
203
|
+
if (dataItems.length) {
|
|
204
|
+
dataItems.forEach((item, index) => {
|
|
208
205
|
const key = item.keyBindData;
|
|
209
|
-
if (!index && isNil(get(this.dataLanguageChange, lang))) {
|
|
210
|
-
this.setDefaultData(lang);
|
|
206
|
+
if (!index && isNil(get(this.dataLanguageChange(), lang))) {
|
|
207
|
+
void this.setDefaultData(lang);
|
|
211
208
|
return;
|
|
212
209
|
}
|
|
213
|
-
if (!key || !isNil(get(this.dataLanguageChange, key))) {
|
|
210
|
+
if (!key || !isNil(get(this.dataLanguageChange(), key))) {
|
|
214
211
|
return;
|
|
215
212
|
}
|
|
216
213
|
this.dataLanguageChange.update((value) => ({ ...value, [key]: { [lang]: '' } }));
|
|
217
214
|
});
|
|
218
215
|
}
|
|
219
|
-
if (!
|
|
216
|
+
if (!dataItems.length) {
|
|
220
217
|
if (!this.dataLanguage() || !Object.keys(this.dataLanguage()).length) {
|
|
221
|
-
this.setDefaultData(lang);
|
|
218
|
+
void this.setDefaultData(lang);
|
|
222
219
|
}
|
|
223
220
|
this.data.set([
|
|
224
221
|
{
|
|
@@ -230,19 +227,19 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
230
227
|
]);
|
|
231
228
|
}
|
|
232
229
|
}
|
|
233
|
-
|
|
230
|
+
setDefaultData(key) {
|
|
234
231
|
this.dataLanguageChange.update((value) => ({ ...value, [key]: '' }));
|
|
235
232
|
this.dataLanguage.update((value) => ({ ...value, [key]: '' }));
|
|
236
233
|
}
|
|
237
234
|
async validate() {
|
|
238
235
|
let valid = true;
|
|
239
|
-
for (const control of this.
|
|
240
|
-
if (!(await control.checkIsValid())) {
|
|
236
|
+
for (const control of this.inputComponentRefs()) {
|
|
237
|
+
if (!(await control.FunctionsControl.checkIsValid())) {
|
|
241
238
|
valid = false;
|
|
242
239
|
}
|
|
243
240
|
}
|
|
244
|
-
for (const
|
|
245
|
-
if (!(await
|
|
241
|
+
for (const quillCmp of this.quillComponentRefs()) {
|
|
242
|
+
if (!(await quillCmp.FunctionsControl.checkIsValid())) {
|
|
246
243
|
valid = false;
|
|
247
244
|
}
|
|
248
245
|
}
|
|
@@ -250,9 +247,12 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
250
247
|
return valid;
|
|
251
248
|
}
|
|
252
249
|
if (this.data().length === 1) {
|
|
253
|
-
await this.validateDefault();
|
|
250
|
+
const defaultOk = await this.validateDefault();
|
|
251
|
+
if (!defaultOk) {
|
|
252
|
+
valid = false;
|
|
253
|
+
}
|
|
254
254
|
}
|
|
255
|
-
this.validateIsMultiKey();
|
|
255
|
+
await this.validateIsMultiKey();
|
|
256
256
|
return valid;
|
|
257
257
|
}
|
|
258
258
|
async validateDefault() {
|
|
@@ -272,12 +272,12 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
272
272
|
return valid;
|
|
273
273
|
}
|
|
274
274
|
for (const key of Object.keys(this.dataLanguageChange())) {
|
|
275
|
-
if (key !== 'id' && key !== this.keyHeader() && get(this.dataLanguageChange, key) && key !== this.langDefault()[0]) {
|
|
275
|
+
if (key !== 'id' && key !== this.keyHeader() && get(this.dataLanguageChange(), key) && key !== this.langDefault()[0]) {
|
|
276
276
|
this.validRequiredDefault.update((value) => ({ ...value, isRequired: true }));
|
|
277
277
|
if (!(await this.checkValidInput())) {
|
|
278
278
|
valid = false;
|
|
279
279
|
}
|
|
280
|
-
return;
|
|
280
|
+
return valid;
|
|
281
281
|
}
|
|
282
282
|
this.validRequiredDefault.update((value) => ({ ...value, isRequired: false }));
|
|
283
283
|
if (!(await this.checkValidInput())) {
|
|
@@ -288,80 +288,90 @@ export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
|
288
288
|
}
|
|
289
289
|
async checkValidInput() {
|
|
290
290
|
let valid = true;
|
|
291
|
-
for (const control of this.
|
|
292
|
-
if (!(await control.checkIsValid())) {
|
|
291
|
+
for (const control of this.inputComponentRefs()) {
|
|
292
|
+
if (!(await control.FunctionsControl.checkIsValid())) {
|
|
293
293
|
valid = false;
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
296
|
return valid;
|
|
297
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* Khi có nhiều `IDataItem` (nhiều field bind), cập nhật `validRequiredLangDefault` theo dữ liệu đã nhập.
|
|
300
|
+
* Giữ nguyên thứ tự điều kiện / nhánh như phiên bản trước (forEach async), nhưng await đúng để validate không kết thúc sớm.
|
|
301
|
+
*/
|
|
298
302
|
async validateIsMultiKey() {
|
|
299
|
-
if (this.data().length
|
|
300
|
-
|
|
301
|
-
|
|
303
|
+
if (this.data().length <= 1) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
if (this.data()[0].validRequired?.isRequired) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const dataItems = this.data();
|
|
310
|
+
const dc = this.dataLanguageChange();
|
|
311
|
+
for (const item of dataItems) {
|
|
312
|
+
if (!item.keyBindData) {
|
|
313
|
+
continue;
|
|
302
314
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
await this.checkValidInput();
|
|
317
|
-
}
|
|
318
|
-
});
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
this.data().forEach(async (config) => {
|
|
322
|
-
if (config && config.validRequiredLangDefault) {
|
|
323
|
-
config.validRequiredLangDefault.isRequired = false;
|
|
315
|
+
const nested = get(dc, item.keyBindData);
|
|
316
|
+
if (!nested || typeof nested !== 'object') {
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
langKey: for (const langNestedKey of Object.keys(nested)) {
|
|
320
|
+
for (const topKey of Object.keys(dc)) {
|
|
321
|
+
if (topKey === item.keyBindData || topKey === langNestedKey) {
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (get(dc, topKey) && this.options().find((opt) => opt.key === topKey)) {
|
|
325
|
+
for (const config of dataItems) {
|
|
326
|
+
if (config?.validRequiredLangDefault) {
|
|
327
|
+
config.validRequiredLangDefault.isRequired = true;
|
|
324
328
|
await this.checkValidInput();
|
|
325
329
|
}
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
const dataLanguageChangeByKeyBind = get(this.dataLanguageChange, keyBind);
|
|
329
|
-
const dataLanguageChangeByKeyBindData = item.keyBindData ? get(this.dataLanguageChange, item.keyBindData) : undefined;
|
|
330
|
-
if ((!dataLanguageChangeByKeyBind && !get(dataLanguageChangeByKeyBindData, keyBind)) || (dataLanguageChangeByKeyBind && get(dataLanguageChangeByKeyBindData, keyBind))) {
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
if (!dataLanguageChangeByKeyBind) {
|
|
334
|
-
const dataFirst = this.data()[0];
|
|
335
|
-
if (dataFirst && dataFirst.validRequiredLangDefault) {
|
|
336
|
-
dataFirst.validRequiredLangDefault.isRequired = true;
|
|
337
|
-
await this.checkValidInput();
|
|
338
330
|
}
|
|
339
|
-
|
|
331
|
+
continue langKey;
|
|
340
332
|
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
dataSecond.validRequiredLangDefault.isRequired = true;
|
|
333
|
+
for (const config of dataItems) {
|
|
334
|
+
if (config?.validRequiredLangDefault) {
|
|
335
|
+
config.validRequiredLangDefault.isRequired = false;
|
|
345
336
|
await this.checkValidInput();
|
|
346
337
|
}
|
|
347
|
-
return;
|
|
348
338
|
}
|
|
349
|
-
}
|
|
350
|
-
|
|
339
|
+
}
|
|
340
|
+
const dataLanguageChangeByKeyBind = get(dc, langNestedKey);
|
|
341
|
+
const dataByItemKey = item.keyBindData ? get(dc, item.keyBindData) : undefined;
|
|
342
|
+
if ((!dataLanguageChangeByKeyBind && !get(dataByItemKey, langNestedKey)) || (dataLanguageChangeByKeyBind && get(dataByItemKey, langNestedKey))) {
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
if (!dataLanguageChangeByKeyBind) {
|
|
346
|
+
const dataFirst = dataItems[0];
|
|
347
|
+
if (dataFirst?.validRequiredLangDefault) {
|
|
348
|
+
dataFirst.validRequiredLangDefault.isRequired = true;
|
|
349
|
+
await this.checkValidInput();
|
|
350
|
+
}
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
if (!get(dataByItemKey, langNestedKey)) {
|
|
354
|
+
const dataSecond = dataItems[1];
|
|
355
|
+
if (dataSecond?.validRequiredLangDefault) {
|
|
356
|
+
dataSecond.validRequiredLangDefault.isRequired = true;
|
|
357
|
+
await this.checkValidInput();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
351
361
|
}
|
|
352
362
|
}
|
|
353
|
-
|
|
363
|
+
handlerInputChange() {
|
|
354
364
|
this.outChangeValueInput.emit();
|
|
355
365
|
timer(500)
|
|
356
366
|
.pipe(takeUntil(this.onDestroy))
|
|
357
|
-
.subscribe(() => this.validate());
|
|
367
|
+
.subscribe(() => void this.validate());
|
|
358
368
|
}
|
|
359
369
|
ngOnDestroy() {
|
|
360
370
|
this.onDestroy.next();
|
|
361
371
|
this.onDestroy.complete();
|
|
362
372
|
}
|
|
363
373
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
364
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { optionsLanguage: { classPropertyName: "optionsLanguage", publicName: "optionsLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, multiLine: { classPropertyName: "multiLine", publicName: "multiLine", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, validOneDefaultMultiLanguage: { classPropertyName: "validOneDefaultMultiLanguage", publicName: "validOneDefaultMultiLanguage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outFunctionsControl: "outFunctionsControl", outChangeValueInput: "outChangeValueInput" }, ngImport: i0, template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\">{{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div\n [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div\n class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if ((item.type !== 'editor' && !item.isOneValue) || (item.isOneValue && $first)) {\n <div\n class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"(singleLanguage() && !multiLine()) || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true } : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage() ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false} :\n ($index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false })\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"(validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key] ) ? undefined : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerQuillFunctionControl($event)\" />\n }\n </div>\n </div>\n }\n }\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div\n class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div\n class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage() || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuillComponent, selector: "libs_ui-components-inputs-quill", inputs: ["isShowToolBar", "isToolbarPositionFixed", "classIncludeToolbar", "stylesIncludeToolbar", "toolbarConfig", "placeholder", "label", "item", "autoUpdateValueWhenTextChange", "fieldNameBind", "readonly", "showErrorLabel", "showErrorBorder", "onlyShowErrorBorderInContent", "classIncludeTemplate", "classInclude", "handlersExpand", "validRequired", "validMinLength", "validMaxLength", "zIndex", "dataConfigMention", "blotsRegister", "autoFocus", "focusBottom", "blockUndoRedoKeyboard", "templateToolBarPersonalize", "template", "uploadImageConfig", "heightAuto", "elementScrollHeightAuto", "ignoreShowPopupEditLink", "ignoreCommunicateMicroEventPopup"], outputs: ["itemChange", "outShowPopupEditLink", "outMessageError", "outBlur", "outFocus", "outChange", "outFunctionsControl", "outSelectionChange", "outTextChange", "outContextMenu"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
374
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { optionsLanguage: { classPropertyName: "optionsLanguage", publicName: "optionsLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, validOneDefaultMultiLanguage: { classPropertyName: "validOneDefaultMultiLanguage", publicName: "validOneDefaultMultiLanguage", isSignal: true, isRequired: false, transformFunction: null }, classIconAddLanguage: { classPropertyName: "classIconAddLanguage", publicName: "classIconAddLanguage", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outChangeValueInput: "outChangeValueInput" }, viewQueries: [{ propertyName: "inputComponentRefs", predicate: LibsUiComponentsInputsValidComponent, descendants: true, isSignal: true }, { propertyName: "quillComponentRefs", predicate: LibsUiComponentsInputsQuill2xComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "dropdownTemplateRefNotSearchNoData", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }, { kind: "component", type: LibsUiComponentsInputsQuill2xComponent, selector: "libs_ui-components-inputs-quill2x", inputs: ["uploadImageConfig", "displayToolbar", "placeholder", "blotsRegister", "readonly", "quillCustomConfig", "label", "item", "fieldBind", "dataConfigMention", "templateToolBarPersonalize", "zIndex", "ignoreShowPopupEditLink", "ignoreCommunicateMicroEventPopup", "handlersExpand", "resizeImagePlugin", "fontSizeDefault", "heightEditorContentDefault", "minHeightEditorContentDefault", "maxHeightEditorContentDefault", "removeNearWhiteColorsOnPaste", "resize", "autoFocus", "focusTimerOnInit", "focusBottom", "validRequired", "validMinLength", "validMaxLength", "showErrorLabel", "showErrorBorder", "ignoreShowBorderErrorToolbar"], outputs: ["itemChange", "outShowPopupEditLink", "outMessageError", "outBlur", "outFocus", "outChange", "outSelectionChange", "outTextChange", "outContextMenu", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
365
375
|
}
|
|
366
376
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, decorators: [{
|
|
367
377
|
type: Component,
|
|
@@ -375,7 +385,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
375
385
|
LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe,
|
|
376
386
|
LibsUiComponentsInputsMultiLanguageGetItemPipe,
|
|
377
387
|
LibsUiPipesEscapeHtmlPipe,
|
|
378
|
-
|
|
379
|
-
], template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m
|
|
388
|
+
LibsUiComponentsInputsQuill2xComponent,
|
|
389
|
+
], template: "<div class=\"w-full flex flex-col gap-[8px]\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m\">{{ titleField | translate }}</div>\n }\n <div\n class=\"flex flex-col gap-[8px]\"\n [class.gap-[8px]]=\"viewPosition() === 'row'\"\n [class.gap-[16px]]=\"viewPosition() === 'column'\">\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div class=\"flex gap-[8px] w-full {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown\n [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe: key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHiddenInputSearch]=\"true\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex flex-1 gap-[12px] {{ extendClassContent() }}\">\n @for (item of data(); track item) {\n @if (item.type === 'editor') {\n <div class=\"w-full min-w-0\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-quill2x\n [(item)]=\"itemMap\"\n [fieldBind]=\"key\"\n [resize]=\"item.resize || 'vertical'\"\n [minHeightEditorContentDefault]=\"item.minHeightEditorContentDefault || 160\"\n [maxHeightEditorContentDefault]=\"item.maxHeightEditorContentDefault\"\n [heightEditorContentDefault]=\"item.heightEditorContentDefault\"\n [validRequired]=\"$index === 0 && data().length <= 1 ? validRequiredDefault() : validRequired()\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [readonly]=\"readonly()\"\n (outFocus)=\"handlerInputChange()\"\n (outChange)=\"handlerInputChange()\" />\n }\n </div>\n } @else {\n <div class=\"w-full min-w-0 {{ item.classIncludeInput }}\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: dataLanguageChange; as itemMap) {\n @let constHtmlPlaceholder = item.placeholder || ' ';\n <libs_ui-components-inputs-valid\n [dataType]=\"item.type === 'number' ? 'int' : item.type === 'text' ? 'string' : item.type === 'bigint' ? 'bigint' : 'float'\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"constHtmlPlaceholder | translate\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"\n validOneDefaultMultiLanguage()\n ? { isRequired: validOneDefaultMultiLanguage() === key ? true : false }\n : $index === 0 && data().length <= 1\n ? validRequiredDefault()\n : $index === 0 && data().length > 1 && item.validRequiredLangDefault\n ? item.validRequiredLangDefault\n : item.validRequired\n ? item.validRequired\n : validRequired() || { isRequired: false }\n \"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength().length ? validMaxLength().length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"\n validOneDefaultMultiLanguage() && validOneDefaultMultiLanguage() !== key && !itemMap()[key]\n ? undefined\n : { length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: { number: validMinLength()?.length } }\n \"\n [validPattern]=\"validPattern()\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\" />\n }\n </div>\n }\n }\n @if (!singleLanguage()) {\n <div\n class=\"flex items-center w-[16px] shrink-0\"\n [class.h-[32px]]=\"data()[0].type !== 'editor'\"\n [class.h-[44px]]=\"data()[0].type === 'editor'\">\n @if ($index > 0 && data().length === 1 && !ignoreRemove() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#6a7383',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '#6a7383',\n },\n rootColor: '#6a7383',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n }\n @if ($index === 0 && options().length !== languageDisplay().length && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"classIconAddLanguage()\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n </div>\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex gap-[4px]\">\n @if (!singleLanguage()) {\n <div class=\"flex\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe: options()\" />\n </div>\n }\n <div class=\"flex flex-1 min-w-0\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"(dataLanguageChange()[key] || dataLanguageChange()[key] === 0 ? dataLanguageChange()[key] + '' : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{ zIndex: zIndex() }\" />\n </div>\n </div>\n }\n }\n </div>\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classLabel]=\"'libs-ui-font-h6mi'\"\n [classInclude]=\"'!px-0 !py-[2px]'\"\n [label]=\"'i18n_add_new'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n" }]
|
|
380
390
|
}], ctorParameters: () => [] });
|
|
381
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQWtCLGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakcsT0FBTyxFQUE4QixvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BILE9BQU8sRUFBaUUsb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2SixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBRSxzREFBc0QsRUFBRSxNQUFNLCtC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Q0FBQztRQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDL0IsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBaFhVLDRDQUE0Qzs0RkFBNUMsNENBQTRDLDAvSUNwQ3pELGt1UkFtS0EsMkNEM0lJLGVBQWUsNEZBQ2YsaUNBQWlDLHUzREFDakMsb0NBQW9DLGczREFDcEMsc0NBQXNDLHNqQkFDdEMsZ0NBQWdDLCtmQUNoQyxvREFBb0Qsd0ZBQ3BELHNEQUFzRCwwRkFDdEQsOENBQThDLGtGQUM5Qyx5QkFBeUIsa0VBQ3pCLG9DQUFvQzs7NEZBRzNCLDRDQUE0QztrQkFuQnhELFNBQVM7K0JBRUUsMENBQTBDLGNBRXhDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxlQUFlO3dCQUNmLGlDQUFpQzt3QkFDakMsb0NBQW9DO3dCQUNwQyxzQ0FBc0M7d0JBQ3RDLGdDQUFnQzt3QkFDaEMsb0RBQW9EO3dCQUNwRCxzREFBc0Q7d0JBQ3RELDhDQUE4Qzt3QkFDOUMseUJBQXlCO3dCQUN6QixvQ0FBb0M7cUJBQ3JDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5wdXQsIG1vZGVsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElRdWlsbEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1xdWlsbCc7XG5pbXBvcnQgeyBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJVmFsaWRMZW5ndGgsIElWYWxpZFJlcXVpcmVkLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlIH0gZnJvbSAnQGxpYnMtdWkvcGlwZXMtZXNjYXBlLWh0bWwnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ3VycmVuY3lVbml0LCBJRGF0YUl0ZW0sIElEYXRhTXVsdGlMYW5ndWFnZSwgSUV2ZW50TXVsdGlMYW5ndWFnZSwgSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJT3B0aW9uLCBUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UgfSBmcm9tICcuL2ludGVyZmFjZXMvbXVsdGktbGFuZ3VhZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSB9IGZyb20gJy4vcGlwZXMvZGlzcGxheS1sYW5ndWFnZS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1kaXNhYmxlLWtleS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1pdGVtLnBpcGUnO1xuaW1wb3J0IHsgY3VycmVuY2llc09wdGlvbnMsIGN1cnJlbmNpZXNTdXBwb3J0LCBodHRwUmVxdWVzdERldGFpbCwgbGFuZ09wdGlvbnMsIGxhbmd1YWdlU3VwcG9ydCwgbGlzdENvbmZpZ0l0ZW0sIHZhbGlkUmVxdWlyZWQgfSBmcm9tICcuL3V0aWxzL211bHRpLWxhbmd1YWdlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1tdWx0aV9sYW5ndWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1sYW5ndWFnZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXREaXNhYmxlS2V5UGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZSxcbiAgICBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGxhbmd1YWdlRGlzcGxheSA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihbXSk7XG4gIHByb3RlY3RlZCBkYXRhTGFuZ3VhZ2VDaGFuZ2UgPSBzaWduYWw8SURhdGFNdWx0aUxhbmd1YWdlPih7fSk7XG4gIHByb3RlY3RlZCBsYW5nRGVmYXVsdCA9IHNpZ25hbDxBcnJheTxzdHJpbmc+PihsYW5ndWFnZVN1cHBvcnQoKSk7XG4gIHByb3RlY3RlZCBjdXJyZW5jeVVuaXRzID0gc2lnbmFsPEFycmF5PElDdXJyZW5jeVVuaXQ+PihbXSk7XG4gIHByb3RlY3RlZCBvcHRpb25zID0gc2lnbmFsPEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcHJvdGVjdGVkIHZhbGlkUmVxdWlyZWREZWZhdWx0ID0gc2lnbmFsPElWYWxpZFJlcXVpcmVkPih2YWxpZFJlcXVpcmVkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ0l0ZW0gPSBjb21wdXRlZCgoKSA9PiBsaXN0Q29uZmlnSXRlbSh0aGlzLm9wdGlvbnMoKSkpO1xuICBwcm90ZWN0ZWQgaHR0cFJlcXVlc3REZXRhaWwgPSBjb21wdXRlZCgoKSA9PiBodHRwUmVxdWVzdERldGFpbCh0aGlzLm9wdGlvbnMoKSkpO1xuXG4gIHByaXZhdGUgaW5wdXRGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8TWFwPHN0cmluZywgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudD4+KG5ldyBNYXAoKSk7XG4gIHByaXZhdGUgcXVpbGxGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8QXJyYXk8SVF1aWxsRnVuY3Rpb25Db250cm9sRXZlbnQ+PihbXSk7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IG9wdGlvbnNMYW5ndWFnZSA9IGlucHV0PEFycmF5PElPcHRpb24+PihsYW5nT3B0aW9ucygpKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSB2aWV3VHlwZSA9IGlucHV0PFRZUEVfVklFV19NVUxUSV9MQU5HVUFHRSwgVFlQRV9WSUVXX01VTFRJX0xBTkdVQUdFIHwgdW5kZWZpbmVkPigndGV4dCcsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICd0ZXh0JyB9KTtcbiAgcmVhZG9ubHkgc2luZ2xlTGFuZ3VhZ2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBkYXRhID0gbW9kZWw8QXJyYXk8SURhdGFJdGVtPj4oW10pO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQsIElWYWxpZFJlcXVpcmVkIHwgdW5kZWZpbmVkPih2YWxpZFJlcXVpcmVkKCksIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHZhbGlkUmVxdWlyZWQoKSB9KTtcbiAgcmVhZG9ubHkgaWdub3JlQWRkID0gbW9kZWw8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdGl0bGVGaWVsZCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkga2V5SGVhZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB0ZXh0QXJlYSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBleHRlbmRDbGFzcyA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXh0ZW5kQ2xhc3NDb250ZW50ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB2aWV3UG9zaXRpb24gPSBpbnB1dDwncm93JyB8ICdjb2x1bW4nPigncm93Jyk7XG4gIHJlYWRvbmx5IGlnbm9yZVJlbW92ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4TGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoLCBJVmFsaWRMZW5ndGggfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiAwIH0sIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHsgbGVuZ3RoOiAwIH0gfSk7XG4gIHJlYWRvbmx5IHZhbGlkTWluTGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSBjb3VudENoYXJhY3RlcnMgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2aWV3Q29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUtleSA9IGlucHV0PHN0cmluZz4oJ2xpYnMtdWktZm9udC1oNHInKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVmFsdWUgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDRzJyk7XG4gIHJlYWRvbmx5IGRhdGFMYW5ndWFnZSA9IG1vZGVsPElEYXRhTXVsdGlMYW5ndWFnZT4oe30pO1xuICByZWFkb25seSBtdWx0aUxpbmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGFjY2VwdE5lZ2F0aXZlVmFsdWUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWx1ZVVwRG93bk51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbWF4VmFsdWVOdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSA9IGlucHV0PHN0cmluZz4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRFdmVudE11bHRpTGFuZ3VhZ2UgPSBvdXRwdXQ8SUV2ZW50TXVsdGlMYW5ndWFnZT4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVHlwZUxhbmd1YWdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDaGFuZ2VWYWx1ZUlucHV0ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmKHRoaXMub3B0aW9uc0xhbmd1YWdlKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KHRoaXMub3B0aW9uc0xhbmd1YWdlKCkpO1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdUeXBlID0gdGhpcy52aWV3VHlwZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXdUeXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgICAgICB0aGlzLmxhbmdEZWZhdWx0LnNldChjdXJyZW5jaWVzU3VwcG9ydCgpKTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KGN1cnJlbmNpZXNPcHRpb25zKCkpO1xuICAgICAgICAgIHRoaXMub3B0aW9ucygpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3lVbml0cygpLnB1c2goe1xuICAgICAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgaWQ6IGl0ZW0ua2V5LFxuICAgICAgICAgICAgICB0eXBlOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jdXJyZW5jeVVuaXRzLnVwZGF0ZSgodmFsdWUpID0+IFsuLi52YWx1ZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2UgPSB0aGlzLmRhdGFMYW5ndWFnZSgpO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS5zZXQoY2xvbmVEZWVwKGRhdGFMYW5ndWFnZSkpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0YSgpO1xuICAgICAgICBjb25zdCBvcHRpb25zU2VsZWN0ZWQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKCkuZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IGtleSkpIHtcbiAgICAgICAgICAgIG9wdGlvbnNTZWxlY3RlZC5hZGQoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5sYW5nRGVmYXVsdCgpLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMubGFuZ0RlZmF1bHQoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpKSkge1xuICAgICAgICAgICAgICBvcHRpb25zU2VsZWN0ZWQuYWRkKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYW5ndWFnZURpc3BsYXkuc2V0KEFycmF5LmZyb20ob3B0aW9uc1NlbGVjdGVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBzaW5nbGVMYW5ndWFnZSA9IHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlVHlwZUxhbmd1YWdlLmVtaXQodHJ1ZSk7XG4gICAgICAgIGlmICghc2luZ2xlTGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoIXZhbGlkUmVxdWlyZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdmFsaWRSZXF1aXJlZC5pc1JlcXVpcmVkIH0pKTtcbiAgICAgICAgaWYgKCF2YWxpZFJlcXVpcmVkLmlzUmVxdWlyZWQpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgICB0aGlzLmV4dGVuZENsYXNzLnVwZGF0ZSgodmFsdWUpID0+IGAke3ZhbHVlIHx8ICcnfSAke3RoaXMudmlld1Bvc2l0aW9uKCkgPT09ICdyb3cnID8gJ2ZsZXgtcm93JyA6ICdmbGV4LWNvbCd9YCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICBnZXREYXRhOiB0aGlzLmdldERhdGEuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJJbnB1dEZ1bmN0aW9uQ29udHJvbChldmVudDogSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkuc2V0KGtleSwgZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJRdWlsbEZ1bmN0aW9uQ29udHJvbChldmVudDogSVF1aWxsRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLnF1aWxsRnVuY3Rpb25Db250cm9sLnVwZGF0ZSgoaXRlbXMpID0+IFsuLi5pdGVtcywgZXZlbnRdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0Q2hhbmdlKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCwga2V5T2xkOiBzdHJpbmcpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmtleSA9PT0ga2V5T2xkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGFuZ3VhZ2VEaXNwbGF5LnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlLm1hcCgoaXRlbSkgPT4gKGl0ZW0gPT09IGtleU9sZCA/IChldmVudC5rZXkgYXMgc3RyaW5nKSA6IGl0ZW0pKSk7XG4gICAgZGVsZXRlIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5T2xkXTtcbiAgICBkZWxldGUgdGhpcy5kYXRhTGFuZ3VhZ2UoKVtrZXlPbGRdO1xuICAgIHRoaXMuc2V0RGVmYXVsdERhdGEoZXZlbnQua2V5IGFzIHN0cmluZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckFkZExhbmd1YWdlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLm9wdGlvbnMoKS5maW5kKChpdGVtKSA9PiAhdGhpcy5sYW5ndWFnZURpc3BsYXkoKS5pbmNsdWRlcyhpdGVtLmtleSkpO1xuICAgIGlmICghbGFuZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUoKHZhbHVlKSA9PiBbLi4udmFsdWUsIGxhbmcua2V5XSk7XG4gICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nLmtleSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucygpLmxlbmd0aCA9PT0gdGhpcy5sYW5ndWFnZURpc3BsYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaWdub3JlQWRkLnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5vdXRFdmVudE11bHRpTGFuZ3VhZ2UuZW1pdCh7IGFjdGlvbjogJ2FkZCcsIGRhdGE6IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclJlbW92ZUxhbmd1YWdlKGV2ZW50OiBFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlnbm9yZUFkZC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UudXBkYXRlKCh2YWx1ZSkgPT4ge1xuICAgICAgZGVsZXRlIHZhbHVlW2tleV07XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSB9O1xuICAgIH0pO1xuICAgIHRoaXMudmFsaWRhdGVJc011bHRpS2V5KCk7XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBrZXkpKTtcbiAgICB0aGlzLm91dEV2ZW50TXVsdGlMYW5ndWFnZS5lbWl0KHsgYWN0aW9uOiAncmVtb3ZlJywgZGF0YTogdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSB9KTtcbiAgICB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkuZGVsZXRlKGtleSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldERhdGEoKSB7XG4gICAgaWYgKHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFtrZXldOiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgfSkpO1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YUxhbmd1YWdlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPiAxKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhKCkpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMubGFuZ0RlZmF1bHQoKVswXTtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXlCaW5kRGF0YTtcbiAgICAgICAgY29uc3QgZGF0YUJ5S2V5ID0ga2V5ID8gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoa2V5ICYmIGRhdGFCeUtleSAmJiBsYW5nICYmICFnZXQ8YW55PihkYXRhQnlLZXksIGxhbmcpICYmICFnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGxhbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRGF0YSgpIHtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5QmluZERhdGE7XG4gICAgICAgIGlmICghaW5kZXggJiYgaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBsYW5nKSkpIHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtleSB8fCAhaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IHsgW2xhbmddOiAnJyB9IH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0YSgpLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFMYW5ndWFnZSgpIHx8ICFPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZSgpKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YS5zZXQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogdGhpcy52aWV3VHlwZSgpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyKCksXG4gICAgICAgICAgaXNPbmVWYWx1ZTogZmFsc2UsXG4gICAgICAgICAga2V5QmluZERhdGE6ICcnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXREZWZhdWx0RGF0YShrZXk6IHN0cmluZykge1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkudmFsdWVzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnF1aWxsRnVuY3Rpb25Db250cm9sKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZURlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUlzTXVsdGlLZXkoKTtcbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRGVmYXVsdCgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKS5pc1JlcXVpcmVkKSB7XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB0cnVlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpKSB7XG4gICAgICBpZiAoa2V5ICE9PSAnaWQnICYmIGtleSAhPT0gdGhpcy5rZXlIZWFkZXIoKSAmJiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgJiYga2V5ICE9PSB0aGlzLmxhbmdEZWZhdWx0KClbMF0pIHtcbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdHJ1ZSB9KSk7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnZhbGlkUmVxdWlyZWREZWZhdWx0LnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiBmYWxzZSB9KSk7XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVmFsaWRJbnB1dCgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkudmFsdWVzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVJc011bHRpS2V5KCkge1xuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPiAxKSB7XG4gICAgICBpZiAodGhpcy5kYXRhKClbMF0udmFsaWRSZXF1aXJlZD8uaXNSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGEoKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICghaXRlbS5rZXlCaW5kRGF0YSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyhnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGl0ZW0ua2V5QmluZERhdGEpKS5mb3JFYWNoKGFzeW5jIChrZXlCaW5kKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IGl0ZW0ua2V5QmluZERhdGEgfHwga2V5ID09PSBrZXlCaW5kKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSAmJiB0aGlzLm9wdGlvbnMoKS5maW5kKChpdGVtKSA9PiBpdGVtLmtleSA9PT0ga2V5KSkge1xuICAgICAgICAgICAgICB0aGlzLmRhdGEoKS5mb3JFYWNoKGFzeW5jIChjb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kID0gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXlCaW5kKTtcbiAgICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmREYXRhID0gaXRlbS5rZXlCaW5kRGF0YSA/IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwgaXRlbS5rZXlCaW5kRGF0YSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKCghZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kICYmICFnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpIHx8IChkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgJiYgZ2V0KGRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZERhdGEsIGtleUJpbmQpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUZpcnN0ID0gdGhpcy5kYXRhKClbMF07XG4gICAgICAgICAgICBpZiAoZGF0YUZpcnN0ICYmIGRhdGFGaXJzdC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgZGF0YUZpcnN0LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTZWNvbmQgPSB0aGlzLmRhdGEoKVsxXTtcbiAgICAgICAgICAgIGlmIChkYXRhU2Vjb25kICYmIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSB7XG4gICAgICAgICAgICAgIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlcklucHV0Q2hhbmdlKCkge1xuICAgIHRoaXMub3V0Q2hhbmdlVmFsdWVJbnB1dC5lbWl0KCk7XG4gICAgdGltZXIoNTAwKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy52YWxpZGF0ZSgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XG4gIEBpZiAodGl0bGVGaWVsZCgpOyBhcyB0aXRsZUZpZWxkKSB7XG4gICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gbWItWzRweF1cIj57eyB0aXRsZUZpZWxkIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gIH1cbiAgQGZvciAoa2V5IG9mIGxhbmd1YWdlRGlzcGxheSgpOyB0cmFjayBrZXkpIHtcbiAgICBAaWYgKCF2aWV3Q29udGVudCgpKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIFtjbGFzcy5tdC1bNHB4XV09XCIhJGZpcnN0XCJcbiAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIlxuICAgICAgICBbY2xhc3MubXQtWzhweF1dPVwiY291bnRDaGFyYWN0ZXJzKCkgJiYgISRmaXJzdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB7eyBleHRlbmRDbGFzcygpIH19XCI+XG4gICAgICAgICAgQGlmICghc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cImh0dHBSZXF1ZXN0RGV0YWlsKClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwibGFuZ3VhZ2VEaXNwbGF5KCkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlOiBrZXlcIlxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIkaW5kZXggPT09IDAgfHwgcmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3ctWzE1MHB4XSdcIlxuICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdENoYW5nZSgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCByZWxhdGl2ZSBwLTAge3sgZXh0ZW5kQ2xhc3NDb250ZW50KCkgfX1cIlxuICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS0xNTBweCldXT1cIiF0ZXh0QXJlYSgpICYmICFzaW5nbGVMYW5ndWFnZSgpICYmIHZpZXdQb3NpdGlvbigpID09PSAncm93J1wiXG4gICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cInRleHRBcmVhKCkgfHwgc2luZ2xlTGFuZ3VhZ2UoKSB8fCB2aWV3UG9zaXRpb24oKSA9PT0gJ2NvbHVtbidcIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YSgpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgIEBpZiAoKGl0ZW0udHlwZSAhPT0gJ2VkaXRvcicgJiYgIWl0ZW0uaXNPbmVWYWx1ZSkgfHwgKGl0ZW0uaXNPbmVWYWx1ZSAmJiAkZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB7eyBpdGVtLmNsYXNzSW5jbHVkZUlucHV0IH19XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy53LWZ1bGxdPVwiKHNpbmdsZUxhbmd1YWdlKCkgJiYgIW11bHRpTGluZSgpKSB8fCByZWFkb25seSgpIHx8ICRmaXJzdFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTI4cHgpXV09XCJ0ZXh0QXJlYSgpIHx8ICghc2luZ2xlTGFuZ3VhZ2UoKSAmJiBtdWx0aUxpbmUoKSlcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS00MHB4KV1dPVwiIXRleHRBcmVhKCkgJiYgIXNpbmdsZUxhbmd1YWdlKCkgJiYgIW11bHRpTGluZSgpICYmICFyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtNzBweCldXT1cIiF0ZXh0QXJlYSgpICYmICFzaW5nbGVMYW5ndWFnZSgpICYmIG11bHRpTGluZSgpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5tdC1bOHB4XV09XCJ2aWV3UG9zaXRpb24oKSA9PT0gJ2NvbHVtbidcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLm1sLVsxMnB4XV09XCIhc2luZ2xlTGFuZ3VhZ2UoKSAmJiAhdGV4dEFyZWEoKSAmJiB2aWV3UG9zaXRpb24oKSA9PT0gJ3JvdydcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5rZXlCaW5kRGF0YSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGU6IGRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFBsYWNlaG9sZGVyID0gaXRlbS5wbGFjZWhvbGRlciB8fCAnICc7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgW2RhdGFUeXBlXT1cIml0ZW0udHlwZSA9PT0gJ251bWJlcicgPyAnaW50JyA6IGl0ZW0udHlwZSA9PT0gJ3RleHQnID8gJ3N0cmluZycgOiBpdGVtLnR5cGUgPT09ICdiaWdpbnQnID8gJ2JpZ2ludCcgOiAnZmxvYXQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsQ29uZmlnXT1cImNvdW50Q2hhcmFjdGVycygpID8geyBjbGFzc0luY2x1ZGU6ICdhYnNvbHV0ZSAtdG9wLVsyMHB4XScsIHJlcXVpcmVkOiB0cnVlIH0gOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0YWdJbnB1dF09XCJ0ZXh0QXJlYSgpID8gJ3RleHRhcmVhJyA6ICdpbnB1dCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb25zdEh0bWxQbGFjZWhvbGRlciB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2VtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkUmVxdWlyZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZE9uZURlZmF1bHRNdWx0aUxhbmd1YWdlKCkgPyB7IGlzUmVxdWlyZWQ6IHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKSA9PT0ga2V5ID8gdHJ1ZSA6IGZhbHNlfSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAoJGluZGV4ID09PSAwICYmIGRhdGEoKS5sZW5ndGggPD0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZhbGlkUmVxdWlyZWREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA+IDEgJiYgaXRlbS52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLnZhbGlkUmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaXRlbS52YWxpZFJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbGlkUmVxdWlyZWQoKSB8fCB7IGlzUmVxdWlyZWQ6IGZhbHNlIH0pXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdW5pdHNSaWdodF09XCJjdXJyZW5jeVVuaXRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtrZXlTZWxlY3RlZFVuaXRSaWdodF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NvdW50XT1cImNvdW50Q2hhcmFjdGVycygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cInZhbGlkTWF4TGVuZ3RoKCkubGVuZ3RoID8gdmFsaWRNYXhMZW5ndGgoKS5sZW5ndGggOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaXhlZEZsb2F0XT1cIml0ZW0udHlwZSA9PT0gJ2JpZ2ludCcgPyA0IDogMTRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZE1pbkxlbmd0aF09XCIodmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSgpICYmIHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKSAhPT0ga2V5ICYmICFpdGVtTWFwKClba2V5XSApID8gIHVuZGVmaW5lZCA6IHsgbGVuZ3RoOiB2YWxpZE1pbkxlbmd0aCgpPy5sZW5ndGggfHwgLTEsIG1lc3NhZ2U6ICdpMThuX21pbmltdW1fbGVuZ3RoX251bWJlcicsIGludGVycG9sYXRlUGFyYW1zOiB7IG51bWJlcjogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RoIH0gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdE5lZ2F0aXZlVmFsdWVdPVwiYWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIm1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZV09XCJvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0VmFsdWVDaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJJbnB1dEZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS50eXBlID09PSAnZWRpdG9yJykge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LVtjYWxjKDEwMCUtMjhweCldXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMjUwcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5rZXlCaW5kRGF0YSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGU6IGRhdGFMYW5ndWFnZUNoYW5nZTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sUGxhY2Vob2xkZXIgPSBpdGVtLnBsYWNlaG9sZGVyIHx8ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1xdWlsbFxuICAgICAgICAgICAgICAgICAgICAgICAgWyhpdGVtKV09XCJpdGVtTWFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRSZXF1aXJlZF09XCIkaW5kZXggPT09IDAgJiYgZGF0YSgpLmxlbmd0aCA8PSAxID8gdmFsaWRSZXF1aXJlZERlZmF1bHQoKSA6IHZhbGlkUmVxdWlyZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uc3RIdG1sUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZvY3VzKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclF1aWxsRnVuY3Rpb25Db250cm9sKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICgkaW5kZXggPiAwICYmIGRhdGEoKS5sZW5ndGggPT09IDEgJiYgIWlnbm9yZVJlbW92ZSgpICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVszMnB4XSBmbGV4IGl0ZW1zLWNlbnRlciBtbC1bMTZweF1cIj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstY3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgICBbYnV0dG9uQ3VzdG9tXT1cIntcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU3RlcENvbG9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyMwNzE2MzEnLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRfaG92ZXI6ICcjZWUyZDQxJyxcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2FjdGl2ZTogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRfZGlzYWJsZTogJzA3MTYzMScsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJvb3RDb2xvcjogJyMwNzE2MzEnLFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwieyBjb25maWc6IHsgY29udGVudDogJ2kxOG5fZGVsZXRlJywgekluZGV4OiAxMjA1IH0gfVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLXJlbW92ZSdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCdcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJSZW1vdmVMYW5ndWFnZSgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoJGluZGV4ID09PSAwICYmICFzaW5nbGVMYW5ndWFnZSgpICYmIG9wdGlvbnMoKS5sZW5ndGggIT09IGxhbmd1YWdlRGlzcGxheSgpLmxlbmd0aCAmJiB2aWV3VHlwZSgpICE9PSAnaW50ZWdlcicgJiYgIXJlYWRvbmx5KCkpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIidpMThuX2FkZF9sYW5ndWFnZSdcIlxuICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQnXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFweC0wIG10LVs4cHhdJ1wiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckFkZExhbmd1YWdlKCRldmVudClcIiAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmICh2aWV3Q29udGVudCgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICBAaWYgKHNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIlxuICAgICAgICAgICAgW2NsYXNzLm10LVs0cHhdXT1cIiFzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZUtleSgpXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJrZXkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGU6IG9wdGlvbnMoKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidy1bY2FsYygxMDAlLTEwMHB4KV1cIlxuICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwic2luZ2xlTGFuZ3VhZ2UoKSAmJiAhJGZpcnN0XCJcbiAgICAgICAgICBbY2xhc3MuZmxleF09XCIhc2luZ2xlTGFuZ3VhZ2UoKSB8fCAkZmlyc3RcIlxuICAgICAgICAgIFtjbGFzcy5tdC1bNHB4XV09XCIhc2luZ2xlTGFuZ3VhZ2UoKSAmJiAhJGZpcnN0XCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGVWYWx1ZSgpXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gfHwgZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSA9PT0gMCA/IGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gKyAnJyA6ICcnKSB8IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGVcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJ7IHpJbmRleDogekluZGV4KCkgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG4gIEBpZiAodmlld1R5cGUoKSA9PT0gJ2ludGVnZXInICYmICF0aGlzLmlnbm9yZUFkZCgpICYmICFyZWFkb25seSgpKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvbi1saW5rLXByaW1hcnlcIlxuICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQgbXItWzhweF0gdGV4dC1bMTBweF0nXCJcbiAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cIichcGItMCdcIlxuICAgICAgW2xhYmVsXT1cIidpMThuX2FkZF9jdXJyZW5jeSdcIlxuICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgfVxuPC9kaXY+XG4iXX0=
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0osT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBK0Msb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNySSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpELE9BQU8sRUFBRSxzREFBc0QsRUFB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QUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQzt3R0FoWVUsNENBQTRDOzRGQUE1Qyw0Q0FBNEMsbXFKQVViLG9DQUFvQyx3RkFDcEMsc0NBQXNDLGdFQy9DbEYsd2lRQTRKQSwyQ0RwSUksZUFBZSw0RkFDZixpQ0FBaUMsdTNEQUNqQyxvQ0FBb0MsZzNEQUNwQyxzQ0FBc0Msc2pCQUN0QyxnQ0FBZ0MsK2ZBQ2hDLG9EQUFvRCx3RkFDcEQsc0RBQXNELDBGQUN0RCw4Q0FBOEMsa0ZBQzlDLHlCQUF5QixrRUFDekIsc0NBQXNDOzs0RkFHN0IsNENBQTRDO2tCQW5CeEQsU0FBUzsrQkFFRSwwQ0FBMEMsY0FFeEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLGVBQWU7d0JBQ2YsaUNBQWlDO3dCQUNqQyxvQ0FBb0M7d0JBQ3BDLHNDQUFzQzt3QkFDdEMsZ0NBQWdDO3dCQUNoQyxvREFBb0Q7d0JBQ3BELHNEQUFzRDt3QkFDdEQsOENBQThDO3dCQUM5Qyx5QkFBeUI7d0JBQ3pCLHNDQUFzQztxQkFDdkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkLCB2aWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJRW1pdFNlbGVjdEtleSwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93bic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGwyeENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXF1aWxsMngnO1xuaW1wb3J0IHsgSVZhbGlkTGVuZ3RoLCBJVmFsaWRQYXR0ZXJuLCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWVzY2FwZS1odG1sJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZ2V0LCBpc05pbCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSUN1cnJlbmN5VW5pdCwgSURhdGFJdGVtLCBJRGF0YU11bHRpTGFuZ3VhZ2UsIElFdmVudE11bHRpTGFuZ3VhZ2UsIElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudCwgSU9wdGlvbiwgVFlQRV9WSUVXX01VTFRJX0xBTkdVQUdFIH0gZnJvbSAnLi9pbnRlcmZhY2VzL211bHRpLWxhbmd1YWdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGUgfSBmcm9tICcuL3BpcGVzL2Rpc3BsYXktbGFuZ3VhZ2UucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlIH0gZnJvbSAnLi9waXBlcy9nZXQtZGlzYWJsZS1rZXkucGlwZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlIH0gZnJvbSAnLi9waXBlcy9nZXQtaXRlbS5waXBlJztcbmltcG9ydCB7IGN1cnJlbmNpZXNPcHRpb25zLCBjdXJyZW5jaWVzU3VwcG9ydCwgaHR0cFJlcXVlc3REZXRhaWwsIGxhbmdPcHRpb25zLCBsYW5ndWFnZVN1cHBvcnQsIGxpc3RDb25maWdJdGVtLCB2YWxpZFJlcXVpcmVkIH0gZnJvbSAnLi91dGlscy9tdWx0aS1sYW5ndWFnZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtbXVsdGlfbGFuZ3VhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VEaXNwbGF5TGFuZ3VhZ2VQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0SXRlbVBpcGUsXG4gICAgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGwyeENvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBsYW5ndWFnZURpc3BsYXkgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4oW10pO1xuICBwcm90ZWN0ZWQgZGF0YUxhbmd1YWdlQ2hhbmdlID0gc2lnbmFsPElEYXRhTXVsdGlMYW5ndWFnZT4oe30pO1xuICBwcm90ZWN0ZWQgbGFuZ0RlZmF1bHQgPSBzaWduYWw8QXJyYXk8c3RyaW5nPj4obGFuZ3VhZ2VTdXBwb3J0KCkpO1xuICBwcm90ZWN0ZWQgY3VycmVuY3lVbml0cyA9IHNpZ25hbDxBcnJheTxJQ3VycmVuY3lVbml0Pj4oW10pO1xuICBwcm90ZWN0ZWQgb3B0aW9ucyA9IHNpZ25hbDxBcnJheTxJT3B0aW9uPj4obGFuZ09wdGlvbnMoKSk7XG4gIHByb3RlY3RlZCB2YWxpZFJlcXVpcmVkRGVmYXVsdCA9IHNpZ25hbDxJVmFsaWRSZXF1aXJlZD4odmFsaWRSZXF1aXJlZCgpKTtcbiAgcHJvdGVjdGVkIGxpc3RDb25maWdJdGVtID0gY29tcHV0ZWQoKCkgPT4gbGlzdENvbmZpZ0l0ZW0odGhpcy5vcHRpb25zKCkpKTtcbiAgcHJvdGVjdGVkIGh0dHBSZXF1ZXN0RGV0YWlsID0gY29tcHV0ZWQoKCkgPT4gaHR0cFJlcXVlc3REZXRhaWwodGhpcy5vcHRpb25zKCkpKTtcblxuICBwcml2YXRlIGlucHV0Q29tcG9uZW50UmVmcyA9IHZpZXdDaGlsZHJlbihMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQpO1xuICBwcml2YXRlIHF1aWxsQ29tcG9uZW50UmVmcyA9IHZpZXdDaGlsZHJlbihMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGwyeENvbXBvbmVudCk7XG4gIHByaXZhdGUgb25EZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICByZWFkb25seSBvcHRpb25zTGFuZ3VhZ2UgPSBpbnB1dDxBcnJheTxJT3B0aW9uPj4obGFuZ09wdGlvbnMoKSk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgdmlld1R5cGUgPSBpbnB1dDxUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UsIFRZUEVfVklFV19NVUxUSV9MQU5HVUFHRSB8IHVuZGVmaW5lZD4oJ3RleHQnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAndGV4dCcgfSk7XG4gIHJlYWRvbmx5IHNpbmdsZUxhbmd1YWdlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGF0YSA9IG1vZGVsPEFycmF5PElEYXRhSXRlbT4+KFtdKTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElWYWxpZFJlcXVpcmVkLCBJVmFsaWRSZXF1aXJlZCB8IHVuZGVmaW5lZD4odmFsaWRSZXF1aXJlZCgpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyB2YWxpZFJlcXVpcmVkKCkgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUFkZCA9IG1vZGVsPGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHRpdGxlRmllbGQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGtleUhlYWRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdGV4dEFyZWEgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXh0ZW5kQ2xhc3MgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGV4dGVuZENsYXNzQ29udGVudCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdmlld1Bvc2l0aW9uID0gaW5wdXQ8J3JvdycgfCAnY29sdW1uJz4oJ3JvdycpO1xuICByZWFkb25seSBpZ25vcmVSZW1vdmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWxpZE1heExlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aCwgSVZhbGlkTGVuZ3RoIHwgdW5kZWZpbmVkPih7IGxlbmd0aDogMCB9LCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyB7IGxlbmd0aDogMCB9IH0pO1xuICByZWFkb25seSB2YWxpZE1pbkxlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aD4oKTtcbiAgcmVhZG9ubHkgY291bnRDaGFyYWN0ZXJzID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmlld0NvbnRlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVLZXkgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDRyJyk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZVZhbHVlID0gaW5wdXQ8c3RyaW5nPignbGlicy11aS1mb250LWg0cycpO1xuICByZWFkb25seSBkYXRhTGFuZ3VhZ2UgPSBtb2RlbDxJRGF0YU11bHRpTGFuZ3VhZ2U+KHt9KTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsdWVVcERvd25OdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG1heFZhbHVlTnVtYmVyID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSWNvbkFkZExhbmd1YWdlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdsaWJzLXVpLWljb24tYWRkJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJ2xpYnMtdWktaWNvbi1hZGQnIH0pO1xuICByZWFkb25seSB2YWxpZFBhdHRlcm4gPSBpbnB1dDxBcnJheTxJVmFsaWRQYXR0ZXJuPj4oKTtcblxuICByZWFkb25seSBvdXRFdmVudE11bHRpTGFuZ3VhZ2UgPSBvdXRwdXQ8SUV2ZW50TXVsdGlMYW5ndWFnZT4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVHlwZUxhbmd1YWdlID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nZVZhbHVlSW5wdXQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9uc0xhbmd1YWdlKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2V0KHRoaXMub3B0aW9uc0xhbmd1YWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3VHlwZSA9IHRoaXMudmlld1R5cGUoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWV3VHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAgICAgICAgdGhpcy5sYW5nRGVmYXVsdC5zZXQoY3VycmVuY2llc1N1cHBvcnQoKSk7XG4gICAgICAgICAgY29uc3Qgb3B0cyA9IGN1cnJlbmNpZXNPcHRpb25zKCk7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNldChvcHRzKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbmN5VW5pdHMuc2V0KFxuICAgICAgICAgICAgb3B0cy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgICBpZDogaXRlbS5rZXksXG4gICAgICAgICAgICAgIHR5cGU6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhbmdEZWZhdWx0LnNldChsYW5ndWFnZVN1cHBvcnQoKSk7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zZXQodGhpcy5vcHRpb25zTGFuZ3VhZ2UoKSk7XG4gICAgICAgIHRoaXMuY3VycmVuY3lVbml0cy5zZXQoW10pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlID0gdGhpcy5kYXRhTGFuZ3VhZ2UoKTtcbiAgICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2Uuc2V0KGNsb25lRGVlcChkYXRhTGFuZ3VhZ2UpKTtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZURhdGEoKTtcbiAgICAgICAgdGhpcy5sYW5ndWFnZURpc3BsYXkuc2V0KHRoaXMuY29tcHV0ZUxhbmd1YWdlRGlzcGxheUtleXMoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBzaW5nbGVMYW5ndWFnZSA9IHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlVHlwZUxhbmd1YWdlLmVtaXQodHJ1ZSk7XG4gICAgICAgIGlmICghc2luZ2xlTGFuZ3VhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZS51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBrZXkpIH0pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkUmVxdWlyZWRJbnB1dCA9IHRoaXMudmFsaWRSZXF1aXJlZCgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKCF2YWxpZFJlcXVpcmVkSW5wdXQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogdmFsaWRSZXF1aXJlZElucHV0LmlzUmVxdWlyZWQgfSkpO1xuICAgICAgICBpZiAoIXZhbGlkUmVxdWlyZWRJbnB1dC5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgdm9pZCB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5leHRlbmRDbGFzcy51cGRhdGUoKHZhbHVlKSA9PiBgJHt2YWx1ZSB8fCAnJ30gJHt0aGlzLnZpZXdQb3NpdGlvbigpID09PSAncm93JyA/ICdmbGV4LXJvdycgOiAnZmxleC1jb2wnfWApO1xuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgZ2V0RGF0YTogdGhpcy5nZXREYXRhLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDw6FjIGtleSBuZ8O0biBuZ+G7ryAvIHRp4buBbiB04buHIGPhuqduIGhp4buDbiB0aOG7iyB0aGVvIGThu68gbGnhu4d1ICsgY+G6pXUgaMOsbmggb3B0aW9ucy4gKi9cbiAgcHJpdmF0ZSBjb21wdXRlTGFuZ3VhZ2VEaXNwbGF5S2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZGMgPSB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICBjb25zdCBsYW5ncyA9IHRoaXMubGFuZ0RlZmF1bHQoKTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKGRjKSkge1xuICAgICAgaWYgKG9wdHMuc29tZSgobykgPT4gby5rZXkgPT09IGspKSB7XG4gICAgICAgIHNlbGVjdGVkLmFkZChrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrIG9mIGxhbmdzKSB7XG4gICAgICBpZiAoIWlzTmlsKGdldChkYywgaykpKSB7XG4gICAgICAgIHNlbGVjdGVkLmFkZChrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RDaGFuZ2UoZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkLCBrZXlPbGQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQua2V5ID09PSBrZXlPbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUubWFwKChpdGVtKSA9PiAoaXRlbSA9PT0ga2V5T2xkID8gKGV2ZW50LmtleSBhcyBzdHJpbmcpIDogaXRlbSkpKTtcbiAgICBkZWxldGUgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKVtrZXlPbGRdO1xuICAgIGRlbGV0ZSB0aGlzLmRhdGFMYW5ndWFnZSgpW2tleU9sZF07XG4gICAgdm9pZCB0aGlzLnNldERlZmF1bHREYXRhKGV2ZW50LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJBZGRMYW5ndWFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5vcHRpb25zKCkuZmluZCgoaXRlbSkgPT4gIXRoaXMubGFuZ3VhZ2VEaXNwbGF5KCkuaW5jbHVkZXMoaXRlbS5rZXkpKTtcbiAgICBpZiAoIWxhbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gWy4uLnZhbHVlLCBsYW5nLmtleV0pO1xuICAgIHZvaWQgdGhpcy5zZXREZWZhdWx0RGF0YShsYW5nLmtleSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucygpLmxlbmd0aCA9PT0gdGhpcy5sYW5ndWFnZURpc3BsYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaWdub3JlQWRkLnNldCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5vdXRFdmVudE11bHRpTGFuZ3VhZ2UuZW1pdCh7IGFjdGlvbjogJ2FkZCcsIGRhdGE6IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclJlbW92ZUxhbmd1YWdlKGV2ZW50OiBFdmVudCwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlnbm9yZUFkZC5zZXQoZmFsc2UpO1xuICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+IHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtrZXldO1xuICAgICAgcmV0dXJuIHsgLi4udmFsdWUgfTtcbiAgICB9KTtcbiAgICB2b2lkIHRoaXMudmFsaWRhdGVJc011bHRpS2V5KCk7XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKCh2YWx1ZSkgPT4gdmFsdWUuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBrZXkpKTtcbiAgICB0aGlzLm91dEV2ZW50TXVsdGlMYW5ndWFnZS5lbWl0KHsgYWN0aW9uOiAncmVtb3ZlJywgZGF0YTogdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YSgpOiBJRGF0YU11bHRpTGFuZ3VhZ2UgfCBJRGF0YU11bHRpTGFuZ3VhZ2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFtrZXldOiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwga2V5KSB9KSk7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhTGFuZ3VhZ2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRMYW5nID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGF0YSgpKSB7XG4gICAgICAgIGNvbnN0IGtleUJpbmQgPSBpdGVtLmtleUJpbmREYXRhO1xuICAgICAgICBjb25zdCBkYXRhQnlLZXkgPSBrZXlCaW5kID8gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCksIGtleUJpbmQpIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoa2V5QmluZCAmJiBkYXRhQnlLZXkgJiYgZGVmYXVsdExhbmcgJiYgIWdldDxhbnk+KGRhdGFCeUtleSwgZGVmYXVsdExhbmcpICYmICFnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwgZGVmYXVsdExhbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgIGNvbnN0IGRhdGFJdGVtcyA9IHRoaXMuZGF0YSgpO1xuICAgIGlmIChkYXRhSXRlbXMubGVuZ3RoKSB7XG4gICAgICBkYXRhSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gaXRlbS5rZXlCaW5kRGF0YTtcbiAgICAgICAgaWYgKCFpbmRleCAmJiBpc05pbChnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSwgbGFuZykpKSB7XG4gICAgICAgICAgdm9pZCB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtleSB8fCAhaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCksIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBba2V5XTogeyBbbGFuZ106ICcnIH0gfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghZGF0YUl0ZW1zLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFMYW5ndWFnZSgpIHx8ICFPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZSgpKS5sZW5ndGgpIHtcbiAgICAgICAgdm9pZCB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhLnNldChbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiB0aGlzLnZpZXdUeXBlKCksXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIoKSxcbiAgICAgICAgICBpc09uZVZhbHVlOiBmYWxzZSxcbiAgICAgICAgICBrZXlCaW5kRGF0YTogJycsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldERlZmF1bHREYXRhKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFtrZXldOiAnJyB9KSk7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFtrZXldOiAnJyB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaW5wdXRDb21wb25lbnRSZWZzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuRnVuY3Rpb25zQ29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBxdWlsbENtcCBvZiB0aGlzLnF1aWxsQ29tcG9uZW50UmVmcygpKSB7XG4gICAgICBpZiAoIShhd2FpdCBxdWlsbENtcC5GdW5jdGlvbnNDb250cm9sLmNoZWNrSXNWYWxpZCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRPayA9IGF3YWl0IHRoaXMudmFsaWRhdGVEZWZhdWx0KCk7XG4gICAgICBpZiAoIWRlZmF1bHRPaykge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlSXNNdWx0aUtleSgpO1xuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVEZWZhdWx0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgaWYgKHRoaXMudmFsaWRSZXF1aXJlZCgpLmlzUmVxdWlyZWQpIHtcbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHRydWUgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogZmFsc2UgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSkpIHtcbiAgICAgIGlmIChrZXkgIT09ICdpZCcgJiYga2V5ICE9PSB0aGlzLmtleUhlYWRlcigpICYmIGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpLCBrZXkpICYmIGtleSAhPT0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdKSB7XG4gICAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHRydWUgfSkpO1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpKSkge1xuICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUoKHZhbHVlKSA9PiAoeyAuLi52YWx1ZSwgaXNSZXF1aXJlZDogZmFsc2UgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1ZhbGlkSW5wdXQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbnB1dENvbXBvbmVudFJlZnMoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgY29udHJvbC5GdW5jdGlvbnNDb250cm9sLmNoZWNrSXNWYWxpZCgpKSkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogS2hpIGPDsyBuaGnhu4F1IGBJRGF0YUl0ZW1gIChuaGnhu4F1IGZpZWxkIGJpbmQpLCBj4bqtcCBuaOG6rXQgYHZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdGAgdGhlbyBk4buvIGxp4buHdSDEkcOjIG5o4bqtcC5cbiAgICogR2nhu68gbmd1ecOqbiB0aOG7qSB04buxIMSRaeG7gXUga2nhu4duIC8gbmjDoW5oIG5oxrAgcGhpw6puIGLhuqNuIHRyxrDhu5tjIChmb3JFYWNoIGFzeW5jKSwgbmjGsG5nIGF3YWl0IMSRw7puZyDEkeG7gyB2YWxpZGF0ZSBraMO0bmcga+G6v3QgdGjDumMgc+G7m20uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlSXNNdWx0aUtleSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5kYXRhKCkubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSgpWzBdLnZhbGlkUmVxdWlyZWQ/LmlzUmVxdWlyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhSXRlbXMgPSB0aGlzLmRhdGEoKTtcbiAgICBjb25zdCBkYyA9IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YUl0ZW1zKSB7XG4gICAgICBpZiAoIWl0ZW0ua2V5QmluZERhdGEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSBnZXQoZGMsIGl0ZW0ua2V5QmluZERhdGEpO1xuICAgICAgaWYgKCFuZXN0ZWQgfHwgdHlwZW9mIG5lc3RlZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxhbmdLZXk6IGZvciAoY29uc3QgbGFuZ05lc3RlZEtleSBvZiBPYmplY3Qua2V5cyhuZXN0ZWQgYXMgb2JqZWN0KSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRvcEtleSBvZiBPYmplY3Qua2V5cyhkYykpIHtcbiAgICAgICAgICBpZiAodG9wS2V5ID09PSBpdGVtLmtleUJpbmREYXRhIHx8IHRvcEtleSA9PT0gbGFuZ05lc3RlZEtleSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChnZXQoZGMsIHRvcEtleSkgJiYgdGhpcy5vcHRpb25zKCkuZmluZCgob3B0KSA9PiBvcHQua2V5ID09PSB0b3BLZXkpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBkYXRhSXRlbXMpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZz8udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZSBsYW5nS2V5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBkYXRhSXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChjb25maWc/LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgICBjb25maWcudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgPSBnZXQoZGMsIGxhbmdOZXN0ZWRLZXkpO1xuICAgICAgICBjb25zdCBkYXRhQnlJdGVtS2V5ID0gaXRlbS5rZXlCaW5kRGF0YSA/IGdldChkYywgaXRlbS5rZXlCaW5kRGF0YSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICgoIWRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCAmJiAhZ2V0KGRhdGFCeUl0ZW1LZXksIGxhbmdOZXN0ZWRLZXkpKSB8fCAoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kICYmIGdldChkYXRhQnlJdGVtS2V5LCBsYW5nTmVzdGVkS2V5KSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCkge1xuICAgICAgICAgIGNvbnN0IGRhdGFGaXJzdCA9IGRhdGFJdGVtc1swXTtcbiAgICAgICAgICBpZiAoZGF0YUZpcnN0Py52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgIGRhdGFGaXJzdC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWdldChkYXRhQnlJdGVtS2V5LCBsYW5nTmVzdGVkS2V5KSkge1xuICAgICAgICAgIGNvbnN0IGRhdGFTZWNvbmQgPSBkYXRhSXRlbXNbMV07XG4gICAgICAgICAgaWYgKGRhdGFTZWNvbmQ/LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdCkge1xuICAgICAgICAgICAgZGF0YVNlY29uZC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySW5wdXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRDaGFuZ2VWYWx1ZUlucHV0LmVtaXQoKTtcbiAgICB0aW1lcig1MDApXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB2b2lkIHRoaXMudmFsaWRhdGUoKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5vbkRlc3Ryb3kuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGZsZXgtY29sIGdhcC1bOHB4XVwiPlxuICBAaWYgKHRpdGxlRmllbGQoKTsgYXMgdGl0bGVGaWVsZCkge1xuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDZtXCI+e3sgdGl0bGVGaWVsZCB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICB9XG4gIDxkaXZcbiAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLVs4cHhdXCJcbiAgICBbY2xhc3MuZ2FwLVs4cHhdXT1cInZpZXdQb3NpdGlvbigpID09PSAncm93J1wiXG4gICAgW2NsYXNzLmdhcC1bMTZweF1dPVwidmlld1Bvc2l0aW9uKCkgPT09ICdjb2x1bW4nXCI+XG4gICAgQGZvciAoa2V5IG9mIGxhbmd1YWdlRGlzcGxheSgpOyB0cmFjayBrZXkpIHtcbiAgICAgIEBpZiAoIXZpZXdDb250ZW50KCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLVs4cHhdIHctZnVsbCB7eyBleHRlbmRDbGFzcygpIH19XCI+XG4gICAgICAgICAgQGlmICghc2luZ2xlTGFuZ3VhZ2UoKSkge1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cImh0dHBSZXF1ZXN0RGV0YWlsKClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwibGFuZ3VhZ2VEaXNwbGF5KCkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlOiBrZXlcIlxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIkaW5kZXggPT09IDAgfHwgcmVhZG9ubHkoKVwiXG4gICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ3ctWzE1MHB4XSdcIlxuICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0Q2hhbmdlKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC0xIGdhcC1bMTJweF0ge3sgZXh0ZW5kQ2xhc3NDb250ZW50KCkgfX1cIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YSgpOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS50eXBlID09PSAnZWRpdG9yJykge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmtleUJpbmREYXRhIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZTogZGF0YUxhbmd1YWdlQ2hhbmdlOyBhcyBpdGVtTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sUGxhY2Vob2xkZXIgPSBpdGVtLnBsYWNlaG9sZGVyIHx8ICcgJztcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtcXVpbGwyeFxuICAgICAgICAgICAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbU1hcFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkQmluZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZXNpemVdPVwiaXRlbS5yZXNpemUgfHwgJ3ZlcnRpY2FsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW21pbkhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0XT1cIml0ZW0ubWluSGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHQgfHwgMTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4SGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHRdPVwiaXRlbS5tYXhIZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0XT1cIml0ZW0uaGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cIiRpbmRleCA9PT0gMCAmJiBkYXRhKCkubGVuZ3RoIDw9IDEgPyB2YWxpZFJlcXVpcmVkRGVmYXVsdCgpIDogdmFsaWRSZXF1aXJlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uc3RIdG1sUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0Rm9jdXMpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG1pbi13LTAge3sgaXRlbS5jbGFzc0luY2x1ZGVJbnB1dCB9fVwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmtleUJpbmREYXRhIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZTogZGF0YUxhbmd1YWdlQ2hhbmdlOyBhcyBpdGVtTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgY29uc3RIdG1sUGxhY2Vob2xkZXIgPSBpdGVtLnBsYWNlaG9sZGVyIHx8ICcgJztcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICBbZGF0YVR5cGVdPVwiaXRlbS50eXBlID09PSAnbnVtYmVyJyA/ICdpbnQnIDogaXRlbS50eXBlID09PSAndGV4dCcgPyAnc3RyaW5nJyA6IGl0ZW0udHlwZSA9PT0gJ2JpZ2ludCcgPyAnYmlnaW50JyA6ICdmbG9hdCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFsoaXRlbSldPVwiaXRlbU1hcFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkTmFtZUJpbmRdPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGFnSW5wdXRdPVwidGV4dEFyZWEoKSA/ICd0ZXh0YXJlYScgOiAnaW5wdXQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29uc3RIdG1sUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8geyBpc1JlcXVpcmVkOiB2YWxpZE9uZURlZmF1bHRNdWx0aUxhbmd1YWdlKCkgPT09IGtleSA/IHRydWUgOiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJGluZGV4ID09PSAwICYmIGRhdGEoKS5sZW5ndGggPD0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdmFsaWRSZXF1aXJlZERlZmF1bHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJGluZGV4ID09PSAwICYmIGRhdGEoKS5sZW5ndGggPiAxICYmIGl0ZW0udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0udmFsaWRSZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0ZW0udmFsaWRSZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbGlkUmVxdWlyZWQoKSB8fCB7IGlzUmVxdWlyZWQ6IGZhbHNlIH1cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFt1bml0c1JpZ2h0XT1cImN1cnJlbmN5VW5pdHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2tleVNlbGVjdGVkVW5pdFJpZ2h0XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q291bnRdPVwiY291bnRDaGFyYWN0ZXJzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwidmFsaWRNYXhMZW5ndGgoKS5sZW5ndGggPyB2YWxpZE1heExlbmd0aCgpLmxlbmd0aCA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpeGVkRmxvYXRdPVwiaXRlbS50eXBlID09PSAnYmlnaW50JyA/IDQgOiAxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkTWluTGVuZ3RoXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRPbmVEZWZhdWx0TXVsdGlMYW5ndWFnZSgpICYmIHZhbGlkT25lRGVmYXVsdE11bHRpTGFuZ3VhZ2UoKSAhPT0ga2V5ICYmICFpdGVtTWFwKClba2V5XVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgbGVuZ3RoOiB2YWxpZE1pbkxlbmd0aCgpPy5sZW5ndGggfHwgLTEsIG1lc3NhZ2U6ICdpMThuX21pbmltdW1fbGVuZ3RoX251bWJlcicsIGludGVycG9sYXRlUGFyYW1zOiB7IG51bWJlcjogdmFsaWRNaW5MZW5ndGgoKT8ubGVuZ3RoIH0gfVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkUGF0dGVybl09XCJ2YWxpZFBhdHRlcm4oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdE5lZ2F0aXZlVmFsdWVdPVwiYWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIm1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZV09XCJvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0VmFsdWVDaGFuZ2UpPVwiaGFuZGxlcklucHV0Q2hhbmdlKClcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCFzaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHctWzE2cHhdIHNocmluay0wXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaC1bMzJweF1dPVwiZGF0YSgpWzBdLnR5cGUgIT09ICdlZGl0b3InXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaC1bNDRweF1dPVwiZGF0YSgpWzBdLnR5cGUgPT09ICdlZGl0b3InXCI+XG4gICAgICAgICAgICAgICAgQGlmICgkaW5kZXggPiAwICYmIGRhdGEoKS5sZW5ndGggPT09IDEgJiYgIWlnbm9yZVJlbW92ZSgpICYmICFyZWFkb25seSgpKSB7XG4gICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1jdXN0b20nXCJcbiAgICAgICAgICAgICAgICAgICAgW2J1dHRvbkN1c3RvbV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnU3RlcENvbG9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnIzZhNzM4MycsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2hvdmVyOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2FjdGl2ZTogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9kaXNhYmxlOiAnIzZhNzM4MycsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICByb290Q29sb3I6ICcjNmE3MzgzJyxcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cInsgY29uZmlnOiB7IGNvbnRlbnQ6ICdpMThuX2RlbGV0ZScsIHpJbmRleDogMTIwNSB9IH1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLXJlbW92ZSdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgICAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyUmVtb3ZlTGFuZ3VhZ2UoJGV2ZW50LCBrZXkpXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmICgkaW5kZXggPT09IDAgJiYgb3B0aW9ucygpLmxlbmd0aCAhPT0gbGFuZ3VhZ2VEaXNwbGF5KCkubGVuZ3RoICYmIHZpZXdUeXBlKCkgIT09ICdpbnRlZ2VyJyAmJiAhcmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiY2xhc3NJY29uQWRkTGFuZ3VhZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAnXCJcbiAgICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAodmlld0NvbnRlbnQoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtWzRweF1cIj5cbiAgICAgICAgICBAaWYgKCFzaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlS2V5KClcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwia2V5IHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VEaXNwbGF5TGFuZ3VhZ2VQaXBlOiBvcHRpb25zKClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGVWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCIoZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSB8fCBkYXRhTGFuZ3VhZ2VDaGFuZ2UoKVtrZXldID09PSAwID8gZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5XSArICcnIDogJycpIHwgTGlic1VpUGlwZXNFc2NhcGVIdG1sUGlwZVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwieyB6SW5kZXg6IHpJbmRleCgpIH1cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKHZpZXdUeXBlKCkgPT09ICdpbnRlZ2VyJyAmJiAhdGhpcy5pZ25vcmVBZGQoKSAmJiAhcmVhZG9ubHkoKSkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWFkZCdcIlxuICAgICAgW2NsYXNzTGFiZWxdPVwiJ2xpYnMtdWktZm9udC1oNm1pJ1wiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cIichcHgtMCAhcHktWzJweF0nXCJcbiAgICAgIFtsYWJlbF09XCInaTE4bl9hZGRfbmV3J1wiXG4gICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckFkZExhbmd1YWdlKCRldmVudClcIiAvPlxuICB9XG48L2Rpdj5cbiJdfQ==
|