@stemy/ngx-dynamic-form 19.1.14 → 19.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/fesm2022/stemy-ngx-dynamic-form-ui-nebular.mjs +4 -4
  2. package/fesm2022/stemy-ngx-dynamic-form-ui-nebular.mjs.map +1 -1
  3. package/fesm2022/stemy-ngx-dynamic-form.mjs +858 -1661
  4. package/fesm2022/stemy-ngx-dynamic-form.mjs.map +1 -1
  5. package/ngx-dynamic-form/common-types.d.ts +109 -26
  6. package/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.d.ts +21 -0
  7. package/ngx-dynamic-form/components/dynamic-form-array/dynamic-form-array.component.d.ts +9 -0
  8. package/ngx-dynamic-form/components/dynamic-form-chips/dynamic-form-chips.component.d.ts +7 -0
  9. package/ngx-dynamic-form/components/dynamic-form-field/dynamic-form-field.component.d.ts +6 -0
  10. package/ngx-dynamic-form/components/dynamic-form-fieldset/dynamic-form-fieldset.component.d.ts +7 -0
  11. package/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.d.ts +6 -0
  12. package/ngx-dynamic-form/components/dynamic-form-upload/dynamic-form-upload.component.d.ts +7 -0
  13. package/ngx-dynamic-form/directives/async-submit.directive.d.ts +17 -23
  14. package/ngx-dynamic-form/ngx-dynamic-form.imports.d.ts +5 -9
  15. package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +13 -11
  16. package/ngx-dynamic-form/services/dynamic-form-builder.service.d.ts +27 -0
  17. package/ngx-dynamic-form/services/dynamic-form.service.d.ts +28 -46
  18. package/ngx-dynamic-form/utils/customizer.d.ts +5 -12
  19. package/ngx-dynamic-form/utils/decorators.d.ts +10 -0
  20. package/ngx-dynamic-form/utils/misc.d.ts +2 -4
  21. package/ngx-dynamic-form/utils/validation.d.ts +13 -0
  22. package/package.json +21 -16
  23. package/public_api.d.ts +13 -18
  24. package/ui-nebular/index.d.ts +1 -5
  25. package/common-types.d.ts +0 -37
  26. package/components/base/dynamic-base-form-array.component.d.ts +0 -38
  27. package/components/base/dynamic-base-form-control-container.component.d.ts +0 -39
  28. package/components/base/dynamic-base-form-control.component.d.ts +0 -26
  29. package/components/base/dynamic-base-form-group.component.d.ts +0 -25
  30. package/components/base/dynamic-base-form.component.d.ts +0 -46
  31. package/components/base/dynamic-base-select.component.d.ts +0 -15
  32. package/directives/async-submit.directive.d.ts +0 -31
  33. package/esm2020/ngx-dynamic-form/common-types.mjs +0 -2
  34. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-array.component.mjs +0 -104
  35. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.mjs +0 -127
  36. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-control.component.mjs +0 -57
  37. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-group.component.mjs +0 -75
  38. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form.component.mjs +0 -182
  39. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-select.component.mjs +0 -66
  40. package/esm2020/ngx-dynamic-form/directives/async-submit.directive.mjs +0 -116
  41. package/esm2020/ngx-dynamic-form/ngx-dynamic-form.imports.mjs +0 -26
  42. package/esm2020/ngx-dynamic-form/ngx-dynamic-form.module.mjs +0 -116
  43. package/esm2020/ngx-dynamic-form/services/dynamic-form.service.mjs +0 -615
  44. package/esm2020/ngx-dynamic-form/utils/creators.mjs +0 -67
  45. package/esm2020/ngx-dynamic-form/utils/customizer.mjs +0 -28
  46. package/esm2020/ngx-dynamic-form/utils/dynamic-editor.model.mjs +0 -14
  47. package/esm2020/ngx-dynamic-form/utils/dynamic-form-array.model.mjs +0 -128
  48. package/esm2020/ngx-dynamic-form/utils/dynamic-form-group.model.mjs +0 -26
  49. package/esm2020/ngx-dynamic-form/utils/dynamic-select.model.mjs +0 -59
  50. package/esm2020/ngx-dynamic-form/utils/form-select-subject.mjs +0 -26
  51. package/esm2020/ngx-dynamic-form/utils/form-subject.mjs +0 -29
  52. package/esm2020/ngx-dynamic-form/utils/misc.mjs +0 -47
  53. package/esm2020/ngx-dynamic-form/utils/validation-errors.mjs +0 -22
  54. package/esm2020/ngx-dynamic-form/utils/validators.mjs +0 -56
  55. package/esm2020/public_api.mjs +0 -21
  56. package/esm2020/stemy-ngx-dynamic-form.mjs +0 -5
  57. package/fesm2015/stemy-ngx-dynamic-form.mjs +0 -1927
  58. package/fesm2015/stemy-ngx-dynamic-form.mjs.map +0 -1
  59. package/fesm2020/stemy-ngx-dynamic-form.mjs +0 -1893
  60. package/fesm2020/stemy-ngx-dynamic-form.mjs.map +0 -1
  61. package/fesm2022/stemy-ngx-dynamic-form-src-ngx-dynamic-form-nebular.mjs +0 -50
  62. package/fesm2022/stemy-ngx-dynamic-form-src-ngx-dynamic-form-nebular.mjs.map +0 -1
  63. package/imports.d.ts +0 -12
  64. package/ngx-dynamic-form/components/base/dynamic-base-form-array.component.d.ts +0 -38
  65. package/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.d.ts +0 -39
  66. package/ngx-dynamic-form/components/base/dynamic-base-form-control.component.d.ts +0 -26
  67. package/ngx-dynamic-form/components/base/dynamic-base-form-group.component.d.ts +0 -25
  68. package/ngx-dynamic-form/components/base/dynamic-base-form.component.d.ts +0 -46
  69. package/ngx-dynamic-form/components/base/dynamic-base-select.component.d.ts +0 -15
  70. package/ngx-dynamic-form/services/dynamic-form-layout.service.d.ts +0 -7
  71. package/ngx-dynamic-form/utils/creators.d.ts +0 -18
  72. package/ngx-dynamic-form/utils/dynamic-editor.model.d.ts +0 -11
  73. package/ngx-dynamic-form/utils/dynamic-form-array.model.d.ts +0 -69
  74. package/ngx-dynamic-form/utils/dynamic-form-group.model.d.ts +0 -14
  75. package/ngx-dynamic-form/utils/dynamic-select.model.d.ts +0 -39
  76. package/ngx-dynamic-form/utils/form-select-subject.d.ts +0 -6
  77. package/ngx-dynamic-form/utils/form-subject.d.ts +0 -10
  78. package/ngx-dynamic-form/utils/validators.d.ts +0 -8
  79. package/ngx-dynamic-form.imports.d.ts +0 -12
  80. package/ngx-dynamic-form.module.d.ts +0 -21
  81. package/services/dynamic-form.service.d.ts +0 -61
  82. package/src/ngx-dynamic-form/nebular/imports.d.ts +0 -4
  83. package/src/ngx-dynamic-form/nebular/index.d.ts +0 -5
  84. package/src/ngx-dynamic-form/nebular/ngx-dynamic-form.nebular.module.d.ts +0 -9
  85. package/src/ngx-dynamic-form/nebular/public_api.d.ts +0 -1
  86. package/stemy-ngx-dynamic-form.d.ts +0 -5
  87. package/ui-nebular/public_api.d.ts +0 -1
  88. package/utils/creators.d.ts +0 -18
  89. package/utils/customizer.d.ts +0 -14
  90. package/utils/dynamic-editor.model.d.ts +0 -11
  91. package/utils/dynamic-form-array.model.d.ts +0 -69
  92. package/utils/dynamic-form-group.model.d.ts +0 -14
  93. package/utils/dynamic-select.model.d.ts +0 -39
  94. package/utils/form-select-subject.d.ts +0 -6
  95. package/utils/form-subject.d.ts +0 -10
  96. package/utils/misc.d.ts +0 -11
  97. package/utils/validation-errors.d.ts +0 -11
  98. package/utils/validators.d.ts +0 -8
@@ -1,615 +0,0 @@
1
- import { Inject, Injectable, Injector } from "@angular/core";
2
- import { FormArray, FormGroup } from "@angular/forms";
3
- import { firstValueFrom, Subject } from "rxjs";
4
- import { DynamicCheckboxModel, DynamicDatePickerModel, DynamicFileUploadModel, DynamicFormService as Base, DynamicFormValueControlModel, DynamicInputModel, DynamicTextAreaModel } from "@ng-dynamic-forms/core";
5
- import { ObjectUtils, OpenApiService, StringUtils } from "@stemy/ngx-utils";
6
- import { EDITOR_FORMATS, findRefs, isStringWithVal, MAX_INPUT_NUM, mergeFormModels, MIN_INPUT_NUM } from "../utils/misc";
7
- import { FormSelectSubject } from "../utils/form-select-subject";
8
- import { FormSubject } from "../utils/form-subject";
9
- import { DynamicEditorModel } from "../utils/dynamic-editor.model";
10
- import { DynamicFormArrayGroupModel, DynamicFormArrayModel } from "../utils/dynamic-form-array.model";
11
- import { DynamicFormGroupModel } from "../utils/dynamic-form-group.model";
12
- import { DynamicSelectModel } from "../utils/dynamic-select.model";
13
- import { createFormInput } from "../utils/creators";
14
- import { getFormValidationErrors } from "../utils/validation-errors";
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "@ng-dynamic-forms/core";
17
- import * as i2 from "@stemy/ngx-utils";
18
- export class DynamicFormService extends Base {
19
- constructor(cs, vs, openApi, injector) {
20
- super(cs, vs);
21
- this.openApi = openApi;
22
- this.injector = injector;
23
- }
24
- get api() {
25
- return this.openApi.api;
26
- }
27
- get language() {
28
- return this.api.language;
29
- }
30
- patchGroup(value, formModel, formGroup) {
31
- value = ObjectUtils.copy(value);
32
- this.patchValueRecursive(value, formModel, formGroup);
33
- formGroup.patchValue(value);
34
- this.detectChanges();
35
- }
36
- patchForm(value, component) {
37
- value = ObjectUtils.copy(value);
38
- this.patchValueRecursive(value, component.model, component.group);
39
- component.group.patchValue(value);
40
- this.detectChanges(component);
41
- }
42
- serialize(formModel, formGroup) {
43
- return this.serializeRecursive(formModel, formGroup);
44
- }
45
- notifyChanges(formModel, formGroup) {
46
- this.notifyChangesRecursive(formModel, formGroup, formModel);
47
- }
48
- showErrors(form) {
49
- this.showErrorsForGroup(form.group);
50
- this.detectChanges(form);
51
- }
52
- getErrors(form) {
53
- this.showErrors(form);
54
- return new Promise(resolve => {
55
- setTimeout(() => {
56
- resolve(getFormValidationErrors(form.group.controls, ""));
57
- }, 500);
58
- });
59
- }
60
- patchValueRecursive(value, formModel, formGroup) {
61
- if (!value)
62
- return;
63
- formModel?.forEach(subModel => {
64
- const key = subModel.id;
65
- const subValue = value[key];
66
- const subControl = this.findControlByModel(subModel, formGroup);
67
- if (subModel instanceof DynamicSelectModel && ObjectUtils.isObject(subValue)) {
68
- value[key] = subValue.id || subValue._id || subValue;
69
- return;
70
- }
71
- if (subModel instanceof DynamicDatePickerModel) {
72
- value[key] = this.convertToDate(subValue);
73
- return;
74
- }
75
- if (subModel instanceof DynamicFormArrayModel) {
76
- const length = Array.isArray(subValue) ? subValue.length : 0;
77
- const subArray = subControl;
78
- while (subModel.size > length) {
79
- this.removeFormArrayGroup(0, subArray, subModel);
80
- }
81
- while (subModel.size < length) {
82
- this.insertFormArrayGroup(subModel.size, subArray, subModel);
83
- }
84
- for (let i = 0; i < length; i++) {
85
- const itemModel = subModel.get(i);
86
- this.patchValueRecursive(subValue[i], itemModel.group, subArray.at(i));
87
- }
88
- return;
89
- }
90
- if (subModel instanceof DynamicFormGroupModel) {
91
- this.patchValueRecursive(subValue, subModel.group, subControl);
92
- }
93
- });
94
- }
95
- async serializeRecursive(formModel, formGroup) {
96
- const result = {};
97
- if (!formModel || !formGroup || !formGroup.value)
98
- return result;
99
- for (const i in formModel) {
100
- const subModel = formModel[i];
101
- const subControl = this.findControlByModel(subModel, formGroup);
102
- const serializer = subModel.additional?.serializer;
103
- if (ObjectUtils.isFunction(serializer)) {
104
- result[subModel.id] = await serializer(subModel, subControl);
105
- continue;
106
- }
107
- if (subModel.hidden && !subModel.additional?.serialize)
108
- continue;
109
- if (subModel instanceof DynamicFormArrayModel) {
110
- const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
111
- const subArray = subControl;
112
- const resArray = [];
113
- for (let i = 0; i < length; i++) {
114
- const itemModel = subModel.get(i);
115
- resArray.push(await this.serializeRecursive(itemModel.group, subArray.at(i)));
116
- }
117
- result[subModel.id] = resArray;
118
- continue;
119
- }
120
- if (subModel instanceof DynamicInputModel && !ObjectUtils.isNullOrUndefined(subControl.value)) {
121
- result[subModel.id] = subModel.inputType == "number"
122
- ? parseFloat((`${subControl.value}` || "0").replace(/,/gi, ".")) ?? null
123
- : subControl.value;
124
- continue;
125
- }
126
- if (subModel instanceof DynamicFormGroupModel) {
127
- result[subModel.id] = await this.serializeRecursive(subModel.group, subControl);
128
- continue;
129
- }
130
- result[subModel.id] = subControl.value;
131
- }
132
- return result;
133
- }
134
- notifyChangesRecursive(formModel, formGroup, root) {
135
- if (!formModel || !formGroup)
136
- return;
137
- for (const i in formModel) {
138
- const subModel = formModel[i];
139
- const subControl = this.findControlByModel(subModel, formGroup);
140
- if (subModel instanceof DynamicFormArrayModel) {
141
- const length = Array.isArray(subControl.value) ? subControl.value.length : 0;
142
- const subArray = subControl;
143
- for (let i = 0; i < length; i++) {
144
- const itemModel = subModel.get(i);
145
- this.notifyChangesRecursive(itemModel.group, subArray.at(i), root);
146
- }
147
- continue;
148
- }
149
- if (subModel instanceof DynamicFormGroupModel) {
150
- this.notifyChangesRecursive(subModel.group, subControl, root);
151
- continue;
152
- }
153
- this.updateSelectOptions(subModel, subControl, root);
154
- }
155
- }
156
- updateSelectOptions(formControlModel, formControl, root) {
157
- if (formControlModel instanceof DynamicSelectModel) {
158
- let options = formControlModel.options$;
159
- if (options instanceof FormSubject) {
160
- options.notify(formControlModel, formControl, root);
161
- return;
162
- }
163
- while (options instanceof Subject && options.source) {
164
- options = options.source;
165
- if (options instanceof FormSubject) {
166
- options.notify(formControlModel, formControl, root);
167
- }
168
- }
169
- }
170
- }
171
- showErrorsForGroup(formGroup) {
172
- if (!formGroup)
173
- return;
174
- formGroup.markAsTouched({ onlySelf: true });
175
- const controls = Object.keys(formGroup.controls).map(id => formGroup.controls[id]);
176
- this.showErrorsForControls(controls);
177
- }
178
- showErrorsForControls(controls) {
179
- controls.forEach(control => {
180
- if (control instanceof FormGroup) {
181
- this.showErrorsForGroup(control);
182
- return;
183
- }
184
- control.markAsTouched({ onlySelf: true });
185
- if (control instanceof FormArray) {
186
- this.showErrorsForControls(control.controls);
187
- }
188
- });
189
- }
190
- convertToDate(value) {
191
- if (ObjectUtils.isNullOrUndefined(value))
192
- return null;
193
- const date = ObjectUtils.isDate(value)
194
- ? value
195
- : new Date(value);
196
- return isNaN(date) ? new Date() : date;
197
- }
198
- async getFormModelForSchema(name, customizeModel) {
199
- return (await this.getFormGroupModelForSchema(name, customizeModel)).group;
200
- }
201
- async getFormGroupModelForSchema(name, customizeModel) {
202
- this.api.cache = {};
203
- this.schemas = await this.openApi.getSchemas();
204
- const fieldSets = [];
205
- const customizeModels = async (property, schema, modelType, config) => {
206
- const model = new modelType(config);
207
- if (model instanceof DynamicFormValueControlModel) {
208
- model.value = (model instanceof DynamicDatePickerModel)
209
- ? this.convertToDate(property.default) : property.default;
210
- }
211
- if (!ObjectUtils.isFunction(customizeModel))
212
- return [model];
213
- let res = customizeModel(property, schema, model, config, this.injector);
214
- if (!res)
215
- return [model];
216
- if (res instanceof Promise) {
217
- res = await res;
218
- }
219
- return Array.isArray(res) ? res : [res];
220
- };
221
- const schema = this.schemas[name];
222
- const controls = await this.getFormModelForSchemaDef(schema, fieldSets, customizeModels);
223
- const idFields = [
224
- createFormInput("id", { hidden: true }),
225
- createFormInput("_id", { hidden: true })
226
- ].filter(t => !controls.some(c => c.id == t.id));
227
- const config = {
228
- id: "root",
229
- group: [
230
- // -- Hidden id fields --
231
- ...idFields,
232
- // -- Main form controls --
233
- ...controls
234
- ],
235
- fieldSets
236
- };
237
- const root = await customizeModels({
238
- id: "root",
239
- type: "object",
240
- properties: schema.properties
241
- }, schema, DynamicFormGroupModel, config);
242
- // Check if the customized root wrapper returned an array
243
- if (Array.isArray(root)) {
244
- controls.length = 0;
245
- for (const model of root) {
246
- if (model instanceof DynamicFormGroupModel && model.id === "root") {
247
- return model;
248
- }
249
- else {
250
- controls.push(model);
251
- }
252
- }
253
- }
254
- return new DynamicFormGroupModel({
255
- ...config,
256
- group: controls
257
- });
258
- }
259
- async getFormModelForSchemaDef(schema, fieldSets, customizeModels) {
260
- if (!schema)
261
- return [];
262
- const keys = Object.keys(schema.properties || {});
263
- const controls = [];
264
- for (const p of keys) {
265
- const property = schema.properties[p];
266
- const fsName = property.hidden ? null : String(property.fieldSet || "");
267
- if (fsName) {
268
- const fs = fieldSets.find(t => t.id === fsName);
269
- if (fs) {
270
- fs.fields.push(p);
271
- }
272
- else {
273
- fieldSets.push({ id: fsName, legend: `legend.${fsName}`, fields: [p] });
274
- }
275
- }
276
- const models = await this.getFormControlModels(property, schema, customizeModels);
277
- controls.push(...models);
278
- }
279
- return controls.filter(t => null !== t);
280
- }
281
- checkIsEditorProperty(property) {
282
- if (!property.format)
283
- return false;
284
- return EDITOR_FORMATS.indexOf(property.format) >= 0 || property.format.endsWith("script");
285
- }
286
- async getFormControlModels(property, schema, customizeModels) {
287
- const $enum = property.items?.enum || property.enum;
288
- if (Array.isArray($enum) || isStringWithVal(property.optionsPath) || isStringWithVal(property.endpoint)) {
289
- return customizeModels(property, schema, DynamicSelectModel, this.getFormSelectConfig(property, schema));
290
- }
291
- switch (property.type) {
292
- case "string":
293
- case "number":
294
- case "integer":
295
- case "textarea":
296
- if (this.checkIsEditorProperty(property)) {
297
- return customizeModels(property, schema, DynamicEditorModel, this.getFormEditorConfig(property, schema));
298
- }
299
- if (property.format == "textarea") {
300
- return customizeModels(property, schema, DynamicTextAreaModel, this.getFormTextareaConfig(property, schema));
301
- }
302
- if (property.format == "date") {
303
- return customizeModels(property, schema, DynamicDatePickerModel, this.getFormDatepickerConfig(property, schema));
304
- }
305
- return customizeModels(property, schema, DynamicInputModel, this.getFormInputConfig(property, schema));
306
- case "object":
307
- return customizeModels(property, schema, DynamicEditorModel, this.getFormEditorConfig(property, schema));
308
- case "boolean":
309
- return customizeModels(property, schema, DynamicCheckboxModel, this.getFormCheckboxConfig(property, schema));
310
- case "array":
311
- if (findRefs(property).length > 0) {
312
- return customizeModels(property, schema, DynamicFormArrayModel, await this.getFormArrayConfig(property, schema, customizeModels));
313
- }
314
- else {
315
- return customizeModels(property, schema, DynamicInputModel, this.getFormInputConfig(property, schema));
316
- }
317
- case "file":
318
- return customizeModels(property, schema, DynamicFileUploadModel, this.getFormUploadConfig(property, schema));
319
- }
320
- if (findRefs(property).length > 0) {
321
- return customizeModels(property, schema, DynamicFormGroupModel, await this.getFormGroupConfig(property, schema, customizeModels));
322
- }
323
- return [];
324
- }
325
- findModelByPath(parent, path) {
326
- if (path.length == 0)
327
- return parent;
328
- const next = path.shift();
329
- if (Array.isArray(parent)) {
330
- return this.findModelByPath(parent.find(t => t.id == next), path);
331
- }
332
- if (parent instanceof DynamicFormGroupModel || parent instanceof DynamicFormArrayGroupModel) {
333
- return this.findModelByPath(parent.group.find(t => t.id == next), path);
334
- }
335
- if (parent instanceof DynamicFormArrayModel) {
336
- return this.findModelByPath(parent.groups.find(t => t.index == next), path);
337
- }
338
- return parent;
339
- }
340
- getFormControlConfig(property, schema) {
341
- const validators = this.getValidators(property, schema);
342
- const errorMessages = Object.keys(validators).reduce((res, key) => {
343
- res[key] = `error.${key}`;
344
- return res;
345
- }, {});
346
- return {
347
- id: property.id,
348
- label: ObjectUtils.isString(property.label) ? property.label : property.id,
349
- hidden: property.hidden,
350
- disabled: property.disabled,
351
- validators,
352
- errorMessages,
353
- additional: Object.assign({}, property)
354
- };
355
- }
356
- async getFormArrayConfig(property, schema, customizeModels) {
357
- const fieldSets = [];
358
- const subSchemas = findRefs(property).map(ref => this.schemas[ref]);
359
- const subModels = await Promise.all(subSchemas.map(s => this.getFormModelForSchemaDef(s, fieldSets, customizeModels)));
360
- return Object.assign(this.getFormControlConfig(property, schema), {
361
- groupFactory: () => mergeFormModels(ObjectUtils.copy(subModels)),
362
- initialCount: property.initialCount || 0,
363
- sortable: property.sortable || false,
364
- useTabs: property.useTabs || false,
365
- addItem: property.addItem !== false,
366
- insertItem: property.insertItem !== false,
367
- cloneItem: property.cloneItem !== false,
368
- moveItem: property.moveItem !== false,
369
- removeItem: property.removeItem !== false,
370
- clearItems: property.clearItems !== false
371
- });
372
- }
373
- async getFormGroupConfig(property, schema, customizeModels) {
374
- const fieldSets = [];
375
- const subSchemas = findRefs(property).map(ref => this.schemas[ref]);
376
- const subModels = await Promise.all(subSchemas.map(s => this.getFormModelForSchemaDef(s, fieldSets, customizeModels)));
377
- return Object.assign(this.getFormControlConfig(property, schema), {
378
- fieldSets,
379
- group: mergeFormModels(subModels)
380
- });
381
- }
382
- getFormInputConfig(property, schema) {
383
- let inputType = StringUtils.has(property.id, "password", "Password") ? "password" : (property.format || property.items?.type || property.type);
384
- switch (inputType) {
385
- case "string":
386
- inputType = "text";
387
- break;
388
- case "boolean":
389
- inputType = "checkbox";
390
- break;
391
- case "textarea":
392
- inputType = "textarea";
393
- break;
394
- case "integer":
395
- inputType = "number";
396
- break;
397
- }
398
- const sub = property.type == "array" ? property.items || property : property;
399
- return Object.assign(this.getFormControlConfig(property, schema), {
400
- inputType,
401
- autoComplete: property.autoComplete || "off",
402
- multiple: property.type == "array",
403
- accept: ObjectUtils.isString(property.accept) ? property.accept : null,
404
- mask: ObjectUtils.isString(property.mask) ? property.mask : null,
405
- pattern: ObjectUtils.isString(property.pattern) ? property.pattern : null,
406
- step: isNaN(sub.step) ? (isNaN(property.step) ? 1 : property.step) : sub.step,
407
- min: isNaN(sub.minimum) ? MIN_INPUT_NUM : sub.minimum,
408
- max: isNaN(sub.maximum) ? MAX_INPUT_NUM : sub.maximum,
409
- minLength: isNaN(sub.minLength) ? 0 : sub.minLength,
410
- maxLength: isNaN(sub.maxLength) ? MAX_INPUT_NUM : sub.maxLength,
411
- placeholder: property.placeholder || ""
412
- });
413
- }
414
- getFormEditorConfig(property, schema) {
415
- const sub = property.type == "array" ? property.items || property : property;
416
- return Object.assign(this.getFormControlConfig(property, schema), {
417
- inputType: property.format || "json",
418
- convertObject: property.type !== "string",
419
- autoComplete: property.autoComplete || "off",
420
- multiple: property.type == "array",
421
- accept: ObjectUtils.isString(property.accept) ? property.accept : null,
422
- mask: ObjectUtils.isString(property.mask) ? property.mask : null,
423
- pattern: ObjectUtils.isString(property.pattern) ? property.pattern : null,
424
- step: isNaN(sub.step) ? (isNaN(property.step) ? 1 : property.step) : sub.step,
425
- minLength: isNaN(sub.minLength) ? 0 : sub.minLength,
426
- maxLength: isNaN(sub.maxLength) ? MAX_INPUT_NUM : sub.maxLength,
427
- placeholder: property.placeholder || ""
428
- });
429
- }
430
- getFormTextareaConfig(property, schema) {
431
- return Object.assign(this.getFormControlConfig(property, schema), {
432
- cols: property.cols || null,
433
- rows: property.rows || 10,
434
- wrap: property.wrap || false,
435
- autoComplete: property.autoComplete || "off",
436
- multiple: property.type == "array",
437
- minLength: isNaN(property.minLength) ? 0 : property.minLength,
438
- maxLength: isNaN(property.maxLength) ? MAX_INPUT_NUM : property.maxLength,
439
- placeholder: property.placeholder || ""
440
- });
441
- }
442
- getFormDatepickerConfig(property, schema) {
443
- return Object.assign(this.getFormControlConfig(property, schema), {
444
- format: property.dateFormat || "dd.MM.yyyy",
445
- min: this.convertToDate(property.min),
446
- max: this.convertToDate(property.max),
447
- });
448
- }
449
- getFormSelectOptions(property, schema) {
450
- const $enum = property.items?.enum || property.enum;
451
- if (Array.isArray($enum)) {
452
- return new FormSelectSubject((selectModel, formControl) => {
453
- const options = $enum.map(value => {
454
- const label = property.translatable ? `${property.id}.${value}` : `${value}`;
455
- return { value, label };
456
- });
457
- return this.fixSelectOptions(selectModel, formControl, options);
458
- });
459
- }
460
- if (isStringWithVal(property.optionsPath)) {
461
- return new FormSelectSubject(async (selectModel, control, root, indexes) => {
462
- let path = property.optionsPath;
463
- let target = control;
464
- let model = selectModel;
465
- if (path.startsWith("$root")) {
466
- path = path.substring(5);
467
- while (target.parent) {
468
- target = target.parent;
469
- }
470
- model = root;
471
- }
472
- while (path.startsWith(".")) {
473
- path = path.substring(1);
474
- if (target.parent) {
475
- target = target.parent;
476
- }
477
- model = model.parent || root;
478
- }
479
- Object.keys(indexes).forEach(key => {
480
- path = path.replace(key, indexes[key]);
481
- });
482
- model = this.findModelByPath(model, path.split("."));
483
- const modelOptions = model instanceof DynamicSelectModel
484
- ? await firstValueFrom(model.options$) :
485
- [];
486
- const value = ObjectUtils.getValue(target.value, path);
487
- const options = (!ObjectUtils.isArray(value) ? [] : value).map(value => {
488
- const modelOption = modelOptions.find(t => t.value == value);
489
- return { value, label: modelOption?.label || value };
490
- });
491
- return this.fixSelectOptions(selectModel, control, options);
492
- });
493
- }
494
- return new FormSelectSubject(async (selectModel, control) => {
495
- const entries = Object.entries(control.root?.value || {});
496
- const endpoint = entries.reduce((res, [key, value]) => {
497
- return res.replace(new RegExp(`$${key}`, "gi"), `${value}`);
498
- }, `${property.endpoint}`);
499
- this.api.cache[endpoint] = this.api.cache[endpoint] || this.api.list(endpoint, this.api.makeListParams(1, -1)).then(result => {
500
- const items = ObjectUtils.isArray(result)
501
- ? result
502
- : (ObjectUtils.isArray(result.items) ? result.items : []);
503
- return items.map(i => {
504
- const item = ObjectUtils.isObject(i) ? i : { id: i };
505
- return {
506
- ...item,
507
- value: item.id || item._id,
508
- label: item[property.labelField] || item.label || item.id || item._id
509
- };
510
- });
511
- });
512
- const options = (await this.api.cache[endpoint]).map(t => Object.assign({}, t));
513
- return this.fixSelectOptions(selectModel, control, options);
514
- });
515
- }
516
- getFormSelectConfig(property, schema) {
517
- return Object.assign(this.getFormControlConfig(property, schema), {
518
- options: this.getFormSelectOptions(property, schema),
519
- multiple: property.type == "array",
520
- groupBy: property.groupBy,
521
- inline: property.inline,
522
- allowEmpty: property.allowEmpty,
523
- });
524
- }
525
- getFormUploadConfig(property, schema) {
526
- const url = this.api.url(property.url || "assets");
527
- const { accept, autoUpload, maxSize, minSize, removeUrl, showFileList } = property;
528
- return Object.assign(this.getFormControlConfig(property, schema), {
529
- url,
530
- accept,
531
- autoUpload,
532
- maxSize,
533
- minSize,
534
- removeUrl,
535
- showFileList
536
- });
537
- }
538
- getFormCheckboxConfig(property, schema) {
539
- return Object.assign(this.getFormControlConfig(property, schema), {
540
- indeterminate: property.indeterminate || false
541
- });
542
- }
543
- cloneFormArrayGroup(index, formArray, formArrayModel) {
544
- this.insertFormArrayGroup(index, formArray, formArrayModel);
545
- this.patchGroup(formArray.at(index + 1).value, formArrayModel.groups[index].group, formArray.at(index));
546
- formArrayModel.filterGroups();
547
- }
548
- async fixSelectOptions(model, control, options) {
549
- if (!options)
550
- return [];
551
- for (const option of options) {
552
- option.classes = [option.classes, model.getClasses(option, model, control, this.injector)].filter(isStringWithVal).join(" ");
553
- option.label = await this.language.getTranslation(option.label);
554
- }
555
- return options;
556
- }
557
- getValidators(property, schema) {
558
- const validators = {};
559
- if (ObjectUtils.isArray(schema.required) && schema.required.indexOf(property.id) >= 0) {
560
- validators.required = null;
561
- }
562
- this.addPropertyValidators(validators, property);
563
- this.addItemsValidators(validators, property.items);
564
- return validators;
565
- }
566
- addPropertyValidators(validators, property) {
567
- if (!property)
568
- return;
569
- if (!isNaN(property.minLength)) {
570
- validators.minLength = property.minLength;
571
- }
572
- if (!isNaN(property.maxLength)) {
573
- validators.maxLength = property.maxLength;
574
- }
575
- if (!isNaN(property.minimum)) {
576
- validators.min = property.minimum;
577
- }
578
- if (!isNaN(property.maximum)) {
579
- validators.max = property.maximum;
580
- }
581
- switch (property.format) {
582
- case "email":
583
- validators.email = null;
584
- break;
585
- }
586
- }
587
- addItemsValidators(validators, items) {
588
- if (!items)
589
- return;
590
- if (!isNaN(items.minLength)) {
591
- validators.itemsMinLength = items.minLength;
592
- }
593
- if (!isNaN(items.maxLength)) {
594
- validators.itemsMaxLength = items.maxLength;
595
- }
596
- if (!isNaN(items.minimum)) {
597
- validators.itemsMinValue = items.minimum;
598
- }
599
- if (!isNaN(items.maximum)) {
600
- validators.itemsMaxValue = items.maximum;
601
- }
602
- }
603
- }
604
- DynamicFormService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicFormService, deps: [{ token: i1.DynamicFormComponentService }, { token: i1.DynamicFormValidationService }, { token: OpenApiService }, { token: Injector }], target: i0.ɵɵFactoryTarget.Injectable });
605
- DynamicFormService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicFormService });
606
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicFormService, decorators: [{
607
- type: Injectable
608
- }], ctorParameters: function () { return [{ type: i1.DynamicFormComponentService }, { type: i1.DynamicFormValidationService }, { type: i2.OpenApiService, decorators: [{
609
- type: Inject,
610
- args: [OpenApiService]
611
- }] }, { type: i0.Injector, decorators: [{
612
- type: Inject,
613
- args: [Injector]
614
- }] }]; } });
615
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFrQixTQUFTLEVBQWUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxFQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUNILG9CQUFvQixFQUVwQixzQkFBc0IsRUFFdEIsc0JBQXNCLEVBTXRCLGtCQUFrQixJQUFJLElBQUksRUFFMUIsNEJBQTRCLEVBRTVCLGlCQUFpQixFQUdqQixvQkFBb0IsRUFHdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBTUgsV0FBVyxFQUNYLGNBQWMsRUFDZCxXQUFXLEVBQ2QsTUFBTSxrQkFBa0IsQ0FBQztBQUkxQixPQUFPLEVBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxrQkFBa0IsRUFBMkIsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRixPQUFPLEVBQ0gsMEJBQTBCLEVBQzFCLHFCQUFxQixFQUV4QixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFFSCxxQkFBcUIsRUFFeEIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQTBCLGtCQUFrQixFQUEyQixNQUFNLCtCQUErQixDQUFDO0FBRXBILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQXNCLHVCQUF1QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFHeEYsTUFBTSxPQUFPLGtCQUFtQixTQUFRLElBQUk7SUFZeEMsWUFBWSxFQUErQixFQUMvQixFQUFnQyxFQUNDLE9BQXVCLEVBQzdCLFFBQWtCO1FBQ3JELEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFGMkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDN0IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUV6RCxDQUFDO0lBZkQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUM3QixDQUFDO0lBV0QsVUFBVSxDQUFDLEtBQVUsRUFBRSxTQUEyQixFQUFFLFNBQW9CO1FBQ3BFLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBVSxFQUFFLFNBQW1DO1FBQ3JELEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEUsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsU0FBUyxDQUFDLFNBQTJCLEVBQUUsU0FBb0I7UUFDdkQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxhQUFhLENBQUMsU0FBMkIsRUFBRSxTQUFvQjtRQUMzRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQThCO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQThCO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVTLG1CQUFtQixDQUFDLEtBQVUsRUFBRSxTQUEyQixFQUFFLFNBQW9CO1FBQ3ZGLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUNuQixTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDaEUsSUFBSSxRQUFRLFlBQVksa0JBQWtCLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDMUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUM7Z0JBQ3JELE9BQU87YUFDVjtZQUNELElBQUksUUFBUSxZQUFZLHNCQUFzQixFQUFFO2dCQUM1QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUMsT0FBTzthQUNWO1lBQ0QsSUFBSSxRQUFRLFlBQVkscUJBQXFCLEVBQUU7Z0JBQzNDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxRQUFRLEdBQUcsVUFBdUIsQ0FBQztnQkFDekMsT0FBTyxRQUFRLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRTtvQkFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ3BEO2dCQUNELE9BQU8sUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFpQyxDQUFDLENBQUM7aUJBQ3pGO2dCQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzdCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBYyxDQUFDLENBQUM7aUJBQ3ZGO2dCQUNELE9BQU87YUFDVjtZQUNELElBQUksUUFBUSxZQUFZLHFCQUFxQixFQUFFO2dCQUMzQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBdUIsQ0FBQyxDQUFDO2FBQy9FO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQTJCLEVBQUUsU0FBb0I7UUFDaEYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSztZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ2hFLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQXNDLENBQUM7WUFDbkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNoRSxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLFVBQW1DLENBQUM7WUFDNUUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDN0QsU0FBUzthQUNaO1lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxTQUFTO2dCQUFFLFNBQVM7WUFDakUsSUFBSSxRQUFRLFlBQVkscUJBQXFCLEVBQUU7Z0JBQzNDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxNQUFNLFFBQVEsR0FBRyxVQUF1QixDQUFDO2dCQUN6QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzdCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQ1QsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBYyxDQUFDLENBQzlFLENBQUM7aUJBQ0w7Z0JBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUM7Z0JBQy9CLFNBQVM7YUFDWjtZQUNELElBQUksUUFBUSxZQUFZLGlCQUFpQixJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDM0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxJQUFJLFFBQVE7b0JBQ2hELENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSTtvQkFDeEUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLFNBQVM7YUFDWjtZQUNELElBQUksUUFBUSxZQUFZLHFCQUFxQixFQUFFO2dCQUMzQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBdUIsQ0FBQyxDQUFDO2dCQUM3RixTQUFTO2FBQ1o7WUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7U0FDMUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRVMsc0JBQXNCLENBQUMsU0FBMkIsRUFBRSxTQUFvQixFQUFFLElBQXNCO1FBQ3RHLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUNyQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsRUFBRTtZQUN2QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFzQyxDQUFDO1lBQ25FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDaEUsSUFBSSxRQUFRLFlBQVkscUJBQXFCLEVBQUU7Z0JBQzNDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxNQUFNLFFBQVEsR0FBRyxVQUF1QixDQUFDO2dCQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUM3QixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNuRjtnQkFDRCxTQUFTO2FBQ1o7WUFDRCxJQUFJLFFBQVEsWUFBWSxxQkFBcUIsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0UsU0FBUzthQUNaO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxVQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0wsQ0FBQztJQUVTLG1CQUFtQixDQUFDLGdCQUF5QyxFQUFFLFdBQXdCLEVBQUUsSUFBc0I7UUFDckgsSUFBSSxnQkFBZ0IsWUFBWSxrQkFBa0IsRUFBRTtZQUNoRCxJQUFJLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7WUFDeEMsSUFBSSxPQUFPLFlBQVksV0FBVyxFQUFFO2dCQUNoQyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDcEQsT0FBTzthQUNWO1lBQ0QsT0FBTyxPQUFPLFlBQVksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN6QixJQUFJLE9BQU8sWUFBWSxXQUFXLEVBQUU7b0JBQ2hDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUN2RDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRVMsa0JBQWtCLENBQUMsU0FBb0I7UUFDN0MsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQ3ZCLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxRQUEyQjtRQUN2RCxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLElBQUksT0FBTyxZQUFZLFNBQVMsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqQyxPQUFPO2FBQ1Y7WUFDRCxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxPQUFPLFlBQVksU0FBUyxFQUFFO2dCQUM5QixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hEO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsYUFBYSxDQUFDLEtBQVU7UUFDOUIsSUFBSSxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDbEMsQ0FBQyxDQUFDLEtBQUs7WUFDUCxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsT0FBTyxLQUFLLENBQUMsSUFBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQVksRUFBRSxjQUFvQztRQUMxRSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9FLENBQUM7SUFFRCxLQUFLLENBQUMsMEJBQTBCLENBQUMsSUFBWSxFQUFFLGNBQW9DO1FBQy9FLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBa0MsRUFBRSxDQUFDO1FBQ3BELE1BQU0sZUFBZSxHQUE0QixLQUFLLEVBQ2xELFFBQWdDLEVBQUUsTUFBc0IsRUFDeEQsU0FBb0IsRUFBRSxNQUFxQyxFQUFFLEVBQUU7WUFDL0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEMsSUFBSSxLQUFLLFlBQVksNEJBQTRCLEVBQUU7Z0JBQy9DLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLFlBQVksc0JBQXNCLENBQUM7b0JBQ25ELENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQzthQUNqRTtZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUQsSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLElBQUksR0FBRyxZQUFZLE9BQU8sRUFBRTtnQkFDeEIsR0FBRyxHQUFHLE1BQU0sR0FBRyxDQUFDO2FBQ25CO1lBQ0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sUUFBUSxHQUFHO1lBQ2IsZUFBZSxDQUFDLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsQ0FBQztZQUNyQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDO1NBQ3pDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxNQUFNLE1BQU0sR0FBRztZQUNYLEVBQUUsRUFBRSxNQUFNO1lBQ1YsS0FBSyxFQUFFO2dCQUNILHlCQUF5QjtnQkFDekIsR0FBRyxRQUFRO2dCQUNYLDJCQUEyQjtnQkFDM0IsR0FBRyxRQUFRO2FBQ2Q7WUFDRCxTQUFTO1NBQ21CLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxlQUFlLENBQUM7WUFDL0IsRUFBRSxFQUFFLE1BQU07WUFDVixJQUFJLEVBQUUsUUFBUTtZQUNkLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtTQUNoQyxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQyx5REFBeUQ7UUFDekQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUN0QixJQUFJLEtBQUssWUFBWSxxQkFBcUIsSUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLE1BQU0sRUFBRTtvQkFDL0QsT0FBTyxLQUFLLENBQUM7aUJBQ2hCO3FCQUFNO29CQUNILFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3hCO2FBQ0o7U0FDSjtRQUNELE9BQU8sSUFBSSxxQkFBcUIsQ0FBQztZQUM3QixHQUFHLE1BQU07WUFDVCxLQUFLLEVBQUUsUUFBUTtTQUNsQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE1BQXNCLEVBQUUsU0FBd0MsRUFBRSxlQUF3QztRQUMvSSxJQUFJLENBQUMsTUFBTTtZQUNQLE9BQU8sRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sUUFBUSxHQUFxQixFQUFFLENBQUM7UUFDdEMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLElBQUksTUFBTSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLEVBQUUsRUFBRTtvQkFDSixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDckI7cUJBQU07b0JBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO2lCQUN6RTthQUNKO1lBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNsRixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDNUI7UUFDRCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVTLHFCQUFxQixDQUFDLFFBQWdDO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ25DLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFUyxLQUFLLENBQUMsb0JBQW9CLENBQUMsUUFBZ0MsRUFBRSxNQUFzQixFQUFFLGVBQXdDO1FBQ25JLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDcEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNyRyxPQUFPLGVBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUM1RztRQUNELFFBQVEsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNuQixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFVBQVU7Z0JBQ1gsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ3RDLE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2lCQUM1RztnQkFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksVUFBVSxFQUFFO29CQUMvQixPQUFPLGVBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDaEg7Z0JBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLE1BQU0sRUFBRTtvQkFDM0IsT0FBTyxlQUFlLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQ3BIO2dCQUNELE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzNHLEtBQUssUUFBUTtnQkFDVCxPQUFPLGVBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM3RyxLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxlQUFlLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDakgsS0FBSyxPQUFPO2dCQUNSLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQy9CLE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO2lCQUNySTtxQkFBTTtvQkFDSCxPQUFPLGVBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDMUc7WUFDTCxLQUFLLE1BQU07Z0JBQ1AsT0FBTyxlQUFlLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDcEg7UUFDRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sZUFBZSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1NBQ3JJO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsZUFBZSxDQUFDLE1BQTBDLEVBQUUsSUFBYztRQUN0RSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztZQUFFLE9BQU8sTUFBeUIsQ0FBQztRQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFTLENBQUM7UUFDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyRTtRQUNELElBQUksTUFBTSxZQUFZLHFCQUFxQixJQUFJLE1BQU0sWUFBWSwwQkFBMEIsRUFBRTtZQUN6RixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsSUFBSSxNQUFNLFlBQVkscUJBQXFCLEVBQUU7WUFDekMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMvRTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxRQUFnQyxFQUFFLE1BQXNCO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzlELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQzFCLE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1AsT0FBTztZQUNILEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNmLEtBQUssRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtZQUMzQixVQUFVO1lBQ1YsYUFBYTtZQUNiLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUM7U0FDMUMsQ0FBQztJQUNOLENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBZ0MsRUFBRSxNQUFzQixFQUFFLGVBQXdDO1FBQ3ZILE1BQU0sU0FBUyxHQUFrQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQy9CLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUNwRixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUMzQztZQUNJLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksSUFBSSxDQUFDO1lBQ3hDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxJQUFJLEtBQUs7WUFDcEMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksS0FBSztZQUNsQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sS0FBSyxLQUFLO1lBQ25DLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxLQUFLLEtBQUs7WUFDekMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEtBQUssS0FBSztZQUN2QyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsS0FBSyxLQUFLO1lBQ3JDLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxLQUFLLEtBQUs7WUFDekMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEtBQUssS0FBSztTQUM1QyxDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQWdDLEVBQUUsTUFBc0IsRUFBRSxlQUF3QztRQUN2SCxNQUFNLFNBQVMsR0FBa0MsRUFBRSxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FDcEYsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFDM0M7WUFDSSxTQUFTO1lBQ1QsS0FBSyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUM7U0FDcEMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELGtCQUFrQixDQUFDLFFBQWdDLEVBQUUsTUFBc0I7UUFDdkUsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9JLFFBQVEsU0FBUyxFQUFFO1lBQ2YsS0FBSyxRQUFRO2dCQUNULFNBQVMsR0FBRyxNQUFNLENBQUM7Z0JBQ25CLE1BQU07WUFDVixLQUFLLFNBQVM7Z0JBQ1YsU0FBUyxHQUFHLFVBQVUsQ0FBQztnQkFDdkIsTUFBTTtZQUNWLEtBQUssVUFBVTtnQkFDWCxTQUFTLEdBQUcsVUFBVSxDQUFDO2dCQUN2QixNQUFNO1lBQ1YsS0FBSyxTQUFTO2dCQUNWLFNBQVMsR0FBRyxRQUFRLENBQUM7Z0JBQ3JCLE1BQU07U0FDYjtRQUNELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzdFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFDM0M7WUFDSSxTQUFTO1lBQ1QsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLElBQUksS0FBSztZQUM1QyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPO1lBQ2xDLE1BQU0sRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN0RSxJQUFJLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDaEUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pFLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUM3RSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTztZQUNyRCxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTztZQUNyRCxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUztZQUNuRCxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUztZQUMvRCxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFO1NBQzFDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUFnQyxFQUFFLE1BQXNCO1FBQ3hFLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzdFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFDM0M7WUFDSSxTQUFTLEVBQUUsUUFBUSxDQUFDLE1BQU0sSUFBSSxNQUFNO1lBQ3BDLGFBQWEsRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVE7WUFDekMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLElBQUksS0FBSztZQUM1QyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPO1lBQ2xDLE1BQU0sRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN0RSxJQUFJLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDaEUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pFLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUM3RSxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUztZQUNuRCxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUztZQUMvRCxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFO1NBQzFDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFnQyxFQUFFLE1BQXNCO1FBQzFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFDM0M7WUFDSSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJO1lBQzNCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksS0FBSztZQUM1QixZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVksSUFBSSxLQUFLO1lBQzVDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLE9BQU87WUFDbEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVM7WUFDN0QsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVM7WUFDekUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRTtTQUMxQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsdUJBQXVCLENBQUMsUUFBZ0MsRUFBRSxNQUFzQjtRQUM1RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQ2hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQzNDO1lBQ0ksTUFBTSxFQUFFLFFBQVEsQ0FBQyxVQUFVLElBQUksWUFBWTtZQUMzQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3JDLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7U0FDeEMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELG9CQUFvQixDQUFDLFFBQWdDLEVBQUUsTUFBc0I7UUFDekUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUNwRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFO2dCQUN0RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUM5QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7b0JBQzdFLE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUM7Z0JBQzFCLENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN2QyxPQUFPLElBQUksaUJBQWlCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUN2RSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsV0FBcUIsQ0FBQztnQkFDMUMsSUFBSSxNQUFNLEdBQUcsT0FBMEIsQ0FBQztnQkFDeEMsSUFBSSxLQUFLLEdBQXVDLFdBQVcsQ0FBQztnQkFDNUQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekIsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFO3dCQUNsQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztxQkFDMUI7b0JBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQztpQkFDaEI7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekIsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO3dCQUNmLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO3FCQUMxQjtvQkFDRCxLQUFLLEdBQUksS0FBeUIsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDO2lCQUNyRDtnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDL0IsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsQ0FBQztnQkFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksa0JBQWtCO29CQUNwRCxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ3hDLEVBQUUsQ0FBQztnQkFDUCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDbkUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUM7b0JBQzdELE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLElBQUksS0FBSyxFQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3hELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUNsRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN6SCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztvQkFDckMsQ0FBQyxDQUFDLE1BQU07b0JBQ1IsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ2pCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFDLENBQUM7b0JBQ25ELE9BQU87d0JBQ0gsR0FBRyxJQUFJO3dCQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHO3dCQUMxQixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUc7cUJBQ3hFLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEYsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxRQUFnQyxFQUFFLE1BQXNCO1FBQ3hFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDaEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFDM0M7WUFDSSxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7WUFDcEQsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksT0FBTztZQUNsQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDekIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtTQUNsQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsbUJBQW1CLENBQUMsUUFBZ0MsRUFBRSxNQUFzQjtRQUN4RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBQyxHQUFHLFFBQVEsQ0FBQztRQUNqRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUM5RCxHQUFHO1lBQ0gsTUFBTTtZQUNOLFVBQVU7WUFDVixPQUFPO1lBQ1AsT0FBTztZQUNQLFNBQVM7WUFDVCxZQUFZO1NBQ2YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHFCQUFxQixDQUFDLFFBQWdDLEVBQUUsTUFBc0I7UUFDMUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUNoQixJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUMzQztZQUNJLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYSxJQUFJLEtBQUs7U0FDakQsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQWEsRUFBRSxTQUFvQixFQUFFLGNBQXFDO1FBQzFGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFjLENBQUMsQ0FBQztRQUNySCxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVTLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUE4QixFQUFFLE9BQW9CLEVBQUUsT0FBdUM7UUFDMUgsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN4QixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUMxQixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0gsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuRTtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFUyxhQUFhLENBQUMsUUFBZ0MsRUFBRSxNQUFzQjtRQUM1RSxNQUFNLFVBQVUsR0FBNEIsRUFBRSxDQUFDO1FBQy9DLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNuRixVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUM5QjtRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVTLHFCQUFxQixDQUFDLFVBQW1DLEVBQUUsUUFBZ0M7UUFDakcsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzVCLFVBQVUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztTQUM3QztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzVCLFVBQVUsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztTQUM3QztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFCLFVBQVUsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztTQUNyQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFCLFVBQVUsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztTQUNyQztRQUNELFFBQVEsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNyQixLQUFLLE9BQU87Z0JBQ1IsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLE1BQU07U0FDYjtJQUNMLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxVQUFtQyxFQUFFLEtBQTZCO1FBQzNGLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN6QixVQUFVLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDL0M7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN6QixVQUFVLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDL0M7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN2QixVQUFVLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDNUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN2QixVQUFVLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDNUM7SUFDTCxDQUFDOzsrR0Fqb0JRLGtCQUFrQix5R0FjUCxjQUFjLGFBQ2QsUUFBUTttSEFmbkIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVU7OzBCQWVNLE1BQU07MkJBQUMsY0FBYzs7MEJBQ3JCLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rvcn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7Zmlyc3RWYWx1ZUZyb20sIFN1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBEeW5hbWljQ2hlY2tib3hNb2RlbCxcclxuICAgIER5bmFtaWNDaGVja2JveE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY0RhdGVQaWNrZXJNb2RlbCxcclxuICAgIER5bmFtaWNEYXRlUGlja2VyTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljRmlsZVVwbG9hZE1vZGVsLFxyXG4gICAgRHluYW1pY0ZpbGVVcGxvYWRNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNGb3JtQ29tcG9uZW50U2VydmljZSxcclxuICAgIER5bmFtaWNGb3JtQ29udHJvbE1vZGVsLFxyXG4gICAgRHluYW1pY0Zvcm1Db250cm9sTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljRm9ybU1vZGVsLFxyXG4gICAgRHluYW1pY0Zvcm1TZXJ2aWNlIGFzIEJhc2UsXHJcbiAgICBEeW5hbWljRm9ybVZhbGlkYXRpb25TZXJ2aWNlLFxyXG4gICAgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbCxcclxuICAgIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWxDb25maWcsXHJcbiAgICBEeW5hbWljSW5wdXRNb2RlbCxcclxuICAgIER5bmFtaWNJbnB1dE1vZGVsQ29uZmlnLFxyXG4gICAgRHluYW1pY1BhdGhhYmxlLFxyXG4gICAgRHluYW1pY1RleHRBcmVhTW9kZWwsXHJcbiAgICBEeW5hbWljVGV4dEFyZWFNb2RlbENvbmZpZyxcclxuICAgIER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnXHJcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICAgIElBcGlTZXJ2aWNlLFxyXG4gICAgSUxhbmd1YWdlU2VydmljZSxcclxuICAgIElPcGVuQXBpU2NoZW1hLFxyXG4gICAgSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSxcclxuICAgIElPcGVuQXBpU2NoZW1hcyxcclxuICAgIE9iamVjdFV0aWxzLFxyXG4gICAgT3BlbkFwaVNlcnZpY2UsXHJcbiAgICBTdHJpbmdVdGlsc1xyXG59IGZyb20gXCJAc3RlbXkvbmd4LXV0aWxzXCI7XHJcblxyXG5pbXBvcnQge0Zvcm1Db250cm9sU2VyaWFsaXplciwgRm9ybU1vZGVsQ3VzdG9taXplciwgRm9ybU1vZGVsQ3VzdG9taXplcldyYXAsIE1vZGVsVHlwZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuaW1wb3J0IHtFRElUT1JfRk9STUFUUywgZmluZFJlZnMsIGlzU3RyaW5nV2l0aFZhbCwgTUFYX0lOUFVUX05VTSwgbWVyZ2VGb3JtTW9kZWxzLCBNSU5fSU5QVVRfTlVNfSBmcm9tIFwiLi4vdXRpbHMvbWlzY1wiO1xyXG5pbXBvcnQge0Zvcm1TZWxlY3RTdWJqZWN0fSBmcm9tIFwiLi4vdXRpbHMvZm9ybS1zZWxlY3Qtc3ViamVjdFwiO1xyXG5pbXBvcnQge0Zvcm1TdWJqZWN0fSBmcm9tIFwiLi4vdXRpbHMvZm9ybS1zdWJqZWN0XCI7XHJcbmltcG9ydCB7RHluYW1pY0VkaXRvck1vZGVsLCBEeW5hbWljRWRpdG9yTW9kZWxDb25maWd9IGZyb20gXCIuLi91dGlscy9keW5hbWljLWVkaXRvci5tb2RlbFwiO1xyXG5pbXBvcnQge1xyXG4gICAgRHluYW1pY0Zvcm1BcnJheUdyb3VwTW9kZWwsXHJcbiAgICBEeW5hbWljRm9ybUFycmF5TW9kZWwsXHJcbiAgICBEeW5hbWljRm9ybUFycmF5TW9kZWxDb25maWdcclxufSBmcm9tIFwiLi4vdXRpbHMvZHluYW1pYy1mb3JtLWFycmF5Lm1vZGVsXCI7XHJcbmltcG9ydCB7XHJcbiAgICBEeW5hbWljRm9ybUZpZWxkU2V0LFxyXG4gICAgRHluYW1pY0Zvcm1Hcm91cE1vZGVsLFxyXG4gICAgRHluYW1pY0Zvcm1Hcm91cE1vZGVsQ29uZmlnXHJcbn0gZnJvbSBcIi4uL3V0aWxzL2R5bmFtaWMtZm9ybS1ncm91cC5tb2RlbFwiO1xyXG5pbXBvcnQge0R5bmFtaWNGb3JtT3B0aW9uQ29uZmlnLCBEeW5hbWljU2VsZWN0TW9kZWwsIER5bmFtaWNTZWxlY3RNb2RlbENvbmZpZ30gZnJvbSBcIi4uL3V0aWxzL2R5bmFtaWMtc2VsZWN0Lm1vZGVsXCI7XHJcbmltcG9ydCB7RHluYW1pY0Jhc2VGb3JtQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9iYXNlL2R5bmFtaWMtYmFzZS1mb3JtLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge2NyZWF0ZUZvcm1JbnB1dH0gZnJvbSBcIi4uL3V0aWxzL2NyZWF0b3JzXCI7XHJcbmltcG9ydCB7QWxsVmFsaWRhdGlvbkVycm9ycywgZ2V0Rm9ybVZhbGlkYXRpb25FcnJvcnN9IGZyb20gXCIuLi91dGlscy92YWxpZGF0aW9uLWVycm9yc1wiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1TZXJ2aWNlIGV4dGVuZHMgQmFzZSB7XHJcblxyXG4gICAgZ2V0IGFwaSgpOiBJQXBpU2VydmljZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkFwaS5hcGk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhbmd1YWdlKCk6IElMYW5ndWFnZVNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwaS5sYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2NoZW1hczogSU9wZW5BcGlTY2hlbWFzO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNzOiBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICB2czogRHluYW1pY0Zvcm1WYWxpZGF0aW9uU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoT3BlbkFwaVNlcnZpY2UpIHJlYWRvbmx5IG9wZW5BcGk6IE9wZW5BcGlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChJbmplY3RvcikgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgc3VwZXIoY3MsIHZzKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaEdyb3VwKHZhbHVlOiBhbnksIGZvcm1Nb2RlbDogRHluYW1pY0Zvcm1Nb2RlbCwgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcclxuICAgICAgICB2YWx1ZSA9IE9iamVjdFV0aWxzLmNvcHkodmFsdWUpO1xyXG4gICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZSwgZm9ybU1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgIGZvcm1Hcm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcclxuICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaEZvcm0odmFsdWU6IGFueSwgY29tcG9uZW50OiBEeW5hbWljQmFzZUZvcm1Db21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICB2YWx1ZSA9IE9iamVjdFV0aWxzLmNvcHkodmFsdWUpO1xyXG4gICAgICAgIHRoaXMucGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZSwgY29tcG9uZW50Lm1vZGVsLCBjb21wb25lbnQuZ3JvdXApO1xyXG4gICAgICAgIGNvbXBvbmVudC5ncm91cC5wYXRjaFZhbHVlKHZhbHVlKTtcclxuICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoY29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXJpYWxpemUoZm9ybU1vZGVsOiBEeW5hbWljRm9ybU1vZGVsLCBmb3JtR3JvdXA6IEZvcm1Hcm91cCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplUmVjdXJzaXZlKGZvcm1Nb2RlbCwgZm9ybUdyb3VwKTtcclxuICAgIH1cclxuXHJcbiAgICBub3RpZnlDaGFuZ2VzKGZvcm1Nb2RlbDogRHluYW1pY0Zvcm1Nb2RlbCwgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXNSZWN1cnNpdmUoZm9ybU1vZGVsLCBmb3JtR3JvdXAsIGZvcm1Nb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Vycm9ycyhmb3JtOiBEeW5hbWljQmFzZUZvcm1Db21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JHcm91cChmb3JtLmdyb3VwKTtcclxuICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoZm9ybSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RXJyb3JzKGZvcm06IER5bmFtaWNCYXNlRm9ybUNvbXBvbmVudCk6IFByb21pc2U8QWxsVmFsaWRhdGlvbkVycm9yc1tdPiB7XHJcbiAgICAgICAgdGhpcy5zaG93RXJyb3JzKGZvcm0pO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGdldEZvcm1WYWxpZGF0aW9uRXJyb3JzKGZvcm0uZ3JvdXAuY29udHJvbHMsIFwiXCIpKTtcclxuICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcGF0Y2hWYWx1ZVJlY3Vyc2l2ZSh2YWx1ZTogYW55LCBmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIGZvcm1Nb2RlbD8uZm9yRWFjaChzdWJNb2RlbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHN1Yk1vZGVsLmlkO1xyXG4gICAgICAgICAgICBjb25zdCBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YkNvbnRyb2wgPSB0aGlzLmZpbmRDb250cm9sQnlNb2RlbChzdWJNb2RlbCwgZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY1NlbGVjdE1vZGVsICYmIE9iamVjdFV0aWxzLmlzT2JqZWN0KHN1YlZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWVba2V5XSA9IHN1YlZhbHVlLmlkIHx8IHN1YlZhbHVlLl9pZCB8fCBzdWJWYWx1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRGF0ZVBpY2tlck1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZVtrZXldID0gdGhpcy5jb252ZXJ0VG9EYXRlKHN1YlZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUFycmF5TW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViVmFsdWUpID8gc3ViVmFsdWUubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFycmF5ID0gc3ViQ29udHJvbCBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3ViTW9kZWwuc2l6ZSA+IGxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRm9ybUFycmF5R3JvdXAoMCwgc3ViQXJyYXksIHN1Yk1vZGVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHdoaWxlIChzdWJNb2RlbC5zaXplIDwgbGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRGb3JtQXJyYXlHcm91cChzdWJNb2RlbC5zaXplLCBzdWJBcnJheSwgc3ViTW9kZWwgYXMgRHluYW1pY0Zvcm1BcnJheU1vZGVsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtTW9kZWwgPSBzdWJNb2RlbC5nZXQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRjaFZhbHVlUmVjdXJzaXZlKHN1YlZhbHVlW2ldLCBpdGVtTW9kZWwuZ3JvdXAsIHN1YkFycmF5LmF0KGkpIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHN1Yk1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0Zvcm1Hcm91cE1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGNoVmFsdWVSZWN1cnNpdmUoc3ViVmFsdWUsIHN1Yk1vZGVsLmdyb3VwLCBzdWJDb250cm9sIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYXN5bmMgc2VyaWFsaXplUmVjdXJzaXZlKGZvcm1Nb2RlbDogRHluYW1pY0Zvcm1Nb2RlbCwgZm9ybUdyb3VwOiBGb3JtR3JvdXApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGlmICghZm9ybU1vZGVsIHx8ICFmb3JtR3JvdXAgfHwgIWZvcm1Hcm91cC52YWx1ZSkgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gZm9ybU1vZGVsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1Yk1vZGVsID0gZm9ybU1vZGVsW2ldIGFzIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWw8YW55PjtcclxuICAgICAgICAgICAgY29uc3Qgc3ViQ29udHJvbCA9IHRoaXMuZmluZENvbnRyb2xCeU1vZGVsKHN1Yk1vZGVsLCBmb3JtR3JvdXApO1xyXG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gc3ViTW9kZWwuYWRkaXRpb25hbD8uc2VyaWFsaXplciBhcyBGb3JtQ29udHJvbFNlcmlhbGl6ZXI7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0Z1bmN0aW9uKHNlcmlhbGl6ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gYXdhaXQgc2VyaWFsaXplcihzdWJNb2RlbCwgc3ViQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwuaGlkZGVuICYmICFzdWJNb2RlbC5hZGRpdGlvbmFsPy5zZXJpYWxpemUpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUFycmF5TW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IEFycmF5LmlzQXJyYXkoc3ViQ29udHJvbC52YWx1ZSkgPyBzdWJDb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJBcnJheSA9IHN1YkNvbnRyb2wgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzQXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtTW9kZWwgPSBzdWJNb2RlbC5nZXQoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzQXJyYXkucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXJpYWxpemVSZWN1cnNpdmUoaXRlbU1vZGVsLmdyb3VwLCBzdWJBcnJheS5hdChpKSBhcyBGb3JtR3JvdXApXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc3VsdFtzdWJNb2RlbC5pZF0gPSByZXNBcnJheTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNJbnB1dE1vZGVsICYmICFPYmplY3RVdGlscy5pc051bGxPclVuZGVmaW5lZChzdWJDb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IHN1Yk1vZGVsLmlucHV0VHlwZSA9PSBcIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUZsb2F0KChgJHtzdWJDb250cm9sLnZhbHVlfWAgfHwgXCIwXCIpLnJlcGxhY2UoLywvZ2ksIFwiLlwiKSkgPz8gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIDogc3ViQ29udHJvbC52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W3N1Yk1vZGVsLmlkXSA9IGF3YWl0IHRoaXMuc2VyaWFsaXplUmVjdXJzaXZlKHN1Yk1vZGVsLmdyb3VwLCBzdWJDb250cm9sIGFzIEZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXN1bHRbc3ViTW9kZWwuaWRdID0gc3ViQ29udHJvbC52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShmb3JtTW9kZWw6IER5bmFtaWNGb3JtTW9kZWwsIGZvcm1Hcm91cDogRm9ybUdyb3VwLCByb290OiBEeW5hbWljRm9ybU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFmb3JtTW9kZWwgfHwgIWZvcm1Hcm91cCkgcmV0dXJuO1xyXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiBmb3JtTW9kZWwpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ViTW9kZWwgPSBmb3JtTW9kZWxbaV0gYXMgRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbDxhbnk+O1xyXG4gICAgICAgICAgICBjb25zdCBzdWJDb250cm9sID0gdGhpcy5maW5kQ29udHJvbEJ5TW9kZWwoc3ViTW9kZWwsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgIGlmIChzdWJNb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtQXJyYXlNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gQXJyYXkuaXNBcnJheShzdWJDb250cm9sLnZhbHVlKSA/IHN1YkNvbnRyb2wudmFsdWUubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YkFycmF5ID0gc3ViQ29udHJvbCBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbU1vZGVsID0gc3ViTW9kZWwuZ2V0KGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShpdGVtTW9kZWwuZ3JvdXAsIHN1YkFycmF5LmF0KGkpIGFzIEZvcm1Hcm91cCwgcm9vdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlc1JlY3Vyc2l2ZShzdWJNb2RlbC5ncm91cCwgc3ViQ29udHJvbCBhcyBGb3JtR3JvdXAsIHJvb3QpO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RPcHRpb25zKHN1Yk1vZGVsLCBzdWJDb250cm9sIGFzIEZvcm1Db250cm9sLCByb290KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVNlbGVjdE9wdGlvbnMoZm9ybUNvbnRyb2xNb2RlbDogRHluYW1pY0Zvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCwgcm9vdDogRHluYW1pY0Zvcm1Nb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChmb3JtQ29udHJvbE1vZGVsIGluc3RhbmNlb2YgRHluYW1pY1NlbGVjdE1vZGVsKSB7XHJcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gZm9ybUNvbnRyb2xNb2RlbC5vcHRpb25zJDtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGb3JtU3ViamVjdCkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5ub3RpZnkoZm9ybUNvbnRyb2xNb2RlbCwgZm9ybUNvbnRyb2wsIHJvb3QpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdoaWxlIChvcHRpb25zIGluc3RhbmNlb2YgU3ViamVjdCAmJiBvcHRpb25zLnNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMuc291cmNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBGb3JtU3ViamVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubm90aWZ5KGZvcm1Db250cm9sTW9kZWwsIGZvcm1Db250cm9sLCByb290KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2hvd0Vycm9yc0Zvckdyb3VwKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFmb3JtR3JvdXApIHJldHVybjtcclxuICAgICAgICBmb3JtR3JvdXAubWFya0FzVG91Y2hlZCh7b25seVNlbGY6IHRydWV9KTtcclxuICAgICAgICBjb25zdCBjb250cm9scyA9IE9iamVjdC5rZXlzKGZvcm1Hcm91cC5jb250cm9scykubWFwKGlkID0+IGZvcm1Hcm91cC5jb250cm9sc1tpZF0pO1xyXG4gICAgICAgIHRoaXMuc2hvd0Vycm9yc0ZvckNvbnRyb2xzKGNvbnRyb2xzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc2hvd0Vycm9yc0ZvckNvbnRyb2xzKGNvbnRyb2xzOiBBYnN0cmFjdENvbnRyb2xbXSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JHcm91cChjb250cm9sKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiB0cnVlfSk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcnNGb3JDb250cm9scyhjb250cm9sLmNvbnRyb2xzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb252ZXJ0VG9EYXRlKHZhbHVlOiBhbnkpOiBEYXRlIHtcclxuICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBjb25zdCBkYXRlID0gT2JqZWN0VXRpbHMuaXNEYXRlKHZhbHVlKVxyXG4gICAgICAgICAgICA/IHZhbHVlXHJcbiAgICAgICAgICAgIDogbmV3IERhdGUodmFsdWUpO1xyXG4gICAgICAgIHJldHVybiBpc05hTihkYXRlIGFzIGFueSkgPyBuZXcgRGF0ZSgpIDogZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRGb3JtTW9kZWxGb3JTY2hlbWEobmFtZTogc3RyaW5nLCBjdXN0b21pemVNb2RlbD86IEZvcm1Nb2RlbEN1c3RvbWl6ZXIpOiBQcm9taXNlPER5bmFtaWNGb3JtTW9kZWw+IHtcclxuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Rm9ybUdyb3VwTW9kZWxGb3JTY2hlbWEobmFtZSwgY3VzdG9taXplTW9kZWwpKS5ncm91cDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRGb3JtR3JvdXBNb2RlbEZvclNjaGVtYShuYW1lOiBzdHJpbmcsIGN1c3RvbWl6ZU1vZGVsPzogRm9ybU1vZGVsQ3VzdG9taXplcik6IFByb21pc2U8RHluYW1pY0Zvcm1Hcm91cE1vZGVsPiB7XHJcbiAgICAgICAgdGhpcy5hcGkuY2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLnNjaGVtYXMgPSBhd2FpdCB0aGlzLm9wZW5BcGkuZ2V0U2NoZW1hcygpO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkU2V0czogRHluYW1pY0Zvcm1GaWVsZFNldDxzdHJpbmc+W10gPSBbXTtcclxuICAgICAgICBjb25zdCBjdXN0b21pemVNb2RlbHM6IEZvcm1Nb2RlbEN1c3RvbWl6ZXJXcmFwID0gYXN5bmMgKFxyXG4gICAgICAgICAgICBwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSxcclxuICAgICAgICAgICAgbW9kZWxUeXBlOiBNb2RlbFR5cGUsIGNvbmZpZzogRHluYW1pY0Zvcm1Db250cm9sTW9kZWxDb25maWcpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBuZXcgbW9kZWxUeXBlKGNvbmZpZyk7XHJcbiAgICAgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtVmFsdWVDb250cm9sTW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIG1vZGVsLnZhbHVlID0gKG1vZGVsIGluc3RhbmNlb2YgRHluYW1pY0RhdGVQaWNrZXJNb2RlbClcclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY29udmVydFRvRGF0ZShwcm9wZXJ0eS5kZWZhdWx0KSA6IHByb3BlcnR5LmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFPYmplY3RVdGlscy5pc0Z1bmN0aW9uKGN1c3RvbWl6ZU1vZGVsKSkgcmV0dXJuIFttb2RlbF07XHJcbiAgICAgICAgICAgIGxldCByZXMgPSBjdXN0b21pemVNb2RlbChwcm9wZXJ0eSwgc2NoZW1hLCBtb2RlbCwgY29uZmlnLCB0aGlzLmluamVjdG9yKTtcclxuICAgICAgICAgICAgaWYgKCFyZXMpIHJldHVybiBbbW9kZWxdO1xyXG4gICAgICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzID0gYXdhaXQgcmVzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlcykgPyByZXMgOiBbcmVzXTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hc1tuYW1lXTtcclxuICAgICAgICBjb25zdCBjb250cm9scyA9IGF3YWl0IHRoaXMuZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHNjaGVtYSwgZmllbGRTZXRzLCBjdXN0b21pemVNb2RlbHMpO1xyXG4gICAgICAgIGNvbnN0IGlkRmllbGRzID0gW1xyXG4gICAgICAgICAgICBjcmVhdGVGb3JtSW5wdXQoXCJpZFwiLCB7aGlkZGVuOiB0cnVlfSksXHJcbiAgICAgICAgICAgIGNyZWF0ZUZvcm1JbnB1dChcIl9pZFwiLCB7aGlkZGVuOiB0cnVlfSlcclxuICAgICAgICBdLmZpbHRlcih0ID0+ICFjb250cm9scy5zb21lKGMgPT4gYy5pZCA9PSB0LmlkKSk7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICAgICAgICBpZDogXCJyb290XCIsXHJcbiAgICAgICAgICAgIGdyb3VwOiBbXHJcbiAgICAgICAgICAgICAgICAvLyAtLSBIaWRkZW4gaWQgZmllbGRzIC0tXHJcbiAgICAgICAgICAgICAgICAuLi5pZEZpZWxkcyxcclxuICAgICAgICAgICAgICAgIC8vIC0tIE1haW4gZm9ybSBjb250cm9scyAtLVxyXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbHNcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgZmllbGRTZXRzXHJcbiAgICAgICAgfSBhcyBEeW5hbWljRm9ybUdyb3VwTW9kZWxDb25maWc7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IGF3YWl0IGN1c3RvbWl6ZU1vZGVscyh7XHJcbiAgICAgICAgICAgIGlkOiBcInJvb3RcIixcclxuICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcclxuICAgICAgICAgICAgcHJvcGVydGllczogc2NoZW1hLnByb3BlcnRpZXNcclxuICAgICAgICB9LCBzY2hlbWEsIER5bmFtaWNGb3JtR3JvdXBNb2RlbCwgY29uZmlnKTtcclxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VzdG9taXplZCByb290IHdyYXBwZXIgcmV0dXJuZWQgYW4gYXJyYXlcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb290KSkge1xyXG4gICAgICAgICAgICBjb250cm9scy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJvb3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIER5bmFtaWNGb3JtR3JvdXBNb2RlbCAmJiBtb2RlbC5pZCA9PT0gXCJyb290XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWw7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzLnB1c2gobW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY0Zvcm1Hcm91cE1vZGVsKHtcclxuICAgICAgICAgICAgLi4uY29uZmlnLFxyXG4gICAgICAgICAgICBncm91cDogY29udHJvbHNcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0Rm9ybU1vZGVsRm9yU2NoZW1hRGVmKHNjaGVtYTogSU9wZW5BcGlTY2hlbWEsIGZpZWxkU2V0czogRHluYW1pY0Zvcm1GaWVsZFNldDxzdHJpbmc+W10sIGN1c3RvbWl6ZU1vZGVsczogRm9ybU1vZGVsQ3VzdG9taXplcldyYXApOiBQcm9taXNlPER5bmFtaWNGb3JtTW9kZWw+IHtcclxuICAgICAgICBpZiAoIXNjaGVtYSlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEucHJvcGVydGllcyB8fCB7fSk7XHJcbiAgICAgICAgY29uc3QgY29udHJvbHM6IER5bmFtaWNGb3JtTW9kZWwgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHAgb2Yga2V5cykge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHNjaGVtYS5wcm9wZXJ0aWVzW3BdO1xyXG4gICAgICAgICAgICBjb25zdCBmc05hbWUgPSBwcm9wZXJ0eS5oaWRkZW4gPyBudWxsIDogU3RyaW5nKHByb3BlcnR5LmZpZWxkU2V0IHx8IFwiXCIpO1xyXG4gICAgICAgICAgICBpZiAoZnNOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmcyA9IGZpZWxkU2V0cy5maW5kKHQgPT4gdC5pZCA9PT0gZnNOYW1lKTtcclxuICAgICAgICAgICAgICAgIGlmIChmcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmZpZWxkcy5wdXNoKHApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZFNldHMucHVzaCh7aWQ6IGZzTmFtZSwgbGVnZW5kOiBgbGVnZW5kLiR7ZnNOYW1lfWAsIGZpZWxkczogW3BdfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbW9kZWxzID0gYXdhaXQgdGhpcy5nZXRGb3JtQ29udHJvbE1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBjdXN0b21pemVNb2RlbHMpO1xyXG4gICAgICAgICAgICBjb250cm9scy5wdXNoKC4uLm1vZGVscyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250cm9scy5maWx0ZXIodCA9PiBudWxsICE9PSB0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY2hlY2tJc0VkaXRvclByb3BlcnR5KHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFwcm9wZXJ0eS5mb3JtYXQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gRURJVE9SX0ZPUk1BVFMuaW5kZXhPZihwcm9wZXJ0eS5mb3JtYXQpID49IDAgfHwgcHJvcGVydHkuZm9ybWF0LmVuZHNXaXRoKFwic2NyaXB0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyBnZXRGb3JtQ29udHJvbE1vZGVscyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSwgY3VzdG9taXplTW9kZWxzOiBGb3JtTW9kZWxDdXN0b21pemVyV3JhcCk6IFByb21pc2U8RHluYW1pY0Zvcm1Db250cm9sTW9kZWxbXT4ge1xyXG4gICAgICAgIGNvbnN0ICRlbnVtID0gcHJvcGVydHkuaXRlbXM/LmVudW0gfHwgcHJvcGVydHkuZW51bTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSgkZW51bSkgfHwgaXNTdHJpbmdXaXRoVmFsKHByb3BlcnR5Lm9wdGlvbnNQYXRoKSB8fCBpc1N0cmluZ1dpdGhWYWwocHJvcGVydHkuZW5kcG9pbnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXN0b21pemVNb2RlbHMocHJvcGVydHksIHNjaGVtYSwgRHluYW1pY1NlbGVjdE1vZGVsLCB0aGlzLmdldEZvcm1TZWxlY3RDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tJc0VkaXRvclByb3BlcnR5KHByb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemVNb2RlbHMocHJvcGVydHksIHNjaGVtYSwgRHluYW1pY0VkaXRvck1vZGVsLCB0aGlzLmdldEZvcm1FZGl0b3JDb25maWcocHJvcGVydHksIHNjaGVtYSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmZvcm1hdCA9PSBcInRleHRhcmVhXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNUZXh0QXJlYU1vZGVsLCB0aGlzLmdldEZvcm1UZXh0YXJlYUNvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuZm9ybWF0ID09IFwiZGF0ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZU1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBEeW5hbWljRGF0ZVBpY2tlck1vZGVsLCB0aGlzLmdldEZvcm1EYXRlcGlja2VyQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21pemVNb2RlbHMocHJvcGVydHksIHNjaGVtYSwgRHluYW1pY0lucHV0TW9kZWwsIHRoaXMuZ2V0Rm9ybUlucHV0Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEpKTtcclxuICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZU1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBEeW5hbWljRWRpdG9yTW9kZWwsIHRoaXMuZ2V0Rm9ybUVkaXRvckNvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNDaGVja2JveE1vZGVsLCB0aGlzLmdldEZvcm1DaGVja2JveENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRSZWZzKHByb3BlcnR5KS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbWl6ZU1vZGVscyhwcm9wZXJ0eSwgc2NoZW1hLCBEeW5hbWljRm9ybUFycmF5TW9kZWwsIGF3YWl0IHRoaXMuZ2V0Rm9ybUFycmF5Q29uZmlnKHByb3BlcnR5LCBzY2hlbWEsIGN1c3RvbWl6ZU1vZGVscykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNJbnB1dE1vZGVsLCB0aGlzLmdldEZvcm1JbnB1dENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNGaWxlVXBsb2FkTW9kZWwsIHRoaXMuZ2V0Rm9ybVVwbG9hZENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaW5kUmVmcyhwcm9wZXJ0eSkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY3VzdG9taXplTW9kZWxzKHByb3BlcnR5LCBzY2hlbWEsIER5bmFtaWNGb3JtR3JvdXBNb2RlbCwgYXdhaXQgdGhpcy5nZXRGb3JtR3JvdXBDb25maWcocHJvcGVydHksIHNjaGVtYSwgY3VzdG9taXplTW9kZWxzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kTW9kZWxCeVBhdGgocGFyZW50OiBEeW5hbWljUGF0aGFibGUgfCBEeW5hbWljRm9ybU1vZGVsLCBwYXRoOiBzdHJpbmdbXSk6IER5bmFtaWNQYXRoYWJsZSB7XHJcbiAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09IDApIHJldHVybiBwYXJlbnQgYXMgRHluYW1pY1BhdGhhYmxlO1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSBwYXRoLnNoaWZ0KCkgYXMgYW55O1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE1vZGVsQnlQYXRoKHBhcmVudC5maW5kKHQgPT4gdC5pZCA9PSBuZXh0KSwgcGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwgfHwgcGFyZW50IGluc3RhbmNlb2YgRHluYW1pY0Zvcm1BcnJheUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE1vZGVsQnlQYXRoKHBhcmVudC5ncm91cC5maW5kKHQgPT4gdC5pZCA9PSBuZXh0KSwgcGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUFycmF5TW9kZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE1vZGVsQnlQYXRoKHBhcmVudC5ncm91cHMuZmluZCh0ID0+IHQuaW5kZXggPT0gbmV4dCksIHBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0Zvcm1WYWx1ZUNvbnRyb2xNb2RlbENvbmZpZzxhbnk+IHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy5nZXRWYWxpZGF0b3JzKHByb3BlcnR5LCBzY2hlbWEpO1xyXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBPYmplY3Qua2V5cyh2YWxpZGF0b3JzKS5yZWR1Y2UoKHJlcywga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIHJlc1trZXldID0gYGVycm9yLiR7a2V5fWA7XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiBwcm9wZXJ0eS5pZCxcclxuICAgICAgICAgICAgbGFiZWw6IE9iamVjdFV0aWxzLmlzU3RyaW5nKHByb3BlcnR5LmxhYmVsKSA/IHByb3BlcnR5LmxhYmVsIDogcHJvcGVydHkuaWQsXHJcbiAgICAgICAgICAgIGhpZGRlbjogcHJvcGVydHkuaGlkZGVuLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogcHJvcGVydHkuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMsXHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZXMsXHJcbiAgICAgICAgICAgIGFkZGl0aW9uYWw6IE9iamVjdC5hc3NpZ24oe30sIHByb3BlcnR5KVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Rm9ybUFycmF5Q29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hLCBjdXN0b21pemVNb2RlbHM6IEZvcm1Nb2RlbEN1c3RvbWl6ZXJXcmFwKTogUHJvbWlzZTxEeW5hbWljRm9ybUFycmF5TW9kZWxDb25maWc+IHtcclxuICAgICAgICBjb25zdCBmaWVsZFNldHM6IER5bmFtaWNGb3JtRmllbGRTZXQ8c3RyaW5nPltdID0gW107XHJcbiAgICAgICAgY29uc3Qgc3ViU2NoZW1hcyA9IGZpbmRSZWZzKHByb3BlcnR5KS5tYXAocmVmID0+IHRoaXMuc2NoZW1hc1tyZWZdKTtcclxuICAgICAgICBjb25zdCBzdWJNb2RlbHMgPSBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgc3ViU2NoZW1hcy5tYXAocyA9PiB0aGlzLmdldEZvcm1Nb2RlbEZvclNjaGVtYURlZihzLCBmaWVsZFNldHMsIGN1c3RvbWl6ZU1vZGVscykpXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBGYWN0b3J5OiAoKSA9PiBtZXJnZUZvcm1Nb2RlbHMoT2JqZWN0VXRpbHMuY29weShzdWJNb2RlbHMpKSxcclxuICAgICAgICAgICAgICAgIGluaXRpYWxDb3VudDogcHJvcGVydHkuaW5pdGlhbENvdW50IHx8IDAsXHJcbiAgICAgICAgICAgICAgICBzb3J0YWJsZTogcHJvcGVydHkuc29ydGFibGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB1c2VUYWJzOiBwcm9wZXJ0eS51c2VUYWJzIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYWRkSXRlbTogcHJvcGVydHkuYWRkSXRlbSAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBpbnNlcnRJdGVtOiBwcm9wZXJ0eS5pbnNlcnRJdGVtICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNsb25lSXRlbTogcHJvcGVydHkuY2xvbmVJdGVtICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG1vdmVJdGVtOiBwcm9wZXJ0eS5tb3ZlSXRlbSAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtOiBwcm9wZXJ0eS5yZW1vdmVJdGVtICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNsZWFySXRlbXM6IHByb3BlcnR5LmNsZWFySXRlbXMgIT09IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEZvcm1Hcm91cENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSwgY3VzdG9taXplTW9kZWxzOiBGb3JtTW9kZWxDdXN0b21pemVyV3JhcCk6IFByb21pc2U8RHluYW1pY0Zvcm1Hcm91cE1vZGVsQ29uZmlnPiB7XHJcbiAgICAgICAgY29uc3QgZmllbGRTZXRzOiBEeW5hbWljRm9ybUZpZWxkU2V0PHN0cmluZz5bXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHN1YlNjaGVtYXMgPSBmaW5kUmVmcyhwcm9wZXJ0eSkubWFwKHJlZiA9PiB0aGlzLnNjaGVtYXNbcmVmXSk7XHJcbiAgICAgICAgY29uc3Qgc3ViTW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIHN1YlNjaGVtYXMubWFwKHMgPT4gdGhpcy5nZXRGb3JtTW9kZWxGb3JTY2hlbWFEZWYocywgZmllbGRTZXRzLCBjdXN0b21pemVNb2RlbHMpKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZpZWxkU2V0cyxcclxuICAgICAgICAgICAgICAgIGdyb3VwOiBtZXJnZUZvcm1Nb2RlbHMoc3ViTW9kZWxzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtSW5wdXRDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljSW5wdXRNb2RlbENvbmZpZyB7XHJcbiAgICAgICAgbGV0IGlucHV0VHlwZSA9IFN0cmluZ1V0aWxzLmhhcyhwcm9wZXJ0eS5pZCwgXCJwYXNzd29yZFwiLCBcIlBhc3N3b3JkXCIpID8gXCJwYXNzd29yZFwiIDogKHByb3BlcnR5LmZvcm1hdCB8fCBwcm9wZXJ0eS5pdGVtcz8udHlwZSB8fCBwcm9wZXJ0eS50eXBlKTtcclxuICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSBcInRleHRcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJjaGVja2JveFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gXCJ0ZXh0YXJlYVwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XHJcbiAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSBcIm51bWJlclwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1YiA9IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiID8gcHJvcGVydHkuaXRlbXMgfHwgcHJvcGVydHkgOiBwcm9wZXJ0eTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlLFxyXG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlOiBwcm9wZXJ0eS5hdXRvQ29tcGxldGUgfHwgXCJvZmZcIixcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wZXJ0eS50eXBlID09IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgICAgIGFjY2VwdDogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkuYWNjZXB0KSA/IHByb3BlcnR5LmFjY2VwdCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBtYXNrOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5tYXNrKSA/IHByb3BlcnR5Lm1hc2sgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkucGF0dGVybikgPyBwcm9wZXJ0eS5wYXR0ZXJuIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0ZXA6IGlzTmFOKHN1Yi5zdGVwKSA/IChpc05hTihwcm9wZXJ0eS5zdGVwKSA/IDEgOiBwcm9wZXJ0eS5zdGVwKSA6IHN1Yi5zdGVwLFxyXG4gICAgICAgICAgICAgICAgbWluOiBpc05hTihzdWIubWluaW11bSkgPyBNSU5fSU5QVVRfTlVNIDogc3ViLm1pbmltdW0sXHJcbiAgICAgICAgICAgICAgICBtYXg6IGlzTmFOKHN1Yi5tYXhpbXVtKSA/IE1BWF9JTlBVVF9OVU0gOiBzdWIubWF4aW11bSxcclxuICAgICAgICAgICAgICAgIG1pbkxlbmd0aDogaXNOYU4oc3ViLm1pbkxlbmd0aCkgPyAwIDogc3ViLm1pbkxlbmd0aCxcclxuICAgICAgICAgICAgICAgIG1heExlbmd0aDogaXNOYU4oc3ViLm1heExlbmd0aCkgPyBNQVhfSU5QVVRfTlVNIDogc3ViLm1heExlbmd0aCxcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwcm9wZXJ0eS5wbGFjZWhvbGRlciB8fCBcIlwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1FZGl0b3JDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRWRpdG9yTW9kZWxDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHN1YiA9IHByb3BlcnR5LnR5cGUgPT0gXCJhcnJheVwiID8gcHJvcGVydHkuaXRlbXMgfHwgcHJvcGVydHkgOiBwcm9wZXJ0eTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaW5wdXRUeXBlOiBwcm9wZXJ0eS5mb3JtYXQgfHwgXCJqc29uXCIsXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0T2JqZWN0OiBwcm9wZXJ0eS50eXBlICE9PSBcInN0cmluZ1wiLFxyXG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlOiBwcm9wZXJ0eS5hdXRvQ29tcGxldGUgfHwgXCJvZmZcIixcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wZXJ0eS50eXBlID09IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgICAgIGFjY2VwdDogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkuYWNjZXB0KSA/IHByb3BlcnR5LmFjY2VwdCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBtYXNrOiBPYmplY3RVdGlscy5pc1N0cmluZyhwcm9wZXJ0eS5tYXNrKSA/IHByb3BlcnR5Lm1hc2sgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogT2JqZWN0VXRpbHMuaXNTdHJpbmcocHJvcGVydHkucGF0dGVybikgPyBwcm9wZXJ0eS5wYXR0ZXJuIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0ZXA6IGlzTmFOKHN1Yi5zdGVwKSA/IChpc05hTihwcm9wZXJ0eS5zdGVwKSA/IDEgOiBwcm9wZXJ0eS5zdGVwKSA6IHN1Yi5zdGVwLFxyXG4gICAgICAgICAgICAgICAgbWluTGVuZ3RoOiBpc05hTihzdWIubWluTGVuZ3RoKSA/IDAgOiBzdWIubWluTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoOiBpc05hTihzdWIubWF4TGVuZ3RoKSA/IE1BWF9JTlBVVF9OVU0gOiBzdWIubWF4TGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHByb3BlcnR5LnBsYWNlaG9sZGVyIHx8IFwiXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9ybVRleHRhcmVhQ29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY1RleHRBcmVhTW9kZWxDb25maWcge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb2xzOiBwcm9wZXJ0eS5jb2xzIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICByb3dzOiBwcm9wZXJ0eS5yb3dzIHx8IDEwLFxyXG4gICAgICAgICAgICAgICAgd3JhcDogcHJvcGVydHkud3JhcCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGF1dG9Db21wbGV0ZTogcHJvcGVydHkuYXV0b0NvbXBsZXRlIHx8IFwib2ZmXCIsXHJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZTogcHJvcGVydHkudHlwZSA9PSBcImFycmF5XCIsXHJcbiAgICAgICAgICAgICAgICBtaW5MZW5ndGg6IGlzTmFOKHByb3BlcnR5Lm1pbkxlbmd0aCkgPyAwIDogcHJvcGVydHkubWluTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoOiBpc05hTihwcm9wZXJ0eS5tYXhMZW5ndGgpID8gTUFYX0lOUFVUX05VTSA6IHByb3BlcnR5Lm1heExlbmd0aCxcclxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwcm9wZXJ0eS5wbGFjZWhvbGRlciB8fCBcIlwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1EYXRlcGlja2VyQ29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0RhdGVQaWNrZXJNb2RlbENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZvcm1hdDogcHJvcGVydHkuZGF0ZUZvcm1hdCB8fCBcImRkLk1NLnl5eXlcIixcclxuICAgICAgICAgICAgICAgIG1pbjogdGhpcy5jb252ZXJ0VG9EYXRlKHByb3BlcnR5Lm1pbiksXHJcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMuY29udmVydFRvRGF0ZShwcm9wZXJ0eS5tYXgpLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JtU2VsZWN0T3B0aW9ucyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSkge1xyXG4gICAgICAgIGNvbnN0ICRlbnVtID0gcHJvcGVydHkuaXRlbXM/LmVudW0gfHwgcHJvcGVydHkuZW51bTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSgkZW51bSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtU2VsZWN0U3ViamVjdCgoc2VsZWN0TW9kZWwsIGZvcm1Db250cm9sKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gJGVudW0ubWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHByb3BlcnR5LnRyYW5zbGF0YWJsZSA/IGAke3Byb3BlcnR5LmlkfS4ke3ZhbHVlfWAgOiBgJHt2YWx1ZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWUsIGxhYmVsfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml4U2VsZWN0T3B0aW9ucyhzZWxlY3RNb2RlbCwgZm9ybUNvbnRyb2wsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzU3RyaW5nV2l0aFZhbChwcm9wZXJ0eS5vcHRpb25zUGF0aCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtU2VsZWN0U3ViamVjdChhc3luYyAoc2VsZWN0TW9kZWwsIGNvbnRyb2wsIHJvb3QsIGluZGV4ZXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gcHJvcGVydHkub3B0aW9uc1BhdGggYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGNvbnRyb2wgYXMgQWJzdHJhY3RDb250cm9sO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1vZGVsOiBEeW5hbWljUGF0aGFibGUgfCBEeW5hbWljRm9ybU1vZGVsID0gc2VsZWN0TW9kZWw7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwiJHJvb3RcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoNSk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldC5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSByb290O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhdGguc3RhcnRzV2l0aChcIi5cIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSAobW9kZWwgYXMgRHluYW1pY1BhdGhhYmxlKS5wYXJlbnQgfHwgcm9vdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGluZGV4ZXMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKGtleSwgaW5kZXhlc1trZXldKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgbW9kZWwgPSB0aGlzLmZpbmRNb2RlbEJ5UGF0aChtb2RlbCwgcGF0aC5zcGxpdChcIi5cIikpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kZWxPcHRpb25zID0gbW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljU2VsZWN0TW9kZWxcclxuICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1vZGVsLm9wdGlvbnMkKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgW107XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdFV0aWxzLmdldFZhbHVlKHRhcmdldC52YWx1ZSwgcGF0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gKCFPYmplY3RVdGlscy5pc0FycmF5KHZhbHVlKSA/IFtdIDogdmFsdWUpLm1hcCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWxPcHRpb24gPSBtb2RlbE9wdGlvbnMuZmluZCh0ID0+IHQudmFsdWUgPT0gdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7dmFsdWUsIGxhYmVsOiBtb2RlbE9wdGlvbj8ubGFiZWwgfHwgdmFsdWV9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXhTZWxlY3RPcHRpb25zKHNlbGVjdE1vZGVsLCBjb250cm9sLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgRm9ybVNlbGVjdFN1YmplY3QoYXN5bmMgKHNlbGVjdE1vZGVsLCBjb250cm9sKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhjb250cm9sLnJvb3Q/LnZhbHVlIHx8IHt9KTtcclxuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnQgPSBlbnRyaWVzLnJlZHVjZSgocmVzLCBba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXMucmVwbGFjZShuZXcgUmVnRXhwKGAkJHtrZXl9YCwgXCJnaVwiKSwgYCR7dmFsdWV9YCk7XHJcbiAgICAgICAgICAgIH0sIGAke3Byb3BlcnR5LmVuZHBvaW50fWApO1xyXG4gICAgICAgICAgICB0aGlzLmFwaS5jYWNoZVtlbmRwb2ludF0gPSB0aGlzLmFwaS5jYWNoZVtlbmRwb2ludF0gfHwgdGhpcy5hcGkubGlzdChlbmRwb2ludCwgdGhpcy5hcGkubWFrZUxpc3RQYXJhbXMoMSwgLTEpKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IE9iamVjdFV0aWxzLmlzQXJyYXkocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgOiAoT2JqZWN0VXRpbHMuaXNBcnJheShyZXN1bHQuaXRlbXMpID8gcmVzdWx0Lml0ZW1zIDogW10pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcChpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gT2JqZWN0VXRpbHMuaXNPYmplY3QoaSkgPyBpIDoge2lkOiBpfTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5pZCB8fCBpdGVtLl9pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW1bcHJvcGVydHkubGFiZWxGaWVsZF0gfHwgaXRlbS5sYWJlbCB8fCBpdGVtLmlkIHx8IGl0ZW0uX2lkXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChhd2FpdCB0aGlzLmFwaS5jYWNoZVtlbmRwb2ludF0pLm1hcCh0ID0+IE9iamVjdC5hc3NpZ24oe30sIHQpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml4U2VsZWN0T3B0aW9ucyhzZWxlY3RNb2RlbCwgY29udHJvbCwgb3B0aW9ucyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9ybVNlbGVjdENvbmZpZyhwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSwgc2NoZW1hOiBJT3BlbkFwaVNjaGVtYSk6IER5bmFtaWNTZWxlY3RNb2RlbENvbmZpZzxhbnk+IHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgdGhpcy5nZXRGb3JtQ29udHJvbENvbmZpZyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5nZXRGb3JtU2VsZWN0T3B0aW9ucyhwcm9wZXJ0eSwgc2NoZW1hKSxcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlOiBwcm9wZXJ0eS50eXBlID09IFwiYXJyYXlcIixcclxuICAgICAgICAgICAgICAgIGdyb3VwQnk6IHByb3BlcnR5Lmdyb3VwQnksXHJcbiAgICAgICAgICAgICAgICBpbmxpbmU6IHByb3BlcnR5LmlubGluZSxcclxuICAgICAgICAgICAgICAgIGFsbG93RW1wdHk6IHByb3BlcnR5LmFsbG93RW1wdHksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZvcm1VcGxvYWRDb25maWcocHJvcGVydHk6IElPcGVuQXBpU2NoZW1hUHJvcGVydHksIHNjaGVtYTogSU9wZW5BcGlTY2hlbWEpOiBEeW5hbWljRmlsZVVwbG9hZE1vZGVsQ29uZmlnIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmFwaS51cmwocHJvcGVydHkudXJsIHx8IFwiYXNzZXRzXCIpO1xyXG4gICAgICAgIGNvbnN0IHthY2NlcHQsIGF1dG9VcGxvYWQsIG1heFNpemUsIG1pblNpemUsIHJlbW92ZVVybCwgc2hvd0ZpbGVMaXN0fSA9IHByb3BlcnR5O1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRoaXMuZ2V0Rm9ybUNvbnRyb2xDb25maWcocHJvcGVydHksIHNjaGVtYSksIHtcclxuICAgICAgICAgICAgdXJsLFxyXG4gICAgICAgICAgICBhY2NlcHQsXHJcbiAgICAgICAgICAgIGF1dG9VcGxvYWQsXHJcbiAgICAgICAgICAgIG1heFNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemUsXHJcbiAgICAgICAgICAgIHJlbW92ZVVybCxcclxuICAgICAgICAgICAgc2hvd0ZpbGVMaXN0XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9ybUNoZWNrYm94Q29uZmlnKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY0NoZWNrYm94TW9kZWxDb25maWcge1xyXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgICB0aGlzLmdldEZvcm1Db250cm9sQ29uZmlnKHByb3BlcnR5LCBzY2hlbWEpLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbmRldGVybWluYXRlOiBwcm9wZXJ0eS5pbmRldGVybWluYXRlIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb25lRm9ybUFycmF5R3JvdXAoaW5kZXg6IG51bWJlciwgZm9ybUFycmF5OiBGb3JtQXJyYXksIGZvcm1BcnJheU1vZGVsOiBEeW5hbWljRm9ybUFycmF5TW9kZWwpIHtcclxuICAgICAgICB0aGlzLmluc2VydEZvcm1BcnJheUdyb3VwKGluZGV4LCBmb3JtQXJyYXksIGZvcm1BcnJheU1vZGVsKTtcclxuICAgICAgICB0aGlzLnBhdGNoR3JvdXAoZm9ybUFycmF5LmF0KGluZGV4ICsgMSkudmFsdWUsIGZvcm1BcnJheU1vZGVsLmdyb3Vwc1tpbmRleF0uZ3JvdXAsIGZvcm1BcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwKTtcclxuICAgICAgICBmb3JtQXJyYXlNb2RlbC5maWx0ZXJHcm91cHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYXN5bmMgZml4U2VsZWN0T3B0aW9ucyhtb2RlbDogRHluYW1pY1NlbGVjdE1vZGVsPGFueT4sIGNvbnRyb2w6IEZvcm1Db250cm9sLCBvcHRpb25zOiBEeW5hbWljRm9ybU9wdGlvbkNvbmZpZzxhbnk+W10pOiBQcm9taXNlPER5bmFtaWNGb3JtT3B0aW9uQ29uZmlnPGFueT5bXT4ge1xyXG4gICAgICAgIGlmICghb3B0aW9ucykgcmV0dXJuIFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgb3B0aW9uLmNsYXNzZXMgPSBbb3B0aW9uLmNsYXNzZXMsIG1vZGVsLmdldENsYXNzZXMob3B0aW9uLCBtb2RlbCwgY29udHJvbCwgdGhpcy5pbmplY3RvcildLmZpbHRlcihpc1N0cmluZ1dpdGhWYWwpLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgICAgICBvcHRpb24ubGFiZWwgPSBhd2FpdCB0aGlzLmxhbmd1YWdlLmdldFRyYW5zbGF0aW9uKG9wdGlvbi5sYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRWYWxpZGF0b3JzKHByb3BlcnR5OiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5LCBzY2hlbWE6IElPcGVuQXBpU2NoZW1hKTogRHluYW1pY1ZhbGlkYXRvcnNDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnID0ge307XHJcbiAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzQXJyYXkoc2NoZW1hLnJlcXVpcmVkKSAmJiBzY2hlbWEucmVxdWlyZWQuaW5kZXhPZihwcm9wZXJ0eS5pZCkgPj0gMCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnJlcXVpcmVkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRQcm9wZXJ0eVZhbGlkYXRvcnModmFsaWRhdG9ycywgcHJvcGVydHkpO1xyXG4gICAgICAgIHRoaXMuYWRkSXRlbXNWYWxpZGF0b3JzKHZhbGlkYXRvcnMsIHByb3BlcnR5Lml0ZW1zKTtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdG9ycztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWRkUHJvcGVydHlWYWxpZGF0b3JzKHZhbGlkYXRvcnM6IER5bmFtaWNWYWxpZGF0b3JzQ29uZmlnLCBwcm9wZXJ0eTogSU9wZW5BcGlTY2hlbWFQcm9wZXJ0eSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghcHJvcGVydHkpIHJldHVybjtcclxuICAgICAgICBpZiAoIWlzTmFOKHByb3BlcnR5Lm1pbkxlbmd0aCkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5taW5MZW5ndGggPSBwcm9wZXJ0eS5taW5MZW5ndGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXNOYU4ocHJvcGVydHkubWF4TGVuZ3RoKSkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLm1heExlbmd0aCA9IHByb3BlcnR5Lm1heExlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc05hTihwcm9wZXJ0eS5taW5pbXVtKSkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLm1pbiA9IHByb3BlcnR5Lm1pbmltdW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXNOYU4ocHJvcGVydHkubWF4aW11bSkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5tYXggPSBwcm9wZXJ0eS5tYXhpbXVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LmZvcm1hdCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMuZW1haWwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhZGRJdGVtc1ZhbGlkYXRvcnModmFsaWRhdG9yczogRHluYW1pY1ZhbGlkYXRvcnNDb25maWcsIGl0ZW1zOiBJT3BlbkFwaVNjaGVtYVByb3BlcnR5KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xyXG4gICAgICAgIGlmICghaXNOYU4oaXRlbXMubWluTGVuZ3RoKSkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLml0ZW1zTWluTGVuZ3RoID0gaXRlbXMubWluTGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWlzTmFOKGl0ZW1zLm1heExlbmd0aCkpIHtcclxuICAgICAgICAgICAgdmFsaWRhdG9ycy5pdGVtc01heExlbmd0aCA9IGl0ZW1zLm1heExlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpc05hTihpdGVtcy5taW5pbXVtKSkge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLml0ZW1zTWluVmFsdWUgPSBpdGVtcy5taW5pbXVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWlzTmFOKGl0ZW1zLm1heGltdW0pKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMuaXRlbXNNYXhWYWx1ZSA9IGl0ZW1zLm1heGltdW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==