kwikid-forms 0.1.19 → 0.1.21
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/bundles/kwikid-forms.umd.js +3672 -2968
- package/bundles/kwikid-forms.umd.js.map +1 -1
- package/esm2015/lib/builder/builder.component.js +236 -104
- package/esm2015/lib/builder/builder.module.js +42 -5
- package/esm2015/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.js +302 -0
- package/esm2015/lib/builder/element-config-editor/editors/basic/text-config.editor.component.js +135 -0
- package/esm2015/lib/builder/element-config-editor/editors/basic-element-config.editor.component.js +542 -0
- package/esm2015/lib/builder/element-config-editor/element-config-editor.component.js +89 -0
- package/esm2015/lib/builder/shared/elements.js +44 -0
- package/esm2015/lib/builder/shared/helpers.js +6 -0
- package/esm2015/lib/renderer/config-converter.helper.js +661 -0
- package/esm2015/lib/renderer/form-view/definitions/form-view.apis.definition.js +1 -1
- package/esm2015/lib/renderer/form-view/form-view.component.js +73 -91
- package/esm2015/lib/renderer/form-view/helpers/form-view.apis.helper.js +22 -12
- package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +4 -1
- package/esm2015/lib/renderer/renderer.component.js +74 -24
- package/fesm2015/kwikid-forms.js +3379 -2071
- package/fesm2015/kwikid-forms.js.map +1 -1
- package/lib/builder/builder.component.d.ts +21 -53
- package/lib/builder/builder.module.d.ts +9 -4
- package/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.d.ts +25 -0
- package/lib/builder/element-config-editor/editors/basic/text-config.editor.component.d.ts +16 -0
- package/lib/builder/element-config-editor/editors/basic-element-config.editor.component.d.ts +20 -0
- package/lib/builder/element-config-editor/element-config-editor.component.d.ts +20 -0
- package/lib/builder/shared/elements.d.ts +32 -0
- package/lib/builder/shared/helpers.d.ts +1 -0
- package/lib/renderer/{renderer.config-converter.helper.d.ts → config-converter.helper.d.ts} +2 -0
- package/lib/renderer/form-view/definitions/form-view.apis.definition.d.ts +2 -1
- package/lib/renderer/form-view/form-view.component.d.ts +8 -5
- package/lib/renderer/renderer.component.d.ts +2 -2
- package/package.json +3 -3
- package/esm2015/lib/renderer/renderer.config-converter.helper.js +0 -641
|
@@ -1,641 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { TuiDay } from "@taiga-ui/cdk";
|
|
3
|
-
import { checkObjectKeyExists, isEmptyValue, isNotEmptyValue, logMethod } from "kwikid-toolkit";
|
|
4
|
-
import { convertFormFieldTypeDateToKwikUIFormat } from "./form-view/helpers/form-view.fields.helper";
|
|
5
|
-
export class Converter {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.getFormFields = (formConfig) => {
|
|
8
|
-
let fields;
|
|
9
|
-
if (checkObjectKeyExists(formConfig, "multiForm")) {
|
|
10
|
-
fields = formConfig.multiForm.fields;
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
fields = formConfig.fields;
|
|
14
|
-
}
|
|
15
|
-
return fields;
|
|
16
|
-
};
|
|
17
|
-
this.setMissingFieldKeyValue = (field, key, value) => {
|
|
18
|
-
if (!checkObjectKeyExists(field, key)) {
|
|
19
|
-
field[key] = value;
|
|
20
|
-
}
|
|
21
|
-
return field;
|
|
22
|
-
};
|
|
23
|
-
this.setFieldKeyValue = (field, key, value) => {
|
|
24
|
-
field[key] = value;
|
|
25
|
-
return field;
|
|
26
|
-
};
|
|
27
|
-
this.removeFieldKey = (field, key) => {
|
|
28
|
-
if (checkObjectKeyExists(field, key)) {
|
|
29
|
-
delete field[key];
|
|
30
|
-
}
|
|
31
|
-
return field;
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
convertFormConfig(formConfig) {
|
|
35
|
-
const updateOnFieldType = (field) => {
|
|
36
|
-
const formatFieldTypeHtml = (field) => {
|
|
37
|
-
field = this.setFieldKeyValue(field, "isFormElement", false);
|
|
38
|
-
return field;
|
|
39
|
-
};
|
|
40
|
-
const formatFieldTypeTitle = (field) => {
|
|
41
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
42
|
-
field = this.setFieldKeyValue(field, "isFormElement", false);
|
|
43
|
-
return field;
|
|
44
|
-
};
|
|
45
|
-
const formatFieldTypeText = (field) => {
|
|
46
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
47
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "case", "default");
|
|
48
|
-
return field;
|
|
49
|
-
};
|
|
50
|
-
const formatFieldTypeCheckbox = (field) => {
|
|
51
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
52
|
-
return field;
|
|
53
|
-
};
|
|
54
|
-
const formatFieldTypeNumber = (field) => {
|
|
55
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
56
|
-
if (checkObjectKeyExists(field, "key")) {
|
|
57
|
-
if (field.key === "aadhaar_number") {
|
|
58
|
-
field = this.setFieldKeyValue(field, "type", "aadhaar_number");
|
|
59
|
-
}
|
|
60
|
-
if (field.key === "contact_number") {
|
|
61
|
-
field = this.setFieldKeyValue(field, "type", "phone");
|
|
62
|
-
}
|
|
63
|
-
if (field.type === "phone" || field.type === "number") {
|
|
64
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "countryCode", "+91");
|
|
65
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "phoneMaskAfterCountryCode", "####-######");
|
|
66
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "removeCountryCodeFromValue", true);
|
|
67
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "decimal", "never");
|
|
68
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "prefix", "");
|
|
69
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "postfix", "");
|
|
70
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "min", -Infinity);
|
|
71
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "max", Infinity);
|
|
72
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "precision", 2);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
76
|
-
return field;
|
|
77
|
-
};
|
|
78
|
-
const formatFieldTypeDate = (field) => {
|
|
79
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
80
|
-
if (checkObjectKeyExists(field, "min")) {
|
|
81
|
-
const tuiDay = convertFormFieldTypeDateToKwikUIFormat(field["min"]);
|
|
82
|
-
field.properties = this.setFieldKeyValue(field.properties, "min", tuiDay);
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "min", new TuiDay(0, 0, 1)); // Year - 0000, Month - 0 (0 Indexing), Day - 1
|
|
86
|
-
}
|
|
87
|
-
if (checkObjectKeyExists(field, "max")) {
|
|
88
|
-
const tuiDay = convertFormFieldTypeDateToKwikUIFormat(field["max"]);
|
|
89
|
-
field.properties = this.setFieldKeyValue(field.properties, "max", tuiDay);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "max", new TuiDay(new Date().getFullYear(), // Year - 9999
|
|
93
|
-
new Date().getMonth(), // Month - 11 (0 Indexing)
|
|
94
|
-
new Date().getDate() // Day - 31
|
|
95
|
-
));
|
|
96
|
-
}
|
|
97
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "placeholder", "");
|
|
98
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
99
|
-
return field;
|
|
100
|
-
};
|
|
101
|
-
const formatFieldTypePhone = (field) => {
|
|
102
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
103
|
-
return field;
|
|
104
|
-
};
|
|
105
|
-
const formatFieldTypeRadio = (field) => {
|
|
106
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
107
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "size", "m");
|
|
108
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "orientation", "vertical");
|
|
109
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
110
|
-
field.options = field.options.map((x) => {
|
|
111
|
-
if (typeof x === "string" || typeof x === "number") {
|
|
112
|
-
return { label: x, disabled: false, description: "" };
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
if (checkObjectKeyExists(x, "label") &&
|
|
116
|
-
checkObjectKeyExists(x, "disabled") &&
|
|
117
|
-
checkObjectKeyExists(x, "description")) {
|
|
118
|
-
return x;
|
|
119
|
-
}
|
|
120
|
-
if (!checkObjectKeyExists(x, "disabled")) {
|
|
121
|
-
x = Object.assign(Object.assign({}, x), { disabled: false });
|
|
122
|
-
}
|
|
123
|
-
if (!checkObjectKeyExists(x, "description")) {
|
|
124
|
-
x = Object.assign(Object.assign({}, x), { description: false });
|
|
125
|
-
}
|
|
126
|
-
return x;
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
return field;
|
|
130
|
-
};
|
|
131
|
-
const formatFieldTypeSearchText = (field) => {
|
|
132
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
133
|
-
if (checkObjectKeyExists(field, "type")) {
|
|
134
|
-
if (field.type === "search-text") {
|
|
135
|
-
field = this.setFieldKeyValue(field, "type", "dropdown-with-search");
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return field;
|
|
139
|
-
};
|
|
140
|
-
const formatFieldTypeDropdownWithSearch = (field) => {
|
|
141
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
142
|
-
return field;
|
|
143
|
-
};
|
|
144
|
-
const formatFieldTypeApiCall = (field) => {
|
|
145
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
146
|
-
if (!checkObjectKeyExists(field.properties, "shape")) {
|
|
147
|
-
field.properties = this.setFieldKeyValue(field.properties, "shape", null);
|
|
148
|
-
}
|
|
149
|
-
if (!checkObjectKeyExists(field, "showLoader")) {
|
|
150
|
-
field = this.setFieldKeyValue(field, "showLoader", false);
|
|
151
|
-
}
|
|
152
|
-
if (!checkObjectKeyExists(field.properties, "size")) {
|
|
153
|
-
field.properties = this.setFieldKeyValue(field.properties, "size", "m");
|
|
154
|
-
}
|
|
155
|
-
if (!checkObjectKeyExists(field, "api")) {
|
|
156
|
-
field = this.setFieldKeyValue(field, "api", {});
|
|
157
|
-
field.api = this.setMissingFieldKeyValue(field.api, "url", "");
|
|
158
|
-
field.api = this.setMissingFieldKeyValue(field.api, "request", "");
|
|
159
|
-
field.api = this.setMissingFieldKeyValue(field.api, "response", "");
|
|
160
|
-
field.api = this.setMissingFieldKeyValue(field.api, "status", "");
|
|
161
|
-
field.api.status = this.setMissingFieldKeyValue(field.api.status, "value", "default");
|
|
162
|
-
field.api.status = this.setMissingFieldKeyValue(field.api.status, "labels", {
|
|
163
|
-
default: "Call API",
|
|
164
|
-
loading: "Call API",
|
|
165
|
-
success: "API Success",
|
|
166
|
-
failed: "API Failed"
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
return field;
|
|
170
|
-
};
|
|
171
|
-
const formatFieldTypeOtp = (field) => {
|
|
172
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
173
|
-
field.properties = this.setMissingFieldKeyValue(field.properties, "mask", new Array(field.properties.otpLength).fill("#").join(" "));
|
|
174
|
-
field = this.setFieldKeyValue(field, "hidden", false);
|
|
175
|
-
return field;
|
|
176
|
-
};
|
|
177
|
-
const formatFieldTypeAadhaarNumber = (field) => {
|
|
178
|
-
field = this.setFieldKeyValue(field, "isFormElement", true);
|
|
179
|
-
return field;
|
|
180
|
-
};
|
|
181
|
-
switch (field.type) {
|
|
182
|
-
case "html":
|
|
183
|
-
field = formatFieldTypeHtml(field);
|
|
184
|
-
break;
|
|
185
|
-
case "title":
|
|
186
|
-
field = formatFieldTypeTitle(field);
|
|
187
|
-
break;
|
|
188
|
-
case "text":
|
|
189
|
-
field = formatFieldTypeText(field);
|
|
190
|
-
break;
|
|
191
|
-
case "checkbox":
|
|
192
|
-
field = formatFieldTypeCheckbox(field);
|
|
193
|
-
break;
|
|
194
|
-
case "number":
|
|
195
|
-
field = formatFieldTypeNumber(field);
|
|
196
|
-
break;
|
|
197
|
-
case "date":
|
|
198
|
-
field = formatFieldTypeDate(field);
|
|
199
|
-
break;
|
|
200
|
-
case "phone":
|
|
201
|
-
field = formatFieldTypePhone(field);
|
|
202
|
-
break;
|
|
203
|
-
case "radio":
|
|
204
|
-
field = formatFieldTypeRadio(field);
|
|
205
|
-
break;
|
|
206
|
-
case "search-text":
|
|
207
|
-
field = formatFieldTypeSearchText(field);
|
|
208
|
-
break;
|
|
209
|
-
case "dropdown-with-search":
|
|
210
|
-
field = formatFieldTypeDropdownWithSearch(field);
|
|
211
|
-
break;
|
|
212
|
-
case "api-call":
|
|
213
|
-
field = formatFieldTypeApiCall(field);
|
|
214
|
-
break;
|
|
215
|
-
case "otp":
|
|
216
|
-
field = formatFieldTypeOtp(field);
|
|
217
|
-
break;
|
|
218
|
-
case "aadhaar-number":
|
|
219
|
-
field = formatFieldTypeAadhaarNumber(field);
|
|
220
|
-
break;
|
|
221
|
-
default:
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
return field;
|
|
225
|
-
};
|
|
226
|
-
const getConnectedElementKeyValueObject = (key) => {
|
|
227
|
-
const object = {
|
|
228
|
-
key: key,
|
|
229
|
-
conditions: { formula: "", rules: [] },
|
|
230
|
-
actions: { success: [], failure: [] }
|
|
231
|
-
};
|
|
232
|
-
return object;
|
|
233
|
-
};
|
|
234
|
-
const formatFieldKeys = (field) => {
|
|
235
|
-
if (checkObjectKeyExists(field, "connectedTo")) {
|
|
236
|
-
if (typeof field["connectedTo"] === "string") {
|
|
237
|
-
field["connectedElements"] = [
|
|
238
|
-
getConnectedElementKeyValueObject(field["connectedTo"])
|
|
239
|
-
];
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
field["connectedTo"] = field["connectedTo"].map((key) => {
|
|
243
|
-
return getConnectedElementKeyValueObject(key);
|
|
244
|
-
});
|
|
245
|
-
field["connectedElements"] = field["connectedTo"];
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
this.removeFieldKey(field, "connectedTo");
|
|
249
|
-
if (checkObjectKeyExists(field, "connectedToParent")) {
|
|
250
|
-
if (typeof field["connectedToParent"] === "string") {
|
|
251
|
-
field["connectedParentFields"] = [
|
|
252
|
-
getConnectedElementKeyValueObject(field["connectedToParent"])
|
|
253
|
-
];
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
field["connectedParentFields"] = getConnectedElementKeyValueObject(field["connectedToParent"]);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
this.removeFieldKey(field, "connectedToParent");
|
|
260
|
-
this.removeFieldKey(field, "sideEffect");
|
|
261
|
-
return field;
|
|
262
|
-
};
|
|
263
|
-
const getConnectedElementFieldMapping = (field, connectedFieldMapping) => {
|
|
264
|
-
const getConnectedElementChildFieldMapping = (field, connectedFieldMapping) => {
|
|
265
|
-
if (checkObjectKeyExists(field, "connectedElements")) {
|
|
266
|
-
connectedFieldMapping["child"][field.key] = field.connectedElements;
|
|
267
|
-
}
|
|
268
|
-
else if (checkObjectKeyExists(connectedFieldMapping["child"], field.key)) {
|
|
269
|
-
field["connectedElements"] =
|
|
270
|
-
connectedFieldMapping["child"][field.key];
|
|
271
|
-
}
|
|
272
|
-
return { field: field, connectedFieldMapping: connectedFieldMapping };
|
|
273
|
-
};
|
|
274
|
-
const getConnectedElementParentFieldMapping = (field, connectedFieldMapping) => {
|
|
275
|
-
if (checkObjectKeyExists(connectedFieldMapping["child"], field.key)) {
|
|
276
|
-
for (let connectedParentKey of connectedFieldMapping["child"][field.key]) {
|
|
277
|
-
if (checkObjectKeyExists(connectedFieldMapping["parent"], connectedParentKey["key"])) {
|
|
278
|
-
connectedFieldMapping["parent"][connectedParentKey["key"]].push(field.key);
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
connectedFieldMapping["parent"][connectedParentKey["key"]] = [
|
|
282
|
-
field.key
|
|
283
|
-
];
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
return { field: field, connectedFieldMapping: connectedFieldMapping };
|
|
288
|
-
};
|
|
289
|
-
const connectedChildFieldMapping = getConnectedElementChildFieldMapping(field, connectedFieldMapping);
|
|
290
|
-
field = connectedChildFieldMapping["field"];
|
|
291
|
-
connectedFieldMapping =
|
|
292
|
-
connectedChildFieldMapping["connectedFieldMapping"];
|
|
293
|
-
const connectedParentFieldMapping = getConnectedElementParentFieldMapping(field, connectedFieldMapping);
|
|
294
|
-
field = connectedParentFieldMapping["field"];
|
|
295
|
-
connectedFieldMapping =
|
|
296
|
-
connectedParentFieldMapping["connectedFieldMapping"];
|
|
297
|
-
return connectedFieldMapping;
|
|
298
|
-
};
|
|
299
|
-
const updateConnectedElementsKeyValue = (field, connectedFieldMapping) => {
|
|
300
|
-
if (checkObjectKeyExists(connectedFieldMapping["child"], field.key)) {
|
|
301
|
-
field["connectedElements"] = connectedFieldMapping["child"][field.key];
|
|
302
|
-
}
|
|
303
|
-
if (checkObjectKeyExists(connectedFieldMapping["parent"], field.key)) {
|
|
304
|
-
field["connectedParentFields"] =
|
|
305
|
-
connectedFieldMapping["parent"][field.key];
|
|
306
|
-
}
|
|
307
|
-
return field;
|
|
308
|
-
};
|
|
309
|
-
const updateFieldValidatorConfig = (field) => {
|
|
310
|
-
var _a, _b, _c, _d, _e;
|
|
311
|
-
if (field.isFormElement) {
|
|
312
|
-
const validators = checkObjectKeyExists(field, "validators")
|
|
313
|
-
? field.validators
|
|
314
|
-
: {};
|
|
315
|
-
field = this.setMissingFieldKeyValue(field, "validators", {});
|
|
316
|
-
field = this.setFieldKeyValue(field, "validators", Object.assign(Object.assign({}, field["validators"]), { min: checkObjectKeyExists(validators, "min")
|
|
317
|
-
? isNotEmptyValue(validators.min)
|
|
318
|
-
? Number(validators.min)
|
|
319
|
-
: null
|
|
320
|
-
: checkObjectKeyExists(field, "min")
|
|
321
|
-
? Number(field.min)
|
|
322
|
-
: null, max: checkObjectKeyExists(validators, "max")
|
|
323
|
-
? isNotEmptyValue(validators.max)
|
|
324
|
-
? Number(validators.max)
|
|
325
|
-
: null
|
|
326
|
-
: checkObjectKeyExists(field, "max")
|
|
327
|
-
? Number(field.max)
|
|
328
|
-
: null, required: checkObjectKeyExists(validators, "required")
|
|
329
|
-
? Boolean(validators.required)
|
|
330
|
-
: checkObjectKeyExists(field, "required")
|
|
331
|
-
? Boolean(field.required)
|
|
332
|
-
: false, minLength: checkObjectKeyExists(validators, "minLength")
|
|
333
|
-
? isNotEmptyValue(validators.minLength)
|
|
334
|
-
? Number(validators.minLength)
|
|
335
|
-
: null
|
|
336
|
-
: checkObjectKeyExists(field, "minLength")
|
|
337
|
-
? Number(field.minLength)
|
|
338
|
-
: null, maxLength: checkObjectKeyExists(validators, "maxLength")
|
|
339
|
-
? isNotEmptyValue(validators.maxLength)
|
|
340
|
-
? Number(validators.maxLength)
|
|
341
|
-
: null
|
|
342
|
-
: checkObjectKeyExists(field, "length")
|
|
343
|
-
? Number(field.length)
|
|
344
|
-
: checkObjectKeyExists(field, "maxLength")
|
|
345
|
-
? Number(field.maxLength)
|
|
346
|
-
: null, pattern: checkObjectKeyExists(validators, "pattern")
|
|
347
|
-
? isNotEmptyValue(validators.pattern)
|
|
348
|
-
? validators.pattern
|
|
349
|
-
: undefined
|
|
350
|
-
: checkObjectKeyExists(field, "pattern")
|
|
351
|
-
? { key: "CUSTOM", pattern: String(field.pattern) }
|
|
352
|
-
: checkObjectKeyExists(field, "regex")
|
|
353
|
-
? { key: "CUSTOM", pattern: String(field.regex) }
|
|
354
|
-
: undefined }));
|
|
355
|
-
delete field.min;
|
|
356
|
-
delete field.max;
|
|
357
|
-
delete field.required;
|
|
358
|
-
delete field.minLength;
|
|
359
|
-
delete field.length;
|
|
360
|
-
delete field.maxLength;
|
|
361
|
-
delete field.pattern;
|
|
362
|
-
delete field.regex;
|
|
363
|
-
switch (field.type) {
|
|
364
|
-
case "text":
|
|
365
|
-
delete field.validators.min;
|
|
366
|
-
delete field.validators.max;
|
|
367
|
-
break;
|
|
368
|
-
default:
|
|
369
|
-
break;
|
|
370
|
-
}
|
|
371
|
-
if (isEmptyValue((_a = field.validators) === null || _a === void 0 ? void 0 : _a.min)) {
|
|
372
|
-
delete field.validators.min;
|
|
373
|
-
}
|
|
374
|
-
if (isEmptyValue((_b = field.validators) === null || _b === void 0 ? void 0 : _b.max)) {
|
|
375
|
-
delete field.validators.min;
|
|
376
|
-
}
|
|
377
|
-
if (isEmptyValue((_c = field.validators) === null || _c === void 0 ? void 0 : _c.minLength)) {
|
|
378
|
-
delete field.validators.minLength;
|
|
379
|
-
}
|
|
380
|
-
if (isEmptyValue((_d = field.validators) === null || _d === void 0 ? void 0 : _d.maxLength)) {
|
|
381
|
-
delete field.validators.maxLength;
|
|
382
|
-
}
|
|
383
|
-
if (isEmptyValue((_e = field.validators) === null || _e === void 0 ? void 0 : _e.pattern)) {
|
|
384
|
-
delete field.validators.pattern;
|
|
385
|
-
}
|
|
386
|
-
field.focus = false;
|
|
387
|
-
field.invalid = false;
|
|
388
|
-
}
|
|
389
|
-
return field;
|
|
390
|
-
};
|
|
391
|
-
const updateFieldDefaultValueConfig = (field) => {
|
|
392
|
-
if (field.isFormElement) {
|
|
393
|
-
if (checkObjectKeyExists(field, "defaultValue")) {
|
|
394
|
-
return field;
|
|
395
|
-
}
|
|
396
|
-
else if (checkObjectKeyExists(field, "default")) {
|
|
397
|
-
return field;
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
if (checkObjectKeyExists(field, "defaultVal")) {
|
|
401
|
-
// Currently below line is commented because it caused issues in setting Default Value.
|
|
402
|
-
// field["defaultValue"] = field["defaultVal"];
|
|
403
|
-
// delete field["defaultVal"];
|
|
404
|
-
}
|
|
405
|
-
// TODO: Condition for all_forms_data is not considered yet.
|
|
406
|
-
if (field.autoPopulateFromSummaryData) {
|
|
407
|
-
field["defaultValue"] = {
|
|
408
|
-
is_found: false,
|
|
409
|
-
value: "",
|
|
410
|
-
sources: [
|
|
411
|
-
{
|
|
412
|
-
source: "summary_data",
|
|
413
|
-
summary_data: {
|
|
414
|
-
path: `$.${field.key}`,
|
|
415
|
-
validation: {
|
|
416
|
-
rules: [
|
|
417
|
-
{
|
|
418
|
-
key: "1",
|
|
419
|
-
type: "is_not_empty",
|
|
420
|
-
is_not_empty: {
|
|
421
|
-
value: true
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
],
|
|
425
|
-
actions: [
|
|
426
|
-
{
|
|
427
|
-
type: "set_default_value_found",
|
|
428
|
-
condition: "1",
|
|
429
|
-
set_default_value_found: {
|
|
430
|
-
value: true
|
|
431
|
-
}
|
|
432
|
-
},
|
|
433
|
-
{
|
|
434
|
-
type: "enable_field",
|
|
435
|
-
condition: "1 OR NOT(1)",
|
|
436
|
-
enable_field: { value: true }
|
|
437
|
-
}
|
|
438
|
-
]
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
]
|
|
443
|
-
};
|
|
444
|
-
}
|
|
445
|
-
else if (checkObjectKeyExists(field, "autofill")) {
|
|
446
|
-
if (checkObjectKeyExists(field.autofill, "type")) {
|
|
447
|
-
if (field.autofill.type === "storage") {
|
|
448
|
-
field["defaultValue"] = {
|
|
449
|
-
is_found: false,
|
|
450
|
-
value: "",
|
|
451
|
-
sources: [
|
|
452
|
-
{
|
|
453
|
-
source: "browser_storage",
|
|
454
|
-
browser_storage: {
|
|
455
|
-
path: `$.${field.key}`,
|
|
456
|
-
validation: {
|
|
457
|
-
rules: [
|
|
458
|
-
{
|
|
459
|
-
key: "1",
|
|
460
|
-
type: "is_not_empty",
|
|
461
|
-
is_not_empty: {
|
|
462
|
-
value: true
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
],
|
|
466
|
-
actions: [
|
|
467
|
-
{
|
|
468
|
-
type: "set_default_value_found",
|
|
469
|
-
condition: "1",
|
|
470
|
-
set_default_value_found: {
|
|
471
|
-
value: true
|
|
472
|
-
}
|
|
473
|
-
},
|
|
474
|
-
{
|
|
475
|
-
type: "enable_field",
|
|
476
|
-
condition: "1 OR NOT(1)",
|
|
477
|
-
enable_field: { value: true }
|
|
478
|
-
}
|
|
479
|
-
]
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
]
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
else if (field.autofill.type === "config") {
|
|
487
|
-
field["defaultValue"] = {
|
|
488
|
-
is_found: false,
|
|
489
|
-
value: "",
|
|
490
|
-
sources: [
|
|
491
|
-
{
|
|
492
|
-
source: "field_config",
|
|
493
|
-
field_config: {
|
|
494
|
-
path: `$.${field.key}`,
|
|
495
|
-
validation: {
|
|
496
|
-
rules: [
|
|
497
|
-
{
|
|
498
|
-
key: "1",
|
|
499
|
-
type: "is_not_empty",
|
|
500
|
-
is_not_empty: {
|
|
501
|
-
value: true
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
],
|
|
505
|
-
actions: [
|
|
506
|
-
{
|
|
507
|
-
type: "set_default_value_found",
|
|
508
|
-
condition: "1",
|
|
509
|
-
set_default_value_found: {
|
|
510
|
-
value: true
|
|
511
|
-
}
|
|
512
|
-
},
|
|
513
|
-
{
|
|
514
|
-
type: "enable_field",
|
|
515
|
-
condition: "1 OR NOT(1)",
|
|
516
|
-
enable_field: { value: true }
|
|
517
|
-
}
|
|
518
|
-
]
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
]
|
|
523
|
-
};
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
else {
|
|
528
|
-
field["defaultValue"] = {
|
|
529
|
-
is_found: false,
|
|
530
|
-
value: "",
|
|
531
|
-
sources: [
|
|
532
|
-
{
|
|
533
|
-
source: "form_data",
|
|
534
|
-
form_data: {
|
|
535
|
-
path: `$.${field.key}`,
|
|
536
|
-
validation: {
|
|
537
|
-
rules: [
|
|
538
|
-
{
|
|
539
|
-
key: "1",
|
|
540
|
-
type: "is_not_empty",
|
|
541
|
-
is_not_empty: {
|
|
542
|
-
value: true
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
],
|
|
546
|
-
actions: [
|
|
547
|
-
{
|
|
548
|
-
type: "set_default_value_found",
|
|
549
|
-
condition: "1",
|
|
550
|
-
set_default_value_found: {
|
|
551
|
-
value: true
|
|
552
|
-
}
|
|
553
|
-
},
|
|
554
|
-
{
|
|
555
|
-
type: "enable_field",
|
|
556
|
-
condition: "1 OR NOT(1)",
|
|
557
|
-
enable_field: { value: true }
|
|
558
|
-
}
|
|
559
|
-
]
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
]
|
|
564
|
-
};
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
delete field["defaultVal"];
|
|
568
|
-
}
|
|
569
|
-
return field;
|
|
570
|
-
};
|
|
571
|
-
const updateFieldMessages = (field) => {
|
|
572
|
-
if (field.isFormElement) {
|
|
573
|
-
field = this.setMissingFieldKeyValue(field, "messages", []);
|
|
574
|
-
}
|
|
575
|
-
return field;
|
|
576
|
-
};
|
|
577
|
-
const updateFieldResetButton = (field) => {
|
|
578
|
-
if (field.isFormElement) {
|
|
579
|
-
if (checkObjectKeyExists(field, "action") &&
|
|
580
|
-
field.action === "reset" &&
|
|
581
|
-
checkObjectKeyExists(field, "fields")) {
|
|
582
|
-
field = this.setFieldKeyValue(field, "reset", {
|
|
583
|
-
fields: field.fields
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
return field;
|
|
588
|
-
};
|
|
589
|
-
const setFormFields = (formConfig, fields) => {
|
|
590
|
-
if (checkObjectKeyExists(formConfig, "multiForm")) {
|
|
591
|
-
formConfig.multiForm["fields"] = fields;
|
|
592
|
-
}
|
|
593
|
-
else {
|
|
594
|
-
formConfig["fields"] = fields;
|
|
595
|
-
}
|
|
596
|
-
return formConfig;
|
|
597
|
-
};
|
|
598
|
-
const setFormFieldGroups = (formConfig, groups) => {
|
|
599
|
-
formConfig["fieldGroups"] = groups;
|
|
600
|
-
return formConfig;
|
|
601
|
-
};
|
|
602
|
-
const updateFormFieldGroups = (fieldGroups, field) => {
|
|
603
|
-
if (checkObjectKeyExists(field, "groupKey")) {
|
|
604
|
-
if (checkObjectKeyExists(fieldGroups, field.groupKey)) {
|
|
605
|
-
fieldGroups[field.groupKey].push(field.key);
|
|
606
|
-
}
|
|
607
|
-
else {
|
|
608
|
-
fieldGroups[field.groupKey] = [field.key];
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
return fieldGroups;
|
|
612
|
-
};
|
|
613
|
-
let connectedFieldMapping = {
|
|
614
|
-
parent: {},
|
|
615
|
-
child: {}
|
|
616
|
-
};
|
|
617
|
-
let fields = this.getFormFields(formConfig);
|
|
618
|
-
let fieldGroups = {};
|
|
619
|
-
for (let field of fields) {
|
|
620
|
-
field = updateOnFieldType(field);
|
|
621
|
-
field = formatFieldKeys(field);
|
|
622
|
-
// connectedFieldMapping = getConnectedElementFieldMapping(
|
|
623
|
-
// field,
|
|
624
|
-
// connectedFieldMapping
|
|
625
|
-
// );
|
|
626
|
-
// field = updateConnectedElementsKeyValue(field, connectedFieldMapping);
|
|
627
|
-
fieldGroups = updateFormFieldGroups(fieldGroups, field);
|
|
628
|
-
field = updateFieldDefaultValueConfig(field);
|
|
629
|
-
field = updateFieldValidatorConfig(field);
|
|
630
|
-
field = updateFieldResetButton(field);
|
|
631
|
-
field = updateFieldMessages(field);
|
|
632
|
-
}
|
|
633
|
-
formConfig = setFormFieldGroups(formConfig, fieldGroups);
|
|
634
|
-
formConfig = setFormFields(formConfig, fields);
|
|
635
|
-
return formConfig;
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
__decorate([
|
|
639
|
-
logMethod
|
|
640
|
-
], Converter.prototype, "convertFormConfig", null);
|
|
641
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuY29uZmlnLWNvbnZlcnRlci5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9yZW5kZXJlci9yZW5kZXJlci5jb25maWctY29udmVydGVyLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixlQUFlLEVBQUUsU0FBUyxFQUMzQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRXJHLE1BQU0sT0FBTyxTQUFTO0lBQXRCO1FBQ0Usa0JBQWEsR0FBRyxDQUFDLFVBQWUsRUFBUyxFQUFFO1lBQ3pDLElBQUksTUFBYSxDQUFDO1lBRWxCLElBQUksb0JBQW9CLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2dCQUNqRCxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0wsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDNUI7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7UUFFRiw0QkFBdUIsR0FBRyxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsS0FBVSxFQUFPLEVBQUU7WUFDckUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDckMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUNwQjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO1FBRUYscUJBQWdCLEdBQUcsQ0FBQyxLQUFVLEVBQUUsR0FBVyxFQUFFLEtBQVUsRUFBTyxFQUFFO1lBQzlELEtBQUssQ0FBQyxH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QUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRS9DLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXR4QkM7SUFEQyxTQUFTO2tEQXN4QlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUdWlEYXkgfSBmcm9tIFwiQHRhaWdhLXVpL2Nka1wiO1xuaW1wb3J0IHtcbiAgY2hlY2tPYmplY3RLZXlFeGlzdHMsXG4gIGlzRW1wdHlWYWx1ZSxcbiAgaXNOb3RFbXB0eVZhbHVlLCBsb2dNZXRob2Rcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBjb252ZXJ0Rm9ybUZpZWxkVHlwZURhdGVUb0t3aWtVSUZvcm1hdCB9IGZyb20gXCIuL2Zvcm0tdmlldy9oZWxwZXJzL2Zvcm0tdmlldy5maWVsZHMuaGVscGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb252ZXJ0ZXIge1xuICBnZXRGb3JtRmllbGRzID0gKGZvcm1Db25maWc6IGFueSk6IGFueVtdID0+IHtcbiAgICBsZXQgZmllbGRzOiBhbnlbXTtcblxuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLCBcIm11bHRpRm9ybVwiKSkge1xuICAgICAgZmllbGRzID0gZm9ybUNvbmZpZy5tdWx0aUZvcm0uZmllbGRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWVsZHMgPSBmb3JtQ29uZmlnLmZpZWxkcztcbiAgICB9XG5cbiAgICByZXR1cm4gZmllbGRzO1xuICB9O1xuXG4gIHNldE1pc3NpbmdGaWVsZEtleVZhbHVlID0gKGZpZWxkOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBrZXkpKSB7XG4gICAgICBmaWVsZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZDtcbiAgfTtcblxuICBzZXRGaWVsZEtleVZhbHVlID0gKGZpZWxkOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICBmaWVsZFtrZXldID0gdmFsdWU7XG5cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgcmVtb3ZlRmllbGRLZXkgPSAoZmllbGQ6IGFueSwga2V5OiBzdHJpbmcpOiBhbnkgPT4ge1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwga2V5KSkge1xuICAgICAgZGVsZXRlIGZpZWxkW2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkO1xuICB9O1xuXG4gIEBsb2dNZXRob2RcbiAgY29udmVydEZvcm1Db25maWcoZm9ybUNvbmZpZzogYW55KTogYW55IHtcbiAgICBjb25zdCB1cGRhdGVPbkZpZWxkVHlwZSA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZUh0bWwgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVUaXRsZSA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVRleHQgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgXCJjYXNlXCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCJcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZUNoZWNrYm94ID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlTnVtYmVyID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwia2V5XCIpKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLmtleSA9PT0gXCJhYWRoYWFyX251bWJlclwiKSB7XG4gICAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJ0eXBlXCIsIFwiYWFkaGFhcl9udW1iZXJcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWVsZC5rZXkgPT09IFwiY29udGFjdF9udW1iZXJcIikge1xuICAgICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwidHlwZVwiLCBcInBob25lXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSBcInBob25lXCIgfHwgZmllbGQudHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwiY291bnRyeUNvZGVcIixcbiAgICAgICAgICAgICAgXCIrOTFcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBcInBob25lTWFza0FmdGVyQ291bnRyeUNvZGVcIixcbiAgICAgICAgICAgICAgXCIjIyMjLSMjIyMjI1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwicmVtb3ZlQ291bnRyeUNvZGVGcm9tVmFsdWVcIixcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICBcImRlY2ltYWxcIixcbiAgICAgICAgICAgICAgXCJuZXZlclwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwicHJlZml4XCIsXG4gICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJwb3N0Zml4XCIsXG4gICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgXCJtaW5cIixcbiAgICAgICAgICAgICAgLUluZmluaXR5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwibWF4XCIsXG4gICAgICAgICAgICAgIEluZmluaXR5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgIFwicHJlY2lzaW9uXCIsXG4gICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaGlkZGVuXCIsIGZhbHNlKTtcblxuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICB9O1xuICAgICAgY29uc3QgZm9ybWF0RmllbGRUeXBlRGF0ZSA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcIm1pblwiKSkge1xuICAgICAgICAgIGNvbnN0IHR1aURheSA9IGNvbnZlcnRGb3JtRmllbGRUeXBlRGF0ZVRvS3dpa1VJRm9ybWF0KGZpZWxkW1wibWluXCJdKTtcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgIFwibWluXCIsXG4gICAgICAgICAgICB0dWlEYXlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgIFwibWluXCIsXG4gICAgICAgICAgICBuZXcgVHVpRGF5KDAsIDAsIDEpXG4gICAgICAgICAgKTsgLy8gWWVhciAtIDAwMDAsIE1vbnRoIC0gMCAoMCBJbmRleGluZyksIERheSAtIDFcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJtYXhcIikpIHtcbiAgICAgICAgICBjb25zdCB0dWlEYXkgPSBjb252ZXJ0Rm9ybUZpZWxkVHlwZURhdGVUb0t3aWtVSUZvcm1hdChmaWVsZFtcIm1heFwiXSk7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcIm1heFwiLFxuICAgICAgICAgICAgdHVpRGF5XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcIm1heFwiLFxuICAgICAgICAgICAgbmV3IFR1aURheShcbiAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLCAvLyBZZWFyIC0gOTk5OVxuICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldE1vbnRoKCksIC8vIE1vbnRoIC0gMTEgKDAgSW5kZXhpbmcpXG4gICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpIC8vIERheSAtIDMxXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgXCJwbGFjZWhvbGRlclwiLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKTtcblxuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVQaG9uZSA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVJhZGlvID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzLFxuICAgICAgICAgIFwic2l6ZVwiLFxuICAgICAgICAgIFwibVwiXG4gICAgICAgICk7XG4gICAgICAgIGZpZWxkLnByb3BlcnRpZXMgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKFxuICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgXCJvcmllbnRhdGlvblwiLFxuICAgICAgICAgIFwidmVydGljYWxcIlxuICAgICAgICApO1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJoaWRkZW5cIiwgZmFsc2UpO1xuXG4gICAgICAgIGZpZWxkLm9wdGlvbnMgPSBmaWVsZC5vcHRpb25zLm1hcCgoeDogYW55KTogYW55ID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHggPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiB4LCBkaXNhYmxlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcIlwiIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoeCwgXCJsYWJlbFwiKSAmJlxuICAgICAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyh4LCBcImRpc2FibGVkXCIpICYmXG4gICAgICAgICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHgsIFwiZGVzY3JpcHRpb25cIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoeCwgXCJkaXNhYmxlZFwiKSkge1xuICAgICAgICAgICAgICB4ID0geyAuLi54LCBkaXNhYmxlZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoeCwgXCJkZXNjcmlwdGlvblwiKSkge1xuICAgICAgICAgICAgICB4ID0geyAuLi54LCBkZXNjcmlwdGlvbjogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZVNlYXJjaFRleHQgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IFwic2VhcmNoLXRleHRcIikge1xuICAgICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICBcInR5cGVcIixcbiAgICAgICAgICAgICAgXCJkcm9wZG93bi13aXRoLXNlYXJjaFwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVEcm9wZG93bldpdGhTZWFyY2ggPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG4gICAgICBjb25zdCBmb3JtYXRGaWVsZFR5cGVBcGlDYWxsID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJpc0Zvcm1FbGVtZW50XCIsIHRydWUpO1xuICAgICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLnByb3BlcnRpZXMsIFwic2hhcGVcIikpIHtcbiAgICAgICAgICBmaWVsZC5wcm9wZXJ0aWVzID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKFxuICAgICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICAgIFwic2hhcGVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwic2hvd0xvYWRlclwiKSkge1xuICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcInNob3dMb2FkZXJcIiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQucHJvcGVydGllcywgXCJzaXplXCIpKSB7XG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBcInNpemVcIixcbiAgICAgICAgICAgIFwibVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImFwaVwiKSkge1xuICAgICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImFwaVwiLCB7fSk7XG5cbiAgICAgICAgICBmaWVsZC5hcGkgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLmFwaSwgXCJ1cmxcIiwgXCJcIik7XG4gICAgICAgICAgZmllbGQuYXBpID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShmaWVsZC5hcGksIFwicmVxdWVzdFwiLCBcIlwiKTtcbiAgICAgICAgICBmaWVsZC5hcGkgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLmFwaSwgXCJyZXNwb25zZVwiLCBcIlwiKTtcbiAgICAgICAgICBmaWVsZC5hcGkgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLmFwaSwgXCJzdGF0dXNcIiwgXCJcIik7XG5cbiAgICAgICAgICBmaWVsZC5hcGkuc3RhdHVzID0gdGhpcy5zZXRNaXNzaW5nRmllbGRLZXlWYWx1ZShcbiAgICAgICAgICAgIGZpZWxkLmFwaS5zdGF0dXMsXG4gICAgICAgICAgICBcInZhbHVlXCIsXG4gICAgICAgICAgICBcImRlZmF1bHRcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgZmllbGQuYXBpLnN0YXR1cyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgICBmaWVsZC5hcGkuc3RhdHVzLFxuICAgICAgICAgICAgXCJsYWJlbHNcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGVmYXVsdDogXCJDYWxsIEFQSVwiLFxuICAgICAgICAgICAgICBsb2FkaW5nOiBcIkNhbGwgQVBJXCIsXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IFwiQVBJIFN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgZmFpbGVkOiBcIkFQSSBGYWlsZWRcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZU90cCA9IChmaWVsZDogYW55KTogYW55ID0+IHtcbiAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwiaXNGb3JtRWxlbWVudFwiLCB0cnVlKTtcbiAgICAgICAgZmllbGQucHJvcGVydGllcyA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoXG4gICAgICAgICAgZmllbGQucHJvcGVydGllcyxcbiAgICAgICAgICBcIm1hc2tcIixcbiAgICAgICAgICBuZXcgQXJyYXkoZmllbGQucHJvcGVydGllcy5vdHBMZW5ndGgpLmZpbGwoXCIjXCIpLmpvaW4oXCIgXCIpXG4gICAgICAgICk7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImhpZGRlblwiLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1hdEZpZWxkVHlwZUFhZGhhYXJOdW1iZXIgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGZpZWxkID0gdGhpcy5zZXRGaWVsZEtleVZhbHVlKGZpZWxkLCBcImlzRm9ybUVsZW1lbnRcIiwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH07XG5cbiAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlSHRtbChmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ0aXRsZVwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlVGl0bGUoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlVGV4dChmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlQ2hlY2tib3goZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVOdW1iZXIoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlRGF0ZShmaWVsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJwaG9uZVwiOlxuICAgICAgICAgIGZpZWxkID0gZm9ybWF0RmllbGRUeXBlUGhvbmUoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZVJhZGlvKGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInNlYXJjaC10ZXh0XCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVTZWFyY2hUZXh0KGZpZWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRyb3Bkb3duLXdpdGgtc2VhcmNoXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVEcm9wZG93bldpdGhTZWFyY2goZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXBpLWNhbGxcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZUFwaUNhbGwoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwib3RwXCI6XG4gICAgICAgICAgZmllbGQgPSBmb3JtYXRGaWVsZFR5cGVPdHAoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYWFkaGFhci1udW1iZXJcIjpcbiAgICAgICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkVHlwZUFhZGhhYXJOdW1iZXIoZmllbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENvbm5lY3RlZEVsZW1lbnRLZXlWYWx1ZU9iamVjdCA9IChrZXk6IGFueSk6IGFueSA9PiB7XG4gICAgICBjb25zdCBvYmplY3QgPSB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBjb25kaXRpb25zOiB7IGZvcm11bGE6IFwiXCIsIHJ1bGVzOiBbXSB9LFxuICAgICAgICBhY3Rpb25zOiB7IHN1Y2Nlc3M6IFtdLCBmYWlsdXJlOiBbXSB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybWF0RmllbGRLZXlzID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZFRvXCIpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRbXCJjb25uZWN0ZWRUb1wiXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkRWxlbWVudHNcIl0gPSBbXG4gICAgICAgICAgICBnZXRDb25uZWN0ZWRFbGVtZW50S2V5VmFsdWVPYmplY3QoZmllbGRbXCJjb25uZWN0ZWRUb1wiXSlcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkVG9cIl0gPSBmaWVsZFtcImNvbm5lY3RlZFRvXCJdLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb25uZWN0ZWRFbGVtZW50S2V5VmFsdWVPYmplY3Qoa2V5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZEVsZW1lbnRzXCJdID0gZmllbGRbXCJjb25uZWN0ZWRUb1wiXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVGaWVsZEtleShmaWVsZCwgXCJjb25uZWN0ZWRUb1wiKTtcblxuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImNvbm5lY3RlZFRvUGFyZW50XCIpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRbXCJjb25uZWN0ZWRUb1BhcmVudFwiXSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkUGFyZW50RmllbGRzXCJdID0gW1xuICAgICAgICAgICAgZ2V0Q29ubmVjdGVkRWxlbWVudEtleVZhbHVlT2JqZWN0KGZpZWxkW1wiY29ubmVjdGVkVG9QYXJlbnRcIl0pXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9IGdldENvbm5lY3RlZEVsZW1lbnRLZXlWYWx1ZU9iamVjdChcbiAgICAgICAgICAgIGZpZWxkW1wiY29ubmVjdGVkVG9QYXJlbnRcIl1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlbW92ZUZpZWxkS2V5KGZpZWxkLCBcImNvbm5lY3RlZFRvUGFyZW50XCIpO1xuXG4gICAgICB0aGlzLnJlbW92ZUZpZWxkS2V5KGZpZWxkLCBcInNpZGVFZmZlY3RcIik7XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q29ubmVjdGVkRWxlbWVudEZpZWxkTWFwcGluZyA9IChcbiAgICAgIGZpZWxkOiBhbnksXG4gICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGFueVxuICAgICk6IGFueSA9PiB7XG4gICAgICBjb25zdCBnZXRDb25uZWN0ZWRFbGVtZW50Q2hpbGRGaWVsZE1hcHBpbmcgPSAoXG4gICAgICAgIGZpZWxkOiBhbnksXG4gICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55XG4gICAgICApOiBhbnkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiY29ubmVjdGVkRWxlbWVudHNcIikpIHtcbiAgICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtmaWVsZC5rZXldID0gZmllbGQuY29ubmVjdGVkRWxlbWVudHM7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl0sIGZpZWxkLmtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmllbGRbXCJjb25uZWN0ZWRFbGVtZW50c1wiXSA9XG4gICAgICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtmaWVsZC5rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgZmllbGQ6IGZpZWxkLCBjb25uZWN0ZWRGaWVsZE1hcHBpbmc6IGNvbm5lY3RlZEZpZWxkTWFwcGluZyB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0Q29ubmVjdGVkRWxlbWVudFBhcmVudEZpZWxkTWFwcGluZyA9IChcbiAgICAgICAgZmllbGQ6IGFueSxcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBhbnlcbiAgICAgICk6IGFueSA9PiB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICAgIGZvciAobGV0IGNvbm5lY3RlZFBhcmVudEtleSBvZiBjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXVtcbiAgICAgICAgICAgIGZpZWxkLmtleVxuICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoXG4gICAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdLFxuICAgICAgICAgICAgICAgIGNvbm5lY3RlZFBhcmVudEtleVtcImtleVwiXVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdW2Nvbm5lY3RlZFBhcmVudEtleVtcImtleVwiXV0ucHVzaChcbiAgICAgICAgICAgICAgICBmaWVsZC5rZXlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXVtjb25uZWN0ZWRQYXJlbnRLZXlbXCJrZXlcIl1dID0gW1xuICAgICAgICAgICAgICAgIGZpZWxkLmtleVxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGZpZWxkOiBmaWVsZCwgY29ubmVjdGVkRmllbGRNYXBwaW5nOiBjb25uZWN0ZWRGaWVsZE1hcHBpbmcgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNvbm5lY3RlZENoaWxkRmllbGRNYXBwaW5nID0gZ2V0Q29ubmVjdGVkRWxlbWVudENoaWxkRmllbGRNYXBwaW5nKFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nXG4gICAgICApO1xuICAgICAgZmllbGQgPSBjb25uZWN0ZWRDaGlsZEZpZWxkTWFwcGluZ1tcImZpZWxkXCJdO1xuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nID1cbiAgICAgICAgY29ubmVjdGVkQ2hpbGRGaWVsZE1hcHBpbmdbXCJjb25uZWN0ZWRGaWVsZE1hcHBpbmdcIl07XG5cbiAgICAgIGNvbnN0IGNvbm5lY3RlZFBhcmVudEZpZWxkTWFwcGluZyA9IGdldENvbm5lY3RlZEVsZW1lbnRQYXJlbnRGaWVsZE1hcHBpbmcoXG4gICAgICAgIGZpZWxkLFxuICAgICAgICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdcbiAgICAgICk7XG4gICAgICBmaWVsZCA9IGNvbm5lY3RlZFBhcmVudEZpZWxkTWFwcGluZ1tcImZpZWxkXCJdO1xuICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nID1cbiAgICAgICAgY29ubmVjdGVkUGFyZW50RmllbGRNYXBwaW5nW1wiY29ubmVjdGVkRmllbGRNYXBwaW5nXCJdO1xuXG4gICAgICByZXR1cm4gY29ubmVjdGVkRmllbGRNYXBwaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVDb25uZWN0ZWRFbGVtZW50c0tleVZhbHVlID0gKFxuICAgICAgZmllbGQ6IGFueSxcbiAgICAgIGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55XG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhjb25uZWN0ZWRGaWVsZE1hcHBpbmdbXCJjaGlsZFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICBmaWVsZFtcImNvbm5lY3RlZEVsZW1lbnRzXCJdID0gY29ubmVjdGVkRmllbGRNYXBwaW5nW1wiY2hpbGRcIl1bZmllbGQua2V5XTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGNvbm5lY3RlZEZpZWxkTWFwcGluZ1tcInBhcmVudFwiXSwgZmllbGQua2V5KSkge1xuICAgICAgICBmaWVsZFtcImNvbm5lY3RlZFBhcmVudEZpZWxkc1wiXSA9XG4gICAgICAgICAgY29ubmVjdGVkRmllbGRNYXBwaW5nW1wicGFyZW50XCJdW2ZpZWxkLmtleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlRmllbGRWYWxpZGF0b3JDb25maWcgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwidmFsaWRhdG9yc1wiKVxuICAgICAgICAgID8gZmllbGQudmFsaWRhdG9yc1xuICAgICAgICAgIDoge307XG5cbiAgICAgICAgZmllbGQgPSB0aGlzLnNldE1pc3NpbmdGaWVsZEtleVZhbHVlKGZpZWxkLCBcInZhbGlkYXRvcnNcIiwge30pO1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0RmllbGRLZXlWYWx1ZShmaWVsZCwgXCJ2YWxpZGF0b3JzXCIsIHtcbiAgICAgICAgICAuLi5maWVsZFtcInZhbGlkYXRvcnNcIl0sXG4gICAgICAgICAgbWluOiBjaGVja09iamVjdEtleUV4aXN0cyh2YWxpZGF0b3JzLCBcIm1pblwiKVxuICAgICAgICAgICAgPyBpc05vdEVtcHR5VmFsdWUodmFsaWRhdG9ycy5taW4pXG4gICAgICAgICAgICAgID8gTnVtYmVyKHZhbGlkYXRvcnMubWluKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWluXCIpXG4gICAgICAgICAgICA/IE51bWJlcihmaWVsZC5taW4pXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgbWF4OiBjaGVja09iamVjdEtleUV4aXN0cyh2YWxpZGF0b3JzLCBcIm1heFwiKVxuICAgICAgICAgICAgPyBpc05vdEVtcHR5VmFsdWUodmFsaWRhdG9ycy5tYXgpXG4gICAgICAgICAgICAgID8gTnVtYmVyKHZhbGlkYXRvcnMubWF4KVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWF4XCIpXG4gICAgICAgICAgICA/IE51bWJlcihmaWVsZC5tYXgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgcmVxdWlyZWQ6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwicmVxdWlyZWRcIilcbiAgICAgICAgICAgID8gQm9vbGVhbih2YWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgPyBCb29sZWFuKGZpZWxkLnJlcXVpcmVkKVxuICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICBtaW5MZW5ndGg6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwibWluTGVuZ3RoXCIpXG4gICAgICAgICAgICA/IGlzTm90RW1wdHlWYWx1ZSh2YWxpZGF0b3JzLm1pbkxlbmd0aClcbiAgICAgICAgICAgICAgPyBOdW1iZXIodmFsaWRhdG9ycy5taW5MZW5ndGgpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJtaW5MZW5ndGhcIilcbiAgICAgICAgICAgID8gTnVtYmVyKGZpZWxkLm1pbkxlbmd0aClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBtYXhMZW5ndGg6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKHZhbGlkYXRvcnMsIFwibWF4TGVuZ3RoXCIpXG4gICAgICAgICAgICA/IGlzTm90RW1wdHlWYWx1ZSh2YWxpZGF0b3JzLm1heExlbmd0aClcbiAgICAgICAgICAgICAgPyBOdW1iZXIodmFsaWRhdG9ycy5tYXhMZW5ndGgpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJsZW5ndGhcIilcbiAgICAgICAgICAgID8gTnVtYmVyKGZpZWxkLmxlbmd0aClcbiAgICAgICAgICAgIDogY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwibWF4TGVuZ3RoXCIpXG4gICAgICAgICAgICA/IE51bWJlcihmaWVsZC5tYXhMZW5ndGgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgcGF0dGVybjogY2hlY2tPYmplY3RLZXlFeGlzdHModmFsaWRhdG9ycywgXCJwYXR0ZXJuXCIpXG4gICAgICAgICAgICA/IGlzTm90RW1wdHlWYWx1ZSh2YWxpZGF0b3JzLnBhdHRlcm4pXG4gICAgICAgICAgICAgID8gdmFsaWRhdG9ycy5wYXR0ZXJuXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInBhdHRlcm5cIilcbiAgICAgICAgICAgID8geyBrZXk6IFwiQ1VTVE9NXCIsIHBhdHRlcm46IFN0cmluZyhmaWVsZC5wYXR0ZXJuKSB9XG4gICAgICAgICAgICA6IGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcInJlZ2V4XCIpXG4gICAgICAgICAgICA/IHsga2V5OiBcIkNVU1RPTVwiLCBwYXR0ZXJuOiBTdHJpbmcoZmllbGQucmVnZXgpIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlbGV0ZSBmaWVsZC5taW47XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5tYXg7XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5yZXF1aXJlZDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLm1pbkxlbmd0aDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLmxlbmd0aDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLm1heExlbmd0aDtcbiAgICAgICAgZGVsZXRlIGZpZWxkLnBhdHRlcm47XG4gICAgICAgIGRlbGV0ZSBmaWVsZC5yZWdleDtcblxuICAgICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWluO1xuICAgICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWF4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmaWVsZC52YWxpZGF0b3JzPy5taW4pKSB7XG4gICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmllbGQudmFsaWRhdG9ycz8ubWF4KSkge1xuICAgICAgICAgIGRlbGV0ZSBmaWVsZC52YWxpZGF0b3JzLm1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbXB0eVZhbHVlKGZpZWxkLnZhbGlkYXRvcnM/Lm1pbkxlbmd0aCkpIHtcbiAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5taW5MZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRW1wdHlWYWx1ZShmaWVsZC52YWxpZGF0b3JzPy5tYXhMZW5ndGgpKSB7XG4gICAgICAgICAgZGVsZXRlIGZpZWxkLnZhbGlkYXRvcnMubWF4TGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmllbGQudmFsaWRhdG9ycz8ucGF0dGVybikpIHtcbiAgICAgICAgICBkZWxldGUgZmllbGQudmFsaWRhdG9ycy5wYXR0ZXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQuZm9jdXMgPSBmYWxzZTtcbiAgICAgICAgZmllbGQuaW52YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZpZWxkRGVmYXVsdFZhbHVlQ29uZmlnID0gKGZpZWxkOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmlzRm9ybUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkLCBcImRlZmF1bHRWYWx1ZVwiKSkge1xuICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfSBlbHNlIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJkZWZhdWx0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJkZWZhdWx0VmFsXCIpKSB7XG4gICAgICAgICAgICAvLyBDdXJyZW50bHkgYmVsb3cgbGluZSBpcyBjb21tZW50ZWQgYmVjYXVzZSBpdCBjYXVzZWQgaXNzdWVzIGluIHNldHRpbmcgRGVmYXVsdCBWYWx1ZS5cbiAgICAgICAgICAgIC8vIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0gZmllbGRbXCJkZWZhdWx0VmFsXCJdO1xuICAgICAgICAgICAgLy8gZGVsZXRlIGZpZWxkW1wiZGVmYXVsdFZhbFwiXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUT0RPOiBDb25kaXRpb24gZm9yIGFsbF9mb3Jtc19kYXRhIGlzIG5vdCBjb25zaWRlcmVkIHlldC5cbiAgICAgICAgICBpZiAoZmllbGQuYXV0b1BvcHVsYXRlRnJvbVN1bW1hcnlEYXRhKSB7XG4gICAgICAgICAgICBmaWVsZFtcImRlZmF1bHRWYWx1ZVwiXSA9IHtcbiAgICAgICAgICAgICAgaXNfZm91bmQ6IGZhbHNlLFxuICAgICAgICAgICAgICB2YWx1ZTogXCJcIixcbiAgICAgICAgICAgICAgc291cmNlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogXCJzdW1tYXJ5X2RhdGFcIixcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlfZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBgJC4ke2ZpZWxkLmtleX1gLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpc19ub3RfZW1wdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbm90X2VtcHR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlbmFibGVfZmllbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjEgT1IgTk9UKDEpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV9maWVsZDogeyB2YWx1ZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiYXV0b2ZpbGxcIikpIHtcbiAgICAgICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZC5hdXRvZmlsbCwgXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICAgIGlmIChmaWVsZC5hdXRvZmlsbC50eXBlID09PSBcInN0b3JhZ2VcIikge1xuICAgICAgICAgICAgICAgIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0ge1xuICAgICAgICAgICAgICAgICAgaXNfZm91bmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IFwiYnJvd3Nlcl9zdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYnJvd3Nlcl9zdG9yYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBgJC4ke2ZpZWxkLmtleX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlzX25vdF9lbXB0eVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbm90X2VtcHR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVuYWJsZV9maWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjEgT1IgTk9UKDEpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQuYXV0b2ZpbGwudHlwZSA9PT0gXCJjb25maWdcIikge1xuICAgICAgICAgICAgICAgIGZpZWxkW1wiZGVmYXVsdFZhbHVlXCJdID0ge1xuICAgICAgICAgICAgICAgICAgaXNfZm91bmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IFwiZmllbGRfY29uZmlnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgZmllbGRfY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBgJC4ke2ZpZWxkLmtleX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImlzX25vdF9lbXB0eVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbm90X2VtcHR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9kZWZhdWx0X3ZhbHVlX2ZvdW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVuYWJsZV9maWVsZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBcIjEgT1IgTk9UKDEpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmllbGRbXCJkZWZhdWx0VmFsdWVcIl0gPSB7XG4gICAgICAgICAgICAgIGlzX2ZvdW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgICAgIHNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IFwiZm9ybV9kYXRhXCIsXG4gICAgICAgICAgICAgICAgICBmb3JtX2RhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogYCQuJHtmaWVsZC5rZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaXNfbm90X2VtcHR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vdF9lbXB0eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IFwiMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGVmYXVsdF92YWx1ZV9mb3VuZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZW5hYmxlX2ZpZWxkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogXCIxIE9SIE5PVCgxKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfZmllbGQ6IHsgdmFsdWU6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgZmllbGRbXCJkZWZhdWx0VmFsXCJdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZpZWxkTWVzc2FnZXMgPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICBmaWVsZCA9IHRoaXMuc2V0TWlzc2luZ0ZpZWxkS2V5VmFsdWUoZmllbGQsIFwibWVzc2FnZXNcIiwgW10pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUZpZWxkUmVzZXRCdXR0b24gPSAoZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoZmllbGQuaXNGb3JtRWxlbWVudCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiYWN0aW9uXCIpICYmXG4gICAgICAgICAgZmllbGQuYWN0aW9uID09PSBcInJlc2V0XCIgJiZcbiAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmaWVsZCwgXCJmaWVsZHNcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmllbGQgPSB0aGlzLnNldEZpZWxkS2V5VmFsdWUoZmllbGQsIFwicmVzZXRcIiwge1xuICAgICAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHNldEZvcm1GaWVsZHMgPSAoZm9ybUNvbmZpZzogYW55LCBmaWVsZHM6IGFueVtdKTogYW55ID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtQ29uZmlnLCBcIm11bHRpRm9ybVwiKSkge1xuICAgICAgICBmb3JtQ29uZmlnLm11bHRpRm9ybVtcImZpZWxkc1wiXSA9IGZpZWxkcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1Db25maWdbXCJmaWVsZHNcIl0gPSBmaWVsZHM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3JtQ29uZmlnO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXRGb3JtRmllbGRHcm91cHMgPSAoZm9ybUNvbmZpZzogYW55LCBncm91cHM6IGFueSk6IGFueSA9PiB7XG4gICAgICBmb3JtQ29uZmlnW1wiZmllbGRHcm91cHNcIl0gPSBncm91cHM7XG5cbiAgICAgIHJldHVybiBmb3JtQ29uZmlnO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVGb3JtRmllbGRHcm91cHMgPSAoZmllbGRHcm91cHM6IGFueSwgZmllbGQ6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZmllbGQsIFwiZ3JvdXBLZXlcIikpIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZpZWxkR3JvdXBzLCBmaWVsZC5ncm91cEtleSkpIHtcbiAgICAgICAgICBmaWVsZEdyb3Vwc1tmaWVsZC5ncm91cEtleV0ucHVzaChmaWVsZC5rZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkR3JvdXBzW2ZpZWxkLmdyb3VwS2V5XSA9IFtmaWVsZC5rZXldO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWVsZEdyb3VwcztcbiAgICB9O1xuXG4gICAgbGV0IGNvbm5lY3RlZEZpZWxkTWFwcGluZzogYW55ID0ge1xuICAgICAgcGFyZW50OiB7fSxcbiAgICAgIGNoaWxkOiB7fVxuICAgIH07XG5cbiAgICBsZXQgZmllbGRzOiBhbnlbXSA9IHRoaXMuZ2V0Rm9ybUZpZWxkcyhmb3JtQ29uZmlnKTtcblxuICAgIGxldCBmaWVsZEdyb3VwczogYW55ID0ge307XG5cbiAgICBmb3IgKGxldCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGZpZWxkID0gdXBkYXRlT25GaWVsZFR5cGUoZmllbGQpO1xuXG4gICAgICBmaWVsZCA9IGZvcm1hdEZpZWxkS2V5cyhmaWVsZCk7XG5cbiAgICAgIC8vIGNvbm5lY3RlZEZpZWxkTWFwcGluZyA9IGdldENvbm5lY3RlZEVsZW1lbnRGaWVsZE1hcHBpbmcoXG4gICAgICAvLyAgIGZpZWxkLFxuICAgICAgLy8gICBjb25uZWN0ZWRGaWVsZE1hcHBpbmdcbiAgICAgIC8vICk7XG4gICAgICAvLyBmaWVsZCA9IHVwZGF0ZUNvbm5lY3RlZEVsZW1lbnRzS2V5VmFsdWUoZmllbGQsIGNvbm5lY3RlZEZpZWxkTWFwcGluZyk7XG4gICAgICBmaWVsZEdyb3VwcyA9IHVwZGF0ZUZvcm1GaWVsZEdyb3VwcyhmaWVsZEdyb3VwcywgZmllbGQpO1xuXG4gICAgICBmaWVsZCA9IHVwZGF0ZUZpZWxkRGVmYXVsdFZhbHVlQ29uZmlnKGZpZWxkKTtcblxuICAgICAgZmllbGQgPSB1cGRhdGVGaWVsZFZhbGlkYXRvckNvbmZpZyhmaWVsZCk7XG5cbiAgICAgIGZpZWxkID0gdXBkYXRlRmllbGRSZXNldEJ1dHRvbihmaWVsZCk7XG5cbiAgICAgIGZpZWxkID0gdXBkYXRlRmllbGRNZXNzYWdlcyhmaWVsZCk7XG4gICAgfVxuXG4gICAgZm9ybUNvbmZpZyA9IHNldEZvcm1GaWVsZEdyb3Vwcyhmb3JtQ29uZmlnLCBmaWVsZEdyb3Vwcyk7XG5cbiAgICBmb3JtQ29uZmlnID0gc2V0Rm9ybUZpZWxkcyhmb3JtQ29uZmlnLCBmaWVsZHMpO1xuXG4gICAgcmV0dXJuIGZvcm1Db25maWc7XG4gIH1cbn1cbiJdfQ==
|