mmhglobal-dynamicform 2.0.0-beta.66 → 2.0.0-beta.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/esm2020/lib/zudf/zudf.component.mjs +41 -28
- package/fesm2015/mmhglobal-dynamicform.mjs +40 -27
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +40 -27
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/lib/zudf/zudf.component.d.ts +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.13.
|
|
4
4
|
|
|
5
5
|
## Changelog
|
|
6
|
+
`2.68beta`<br/>
|
|
7
|
+
[zudf] - enhancement for component.
|
|
8
|
+
|
|
9
|
+
`2.67beta`<br/>
|
|
10
|
+
[zudf] - enhancement for component.
|
|
11
|
+
|
|
6
12
|
`2.66beta`<br/>
|
|
7
13
|
[zudf] - enhance setFormFieldzModel method to include handling of container fields. <br/>
|
|
8
14
|
|
|
@@ -120,7 +120,8 @@ export class ZudfComponent {
|
|
|
120
120
|
}
|
|
121
121
|
updateDisplayModel(value, flatIndex) {
|
|
122
122
|
ZComponentHelper.updateArrayObjectByFlatIndex(this.displayElementModel, flatIndex, value);
|
|
123
|
-
this.
|
|
123
|
+
this.updateFormField();
|
|
124
|
+
//this.cdr.detectChanges();
|
|
124
125
|
}
|
|
125
126
|
appendToDisplayModel(value, flatIndex) {
|
|
126
127
|
// append to display model mean it will base on flat index to insert the form control.
|
|
@@ -139,7 +140,7 @@ export class ZudfComponent {
|
|
|
139
140
|
}
|
|
140
141
|
removeElementFromDisplayModel(flatIndex) {
|
|
141
142
|
ZComponentHelper.removeArrayObjectByFlatIndex(this.displayElementModel, flatIndex);
|
|
142
|
-
this.
|
|
143
|
+
this.updateFormField();
|
|
143
144
|
// TODO: remove from zmodel
|
|
144
145
|
//delete this.group[this.componentScopeName].zModel[''];
|
|
145
146
|
}
|
|
@@ -156,7 +157,7 @@ export class ZudfComponent {
|
|
|
156
157
|
}
|
|
157
158
|
this.displayElementModel = this.displayElementModel ?? [];
|
|
158
159
|
this.displayElementModel.push(fieldData);
|
|
159
|
-
this.
|
|
160
|
+
this.updateFormField();
|
|
160
161
|
this.cdr.detectChanges();
|
|
161
162
|
}
|
|
162
163
|
renderFieldElement(fieldElements) {
|
|
@@ -208,8 +209,13 @@ export class ZudfComponent {
|
|
|
208
209
|
}
|
|
209
210
|
// keep a list of dropdown option variable name
|
|
210
211
|
if (this.isDropdownType(field.Type) && field.ZDataOptionName && field.DropdownOptions) {
|
|
211
|
-
this.group.zData[field.ZDataOptionName] = eval('this.' + field.DropdownOptions);
|
|
212
|
+
this.group.zData[field.ZDataOptionName] = Object.assign([], eval('this.' + field.DropdownOptions));
|
|
212
213
|
}
|
|
214
|
+
// auto append current user to the zmodel base on field element attribute "zudfSetDefaultUser"
|
|
215
|
+
if (field.zudfSetDefaultUser) {
|
|
216
|
+
this.setModelValue(field.Name, this.authService.e1Token.userName, true);
|
|
217
|
+
}
|
|
218
|
+
// validator for the component
|
|
213
219
|
const validators = ZComponentHelper.getValidators(field, isVisible, isRequired);
|
|
214
220
|
formControls[field.Value] = new FormControl(
|
|
215
221
|
// TODO: need handle if field.value + container.
|
|
@@ -248,7 +254,9 @@ export class ZudfComponent {
|
|
|
248
254
|
const gridValue = model + '_Options';
|
|
249
255
|
const gridDataSource = model + '_DataSource';
|
|
250
256
|
grp[gridDataSource] = patchedModelData[model];
|
|
251
|
-
grp[gridValue]
|
|
257
|
+
if (grp[gridValue]) {
|
|
258
|
+
grp[gridValue].setData(grp[gridDataSource]);
|
|
259
|
+
}
|
|
252
260
|
}
|
|
253
261
|
}
|
|
254
262
|
// patch formgroup model
|
|
@@ -294,7 +302,7 @@ export class ZudfComponent {
|
|
|
294
302
|
let fg = this.group[this.componentScopeName].form;
|
|
295
303
|
fg.patchValue(zModels);
|
|
296
304
|
}
|
|
297
|
-
getZModel(skipRemovePrefix) {
|
|
305
|
+
getZModel(skipRemovePrefix, skipRemoveMvgFieldValue) {
|
|
298
306
|
const zModel = this.group[this.componentScopeName].zModel;
|
|
299
307
|
// need to loop zModel, remove mvg(multi value group) zmodel. mvg data suppose to be only from the mvg grid.
|
|
300
308
|
for (let prop in zModel) {
|
|
@@ -308,7 +316,7 @@ export class ZudfComponent {
|
|
|
308
316
|
if (this.group[multiValueGroupScopeName]) {
|
|
309
317
|
const mvgField = this.group[multiValueGroupScopeName].find(record => record == prop);
|
|
310
318
|
if (mvgField) {
|
|
311
|
-
zModel[prop] = null;
|
|
319
|
+
zModel[prop] = !skipRemoveMvgFieldValue ? null : zModel[prop];
|
|
312
320
|
this.form.patchValue(zModel);
|
|
313
321
|
}
|
|
314
322
|
}
|
|
@@ -317,26 +325,28 @@ export class ZudfComponent {
|
|
|
317
325
|
}
|
|
318
326
|
// important: loop zmodel, replace prefix base by default.(allow to skip remove prefix).
|
|
319
327
|
const patchedModelData = skipRemovePrefix ? zModel : this.removeZModelPropertyPrefix(zModel);
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
328
|
+
if (this.multiValueGroupGridValue) {
|
|
329
|
+
// get all mvg grid value and put in respective object in the array.
|
|
330
|
+
this.multiValueGroupGridValue.forEach(mvgGridValue => {
|
|
331
|
+
// get grid container name. confirm will be at least 4 length.
|
|
332
|
+
// 3rd segment will be container name.
|
|
333
|
+
const mvgGridValueSegment = mvgGridValue.split('_');
|
|
334
|
+
mvgGridValueSegment.pop();
|
|
335
|
+
const containerName = skipRemovePrefix ? mvgGridValueSegment.join('_') : mvgGridValueSegment[2];
|
|
336
|
+
// get grid data
|
|
337
|
+
const mvgGrid = this.group[mvgGridValue];
|
|
338
|
+
const gridData = mvgGrid.getGridData();
|
|
339
|
+
if (gridData.length > 0) {
|
|
340
|
+
// need to remove property prefix.
|
|
341
|
+
const newGridData = [];
|
|
342
|
+
gridData.forEach(data => {
|
|
343
|
+
const patchedModelData = skipRemovePrefix ? data : this.removeZModelPropertyPrefix(data, true);
|
|
344
|
+
newGridData.push(patchedModelData);
|
|
345
|
+
});
|
|
346
|
+
patchedModelData[containerName] = newGridData;
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}
|
|
340
350
|
return patchedModelData;
|
|
341
351
|
}
|
|
342
352
|
removeZModelPropertyPrefix(zModel, getOnlyFieldName) {
|
|
@@ -476,6 +486,9 @@ export class ZudfComponent {
|
|
|
476
486
|
data.Value.push(element);
|
|
477
487
|
}
|
|
478
488
|
}
|
|
489
|
+
updateFormField() {
|
|
490
|
+
this.formFields = this.displayElementModel;
|
|
491
|
+
}
|
|
479
492
|
captureContainerFieldValueToModel(group, gridValue, gridDataSource, containerName) {
|
|
480
493
|
// get container model value, set to group grid datasource
|
|
481
494
|
group[gridDataSource].push(this.getContainerModelValue(containerName));
|
|
@@ -554,4 +567,4 @@ var ComponentType;
|
|
|
554
567
|
ComponentType["button"] = "zbuttons";
|
|
555
568
|
ComponentType["grid"] = "zgrid";
|
|
556
569
|
})(ComponentType || (ComponentType = {}));
|
|
557
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVkZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96dWRmL3p1ZGYuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenVkZi96dWRmLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQXNDLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQWtCLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELDJDQUEyQztBQUMzQyxPQUFPLEVBR0wsTUFBTSxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUMvQyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7OztBQVV6QixNQUFNLE9BQU8sYUFBYTtJQWF4QixZQUNVLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0QyxZQUEwQixFQUMxQixhQUE0QixFQUM1Qiw0QkFBMEQsRUFDMUQsR0FBc0I7UUFQdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQ0FBNEIsR0FBNUIsNEJBQTRCLENB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YTsrRkFBYixhQUFhLHdHQ3pCMUIsNnZEQWtDQTs0RkRUYSxhQUFhO2tCQUx6QixTQUFTOytCQUNFLFVBQVU7MlRBS1gsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7O0FBc25CUixJQUFLLGFBb0JKO0FBcEJELFdBQUssYUFBYTtJQUNoQiw4QkFBYSxDQUFBO0lBQ2Isc0NBQXFCLENBQUE7SUFDckIsc0NBQXFCLENBQUE7SUFDckIsaUNBQWdCLENBQUE7SUFDaEIsOEJBQWEsQ0FBQTtJQUNiLHdDQUF1QixDQUFBO0lBQ3ZCLDRDQUEyQixDQUFBO0lBQzNCLGtDQUFpQixDQUFBO0lBQ2pCLHNDQUFxQixDQUFBO0lBQ3JCLGdDQUFlLENBQUE7SUFDZiw4QkFBYSxDQUFBO0lBQ2IsZ0NBQWUsQ0FBQTtJQUNmLG9DQUFtQixDQUFBO0lBQ25CLHNDQUFxQixDQUFBO0lBQ3JCLHdEQUF1QyxDQUFBO0lBQ3ZDLG9EQUFtQyxDQUFBO0lBQ25DLG1DQUFrQixDQUFBO0lBQ2xCLG9DQUFtQixDQUFBO0lBQ25CLCtCQUFjLENBQUE7QUFDaEIsQ0FBQyxFQXBCSSxhQUFhLEtBQWIsYUFBYSxRQW9CakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBBc3luY1N1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgbWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHtcclxuICBaQ29tcG9uZW50LCBaRmllbGQsXHJcbiAgQWxlcnRTZXJ2aWNlLCBBdXRoU2VydmljZSwgRmllbGRTZXJ2aWNlLCBSZXNvdXJjZUFwaVNlcnZpY2UsIFRvYXN0U2VydmljZSwgV2ViQXBpU2VydmljZSxcclxuICBaR3JvdXAsIFpDb21wb25lbnRQcm9wZXJ0aWVzLCBaQ29tcG9uZW50SGVscGVyXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9jb21wb25lbnQtZXJyb3ItaGFuZGxlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFpHcmlkIH0gZnJvbSBcIi4uL3pncmlkL3pncmlkLmNvbXBvbmVudFwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXp1ZGYnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96dWRmLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi96dWRmLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBadWRmQ29tcG9uZW50IGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0IHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgZm9ybUZpZWxkczogYW55W107IC8vIHBvcHVsYXRlIHVzaW5nIGZpZWxkIGVsZW1lbnQuXHJcblxyXG4gIGNvbXBvbmVudFByb3BlcnRpZXMgPSBuZXcgWkNvbXBvbmVudFByb3BlcnRpZXMoKTtcclxuICBpbml0aWFsRGF0YVZhbHVlOiBhbnk7XHJcbiAgY29tcG9uZW50UHJlZml4OiBzdHJpbmc7XHJcbiAgY29tcG9uZW50U2NvcGVOYW1lOiBzdHJpbmc7XHJcbiAgZGlzcGxheUVsZW1lbnRNb2RlbDogYW55O1xyXG4gIG11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZTogc3RyaW5nW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3ZWJBcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlOiBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldENvbXBvbmVudFByb3BlcnRpZXModGhpcyk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xyXG5cclxuICAgIC8vIGtlZXAgZGF0YSBWYWx1ZVxyXG4gICAgdGhpcy5pbml0aWFsRGF0YVZhbHVlID0gdGhpcy5kYXRhLlZhbHVlO1xyXG5cclxuICAgIC8vIGRlY2xhcmF0aW9uXHJcbiAgICB0aGlzLmNvbXBvbmVudFNjb3BlTmFtZSA9ICdfenVkZl8nICsgdGhpcy5kYXRhLk5hbWU7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByZWZpeCA9ICd6dWRmXycgKyB0aGlzLmRhdGEuTmFtZTtcclxuXHJcbiAgICB0aGlzLmdyb3VwW3RoaXMuZGF0YS5OYW1lICsgJ01vZGVsJ10gPSBbXTtcclxuXHJcbiAgICB0aGlzLmxvYWRGb3JtKCk7XHJcblxyXG4gICAgLy9pZiAoWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eSh0aGlzLmRhdGEuVmFsdWUpIHx8IHRoaXMuZGF0YS5WYWx1ZS5sZW5ndGggPiAyKSB7XHJcbiAgICAvLyAgdGhpcy5sb2FkRW1wdHlGb3JtKCk7XHJcbiAgICAvL31cclxuICAgIC8vZWxzZSB7XHJcbiAgICAvLyAgdGhpcy5sb2FkWnVkZkZvcm0oKTtcclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkRm9ybSgpIHtcclxuICAgIG9mKHRydWUpLnBpcGUoXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhLlN1YlR5cGUgPSAnenVkZic7XHJcblxyXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBmaWVsZCBmb3JtXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmRhdGEuTmFtZSArICcgZGVmYXVsdCB2YWx1ZTogJyArIHRoaXMuZGF0YS5WYWx1ZSk7XHJcbiAgICAgICAgLy90aGlzLmRhdGEuVmFsdWUgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gY2hhbmdlIHp1ZGYgdG8gemRpdlxyXG4gICAgICAgIC8vdGhpcy5kYXRhLlR5cGUgPSAnemRpdic7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgZ3JvdXAgZm9yIHp1ZGZcclxuICAgICAgICBpZiAoIXRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXSA9IG5ldyBaR3JvdXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWNsYXJlIHpNb2RlbCB0byB6dWRmIGdyb3VwXHJcbiAgICAgICAgY29uc3QgenVkZlNjb3BlR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXTtcclxuICAgICAgICB6dWRmU2NvcGVHcm91cC56TW9kZWwgPSB7fTtcclxuXHJcbiAgICAgICAgLy8gcmVuZGVyIGZpZWxkIGVsZW1lbnRcclxuICAgICAgICB0aGlzLnJlbmRlckZpZWxkRWxlbWVudCh0aGlzLmRhdGEuVmFsdWUpO1xyXG5cclxuICAgICAgICAvLyBzZXQgdGhpcyBuZXcgY3JlYXRlIGZvcm0gdG8gekdyb3VwIHNjb3BlXHJcbiAgICAgICAgLy8gYmluZCBmb3JtIG9ubHkgd2hlbiBWYWx1ZSBpcyBub3QgbnVsbFxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuVmFsdWUpIHtcclxuICAgICAgICAgIHp1ZGZTY29wZUdyb3VwLmZvcm0gPSB0aGlzLmZvcm07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2w6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgICAgenVkZlNjb3BlR3JvdXAuZm9ybSA9IG5ldyBGb3JtR3JvdXAoZm9ybUNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gc2V0IHRvIGZvcm1GaWVsZCBmb3IgZGlzcGxheVxyXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IE9iamVjdC5hc3NpZ24oW10sIHRoaXMuZGF0YS5WYWx1ZSk7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9ICdhZnRlcicgKyAodGhpcy5kYXRhLk5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLmRhdGEuTmFtZS5zbGljZSgxKSkgKyAnTG9hZGVkJztcclxuICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICBpZiAodGhpcy5ncm91cFtmaWVsZE5hbWVdKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwW2ZpZWxkTmFtZV0odGhpcy5ncm91cCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHNldCBGaWVsZCBkaXYgY2xhc3NcclxuICAgICAgLy8gUmVwbGFjZWQgd2l0aDogdGhpcy5maWVsZFNlcnZpY2UucGF0Y2hGaWVsZFByb3BlcnR5KGZpZWxkKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5zZXRGaWVsZHNEaXZDbGFzcyh0aGlzLmdyb3VwLl9wcm9qZWN0TmFtZSwgdGhpcy5ncm91cC5maWVsZE5hbWUsIHRoaXMuZGF0YSwgdGhpcy5hdXRoU2VydmljZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGb3JtQ29udHJvbFZhbGlkYXRpb24oZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogYW55KSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXJGaWVsZEVsZW1lbnRCeUpzb25TdHJpbmcoZ3JvdXA6IFpHcm91cCwganNvblN0cmluZzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBmaWVsZEVsZW1lbnRNYXN0ZXJDb2RlSnNvbkFycmF5ID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcclxuICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KGZpZWxkRWxlbWVudE1hc3RlckNvZGVKc29uQXJyYXkpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIERpc3BsYXkgbW9kZWxcclxuICBwdWJsaWMgc2V0RGlzcGxheU1vZGVsKHZhbHVlOiBhbnkpIHtcclxuICAgIC8vIHJlcGxhY2UgdGhlIHdob2xlIGRpc3BsYXkgbW9kZWxcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLmNsZWFyRm9ybUNvbnRyb2woKTtcclxuXHJcbiAgICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHZhbHVlIHVzZWQgZm9yIHJlbmRlciB6dWRmICcgKyB0aGlzLmRhdGEuTmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGlzcGxheU1vZGVsKHZhbHVlOiBhbnksIGZsYXRJbmRleDogc3RyaW5nKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnVwZGF0ZUFycmF5T2JqZWN0QnlGbGF0SW5kZXgodGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsLCBmbGF0SW5kZXgsIHZhbHVlKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhcHBlbmRUb0Rpc3BsYXlNb2RlbCh2YWx1ZTogYW55LCBmbGF0SW5kZXg6IHN0cmluZykge1xyXG4gICAgLy8gYXBwZW5kIHRvIGRpc3BsYXkgbW9kZWwgbWVhbiBpdCB3aWxsIGJhc2Ugb24gZmxhdCBpbmRleCB0byBpbnNlcnQgdGhlIGZvcm0gY29udHJvbC5cclxuICAgIGlmIChmbGF0SW5kZXgubGVuZ3RoID49IDMpIHtcclxuICAgICAgZmxhdEluZGV4LnN1YnN0cmluZygwLCBmbGF0SW5kZXgubGVuZ3RoIC0gMik7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0ZWRSZWNvcmQgPSBaQ29tcG9uZW50SGVscGVyLmdldEZyb21BcnJheU9iamVjdEJ5RmxhdEluZGV4KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCwgZmxhdEluZGV4KTtcclxuICAgIHNlbGVjdGVkUmVjb3JkLlZhbHVlLnB1c2godmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERpc3BsYXlNb2RlbCgpIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUFsbERpc3BsYXlNb2RlbCgpIHtcclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IFtdO1xyXG4gICAgdGhpcy5jbGVhckZvcm1Db250cm9sKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudEZyb21EaXNwbGF5TW9kZWwoZmxhdEluZGV4OiBzdHJpbmcpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVtb3ZlQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCk7XHJcbiAgICB0aGlzLmZvcm1GaWVsZHMgPSB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWw7XHJcblxyXG4gICAgLy8gVE9ETzogcmVtb3ZlIGZyb20gem1vZGVsXHJcbiAgICAvL2RlbGV0ZSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWxbJyddO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gIC8vI3JlZ2lvbiBmdW5jdGlvbiBmb3IgZm9ybSBjb250cm9sLlxyXG4gIHB1YmxpYyBhcHBlbmRGb3JtQ29udHJvbChmaWVsZERhdGE6IFpGaWVsZCkge1xyXG4gICAgLy8gYXBwZW5kIGZvcm0gY29udHJvbCBtZWFuIGl0IHdpbGwganVzdCBpbnNlcnQgdGhlIGZvcm0gY29udHJvbCBhdCB0aGUgbGFzdCAgXHJcbiAgICBmaWVsZERhdGEuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGREYXRhLk5hbWUsIGZpZWxkRGF0YVsnY29udGFpbmVyTmFtZSddKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9sczogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB9ID0ge307XHJcblxyXG4gICAgZm9ybUNvbnRyb2xzW2ZpZWxkRGF0YS5OYW1lXSA9IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgdGhpcy5ncm91cFsnX3p1ZGZfZm9ybVByZXZpZXcnXS56TW9kZWxbZmllbGREYXRhLk5hbWVdXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGZpZWxkRGF0YS5OYW1lLCBmb3JtQ29udHJvbHNbZmllbGREYXRhLk5hbWVdKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZm9ybUZpZWxkcykge1xyXG4gICAgICBjb25zb2xlLmxvZygnZm9ybUZpZWxkICcgKyB0aGlzLmRhdGEuTmFtZSArICcgaXMgdW5kZWZpbmVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsID0gdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsID8/IFtdO1xyXG4gICAgdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsLnB1c2goZmllbGREYXRhKTtcclxuICAgIHRoaXMuZm9ybUZpZWxkcyA9IHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbDtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXJGaWVsZEVsZW1lbnQoZmllbGRFbGVtZW50czogYW55KSB7XHJcbiAgICBpZiAoZmllbGRFbGVtZW50cykge1xyXG4gICAgICBjb25zdCBmb3JtQ29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICBmaWVsZEVsZW1lbnRzID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9scyhmaWVsZEVsZW1lbnRzLCBmb3JtQ29udHJvbHMpO1xyXG5cclxuICAgICAgLy8gcmVuZGVyIGZvcm0gY29udHJvbCB0byBuZXcgZm9ybWdyb3VwXHJcbiAgICAgIHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoZm9ybUNvbnRyb2xzKTtcclxuICAgICAgdGhpcy5mb3JtRmllbGRzID0gZmllbGRFbGVtZW50cztcclxuICAgICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uZm9ybSA9IHRoaXMuZm9ybTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVGb3JtQ29udHJvbHMoZmllbGRBcnJheTogYW55LCBmb3JtQ29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSwgY29udGFpbmVyTmFtZT86IHN0cmluZykge1xyXG4gICAgZmllbGRBcnJheS5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgdGhpcy5maWVsZFNlcnZpY2UucGF0Y2hGaWVsZFByb3BlcnR5KGZpZWxkKTtcclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZC5WYWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiBmaWVsZC5WYWx1ZS5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcclxuICAgICAgICBpZiAoWyd6Z3JpZCcsICd6dHJlZScsICd6aW1nJywgJ3RleHRhcmVhanNvbiddLmluZGV4T2YoZmllbGQuVHlwZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJGb3JtQ29udHJvbCAtIGludmFsaWQgZmllbGQgdmFsdWVcIiwgZmllbGQuVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5WYWx1ZSkpIHtcclxuICAgICAgICAgIC8vIGluc2VydCBtdWx0aXZhbHVlZ3JvdXAgdG8gdGhlIGNhcmQgdmFsdWUgaWYgdHJ1ZVxyXG4gICAgICAgICAgaWYgKGZpZWxkLk11bHRpVmFsdWVkR3JvdXApIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRNdWx0aVZhbHVlR3JvdXAoZmllbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9scyhmaWVsZC5WYWx1ZSwgZm9ybUNvbnRyb2xzLCBmaWVsZC5OYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAvLyBiZWZvcmUgZ2VuZXJhdGUgRm9ybUNvbnRyb2wsIHdlIG5lZWQgdG8gYWRkIDIgYXR0cmlidXRlIHRvIHRoZSBmaWVsZCB3aGVuIHJlbmRlci5cclxuICAgICAgICAgIC8vIHRoaXMgZm9yIGxhdGVyIG9uLCB3ZSBjYW4gZWFzaWx5IGtub3cgdGhpcyBmaWVsZCBiZWxvbmcgdG8gd2hpY2ggenVkZiBhbmQgdW5kZXIgd2hpY2ggY29udGFpbmVyLiBcclxuICAgICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIGZpZWxkWydjb250YWluZXJOYW1lJ10gPSBjb250YWluZXJOYW1lOztcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVtjb250YWluZXJOYW1lXSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdW2NvbnRhaW5lck5hbWVdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBpc0Zvcm1Db250cm9sID0gWkNvbXBvbmVudEhlbHBlci5pc0Zvcm1Db250cm9sKGZpZWxkKTtcclxuICAgICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IFpDb21wb25lbnRIZWxwZXIuaXNWaXNpYmxlRm9ybUNvbnRyb2wodGhpcywgZmllbGQpO1xyXG4gICAgICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IFpDb21wb25lbnRIZWxwZXIuaXNSZXF1aXJlZEZvcm1Db250cm9sKHRoaXMsIGZpZWxkKTtcclxuXHJcbiAgICAgICAgICBpZiAoaXNGb3JtQ29udHJvbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBmaWVsZC5OYW1lID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZC5OYW1lLCBjb250YWluZXJOYW1lKTtcclxuICAgICAgICAgICAgZmllbGQuVmFsdWUgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGZpZWxkLlZhbHVlLCBjb250YWluZXJOYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVtjb250YWluZXJOYW1lXS5pbmNsdWRlcyhmaWVsZC5WYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdW2NvbnRhaW5lck5hbWVdLnB1c2goZmllbGQuVmFsdWUpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBrZWVwIGEgbGlzdCBvZiBkcm9wZG93biBvcHRpb24gdmFyaWFibGUgbmFtZSBcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93blR5cGUoZmllbGQuVHlwZSkgJiYgZmllbGQuWkRhdGFPcHRpb25OYW1lICYmIGZpZWxkLkRyb3Bkb3duT3B0aW9ucykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ3JvdXAuekRhdGFbZmllbGQuWkRhdGFPcHRpb25OYW1lXSA9IGV2YWwoJ3RoaXMuJyArIGZpZWxkLkRyb3Bkb3duT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBaQ29tcG9uZW50SGVscGVyLmdldFZhbGlkYXRvcnMoZmllbGQsIGlzVmlzaWJsZSwgaXNSZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sc1tmaWVsZC5WYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZCBoYW5kbGUgaWYgZmllbGQudmFsdWUgKyBjb250YWluZXIuXHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsW2ZpZWxkLlZhbHVlXSxcclxuICAgICAgICAgICAgICB2YWxpZGF0b3JzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmIChaQ29tcG9uZW50SGVscGVyLmhhc0NDRmllbGQoZmllbGQuVHlwZSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBjY1ZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBaQ29tcG9uZW50SGVscGVyLmdldENDVmFsaWRhdG9ycyhmaWVsZCwgaXNWaXNpYmxlLCBpc1JlcXVpcmVkKTtcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbHNbZmllbGQuQ0NWYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWxbZmllbGQuQ0NWYWx1ZV0sXHJcbiAgICAgICAgICAgICAgICBjY1ZhbGlkYXRvcnNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIG9uY2hhbmdlIGhhbmRsaW5nP1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBmaWVsZEFycmF5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRm9ybUNvbnRyb2woKSB7XHJcbiAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgdGhpcy5mb3JtLnJlbW92ZUNvbnRyb2woZGF0YS5WYWx1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGEuVmFsdWUgPSB0aGlzLmluaXRpYWxEYXRhVmFsdWU7XHJcblxyXG4gICAgdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsID0gW107XHJcbiAgICB0aGlzLmZvcm1GaWVsZHMgPSBbXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtQ29udHJvbCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1GaWVsZHM7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGZ1bmN0aW9uIGZvciBfenVkZiBzY29wZSB6bW9kZWwuIFxyXG4gIHB1YmxpYyBzZXRGb3JtRmllbGR6TW9kZWwoZ3JvdXA6IFpHcm91cCwgbW9kZWxEYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGdycCA9IGdyb3VwID8gZ3JvdXAgOiB0aGlzLmdyb3VwO1xyXG4gICAgY29uc3QgcGF0Y2hlZE1vZGVsRGF0YSA9IHRoaXMuYWRkWk1vZGVsUHJvcGVydHlQcmVmaXgobW9kZWxEYXRhKTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGdycFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsLCBwYXRjaGVkTW9kZWxEYXRhKTtcclxuXHJcbiAgICAvLyBuZWVkIGluc2VydCBhcnJheSB2YWx1ZSB0byB0aGUgZ3JpZC5cclxuICAgIGZvciAodmFyIG1vZGVsIGluIHBhdGNoZWRNb2RlbERhdGEpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0Y2hlZE1vZGVsRGF0YVttb2RlbF0pKSB7XHJcbiAgICAgICAgY29uc3QgZ3JpZFZhbHVlID0gbW9kZWwgKyAnX09wdGlvbnMnO1xyXG4gICAgICAgIGNvbnN0IGdyaWREYXRhU291cmNlID0gbW9kZWwgKyAnX0RhdGFTb3VyY2UnO1xyXG5cclxuICAgICAgICBncnBbZ3JpZERhdGFTb3VyY2VdID0gcGF0Y2hlZE1vZGVsRGF0YVttb2RlbF07XHJcbiAgICAgICAgZ3JwW2dyaWRWYWx1ZV0uc2V0RGF0YShncnBbZ3JpZERhdGFTb3VyY2VdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHBhdGNoIGZvcm1ncm91cCBtb2RlbFxyXG4gICAgY29uc3QgZmcgPSB0aGlzLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgZmcucGF0Y2hWYWx1ZShncnBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFpNb2RlbFByb3BlcnR5UHJlZml4KG1vZGVsRGF0YTogYW55LCBjb250YWluZXJQcmVmaXg/OiBhbnkpIHtcclxuICAgIGNvbnN0IHBhdGNoZWRNb2RlbERhdGEgPSB7fTtcclxuICAgIC8vIGxvb3AgcHJvcGVydHlcclxuICAgIGZvciAodmFyIG1vZGVsIGluIG1vZGVsRGF0YSkge1xyXG4gICAgICAvLyBmaXJzdCB0aGluZyBjaGVjayB0aGUgdmFsdWUgaXMgaXQgYXJyYXkuXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsRGF0YVttb2RlbF0pKSB7XHJcbiAgICAgICAgLy8gYXJyYXkgc3BlY2lhbCBoYW5kbGluZ1xyXG4gICAgICAgIGxldCBtb2RlbFByb3BlcnR5ID0gbW9kZWw7XHJcbiAgICAgICAgaWYgKCFtb2RlbC5pbmNsdWRlcyh0aGlzLmNvbXBvbmVudFByZWZpeCkpIHtcclxuICAgICAgICAgIG1vZGVsUHJvcGVydHkgPSBbdGhpcy5jb21wb25lbnRQcmVmaXgsIG1vZGVsXS5qb2luKCdfJyk7XHJcbiAgICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW21vZGVsUHJvcGVydHldID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIGFycmF5IHZhbHVlLCBtZWFuICAgdW5kZXIgYSBjb250YWluZXIuIHdpbGwgbmVlZCB0byBwYXNzIG1vZGVsIGF0IGNvbnRhaW5lciBwcmVmaXggZm9yIHByb3BlcnR5IG5hbWUuIFxyXG4gICAgICAgIC8vIGxvb3AgYXJyYXkgdmFsdWUsIHBhdGNoIHByb3BlcnR5IG5hbWVcclxuICAgICAgICBtb2RlbERhdGFbbW9kZWxdLmZvckVhY2goYXJyYXlNb2RlbCA9PiB7XHJcbiAgICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW21vZGVsUHJvcGVydHldLnB1c2godGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChhcnJheU1vZGVsLCBtb2RlbCkpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gbm9uZSBhcnJheSwganVzdCBwYXRjaCB0aGUgcHJvcGVydHkgbmFtZVxyXG4gICAgICAgIGxldCBwcmVmaXhlZE1vZGVsID0gbnVsbDtcclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsRGF0YSwgbW9kZWwpKSB7XHJcbiAgICAgICAgICBpZiAoIW1vZGVsLmluY2x1ZGVzKHRoaXMuY29tcG9uZW50UHJlZml4KSkge1xyXG4gICAgICAgICAgICBwcmVmaXhlZE1vZGVsID0gW3RoaXMuY29tcG9uZW50UHJlZml4LCBjb250YWluZXJQcmVmaXggPz8gY29udGFpbmVyUHJlZml4LCBtb2RlbF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ18nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcGF0Y2hlZE1vZGVsRGF0YVtwcmVmaXhlZE1vZGVsXSA9IG1vZGVsRGF0YVttb2RlbF07XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHBhdGNoZWRNb2RlbERhdGE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TW9kZWxWYWx1ZShtb2RlbE5hbWU6IHN0cmluZywgbW9kZWxWYWx1ZTogYW55LCBza2lwUHJlZml4PzogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgek1vZGVscyA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbDtcclxuICAgIGNvbnN0IHpNb2RlbE5hbWUgPSBza2lwUHJlZml4ID8gbW9kZWxOYW1lIDogdGhpcy5jb21wb25lbnRQcmVmaXggKyAnXycgKyBtb2RlbE5hbWU7XHJcbiAgICB6TW9kZWxzW3pNb2RlbE5hbWVdID0gbW9kZWxWYWx1ZTtcclxuXHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgZmcucGF0Y2hWYWx1ZSh6TW9kZWxzKTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgZ2V0Wk1vZGVsKHNraXBSZW1vdmVQcmVmaXg/OiBib29sZWFuKSB7XHJcbiAgICBjb25zdCB6TW9kZWwgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWw7XHJcblxyXG4gICAgLy8gbmVlZCB0byBsb29wIHpNb2RlbCwgcmVtb3ZlIG12ZyhtdWx0aSB2YWx1ZSBncm91cCkgem1vZGVsLiBtdmcgZGF0YSBzdXBwb3NlIHRvIGJlIG9ubHkgZnJvbSB0aGUgbXZnIGdyaWQuXHJcbiAgICBmb3IgKGxldCBwcm9wIGluIHpNb2RlbCkge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHpNb2RlbCwgcHJvcCkpIHtcclxuICAgICAgICBjb25zdCBwcm9wU2VnbWVudCA9IHByb3Auc3BsaXQoJ18nKTtcclxuXHJcbiAgICAgICAgLy8gYmFzZSBvbiBhcyBsb25nIG1vcmUgdGhlbiAzIHNlZ21lbnQodHlwZSwgenVkZiBuYW1lLCBjb250YWluZXIgbmFtZSwgZmllbGQgbmFtZSkgaXQgbWVhbiBjb250YWluZXIgem1vZGVsIHZhbHVlXHJcbiAgICAgICAgaWYgKHByb3BTZWdtZW50Lmxlbmd0aCA+IDMpIHtcclxuICAgICAgICAgIC8vIHNlZ21lbnQgMiB3aWxsIGJlIGNvbnRhaW5lciBuYW1lXHJcbiAgICAgICAgICAvLyBtYXRjaCB0byBzZWUgaXMgdGhlIHByb3BlcnR5IG5hbWUgdW5kZXIgdGhlIG11bHRpVmFsdWVHcm91cCBTY29wZS5cclxuICAgICAgICAgIGNvbnN0IG11bHRpVmFsdWVHcm91cFNjb3BlTmFtZSA9IFsnbXZnJywgcHJvcFNlZ21lbnRbMl1dLmpvaW4oJ18nKTtcclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgbXZnRmllbGQgPSB0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0uZmluZChyZWNvcmQgPT4gcmVjb3JkID09IHByb3ApO1xyXG4gICAgICAgICAgICBpZiAobXZnRmllbGQpIHtcclxuICAgICAgICAgICAgICB6TW9kZWxbcHJvcF0gPSBudWxsO1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHpNb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBpbXBvcnRhbnQ6IGxvb3Agem1vZGVsLCByZXBsYWNlIHByZWZpeCBiYXNlIGJ5IGRlZmF1bHQuKGFsbG93IHRvIHNraXAgcmVtb3ZlIHByZWZpeCkuXHJcbiAgICBjb25zdCBwYXRjaGVkTW9kZWxEYXRhID0gc2tpcFJlbW92ZVByZWZpeCA/IHpNb2RlbCA6IHRoaXMucmVtb3ZlWk1vZGVsUHJvcGVydHlQcmVmaXgoek1vZGVsKTtcclxuICAgICBcclxuICAgIC8vIGdldCBhbGwgbXZnIGdyaWQgdmFsdWUgYW5kIHB1dCBpbiByZXNwZWN0aXZlIG9iamVjdCBpbiB0aGUgYXJyYXkuXHJcbiAgICB0aGlzLm11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZS5mb3JFYWNoKG12Z0dyaWRWYWx1ZSA9PiB7XHJcbiAgICAgIC8vIGdldCBncmlkIGNvbnRhaW5lciBuYW1lLiBjb25maXJtIHdpbGwgYmUgYXQgbGVhc3QgNCBsZW5ndGguXHJcbiAgICAgIC8vIDNyZCBzZWdtZW50IHdpbGwgYmUgY29udGFpbmVyIG5hbWUuXHJcbiAgICAgIGNvbnN0IG12Z0dyaWRWYWx1ZVNlZ21lbnQgPSBtdmdHcmlkVmFsdWUuc3BsaXQoJ18nKTtcclxuICAgICAgbXZnR3JpZFZhbHVlU2VnbWVudC5wb3AoKTtcclxuICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IHNraXBSZW1vdmVQcmVmaXggPyBtdmdHcmlkVmFsdWVTZWdtZW50LmpvaW4oJ18nKSA6IG12Z0dyaWRWYWx1ZVNlZ21lbnRbMl07XHJcblxyXG4gICAgICAvLyBnZXQgZ3JpZCBkYXRhXHJcbiAgICAgIGNvbnN0IG12Z0dyaWQgPSB0aGlzLmdyb3VwW212Z0dyaWRWYWx1ZV0gYXMgWkdyaWQ7XHJcbiAgICAgIGNvbnN0IGdyaWREYXRhID0gbXZnR3JpZC5nZXRHcmlkRGF0YSgpO1xyXG5cclxuICAgICAgaWYgKGdyaWREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyBuZWVkIHRvIHJlbW92ZSBwcm9wZXJ0eSBwcmVmaXguXHJcbiAgICAgICAgY29uc3QgbmV3R3JpZERhdGEgPSBbXTtcclxuICAgICAgICBncmlkRGF0YS5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcGF0Y2hlZE1vZGVsRGF0YSA9IHNraXBSZW1vdmVQcmVmaXggPyBkYXRhIDogdGhpcy5yZW1vdmVaTW9kZWxQcm9wZXJ0eVByZWZpeChkYXRhLCB0cnVlKTtcclxuICAgICAgICAgIG5ld0dyaWREYXRhLnB1c2gocGF0Y2hlZE1vZGVsRGF0YSk7XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgcGF0Y2hlZE1vZGVsRGF0YVtjb250YWluZXJOYW1lXSA9IG5ld0dyaWREYXRhO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcGF0Y2hlZE1vZGVsRGF0YTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlWk1vZGVsUHJvcGVydHlQcmVmaXgoek1vZGVsOiBhbnksIGdldE9ubHlGaWVsZE5hbWU/OiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBwYXRjaGVkTW9kZWxEYXRhID0ge307XHJcbiAgICBmb3IgKGxldCBwcm9wIGluIHpNb2RlbCkge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHpNb2RlbCwgcHJvcCkpIHtcclxuICAgICAgICBjb25zdCBwcm9wU2VnbWVudCA9IHByb3Auc3BsaXQoJ18nKTtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRPbmx5RmllbGROYW1lID8gcHJvcFNlZ21lbnRbcHJvcFNlZ21lbnQubGVuZ3RoIC0gMV0gOiBwcm9wLnJlcGxhY2UodGhpcy5jb21wb25lbnRQcmVmaXggKyAnXycsICcnKTtcclxuICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0gPSB6TW9kZWxbcHJvcF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGF0Y2hlZE1vZGVsRGF0YTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgZ2V0Wk1vZGVsQXNTdHJpbmcoKSB7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRaTW9kZWwoKSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGNvbW1vbiBmdW5jdGlvbiBcclxuICBDb21wb25lbnRJc1Zpc2libGUoZmllbGQ6IFpGaWVsZCk6IGFueSB7XHJcbiAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5Db21wb25lbnRJc1Zpc2libGUoZmllbGQsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEVuYWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5ID0gIXN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaXNpYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSA9IHN0YXR1cztcclxuICAgIHRoaXMuZGF0YS5WaXNpYmxlID0gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJlcXVpcmUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZCA9IHN0YXR1cztcclxuICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGNvbnRyb2xOYW1lOiBzdHJpbmcsIGNvbnRhaW5lck5hbWU/OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG1haW5QcmVmaXggPSBbdGhpcy5kYXRhLlR5cGUsIHRoaXMuZGF0YS5OYW1lLCBjb250YWluZXJOYW1lID8/IG51bGxdLmZpbHRlcihCb29sZWFuKS5qb2luKCdfJyk7XHJcblxyXG4gICAgLy8gY2hlY2sgaXMgbmFtZSBiZWVuIHByZWZpeGVkIFxyXG4gICAgaWYgKGNvbnRyb2xOYW1lLmluY2x1ZGVzKG1haW5QcmVmaXgpKSB7XHJcbiAgICAgIHJldHVybiBjb250cm9sTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyB3ZSB0cnkgdG8gc3BsaXQgdGhlIG5hbWUgYW5kIHVzZSB0aGUgbGFzdCBzZWdtZW50LlxyXG4gICAgICAvLyBzb21ldGltZSB0aGUgY29udHJvbG5hbWUgY2FuIGJlIHdpdGhvdXQgdGhlIGNvbnRhaW5lciBuYW1lLCBzbyB3ZSBzcGxpdCBhbmQgdXNlIHRoZSBuZXcgbWFpblByZWZpeFxyXG4gICAgICBjb25zdCBjb250cm9sTmFtZVNlZ21lbnQgPSBjb250cm9sTmFtZS5zcGxpdCgnXycpO1xyXG4gICAgICBjb250cm9sTmFtZSA9IGNvbnRyb2xOYW1lU2VnbWVudFtjb250cm9sTmFtZVNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFttYWluUHJlZml4LCBjb250cm9sTmFtZV0uam9pbignXycpO1xyXG4gIH1cclxuICAgXHJcbiAgcHJpdmF0ZSBhcHBlbmRQcmVmaXgoZmllbGRzOiBaRmllbGRbXSwgcHJlZml4OiBhbnkpIHtcclxuICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuVmFsdWUpKSB7XHJcbiAgICAgICAgdGhpcy5hcHBlbmRQcmVmaXgoZmllbGQuVmFsdWUsIHByZWZpeCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZmllbGQuTmFtZSA9IFtwcmVmaXgsIGZpZWxkLk5hbWVdLmpvaW4oJ18nKTtcclxuICAgICAgICBpZiAoZmllbGQuVHlwZSAhPSAnemJ1dHRvbnMnKSB7XHJcbiAgICAgICAgICBmaWVsZC5WYWx1ZSA9IFtwcmVmaXgsIGZpZWxkLlZhbHVlXS5qb2luKCdfJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpZWxkLlN1YlR5cGUgPSBwcmVmaXg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHVibGljIGdldENvbnRhaW5lck1vZGVsVmFsdWUoY29udGFpbmVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV1bY29udGFpbmVyTmFtZV07XHJcblxyXG4gICAgY29uc3QgbW9kZWxWYWx1ZSA9IHt9O1xyXG4gICAgY29udGFpbmVyRWxlbWVudC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBtb2RlbFZhbHVlW2VsZW1lbnRdID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsW2VsZW1lbnRdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG1vZGVsVmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJDb250YWluZXJGaWVsZEVsZW1lbnRWYWx1ZShjb250YWluZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVtjb250YWluZXJOYW1lXTtcclxuICAgIGNvbnRhaW5lckVsZW1lbnQuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgdGhpcy5zZXRNb2RlbFZhbHVlKGVsZW1lbnQsIG51bGwsIHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gLS0tLS0tLS0tLT09PT09PT09PT09PT09PT09PT09IE11bHRpIFZhbHVlIEdyb3VwID09PT09PT09PT09PT09PT09PT09LS0tLS0tLS0tLSovXHJcbiAgcHVibGljIHNldE11bHRpVmFsdWVHcm91cChkYXRhOiBhbnksIGRhdGFJbmRleD86IGFueSkge1xyXG4gICAgLy8gbmVlZCB0byBkZWNsYXJlIG5hbWUsIHZhbHVlLCBkYXRhc291cmNlLCBjb2x1bW5maWVsZHMgYXR0cmlidXRlIGZvciBncmlkLiBcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGRhdGEuTmFtZSk7XHJcbiAgICBjb25zdCBncmlkVmFsdWUgPSBuYW1lICsgJ19PcHRpb25zJztcclxuICAgIGNvbnN0IGdyaWREYXRhU291cmNlID0gbmFtZSArICdfRGF0YVNvdXJjZSc7XHJcbiAgICBjb25zdCBncmlkQ29sdW1uRmllbGRzID0gbmFtZSArICdfQ29sdW1uRmllbGRzJztcclxuICAgIGNvbnN0IG11bHRpVmFsdWVHcm91cFNjb3BlTmFtZSA9IFsnbXZnJywgZGF0YS5OYW1lXS5qb2luKCdfJyk7XHJcbiAgICB0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0gPSBbXTtcclxuXHJcbiAgICAgLy8gc3RvcmUgZ3JpZCBWYWx1ZSBuYW1lLiBjYW4gYmUgdXNlIGluIGdldFpNb2RlbCB0byBnZXQgdGhlIGdyaWQgZGF0YS4gXHJcbiAgICB0aGlzLm11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZSA9IHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlID8/IFtdO1xyXG4gICAgdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUucHVzaChncmlkVmFsdWUpO1xyXG4gICAgXHJcbiAgICAvLyBhZGQgdG8gZ3JpZCBlbGVtZW50IGF0dHJpYnV0ZVxyXG4gICAgLy8gd29udCBuZWVkIHRvIGRlcGVuZCBvbiBmaWVsZCBlbGVtZW50IHNvIGFzIHRvIHNwZWVkIHVwIHRoZSBsb2FkaW5nIHNwZWVkLlxyXG4gICAgY29uc3QgZWxlbWVudCA9IHtcclxuICAgICAgXCJBZGRDb21tYW5kQnV0dG9uTmFtZVwiOiBcIkFkZFwiLFxyXG4gICAgICBcIkFsbG93RXhwb3J0XCI6IGZhbHNlLFxyXG4gICAgICBcIkFsbG93R3JpZERhdGFFeHBvcnRcIjogZmFsc2UsXHJcbiAgICAgIFwiQWxsb3dNdWx0aVNlbGVjdFwiOiBmYWxzZSxcclxuICAgICAgXCJBbGxvd1Jvd1NlbGVjdFwiOiBmYWxzZSxcclxuICAgICAgXCJBbGxvd1NhdmVTdGF0ZVwiOiBmYWxzZSxcclxuICAgICAgXCJDb2x1bW5GaWVsZHNcIjogJ2dyb3VwLicgKyBncmlkQ29sdW1uRmllbGRzLFxyXG4gICAgICBcIkRhdGFTb3VyY2VcIjogJ2dyb3VwLicgKyBncmlkRGF0YVNvdXJjZSxcclxuICAgICAgXCJEaXNhYmxlQ2VsbENsaWNrSGFuZGxlclwiOiB0cnVlLFxyXG4gICAgICBcIkRpc2FibGVHZW5lcmF0ZUNvbHVtbkJ5Rm9ybVwiOiB0cnVlLFxyXG4gICAgICBcIkRpdkNsYXNzXCI6ICdjb2wteHMtMTIgY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTInLFxyXG4gICAgICBcIkVuYWJsZUN1c3RvbUFkZENvbW1hbmRcIjogdHJ1ZSxcclxuICAgICAgXCJFbmFibGVDdXN0b21SZW1vdmVDb21tYW5kXCI6IHRydWUsXHJcbiAgICAgIFwiRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kXCI6IHRydWUsXHJcbiAgICAgIFwiRW5hYmxlU2F2ZUdyaWRTdGF0ZVwiOiBmYWxzZSxcclxuICAgICAgXCJFeHRlcm5hbFBhZ2luYXRpb25cIjogZmFsc2UsXHJcbiAgICAgIFwiSGVpZ2h0UmVkdWNlXCI6IDI1MCxcclxuICAgICAgXCJMaW1pdEZpZWxkc1wiOiBmYWxzZSxcclxuICAgICAgXCJOYW1lXCI6IG5hbWUsXHJcbiAgICAgIFwiUGFnZVNpemVcIjogMjAsXHJcbiAgICAgIFwiUGFnZVNpemVzXCI6IGZhbHNlLFxyXG4gICAgICBcIlJlc291cmNlVVJMXCI6IHRydWUsXHJcbiAgICAgIFwiU2VsZWN0T3B0aW9uc1wiOiBmYWxzZSxcclxuICAgICAgXCJTaG93R3JpZEVkaXRCdXR0b25cIjogZmFsc2UsXHJcbiAgICAgIFwiU3ViVHlwZVwiOiBcInp1ZGZcIixcclxuICAgICAgXCJUeXBlXCI6IFwiemdyaWRcIixcclxuICAgICAgXCJWYWx1ZVwiOiAnZ3JvdXAuJyArIGdyaWRWYWx1ZSxcclxuICAgICAgXCJWaXNpYmxlXCI6IHRydWUsXHJcbiAgICAgIFwiV2lkdGhSZWR1Y2VcIjogNTAwXHJcbiAgICB9XHJcblxyXG4gICAgLy8gY3JlYXRlIHByb3BlcnR5IGluIHRoZSBncm91cCBiYXNlIG9uIGFib3ZlIGRlY2xhcmF0aW9uIGV4Y2VwdCBOYW1lIGFuZCBhbHNvIGluc2VydCBjb2x1bW4gZmllbGQuXHJcbiAgICAvLyB1c2UgZ3JvdXBpbmcgdmFsdWUgYXMgY29sdW1uLiBza2lwIGluc2VydCBhbnkgY29udGFpbmVyIHR5cGUuXHJcbiAgICBjb25zdCBjb250YWluZXJOYW1lID0gZGF0YS5OYW1lO1xyXG4gICAgY29uc3QgZ3JvdXBGaWVsZEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgZGF0YS5WYWx1ZS5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgY29uc3QgZmllbGRNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkKTtcclxuICAgICAgZmllbGRNb2RlbFsnRGlzcGxheU5hbWUnXSA9IGZpZWxkTW9kZWwuTGFiZWw7XHJcbiAgICAgIGZpZWxkTW9kZWwuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGRNb2RlbFsnTmFtZSddLCBjb250YWluZXJOYW1lKTtcclxuICAgICAgZmllbGRNb2RlbC5WYWx1ZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGRNb2RlbFsnVmFsdWUnXSwgY29udGFpbmVyTmFtZSk7XHJcblxyXG4gICAgICBncm91cEZpZWxkRWxlbWVudHMucHVzaChmaWVsZE1vZGVsKTtcclxuXHJcbiAgICAgIC8vIHRoaXMgZm9yIHRhbGx5IGFuZCByZW1vdmUgem1vZGVsIHdoZW4gZ2V0bW9kZWwoKS5cclxuICAgICAgLy8gbm90IHN1cHBvc2UgdG8gc2F2ZSB6bW9kZWwgZmllbGQgdmFsdWUgc2luY2UgaXQgdmFsdWUgc3VwcG9zZSB0byBhZGQgdG8gdGhlIGdyaWQuXHJcbiAgICAgIHRoaXMuZ3JvdXBbbXVsdGlWYWx1ZUdyb3VwU2NvcGVOYW1lXS5wdXNoKGZpZWxkTW9kZWwuVmFsdWUpO1xyXG5cclxuICAgIH0pO1xyXG4gICAgdGhpcy5ncm91cFtncmlkRGF0YVNvdXJjZV0gPSBbXTtcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZENvbHVtbkZpZWxkc10gPSBncm91cEZpZWxkRWxlbWVudHM7XHJcblxyXG4gICAgLy8gZ3JpZCBjb2x1bW4gdG8gYmFzZSBvbiBmaWVsZCBlbGVtZW50IGFuZCBpbnNlcnQgdG8gZ3JpZCBjb2x1bW4uIFxyXG4gICAgdGhpcy5ncm91cFtuYW1lICsgJ19DdXN0b21BZGRCdXR0b25PbkNsaWNrJ10gPSB0aGlzLmNhcHR1cmVDb250YWluZXJGaWVsZFZhbHVlVG9Nb2RlbC5iaW5kKHRoaXMsIHRoaXMuZ3JvdXAsIGdyaWRWYWx1ZSwgZ3JpZERhdGFTb3VyY2UsIGNvbnRhaW5lck5hbWUpOyAvL196dWRmX2Zvcm1QcmV2aWV3XHJcbiAgICB0aGlzLmdyb3VwW25hbWUgKyAnX0N1c3RvbVJlc2V0QnV0dG9uT25DbGljayddID0gdGhpcy5jbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlLmJpbmQodGhpcywgdGhpcy5ncm91cCwgY29udGFpbmVyTmFtZSk7IC8vX3p1ZGZfZm9ybVByZXZpZXdcclxuICAgIHRoaXMuZ3JvdXBbbmFtZSArICdfQ3VzdG9tUmVtb3ZlQnV0dG9uT25DbGljayddID0gdGhpcy5yZW1vdmVHcmlkUm93LmJpbmQodGhpcywgZ3JpZFZhbHVlLCBncmlkRGF0YVNvdXJjZSk7IC8vX3p1ZGZfZm9ybVByZXZpZXdcclxuXHJcbiAgICBpZiAoZGF0YUluZGV4KSB7XHJcbiAgICAgIHRoaXMuYXBwZW5kVG9EaXNwbGF5TW9kZWwoZWxlbWVudCwgZGF0YUluZGV4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkYXRhLlZhbHVlLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhcHR1cmVDb250YWluZXJGaWVsZFZhbHVlVG9Nb2RlbChncm91cDogWkdyb3VwLCBncmlkVmFsdWU6IGFueSwgZ3JpZERhdGFTb3VyY2U6IGFueSwgY29udGFpbmVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICAvLyBnZXQgY29udGFpbmVyIG1vZGVsIHZhbHVlLCBzZXQgdG8gZ3JvdXAgZ3JpZCBkYXRhc291cmNlXHJcbiAgICBncm91cFtncmlkRGF0YVNvdXJjZV0ucHVzaCh0aGlzLmdldENvbnRhaW5lck1vZGVsVmFsdWUoY29udGFpbmVyTmFtZSkpO1xyXG5cclxuICAgIC8vIHNldCBkYXRhc291cmNlIHRvIGdyaWRcclxuICAgIGdyb3VwW2dyaWRWYWx1ZV0uc2V0RGF0YSh0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlXSk7XHJcblxyXG4gICAgLy8gY2xlYXIgY29udGFpbmVyIGZpZWxkIHZhbHVlXHJcbiAgICB0aGlzLmNsZWFyQ29udGFpbmVyUmVsYXRlZEZpZWxkVmFsdWUoZ3JvdXAsIGNvbnRhaW5lck5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlKGdyb3VwOiBaR3JvdXAsIGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gYWZ0ZXIgc2V0IHRvIGdyaWQsIGNsZWFyIHRoZSB6bW9kZWwuIFxyXG4gICAgdGhpcy5jbGVhckNvbnRhaW5lckZpZWxkRWxlbWVudFZhbHVlKGNvbnRhaW5lck5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVHcmlkUm93KGdyaWRWYWx1ZTogYW55LCBncmlkRGF0YVNvdXJjZTogYW55LCBkYXRhSXRlbTogYW55LCBpbmRleDogYW55KSB7XHJcbiAgICB0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlXS5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgIC8vIHNldCBkYXRhc291cmNlIHRvIGdyaWRcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZFZhbHVlXS5zZXREYXRhKHRoaXMuZ3JvdXBbZ3JpZERhdGFTb3VyY2VdKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBmdW5jdGlvbiBmb3IgY29tcG9uZW50IGV2ZW50XHJcbiAgLy8jZW5kcmVncmlvblxyXG5cclxuICAvLyBUT0RPOiB0byBiZSBjb25zaWRlciB0byBhZGQgdG8gWkNvbXBvbmVudEhlbHBlciBcclxuXHJcbiAgcHJpdmF0ZSBpc0Ryb3Bkb3duVHlwZShkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudERhdGFUeXBlID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gZGF0YSA6IGRhdGEuVHlwZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChjb21wb25lbnREYXRhVHlwZSA9PSBDb21wb25lbnRUeXBlLmRyb3Bkb3duIHx8IGNvbXBvbmVudERhdGFUeXBlID09IENvbXBvbmVudFR5cGUuenVpc2VsZWN0bXVsdGlwbGUgfHwgY29tcG9uZW50RGF0YVR5cGUgPT0gQ29tcG9uZW50VHlwZS56c2VsZWN0bXVsdGlwbGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHZhbGlkYXRlQW5kU2hvd0Vycm9yTWVzc2FnZSgpIHtcclxuICAgIGNvbnN0IGZnID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZS5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKHRoaXMuZ3JvdXAsIGZnKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFZhbGlkYXRlZEZvcm1aTW9kZWwoKSB7XHJcbiAgICBjb25zdCBpc1ZhbGlkRm9ybSA9IHRoaXMudmFsaWRhdGVBbmRTaG93RXJyb3JNZXNzYWdlKCk7XHJcblxyXG4gICAgaWYgKGlzVmFsaWRGb3JtKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFpNb2RlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybjtcclxuICB9XHJcbn1cclxuXHJcbmVudW0gQ29tcG9uZW50VHlwZSB7XHJcbiAgdGV4dCA9ICd0ZXh0JyxcclxuICB0ZXh0YXJlYSA9ICd0ZXh0YXJlYScsXHJcbiAgY2hlY2tib3ggPSAnY2hlY2tib3gnLFxyXG4gIGxhYmVsID0gJ3psYWJlbCcsXHJcbiAgZGF0ZSA9ICdkYXRlJyxcclxuICB6ZGF0ZXRpbWUgPSAnemRhdGV0aW1lJyxcclxuICB6dWlkYXRldGltZSA9ICd6dWlkYXRldGltZScsXHJcbiAgbnVtYmVyID0gJ251bWJlcicsXHJcbiAgem51bWVyaWMgPSAnem51bWVyaWMnLFxyXG4gIGVtYWlsID0gJ2VtYWlsJyxcclxuICBmaWxlID0gJ2ZpbGUnLFxyXG4gIHByaWNlID0gJ3ByaWNlJyxcclxuICB3ZWJzaXRlID0gJ3dlYnNpdGUnLFxyXG4gIGRyb3Bkb3duID0gJ2Ryb3Bkb3duJyxcclxuICB6dWlzZWxlY3RtdWx0aXBsZSA9ICd6dWlzZWxlY3RtdWx0aXBsZScsXHJcbiAgenNlbGVjdG11bHRpcGxlID0gJ3pzZWxlY3RtdWx0aXBsZScsXHJcbiAgZ3JvdXBpbmcgPSAna2NhcmQnLFxyXG4gIGJ1dHRvbiA9ICd6YnV0dG9ucycsXHJcbiAgZ3JpZCA9ICd6Z3JpZCdcclxufVxyXG4iLCI8ZGl2IHN0eWxlPVwicGFkZGluZzogMTVweFwiICpuZ0lmPVwiZGF0YS5UaXRsZSAmJiAoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSlcIiB3aWR0aD1cIjEwMCVcIj5cclxuICA8a2VuZG8tY2FyZCAqbmdJZj1cImRhdGEuVGl0bGVcIiB3aWR0aD1cIjEwMCVcIj5cclxuICAgIDxrZW5kby1jYXJkLWhlYWRlcj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiY2FyZC1oZWFkZXItdGl0bGVcIj57e2RhdGEuVGl0bGV9fTwvaW9uLWxhYmVsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwva2VuZG8tY2FyZC1oZWFkZXI+XHJcbiAgICA8a2VuZG8tY2FyZC1ib2R5PlxyXG4gICAgICA8YXBwLXpmb3JtY29udHJvbCBbbmdDbGFzc109XCJncm91cFtmaWVsZC5pc1Zpc2libGVGaWVsZF0gPyBmaWVsZC5EaXZDbGFzcyA6ICgoZmllbGQuVmlzaWJsZSA9PT0gdHJ1ZSkgPyAgZmllbGQuRGl2Q2xhc3MgOiAnZmxleC1oaWRlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZm9ybUZpZWxkcyB8IGRpdnpsYXlvdXQ6IGRhdGEuemxheW91dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7ZmllbGQuTmFtZX19XCI+XHJcbiAgICAgIDwvYXBwLXpmb3JtY29udHJvbD5cclxuICAgIDwva2VuZG8tY2FyZC1ib2R5PlxyXG4gIDwva2VuZG8tY2FyZD5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiIWRhdGEuVGl0bGUgJiYgKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCIgd2lkdGg9XCIxMDAlXCI+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcbiAgICA8aW9uLWdyaWQgd2lkdGg9XCIxMDAlXCI+XHJcbiAgICAgIDxpb24tcm93IGlkPVwiZHluYW1pYy1mb3JtLWhvc3RcIiBjbGFzcz1cImlvbi1hbGlnbi1pdGVtcy1zdGFydFwiPlxyXG4gICAgICAgIDxhcHAtemZvcm1jb250cm9sIFtuZ0NsYXNzXT1cImdyb3VwW2ZpZWxkLmlzVmlzaWJsZUZpZWxkXSA/IGZpZWxkLkRpdkNsYXNzIDogKChmaWVsZC5WaXNpYmxlID09PSB0cnVlKSA/ICBmaWVsZC5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvcm1GaWVsZHMgfCBkaXZ6bGF5b3V0OiBkYXRhLnpsYXlvdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7ZmllbGQuTmFtZX19XCI+XHJcbiAgICAgICAgPC9hcHAtemZvcm1jb250cm9sPlxyXG4gICAgICA8L2lvbi1yb3c+XHJcbiAgICA8L2lvbi1ncmlkPlxyXG4gIDwvZm9ybT5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
570
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVkZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96dWRmL3p1ZGYuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenVkZi96dWRmLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYsNkJBQTZCO0FBRTdCLDhCQUE4QjtBQUM5QixPQUFPLEVBQXNDLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQWtCLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELDJDQUEyQztBQUMzQyxPQUFPLEVBR0wsTUFBTSxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUMvQyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7OztBQVV6QixNQUFNLE9BQU8sYUFBYTtJQWF4QixZQUNVLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0QyxZQUEwQixFQUMxQixhQUE0QixFQUM1Qiw0QkFBMEQsRUFDMUQsR0FBc0I7UUFQdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQThCO1FBQzFELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBZmhDLHdCQUFtQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQTBhMUMsY0FBUyxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFTSxlQUFVLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDN0IsQ0FBQyxDQUFBO1FBRU0sZUFBVSxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDN0MsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkgsQ0FBQyxDQUFBO0lBdGFHLENBQUM7SUFFTCxRQUFRO1FBQ04sZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUV4QyxjQUFjO1FBQ2QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUVoRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUUxQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEIsNkZBQTZGO1FBQzdGLHlCQUF5QjtRQUN6QixHQUFHO1FBQ0gsUUFBUTtRQUNSLHdCQUF3QjtRQUN4QixHQUFHO0lBQ0wsQ0FBQztJQUVPLFFBQVE7UUFDZCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNYLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFFM0IsNENBQTRDO1lBQzVDLHFFQUFxRTtZQUNyRSx1QkFBdUI7WUFFdkIsc0JBQXNCO1lBQ3RCLDBCQUEwQjtRQUM1QixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDO2FBQ2xEO1lBRUQsK0JBQStCO1lBQy9CLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDM0QsY0FBYyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFFM0IsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXpDLDJDQUEyQztZQUMzQyx3Q0FBd0M7WUFDeEMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDbkIsY0FBYyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2pDO2lCQUNJO2dCQUNILE1BQU0sV0FBVyxHQUFtQyxFQUFFLENBQUM7Z0JBQ3ZELGNBQWMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbEQ7UUFDSCxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZixNQUFNLFNBQVMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQzFHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNuQzthQUNGO1lBQ0Qsc0JBQXNCO1lBQ3RCLDhEQUE4RDtZQUM5RCxrSEFBa0g7UUFDcEgsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sd0JBQXdCLENBQUMsZUFBdUIsRUFBRSxTQUFjO1FBQ3JFLFFBQVEsQ0FBQztJQUNYLENBQUM7SUFFTSw4QkFBOEIsQ0FBQyxLQUFhLEVBQUUsVUFBa0I7UUFDckUsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCx1QkFBdUI7SUFDaEIsZUFBZSxDQUFDLEtBQVU7UUFDL0Isa0NBQWtDO1FBQ2xDLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFeEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRTdELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUNuRDthQUNJO1lBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RFO0lBQ0gsQ0FBQztJQUVNLGtCQUFrQixDQUFDLEtBQVUsRUFBRSxTQUFpQjtRQUNyRCxnQkFBZ0IsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QiwyQkFBMkI7SUFDN0IsQ0FBQztJQUVNLG9CQUFvQixDQUFDLEtBQVUsRUFBRSxTQUFpQjtRQUN2RCxzRkFBc0Y7UUFDdEYsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUN6QixTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNHLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxlQUFlO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVNLHFCQUFxQjtRQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSw2QkFBNkIsQ0FBQyxTQUFpQjtRQUNwRCxnQkFBZ0IsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLDJCQUEyQjtRQUMzQix3REFBd0Q7SUFDMUQsQ0FBQztJQUNELFlBQVk7SUFHWixvQ0FBb0M7SUFDN0IsaUJBQWlCLENBQUMsU0FBaUI7UUFDeEMsOEVBQThFO1FBQzlFLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDMUYsTUFBTSxZQUFZLEdBQW1DLEVBQUUsQ0FBQztRQUV4RCxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVyxDQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FDdkQsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sa0JBQWtCLENBQUMsYUFBa0I7UUFDMUMsSUFBSSxhQUFhLEVBQUU7WUFDakIsTUFBTSxZQUFZLEdBQW1DLEVBQUUsQ0FBQztZQUN4RCxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUV2RSx1Q0FBdUM7WUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFVBQWUsRUFBRSxZQUE0QyxFQUFFLGFBQXNCO1FBQ2hILFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUN6RSxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDaEU7YUFDRjtpQkFDSTtnQkFDSCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUM5QixtREFBbUQ7b0JBQ25ELElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFO3dCQUMxQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2hDO29CQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2xFO3FCQUNJO29CQUNILG9GQUFvRjtvQkFDcEYsb0dBQW9HO29CQUNwRyxJQUFJLGFBQWEsRUFBRTt3QkFDakIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQzt3QkFBQSxDQUFDO3dCQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRTs0QkFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7eUJBQ3pEO3FCQUNGO29CQUVELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNyRSxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBRXZFLElBQUksYUFBYSxLQUFLLElBQUksRUFBRTt3QkFDMUIsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQzt3QkFDckUsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQzt3QkFFdkUsSUFBSSxhQUFhLEVBQUU7NEJBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0NBQzdFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTs2QkFDckU7eUJBQ0Y7d0JBRUQsZ0RBQWdEO3dCQUNoRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTs0QkFDckYsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7eUJBQ3BHO3dCQUVELDhGQUE4Rjt3QkFDOUYsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEVBQUU7NEJBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7eUJBQ3pFO3dCQUVELDhCQUE4Qjt3QkFDOUIsTUFBTSxVQUFVLEdBQWtCLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO3dCQUMvRixZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksV0FBVzt3QkFDekMsZ0RBQWdEO3dCQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQ3ZELFVBQVUsQ0FDWCxDQUFDO3dCQUNGLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDM0MsTUFBTSxZQUFZLEdBQWtCLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDOzRCQUNuRyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksV0FBVyxDQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQ3pELFlBQVksQ0FDYixDQUFDO3lCQUNIO3dCQUNELHFCQUFxQjtxQkFFdEI7aUJBQ0Y7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFFeEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUNELFlBQVk7SUFHWiwyQ0FBMkM7SUFDcEMsa0JBQWtCLENBQUMsS0FBYSxFQUFFLFNBQWM7UUFDckQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFckUsdUNBQXVDO1FBQ3ZDLEtBQUssSUFBSSxLQUFLLElBQUksZ0JBQWdCLEVBQUU7WUFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQzFDLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxVQUFVLENBQUM7Z0JBQ3JDLE1BQU0sY0FBYyxHQUFHLEtBQUssR0FBRyxhQUFhLENBQUM7Z0JBRTdDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ2xCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7U0FDRjtRQUVELHdCQUF3QjtRQUN4QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBaUIsQ0FBQztRQUNsQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsU0FBYyxFQUFFLGVBQXFCO1FBQ25FLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLGdCQUFnQjtRQUNoQixLQUFLLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRTtZQUMzQiwyQ0FBMkM7WUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNuQyx5QkFBeUI7Z0JBQ3pCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUN6QyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEQsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUN0QztnQkFDRCw0R0FBNEc7Z0JBQzVHLHdDQUF3QztnQkFDeEMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDcEMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDeEYsQ0FBQyxDQUFDLENBQUE7YUFDSDtpQkFDSTtnQkFDSCwyQ0FBMkM7Z0JBQzNDLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFO29CQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7d0JBQ3pDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsZUFBZSxJQUFJLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUM3RztpQkFDRjtnQkFDRCxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEQ7U0FDRjtRQUFBLENBQUM7UUFFRixPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFTSxhQUFhLENBQUMsU0FBaUIsRUFBRSxVQUFlLEVBQUUsVUFBb0I7UUFDM0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDM0QsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQztRQUNuRixPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBRWpDLElBQUksRUFBRSxHQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBaUIsQ0FBQztRQUMxRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFHTSxTQUFTLENBQUMsZ0JBQTBCLEVBQUUsdUJBQWlDO1FBQzVFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDO1FBRTFELDRHQUE0RztRQUM1RyxLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRXBDLGtIQUFrSDtnQkFDbEgsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDMUIsbUNBQW1DO29CQUNuQyxxRUFBcUU7b0JBQ3JFLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNuRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsRUFBRTt3QkFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQzt3QkFDckYsSUFBSSxRQUFRLEVBQUU7NEJBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDOUI7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsd0ZBQXdGO1FBQ3hGLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdGLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ2pDLG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNuRCw4REFBOEQ7Z0JBQzlELHNDQUFzQztnQkFDdEMsTUFBTSxtQkFBbUIsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRCxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWhHLGdCQUFnQjtnQkFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQVUsQ0FBQztnQkFDbEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUV2QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN2QixrQ0FBa0M7b0JBQ2xDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztvQkFDdkIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDdEIsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUMvRixXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQ3JDLENBQUMsQ0FBQyxDQUFBO29CQUVGLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLFdBQVcsQ0FBQztpQkFDL0M7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRU8sMEJBQTBCLENBQUMsTUFBVyxFQUFFLGdCQUEwQjtRQUN4RSxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUM1QixLQUFLLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDM0gsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQy9DO1NBQ0Y7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFHTSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxZQUFZO0lBR1osMEJBQTBCO0lBQzFCLGtCQUFrQixDQUFDLEtBQWE7UUFDOUIsT0FBTyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFnQk0sT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU0sdUJBQXVCLENBQUMsV0FBbUIsRUFBRSxhQUFzQjtRQUN4RSxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXJHLCtCQUErQjtRQUMvQixJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxXQUFXLENBQUM7U0FDcEI7YUFDSTtZQUNILHFEQUFxRDtZQUNyRCxxR0FBcUc7WUFDckcsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDakU7UUFFRCxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sWUFBWSxDQUFDLE1BQWdCLEVBQUUsTUFBVztRQUNoRCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN4QztpQkFDSTtnQkFDSCxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxVQUFVLEVBQUU7b0JBQzVCLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDL0M7Z0JBQ0QsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7YUFDeEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxZQUFZO0lBRUwsc0JBQXNCLENBQUMsYUFBcUI7UUFDakQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTVFLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN0QixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVNLCtCQUErQixDQUFDLGFBQXFCO1FBQzFELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDJGQUEyRjtJQUNwRixrQkFBa0IsQ0FBQyxJQUFTLEVBQUUsU0FBZTtRQUNsRCw2RUFBNkU7UUFDN0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQ3BDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxhQUFhLENBQUM7UUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsZUFBZSxDQUFDO1FBQ2hELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXpDLHdFQUF3RTtRQUN6RSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixJQUFJLEVBQUUsQ0FBQztRQUNwRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlDLGdDQUFnQztRQUNoQyw0RUFBNEU7UUFDNUUsTUFBTSxPQUFPLEdBQUc7WUFDZCxzQkFBc0IsRUFBRSxLQUFLO1lBQzdCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLHFCQUFxQixFQUFFLEtBQUs7WUFDNUIsa0JBQWtCLEVBQUUsS0FBSztZQUN6QixnQkFBZ0IsRUFBRSxLQUFLO1lBQ3ZCLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsY0FBYyxFQUFFLFFBQVEsR0FBRyxnQkFBZ0I7WUFDM0MsWUFBWSxFQUFFLFFBQVEsR0FBRyxjQUFjO1lBQ3ZDLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsNkJBQTZCLEVBQUUsSUFBSTtZQUNuQyxVQUFVLEVBQUUseUNBQXlDO1lBQ3JELHdCQUF3QixFQUFFLElBQUk7WUFDOUIsMkJBQTJCLEVBQUUsSUFBSTtZQUNqQywwQkFBMEIsRUFBRSxJQUFJO1lBQ2hDLHFCQUFxQixFQUFFLEtBQUs7WUFDNUIsb0JBQW9CLEVBQUUsS0FBSztZQUMzQixjQUFjLEVBQUUsR0FBRztZQUNuQixhQUFhLEVBQUUsS0FBSztZQUNwQixNQUFNLEVBQUUsSUFBSTtZQUNaLFVBQVUsRUFBRSxFQUFFO1lBQ2QsV0FBVyxFQUFFLEtBQUs7WUFDbEIsYUFBYSxFQUFFLElBQUk7WUFDbkIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsb0JBQW9CLEVBQUUsS0FBSztZQUMzQixTQUFTLEVBQUUsTUFBTTtZQUNqQixNQUFNLEVBQUUsT0FBTztZQUNmLE9BQU8sRUFBRSxRQUFRLEdBQUcsU0FBUztZQUM3QixTQUFTLEVBQUUsSUFBSTtZQUNmLGFBQWEsRUFBRSxHQUFHO1NBQ25CLENBQUE7UUFFRCxtR0FBbUc7UUFDbkcsZ0VBQWdFO1FBQ2hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDaEMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDN0MsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2xGLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUVwRixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFcEMsb0RBQW9EO1lBQ3BELG9GQUFvRjtZQUNwRixJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztRQUVsRCxtRUFBbUU7UUFDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcseUJBQXlCLENBQUMsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7UUFDM0ssSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1FBQ2hKLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLDRCQUE0QixDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtRQUUvSCxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDL0M7YUFDSTtZQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDN0MsQ0FBQztJQUVPLGlDQUFpQyxDQUFDLEtBQWEsRUFBRSxTQUFjLEVBQUUsY0FBbUIsRUFBRSxhQUFxQjtRQUNqSCwwREFBMEQ7UUFDMUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUV2RSx5QkFBeUI7UUFDekIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFckQsOEJBQThCO1FBQzlCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLCtCQUErQixDQUFDLEtBQWEsRUFBRSxhQUFxQjtRQUMxRSx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLCtCQUErQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxhQUFhLENBQUMsU0FBYyxFQUFFLGNBQW1CLEVBQUUsUUFBYSxFQUFFLEtBQVU7UUFDbEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTVDLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELFlBQVk7SUFFWixzQ0FBc0M7SUFDdEMsYUFBYTtJQUViLG1EQUFtRDtJQUUzQyxjQUFjLENBQUMsSUFBUztRQUM5QixNQUFNLGlCQUFpQixHQUFHLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXBGLElBQUksaUJBQWlCLElBQUksYUFBYSxDQUFDLFFBQVEsSUFBSSxpQkFBaUIsSUFBSSxhQUFhLENBQUMsaUJBQWlCLElBQUksaUJBQWlCLElBQUksYUFBYSxDQUFDLGVBQWUsRUFBRTtZQUM3SixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sMkJBQTJCO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFpQixDQUFDO1FBRWxDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFO1lBQ2IsSUFBSSxDQUFDLDRCQUE0QixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUUsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLHNCQUFzQjtRQUMzQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUV2RCxJQUFJLFdBQVcsRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3pCO1FBRUQsT0FBTztJQUNULENBQUM7OzJHQXJvQlUsYUFBYTsrRkFBYixhQUFhLHdHQ3pCMUIsNnZEQWtDQTs0RkRUYSxhQUFhO2tCQUx6QixTQUFTOytCQUNFLFVBQVU7MlRBS1gsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7O0FBcW9CUixJQUFLLGFBb0JKO0FBcEJELFdBQUssYUFBYTtJQUNoQiw4QkFBYSxDQUFBO0lBQ2Isc0NBQXFCLENBQUE7SUFDckIsc0NBQXFCLENBQUE7SUFDckIsaUNBQWdCLENBQUE7SUFDaEIsOEJBQWEsQ0FBQTtJQUNiLHdDQUF1QixDQUFBO0lBQ3ZCLDRDQUEyQixDQUFBO0lBQzNCLGtDQUFpQixDQUFBO0lBQ2pCLHNDQUFxQixDQUFBO0lBQ3JCLGdDQUFlLENBQUE7SUFDZiw4QkFBYSxDQUFBO0lBQ2IsZ0NBQWUsQ0FBQTtJQUNmLG9DQUFtQixDQUFBO0lBQ25CLHNDQUFxQixDQUFBO0lBQ3JCLHdEQUF1QyxDQUFBO0lBQ3ZDLG9EQUFtQyxDQUFBO0lBQ25DLG1DQUFrQixDQUFBO0lBQ2xCLG9DQUFtQixDQUFBO0lBQ25CLCtCQUFjLENBQUE7QUFDaEIsQ0FBQyxFQXBCSSxhQUFhLEtBQWIsYUFBYSxRQW9CakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBBc3luY1N1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgbWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHtcclxuICBaQ29tcG9uZW50LCBaRmllbGQsXHJcbiAgQWxlcnRTZXJ2aWNlLCBBdXRoU2VydmljZSwgRmllbGRTZXJ2aWNlLCBSZXNvdXJjZUFwaVNlcnZpY2UsIFRvYXN0U2VydmljZSwgV2ViQXBpU2VydmljZSxcclxuICBaR3JvdXAsIFpDb21wb25lbnRQcm9wZXJ0aWVzLCBaQ29tcG9uZW50SGVscGVyXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9jb21wb25lbnQtZXJyb3ItaGFuZGxlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFpHcmlkIH0gZnJvbSBcIi4uL3pncmlkL3pncmlkLmNvbXBvbmVudFwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXp1ZGYnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96dWRmLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi96dWRmLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBadWRmQ29tcG9uZW50IGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0IHtcclxuICBASW5wdXQoKSBkYXRhOiBaRmllbGQ7XHJcbiAgQElucHV0KCkgZ3JvdXA6IFpHcm91cDtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgZm9ybUZpZWxkczogYW55W107IC8vIHBvcHVsYXRlIHVzaW5nIGZpZWxkIGVsZW1lbnQuXHJcblxyXG4gIGNvbXBvbmVudFByb3BlcnRpZXMgPSBuZXcgWkNvbXBvbmVudFByb3BlcnRpZXMoKTtcclxuICBpbml0aWFsRGF0YVZhbHVlOiBhbnk7XHJcbiAgY29tcG9uZW50UHJlZml4OiBzdHJpbmc7XHJcbiAgY29tcG9uZW50U2NvcGVOYW1lOiBzdHJpbmc7XHJcbiAgZGlzcGxheUVsZW1lbnRNb2RlbDogYW55O1xyXG4gIG11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZTogc3RyaW5nW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3ZWJBcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlOiBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldENvbXBvbmVudFByb3BlcnRpZXModGhpcyk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnJlZ2lzdGVyQ29tcG9uZW50KHRoaXMpO1xyXG5cclxuICAgIC8vIGtlZXAgZGF0YSBWYWx1ZVxyXG4gICAgdGhpcy5pbml0aWFsRGF0YVZhbHVlID0gdGhpcy5kYXRhLlZhbHVlO1xyXG5cclxuICAgIC8vIGRlY2xhcmF0aW9uXHJcbiAgICB0aGlzLmNvbXBvbmVudFNjb3BlTmFtZSA9ICdfenVkZl8nICsgdGhpcy5kYXRhLk5hbWU7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByZWZpeCA9ICd6dWRmXycgKyB0aGlzLmRhdGEuTmFtZTtcclxuXHJcbiAgICB0aGlzLmdyb3VwW3RoaXMuZGF0YS5OYW1lICsgJ01vZGVsJ10gPSBbXTtcclxuXHJcbiAgICB0aGlzLmxvYWRGb3JtKCk7XHJcblxyXG4gICAgLy9pZiAoWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eSh0aGlzLmRhdGEuVmFsdWUpIHx8IHRoaXMuZGF0YS5WYWx1ZS5sZW5ndGggPiAyKSB7XHJcbiAgICAvLyAgdGhpcy5sb2FkRW1wdHlGb3JtKCk7XHJcbiAgICAvL31cclxuICAgIC8vZWxzZSB7XHJcbiAgICAvLyAgdGhpcy5sb2FkWnVkZkZvcm0oKTtcclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkRm9ybSgpIHtcclxuICAgIG9mKHRydWUpLnBpcGUoXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhLlN1YlR5cGUgPSAnenVkZic7XHJcblxyXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBmaWVsZCBmb3JtXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmRhdGEuTmFtZSArICcgZGVmYXVsdCB2YWx1ZTogJyArIHRoaXMuZGF0YS5WYWx1ZSk7XHJcbiAgICAgICAgLy90aGlzLmRhdGEuVmFsdWUgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gY2hhbmdlIHp1ZGYgdG8gemRpdlxyXG4gICAgICAgIC8vdGhpcy5kYXRhLlR5cGUgPSAnemRpdic7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgZ3JvdXAgZm9yIHp1ZGZcclxuICAgICAgICBpZiAoIXRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXSA9IG5ldyBaR3JvdXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWNsYXJlIHpNb2RlbCB0byB6dWRmIGdyb3VwXHJcbiAgICAgICAgY29uc3QgenVkZlNjb3BlR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXTtcclxuICAgICAgICB6dWRmU2NvcGVHcm91cC56TW9kZWwgPSB7fTtcclxuXHJcbiAgICAgICAgLy8gcmVuZGVyIGZpZWxkIGVsZW1lbnRcclxuICAgICAgICB0aGlzLnJlbmRlckZpZWxkRWxlbWVudCh0aGlzLmRhdGEuVmFsdWUpO1xyXG5cclxuICAgICAgICAvLyBzZXQgdGhpcyBuZXcgY3JlYXRlIGZvcm0gdG8gekdyb3VwIHNjb3BlXHJcbiAgICAgICAgLy8gYmluZCBmb3JtIG9ubHkgd2hlbiBWYWx1ZSBpcyBub3QgbnVsbFxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEuVmFsdWUpIHtcclxuICAgICAgICAgIHp1ZGZTY29wZUdyb3VwLmZvcm0gPSB0aGlzLmZvcm07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2w6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgICAgenVkZlNjb3BlR3JvdXAuZm9ybSA9IG5ldyBGb3JtR3JvdXAoZm9ybUNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gc2V0IHRvIGZvcm1GaWVsZCBmb3IgZGlzcGxheVxyXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IE9iamVjdC5hc3NpZ24oW10sIHRoaXMuZGF0YS5WYWx1ZSk7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9ICdhZnRlcicgKyAodGhpcy5kYXRhLk5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLmRhdGEuTmFtZS5zbGljZSgxKSkgKyAnTG9hZGVkJztcclxuICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICBpZiAodGhpcy5ncm91cFtmaWVsZE5hbWVdKSB7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwW2ZpZWxkTmFtZV0odGhpcy5ncm91cCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIHNldCBGaWVsZCBkaXYgY2xhc3NcclxuICAgICAgLy8gUmVwbGFjZWQgd2l0aDogdGhpcy5maWVsZFNlcnZpY2UucGF0Y2hGaWVsZFByb3BlcnR5KGZpZWxkKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5zZXRGaWVsZHNEaXZDbGFzcyh0aGlzLmdyb3VwLl9wcm9qZWN0TmFtZSwgdGhpcy5ncm91cC5maWVsZE5hbWUsIHRoaXMuZGF0YSwgdGhpcy5hdXRoU2VydmljZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGb3JtQ29udHJvbFZhbGlkYXRpb24oZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogYW55KSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXJGaWVsZEVsZW1lbnRCeUpzb25TdHJpbmcoZ3JvdXA6IFpHcm91cCwganNvblN0cmluZzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBmaWVsZEVsZW1lbnRNYXN0ZXJDb2RlSnNvbkFycmF5ID0gSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcclxuICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KGZpZWxkRWxlbWVudE1hc3RlckNvZGVKc29uQXJyYXkpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIERpc3BsYXkgbW9kZWxcclxuICBwdWJsaWMgc2V0RGlzcGxheU1vZGVsKHZhbHVlOiBhbnkpIHtcclxuICAgIC8vIHJlcGxhY2UgdGhlIHdob2xlIGRpc3BsYXkgbW9kZWxcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLmNsZWFyRm9ybUNvbnRyb2woKTtcclxuXHJcbiAgICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHZhbHVlIHVzZWQgZm9yIHJlbmRlciB6dWRmICcgKyB0aGlzLmRhdGEuTmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlRGlzcGxheU1vZGVsKHZhbHVlOiBhbnksIGZsYXRJbmRleDogc3RyaW5nKSB7ICBcclxuICAgIFpDb21wb25lbnRIZWxwZXIudXBkYXRlQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCwgdmFsdWUpOyBcclxuICAgIHRoaXMudXBkYXRlRm9ybUZpZWxkKCk7XHJcbiAgICAvL3RoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhcHBlbmRUb0Rpc3BsYXlNb2RlbCh2YWx1ZTogYW55LCBmbGF0SW5kZXg6IHN0cmluZykge1xyXG4gICAgLy8gYXBwZW5kIHRvIGRpc3BsYXkgbW9kZWwgbWVhbiBpdCB3aWxsIGJhc2Ugb24gZmxhdCBpbmRleCB0byBpbnNlcnQgdGhlIGZvcm0gY29udHJvbC5cclxuICAgIGlmIChmbGF0SW5kZXgubGVuZ3RoID49IDMpIHtcclxuICAgICAgZmxhdEluZGV4LnN1YnN0cmluZygwLCBmbGF0SW5kZXgubGVuZ3RoIC0gMik7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0ZWRSZWNvcmQgPSBaQ29tcG9uZW50SGVscGVyLmdldEZyb21BcnJheU9iamVjdEJ5RmxhdEluZGV4KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCwgZmxhdEluZGV4KTtcclxuICAgIHNlbGVjdGVkUmVjb3JkLlZhbHVlLnB1c2godmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERpc3BsYXlNb2RlbCgpIHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUFsbERpc3BsYXlNb2RlbCgpIHtcclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IFtdO1xyXG4gICAgdGhpcy5jbGVhckZvcm1Db250cm9sKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudEZyb21EaXNwbGF5TW9kZWwoZmxhdEluZGV4OiBzdHJpbmcpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVtb3ZlQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG5cclxuICAgIC8vIFRPRE86IHJlbW92ZSBmcm9tIHptb2RlbFxyXG4gICAgLy9kZWxldGUgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsWycnXTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAvLyNyZWdpb24gZnVuY3Rpb24gZm9yIGZvcm0gY29udHJvbC5cclxuICBwdWJsaWMgYXBwZW5kRm9ybUNvbnRyb2woZmllbGREYXRhOiBaRmllbGQpIHtcclxuICAgIC8vIGFwcGVuZCBmb3JtIGNvbnRyb2wgbWVhbiBpdCB3aWxsIGp1c3QgaW5zZXJ0IHRoZSBmb3JtIGNvbnRyb2wgYXQgdGhlIGxhc3QgIFxyXG4gICAgZmllbGREYXRhLk5hbWUgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGZpZWxkRGF0YS5OYW1lLCBmaWVsZERhdGFbJ2NvbnRhaW5lck5hbWUnXSk7XHJcbiAgICBjb25zdCBmb3JtQ29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG5cclxuICAgIGZvcm1Db250cm9sc1tmaWVsZERhdGEuTmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgIHRoaXMuZ3JvdXBbJ196dWRmX2Zvcm1QcmV2aWV3J10uek1vZGVsW2ZpZWxkRGF0YS5OYW1lXVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChmaWVsZERhdGEuTmFtZSwgZm9ybUNvbnRyb2xzW2ZpZWxkRGF0YS5OYW1lXSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmZvcm1GaWVsZHMpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2Zvcm1GaWVsZCAnICsgdGhpcy5kYXRhLk5hbWUgKyAnIGlzIHVuZGVmaW5lZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA/PyBbXTtcclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbC5wdXNoKGZpZWxkRGF0YSk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlckZpZWxkRWxlbWVudChmaWVsZEVsZW1lbnRzOiBhbnkpIHtcclxuICAgIGlmIChmaWVsZEVsZW1lbnRzKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sczogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB9ID0ge307XHJcbiAgICAgIGZpZWxkRWxlbWVudHMgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xzKGZpZWxkRWxlbWVudHMsIGZvcm1Db250cm9scyk7XHJcblxyXG4gICAgICAvLyByZW5kZXIgZm9ybSBjb250cm9sIHRvIG5ldyBmb3JtZ3JvdXBcclxuICAgICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cChmb3JtQ29udHJvbHMpO1xyXG4gICAgICB0aGlzLmZvcm1GaWVsZHMgPSBmaWVsZEVsZW1lbnRzO1xyXG4gICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS5mb3JtID0gdGhpcy5mb3JtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUZvcm1Db250cm9scyhmaWVsZEFycmF5OiBhbnksIGZvcm1Db250cm9sczogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB9LCBjb250YWluZXJOYW1lPzogc3RyaW5nKSB7XHJcbiAgICBmaWVsZEFycmF5LmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICB0aGlzLmZpZWxkU2VydmljZS5wYXRjaEZpZWxkUHJvcGVydHkoZmllbGQpO1xyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkLlZhbHVlID09PSBcInN0cmluZ1wiICYmIGZpZWxkLlZhbHVlLmluZGV4T2YoXCIuXCIpICE9PSAtMSkge1xyXG4gICAgICAgIGlmIChbJ3pncmlkJywgJ3p0cmVlJywgJ3ppbWcnLCAndGV4dGFyZWFqc29uJ10uaW5kZXhPZihmaWVsZC5UeXBlKSA9PT0gLTEpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcIkZvcm1Db250cm9sIC0gaW52YWxpZCBmaWVsZCB2YWx1ZVwiLCBmaWVsZC5WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgICAgLy8gaW5zZXJ0IG11bHRpdmFsdWVncm91cCB0byB0aGUgY2FyZCB2YWx1ZSBpZiB0cnVlXHJcbiAgICAgICAgICBpZiAoZmllbGQuTXVsdGlWYWx1ZWRHcm91cCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldE11bHRpVmFsdWVHcm91cChmaWVsZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xzKGZpZWxkLlZhbHVlLCBmb3JtQ29udHJvbHMsIGZpZWxkLk5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGJlZm9yZSBnZW5lcmF0ZSBGb3JtQ29udHJvbCwgd2UgbmVlZCB0byBhZGQgMiBhdHRyaWJ1dGUgdG8gdGhlIGZpZWxkIHdoZW4gcmVuZGVyLlxyXG4gICAgICAgICAgLy8gdGhpcyBmb3IgbGF0ZXIgb24sIHdlIGNhbiBlYXNpbHkga25vdyB0aGlzIGZpZWxkIGJlbG9uZyB0byB3aGljaCB6dWRmIGFuZCB1bmRlciB3aGljaCBjb250YWluZXIuIFxyXG4gICAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcclxuICAgICAgICAgICAgZmllbGRbJ2NvbnRhaW5lck5hbWUnXSA9IGNvbnRhaW5lck5hbWU7O1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdW2NvbnRhaW5lck5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV1bY29udGFpbmVyTmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzRm9ybUNvbnRyb2wgPSBaQ29tcG9uZW50SGVscGVyLmlzRm9ybUNvbnRyb2woZmllbGQpO1xyXG4gICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gWkNvbXBvbmVudEhlbHBlci5pc1Zpc2libGVGb3JtQ29udHJvbCh0aGlzLCBmaWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBpc1JlcXVpcmVkID0gWkNvbXBvbmVudEhlbHBlci5pc1JlcXVpcmVkRm9ybUNvbnRyb2wodGhpcywgZmllbGQpO1xyXG5cclxuICAgICAgICAgIGlmIChpc0Zvcm1Db250cm9sID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGZpZWxkLk5hbWUgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGZpZWxkLk5hbWUsIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgICAgICAgICBmaWVsZC5WYWx1ZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGQuVmFsdWUsIGNvbnRhaW5lck5hbWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdW2NvbnRhaW5lck5hbWVdLmluY2x1ZGVzKGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV1bY29udGFpbmVyTmFtZV0ucHVzaChmaWVsZC5WYWx1ZSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGtlZXAgYSBsaXN0IG9mIGRyb3Bkb3duIG9wdGlvbiB2YXJpYWJsZSBuYW1lIFxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duVHlwZShmaWVsZC5UeXBlKSAmJiBmaWVsZC5aRGF0YU9wdGlvbk5hbWUgJiYgZmllbGQuRHJvcGRvd25PcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC56RGF0YVtmaWVsZC5aRGF0YU9wdGlvbk5hbWVdID0gT2JqZWN0LmFzc2lnbihbXSwgZXZhbCgndGhpcy4nICsgZmllbGQuRHJvcGRvd25PcHRpb25zKSk7IFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhdXRvIGFwcGVuZCBjdXJyZW50IHVzZXIgdG8gdGhlIHptb2RlbCBiYXNlIG9uIGZpZWxkIGVsZW1lbnQgYXR0cmlidXRlIFwienVkZlNldERlZmF1bHRVc2VyXCJcclxuICAgICAgICAgICAgaWYgKGZpZWxkLnp1ZGZTZXREZWZhdWx0VXNlcikge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0TW9kZWxWYWx1ZShmaWVsZC5OYW1lLCB0aGlzLmF1dGhTZXJ2aWNlLmUxVG9rZW4udXNlck5hbWUsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB2YWxpZGF0b3IgZm9yIHRoZSBjb21wb25lbnRcclxuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0VmFsaWRhdG9ycyhmaWVsZCwgaXNWaXNpYmxlLCBpc1JlcXVpcmVkKTtcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xzW2ZpZWxkLlZhbHVlXSA9IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkIGhhbmRsZSBpZiBmaWVsZC52YWx1ZSArIGNvbnRhaW5lci5cclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWxbZmllbGQuVmFsdWVdLFxyXG4gICAgICAgICAgICAgIHZhbGlkYXRvcnNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKFpDb21wb25lbnRIZWxwZXIuaGFzQ0NGaWVsZChmaWVsZC5UeXBlKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNjVmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q0NWYWxpZGF0b3JzKGZpZWxkLCBpc1Zpc2libGUsIGlzUmVxdWlyZWQpO1xyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sc1tmaWVsZC5DQ1ZhbHVlXSA9IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbFtmaWVsZC5DQ1ZhbHVlXSxcclxuICAgICAgICAgICAgICAgIGNjVmFsaWRhdG9yc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gb25jaGFuZ2UgaGFuZGxpbmc/XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpZWxkQXJyYXk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJGb3JtQ29udHJvbCgpIHtcclxuICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICB0aGlzLmZvcm0ucmVtb3ZlQ29udHJvbChkYXRhLlZhbHVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZGF0YS5WYWx1ZSA9IHRoaXMuaW5pdGlhbERhdGFWYWx1ZTtcclxuXHJcbiAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPSBbXTtcclxuICAgIHRoaXMuZm9ybUZpZWxkcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm1Db250cm9sKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybUZpZWxkcztcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAvLyNyZWdpb24gZnVuY3Rpb24gZm9yIF96dWRmIHNjb3BlIHptb2RlbC4gXHJcbiAgcHVibGljIHNldEZvcm1GaWVsZHpNb2RlbChncm91cDogWkdyb3VwLCBtb2RlbERhdGE6IGFueSkge1xyXG4gICAgY29uc3QgZ3JwID0gZ3JvdXAgPyBncm91cCA6IHRoaXMuZ3JvdXA7XHJcbiAgICBjb25zdCBwYXRjaGVkTW9kZWxEYXRhID0gdGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChtb2RlbERhdGEpO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oZ3JwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWwsIHBhdGNoZWRNb2RlbERhdGEpO1xyXG5cclxuICAgIC8vIG5lZWQgaW5zZXJ0IGFycmF5IHZhbHVlIHRvIHRoZSBncmlkLlxyXG4gICAgZm9yICh2YXIgbW9kZWwgaW4gcGF0Y2hlZE1vZGVsRGF0YSkge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRjaGVkTW9kZWxEYXRhW21vZGVsXSkpIHtcclxuICAgICAgICBjb25zdCBncmlkVmFsdWUgPSBtb2RlbCArICdfT3B0aW9ucyc7XHJcbiAgICAgICAgY29uc3QgZ3JpZERhdGFTb3VyY2UgPSBtb2RlbCArICdfRGF0YVNvdXJjZSc7XHJcblxyXG4gICAgICAgIGdycFtncmlkRGF0YVNvdXJjZV0gPSBwYXRjaGVkTW9kZWxEYXRhW21vZGVsXTtcclxuICAgICAgICBpZiAoZ3JwW2dyaWRWYWx1ZV0pIHtcclxuICAgICAgICAgIGdycFtncmlkVmFsdWVdLnNldERhdGEoZ3JwW2dyaWREYXRhU291cmNlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcGF0Y2ggZm9ybWdyb3VwIG1vZGVsXHJcbiAgICBjb25zdCBmZyA9IHRoaXMuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBmZy5wYXRjaFZhbHVlKGdycFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkWk1vZGVsUHJvcGVydHlQcmVmaXgobW9kZWxEYXRhOiBhbnksIGNvbnRhaW5lclByZWZpeD86IGFueSkge1xyXG4gICAgY29uc3QgcGF0Y2hlZE1vZGVsRGF0YSA9IHt9O1xyXG4gICAgLy8gbG9vcCBwcm9wZXJ0eVxyXG4gICAgZm9yICh2YXIgbW9kZWwgaW4gbW9kZWxEYXRhKSB7XHJcbiAgICAgIC8vIGZpcnN0IHRoaW5nIGNoZWNrIHRoZSB2YWx1ZSBpcyBpdCBhcnJheS5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxEYXRhW21vZGVsXSkpIHtcclxuICAgICAgICAvLyBhcnJheSBzcGVjaWFsIGhhbmRsaW5nXHJcbiAgICAgICAgbGV0IG1vZGVsUHJvcGVydHkgPSBtb2RlbDtcclxuICAgICAgICBpZiAoIW1vZGVsLmluY2x1ZGVzKHRoaXMuY29tcG9uZW50UHJlZml4KSkge1xyXG4gICAgICAgICAgbW9kZWxQcm9wZXJ0eSA9IFt0aGlzLmNvbXBvbmVudFByZWZpeCwgbW9kZWxdLmpvaW4oJ18nKTtcclxuICAgICAgICAgIHBhdGNoZWRNb2RlbERhdGFbbW9kZWxQcm9wZXJ0eV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgYXJyYXkgdmFsdWUsIG1lYW4gICB1bmRlciBhIGNvbnRhaW5lci4gd2lsbCBuZWVkIHRvIHBhc3MgbW9kZWwgYXQgY29udGFpbmVyIHByZWZpeCBmb3IgcHJvcGVydHkgbmFtZS4gXHJcbiAgICAgICAgLy8gbG9vcCBhcnJheSB2YWx1ZSwgcGF0Y2ggcHJvcGVydHkgbmFtZVxyXG4gICAgICAgIG1vZGVsRGF0YVttb2RlbF0uZm9yRWFjaChhcnJheU1vZGVsID0+IHtcclxuICAgICAgICAgIHBhdGNoZWRNb2RlbERhdGFbbW9kZWxQcm9wZXJ0eV0ucHVzaCh0aGlzLmFkZFpNb2RlbFByb3BlcnR5UHJlZml4KGFycmF5TW9kZWwsIG1vZGVsKSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBub25lIGFycmF5LCBqdXN0IHBhdGNoIHRoZSBwcm9wZXJ0eSBuYW1lXHJcbiAgICAgICAgbGV0IHByZWZpeGVkTW9kZWwgPSBudWxsO1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWxEYXRhLCBtb2RlbCkpIHtcclxuICAgICAgICAgIGlmICghbW9kZWwuaW5jbHVkZXModGhpcy5jb21wb25lbnRQcmVmaXgpKSB7XHJcbiAgICAgICAgICAgIHByZWZpeGVkTW9kZWwgPSBbdGhpcy5jb21wb25lbnRQcmVmaXgsIGNvbnRhaW5lclByZWZpeCA/PyBjb250YWluZXJQcmVmaXgsIG1vZGVsXS5maWx0ZXIoQm9vbGVhbikuam9pbignXycpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW3ByZWZpeGVkTW9kZWxdID0gbW9kZWxEYXRhW21vZGVsXTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gcGF0Y2hlZE1vZGVsRGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRNb2RlbFZhbHVlKG1vZGVsTmFtZTogc3RyaW5nLCBtb2RlbFZhbHVlOiBhbnksIHNraXBQcmVmaXg/OiBib29sZWFuKSB7XHJcbiAgICBjb25zdCB6TW9kZWxzID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsO1xyXG4gICAgY29uc3Qgek1vZGVsTmFtZSA9IHNraXBQcmVmaXggPyBtb2RlbE5hbWUgOiB0aGlzLmNvbXBvbmVudFByZWZpeCArICdfJyArIG1vZGVsTmFtZTtcclxuICAgIHpNb2RlbHNbek1vZGVsTmFtZV0gPSBtb2RlbFZhbHVlO1xyXG5cclxuICAgIGxldCBmZzogRm9ybUdyb3VwID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBmZy5wYXRjaFZhbHVlKHpNb2RlbHMpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBnZXRaTW9kZWwoc2tpcFJlbW92ZVByZWZpeD86IGJvb2xlYW4sIHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlPzogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgek1vZGVsID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsO1xyXG5cclxuICAgIC8vIG5lZWQgdG8gbG9vcCB6TW9kZWwsIHJlbW92ZSBtdmcobXVsdGkgdmFsdWUgZ3JvdXApIHptb2RlbC4gbXZnIGRhdGEgc3VwcG9zZSB0byBiZSBvbmx5IGZyb20gdGhlIG12ZyBncmlkLlxyXG4gICAgZm9yIChsZXQgcHJvcCBpbiB6TW9kZWwpIHtcclxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh6TW9kZWwsIHByb3ApKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcFNlZ21lbnQgPSBwcm9wLnNwbGl0KCdfJyk7XHJcblxyXG4gICAgICAgIC8vIGJhc2Ugb24gYXMgbG9uZyBtb3JlIHRoZW4gMyBzZWdtZW50KHR5cGUsIHp1ZGYgbmFtZSwgY29udGFpbmVyIG5hbWUsIGZpZWxkIG5hbWUpIGl0IG1lYW4gY29udGFpbmVyIHptb2RlbCB2YWx1ZVxyXG4gICAgICAgIGlmIChwcm9wU2VnbWVudC5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgICAvLyBzZWdtZW50IDIgd2lsbCBiZSBjb250YWluZXIgbmFtZVxyXG4gICAgICAgICAgLy8gbWF0Y2ggdG8gc2VlIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIHVuZGVyIHRoZSBtdWx0aVZhbHVlR3JvdXAgU2NvcGUuXHJcbiAgICAgICAgICBjb25zdCBtdWx0aVZhbHVlR3JvdXBTY29wZU5hbWUgPSBbJ212ZycsIHByb3BTZWdtZW50WzJdXS5qb2luKCdfJyk7XHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG12Z0ZpZWxkID0gdGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdLmZpbmQocmVjb3JkID0+IHJlY29yZCA9PSBwcm9wKTtcclxuICAgICAgICAgICAgaWYgKG12Z0ZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgek1vZGVsW3Byb3BdID0gIXNraXBSZW1vdmVNdmdGaWVsZFZhbHVlID8gbnVsbCA6IHpNb2RlbFtwcm9wXTtcclxuICAgICAgICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh6TW9kZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaW1wb3J0YW50OiBsb29wIHptb2RlbCwgcmVwbGFjZSBwcmVmaXggYmFzZSBieSBkZWZhdWx0LihhbGxvdyB0byBza2lwIHJlbW92ZSBwcmVmaXgpLlxyXG4gICAgY29uc3QgcGF0Y2hlZE1vZGVsRGF0YSA9IHNraXBSZW1vdmVQcmVmaXggPyB6TW9kZWwgOiB0aGlzLnJlbW92ZVpNb2RlbFByb3BlcnR5UHJlZml4KHpNb2RlbCk7XHJcblxyXG4gICAgaWYgKHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlKSB7XHJcbiAgICAgIC8vIGdldCBhbGwgbXZnIGdyaWQgdmFsdWUgYW5kIHB1dCBpbiByZXNwZWN0aXZlIG9iamVjdCBpbiB0aGUgYXJyYXkuXHJcbiAgICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlLmZvckVhY2gobXZnR3JpZFZhbHVlID0+IHtcclxuICAgICAgICAvLyBnZXQgZ3JpZCBjb250YWluZXIgbmFtZS4gY29uZmlybSB3aWxsIGJlIGF0IGxlYXN0IDQgbGVuZ3RoLlxyXG4gICAgICAgIC8vIDNyZCBzZWdtZW50IHdpbGwgYmUgY29udGFpbmVyIG5hbWUuXHJcbiAgICAgICAgY29uc3QgbXZnR3JpZFZhbHVlU2VnbWVudCA9IG12Z0dyaWRWYWx1ZS5zcGxpdCgnXycpO1xyXG4gICAgICAgIG12Z0dyaWRWYWx1ZVNlZ21lbnQucG9wKCk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IHNraXBSZW1vdmVQcmVmaXggPyBtdmdHcmlkVmFsdWVTZWdtZW50LmpvaW4oJ18nKSA6IG12Z0dyaWRWYWx1ZVNlZ21lbnRbMl07XHJcblxyXG4gICAgICAgIC8vIGdldCBncmlkIGRhdGFcclxuICAgICAgICBjb25zdCBtdmdHcmlkID0gdGhpcy5ncm91cFttdmdHcmlkVmFsdWVdIGFzIFpHcmlkO1xyXG4gICAgICAgIGNvbnN0IGdyaWREYXRhID0gbXZnR3JpZC5nZXRHcmlkRGF0YSgpO1xyXG5cclxuICAgICAgICBpZiAoZ3JpZERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgLy8gbmVlZCB0byByZW1vdmUgcHJvcGVydHkgcHJlZml4LlxyXG4gICAgICAgICAgY29uc3QgbmV3R3JpZERhdGEgPSBbXTtcclxuICAgICAgICAgIGdyaWREYXRhLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGNoZWRNb2RlbERhdGEgPSBza2lwUmVtb3ZlUHJlZml4ID8gZGF0YSA6IHRoaXMucmVtb3ZlWk1vZGVsUHJvcGVydHlQcmVmaXgoZGF0YSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIG5ld0dyaWREYXRhLnB1c2gocGF0Y2hlZE1vZGVsRGF0YSk7XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgIHBhdGNoZWRNb2RlbERhdGFbY29udGFpbmVyTmFtZV0gPSBuZXdHcmlkRGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXRjaGVkTW9kZWxEYXRhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVaTW9kZWxQcm9wZXJ0eVByZWZpeCh6TW9kZWw6IGFueSwgZ2V0T25seUZpZWxkTmFtZT86IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHBhdGNoZWRNb2RlbERhdGEgPSB7fTtcclxuICAgIGZvciAobGV0IHByb3AgaW4gek1vZGVsKSB7XHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoek1vZGVsLCBwcm9wKSkge1xyXG4gICAgICAgIGNvbnN0IHByb3BTZWdtZW50ID0gcHJvcC5zcGxpdCgnXycpO1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGdldE9ubHlGaWVsZE5hbWUgPyBwcm9wU2VnbWVudFtwcm9wU2VnbWVudC5sZW5ndGggLSAxXSA6IHByb3AucmVwbGFjZSh0aGlzLmNvbXBvbmVudFByZWZpeCArICdfJywgJycpO1xyXG4gICAgICAgIHBhdGNoZWRNb2RlbERhdGFbcHJvcGVydHlOYW1lXSA9IHpNb2RlbFtwcm9wXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXRjaGVkTW9kZWxEYXRhO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBnZXRaTW9kZWxBc1N0cmluZygpIHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmdldFpNb2RlbCgpKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG5cclxuICAvLyNyZWdpb24gY29tbW9uIGZ1bmN0aW9uIFxyXG4gIENvbXBvbmVudElzVmlzaWJsZShmaWVsZDogWkZpZWxkKTogYW55IHtcclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLkNvbXBvbmVudElzVmlzaWJsZShmaWVsZCwgdGhpcy5ncm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RW5hYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkgPSAhc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlID0gc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhLlZpc2libGUgPSBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVxdWlyZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkID0gc3RhdHVzO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5jaGFuZ2VWYWxpZGF0b3Ioc3RhdHVzLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUsIHRoaXMuY29tcG9uZW50UHJvcGVydGllcywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybSgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoY29udHJvbE5hbWU6IHN0cmluZywgY29udGFpbmVyTmFtZT86IHN0cmluZykge1xyXG4gICAgY29uc3QgbWFpblByZWZpeCA9IFt0aGlzLmRhdGEuVHlwZSwgdGhpcy5kYXRhLk5hbWUsIGNvbnRhaW5lck5hbWUgPz8gbnVsbF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ18nKTtcclxuXHJcbiAgICAvLyBjaGVjayBpcyBuYW1lIGJlZW4gcHJlZml4ZWQgXHJcbiAgICBpZiAoY29udHJvbE5hbWUuaW5jbHVkZXMobWFpblByZWZpeCkpIHtcclxuICAgICAgcmV0dXJuIGNvbnRyb2xOYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIHdlIHRyeSB0byBzcGxpdCB0aGUgbmFtZSBhbmQgdXNlIHRoZSBsYXN0IHNlZ21lbnQuXHJcbiAgICAgIC8vIHNvbWV0aW1lIHRoZSBjb250cm9sbmFtZSBjYW4gYmUgd2l0aG91dCB0aGUgY29udGFpbmVyIG5hbWUsIHNvIHdlIHNwbGl0IGFuZCB1c2UgdGhlIG5ldyBtYWluUHJlZml4XHJcbiAgICAgIGNvbnN0IGNvbnRyb2xOYW1lU2VnbWVudCA9IGNvbnRyb2xOYW1lLnNwbGl0KCdfJyk7XHJcbiAgICAgIGNvbnRyb2xOYW1lID0gY29udHJvbE5hbWVTZWdtZW50W2NvbnRyb2xOYW1lU2VnbWVudC5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW21haW5QcmVmaXgsIGNvbnRyb2xOYW1lXS5qb2luKCdfJyk7XHJcbiAgfVxyXG4gICBcclxuICBwcml2YXRlIGFwcGVuZFByZWZpeChmaWVsZHM6IFpGaWVsZFtdLCBwcmVmaXg6IGFueSkge1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5WYWx1ZSkpIHtcclxuICAgICAgICB0aGlzLmFwcGVuZFByZWZpeChmaWVsZC5WYWx1ZSwgcHJlZml4KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBmaWVsZC5OYW1lID0gW3ByZWZpeCwgZmllbGQuTmFtZV0uam9pbignXycpO1xyXG4gICAgICAgIGlmIChmaWVsZC5UeXBlICE9ICd6YnV0dG9ucycpIHtcclxuICAgICAgICAgIGZpZWxkLlZhbHVlID0gW3ByZWZpeCwgZmllbGQuVmFsdWVdLmpvaW4oJ18nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmllbGQuU3ViVHlwZSA9IHByZWZpeDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwdWJsaWMgZ2V0Q29udGFpbmVyTW9kZWxWYWx1ZShjb250YWluZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVtjb250YWluZXJOYW1lXTtcclxuXHJcbiAgICBjb25zdCBtb2RlbFZhbHVlID0ge307XHJcbiAgICBjb250YWluZXJFbGVtZW50LmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIG1vZGVsVmFsdWVbZWxlbWVudF0gPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWxbZWxlbWVudF07XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbW9kZWxWYWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhckNvbnRhaW5lckZpZWxkRWxlbWVudFZhbHVlKGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdW2NvbnRhaW5lck5hbWVdO1xyXG4gICAgY29udGFpbmVyRWxlbWVudC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICB0aGlzLnNldE1vZGVsVmFsdWUoZWxlbWVudCwgbnVsbCwgdHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiAtLS0tLS0tLS0tPT09PT09PT09PT09PT09PT09PT0gTXVsdGkgVmFsdWUgR3JvdXAgPT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tKi9cclxuICBwdWJsaWMgc2V0TXVsdGlWYWx1ZUdyb3VwKGRhdGE6IGFueSwgZGF0YUluZGV4PzogYW55KSB7XHJcbiAgICAvLyBuZWVkIHRvIGRlY2xhcmUgbmFtZSwgdmFsdWUsIGRhdGFzb3VyY2UsIGNvbHVtbmZpZWxkcyBhdHRyaWJ1dGUgZm9yIGdyaWQuIFxyXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZGF0YS5OYW1lKTtcclxuICAgIGNvbnN0IGdyaWRWYWx1ZSA9IG5hbWUgKyAnX09wdGlvbnMnO1xyXG4gICAgY29uc3QgZ3JpZERhdGFTb3VyY2UgPSBuYW1lICsgJ19EYXRhU291cmNlJztcclxuICAgIGNvbnN0IGdyaWRDb2x1bW5GaWVsZHMgPSBuYW1lICsgJ19Db2x1bW5GaWVsZHMnO1xyXG4gICAgY29uc3QgbXVsdGlWYWx1ZUdyb3VwU2NvcGVOYW1lID0gWydtdmcnLCBkYXRhLk5hbWVdLmpvaW4oJ18nKTtcclxuICAgIHRoaXMuZ3JvdXBbbXVsdGlWYWx1ZUdyb3VwU2NvcGVOYW1lXSA9IFtdO1xyXG5cclxuICAgICAvLyBzdG9yZSBncmlkIFZhbHVlIG5hbWUuIGNhbiBiZSB1c2UgaW4gZ2V0Wk1vZGVsIHRvIGdldCB0aGUgZ3JpZCBkYXRhLiBcclxuICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlID0gdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUgPz8gW107XHJcbiAgICB0aGlzLm11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZS5wdXNoKGdyaWRWYWx1ZSk7XHJcbiAgICBcclxuICAgIC8vIGFkZCB0byBncmlkIGVsZW1lbnQgYXR0cmlidXRlXHJcbiAgICAvLyB3b250IG5lZWQgdG8gZGVwZW5kIG9uIGZpZWxkIGVsZW1lbnQgc28gYXMgdG8gc3BlZWQgdXAgdGhlIGxvYWRpbmcgc3BlZWQuXHJcbiAgICBjb25zdCBlbGVtZW50ID0ge1xyXG4gICAgICBcIkFkZENvbW1hbmRCdXR0b25OYW1lXCI6IFwiQWRkXCIsXHJcbiAgICAgIFwiQWxsb3dFeHBvcnRcIjogZmFsc2UsXHJcbiAgICAgIFwiQWxsb3dHcmlkRGF0YUV4cG9ydFwiOiBmYWxzZSxcclxuICAgICAgXCJBbGxvd011bHRpU2VsZWN0XCI6IGZhbHNlLFxyXG4gICAgICBcIkFsbG93Um93U2VsZWN0XCI6IGZhbHNlLFxyXG4gICAgICBcIkFsbG93U2F2ZVN0YXRlXCI6IGZhbHNlLFxyXG4gICAgICBcIkNvbHVtbkZpZWxkc1wiOiAnZ3JvdXAuJyArIGdyaWRDb2x1bW5GaWVsZHMsXHJcbiAgICAgIFwiRGF0YVNvdXJjZVwiOiAnZ3JvdXAuJyArIGdyaWREYXRhU291cmNlLFxyXG4gICAgICBcIkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyXCI6IHRydWUsXHJcbiAgICAgIFwiRGlzYWJsZUdlbmVyYXRlQ29sdW1uQnlGb3JtXCI6IHRydWUsXHJcbiAgICAgIFwiRGl2Q2xhc3NcIjogJ2NvbC14cy0xMiBjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMicsXHJcbiAgICAgIFwiRW5hYmxlQ3VzdG9tQWRkQ29tbWFuZFwiOiB0cnVlLFxyXG4gICAgICBcIkVuYWJsZUN1c3RvbVJlbW92ZUNvbW1hbmRcIjogdHJ1ZSxcclxuICAgICAgXCJFbmFibGVDdXN0b21SZXNldENvbW1hbmRcIjogdHJ1ZSxcclxuICAgICAgXCJFbmFibGVTYXZlR3JpZFN0YXRlXCI6IGZhbHNlLFxyXG4gICAgICBcIkV4dGVybmFsUGFnaW5hdGlvblwiOiBmYWxzZSxcclxuICAgICAgXCJIZWlnaHRSZWR1Y2VcIjogMjUwLFxyXG4gICAgICBcIkxpbWl0RmllbGRzXCI6IGZhbHNlLFxyXG4gICAgICBcIk5hbWVcIjogbmFtZSxcclxuICAgICAgXCJQYWdlU2l6ZVwiOiAyMCxcclxuICAgICAgXCJQYWdlU2l6ZXNcIjogZmFsc2UsXHJcbiAgICAgIFwiUmVzb3VyY2VVUkxcIjogdHJ1ZSxcclxuICAgICAgXCJTZWxlY3RPcHRpb25zXCI6IGZhbHNlLFxyXG4gICAgICBcIlNob3dHcmlkRWRpdEJ1dHRvblwiOiBmYWxzZSxcclxuICAgICAgXCJTdWJUeXBlXCI6IFwienVkZlwiLFxyXG4gICAgICBcIlR5cGVcIjogXCJ6Z3JpZFwiLFxyXG4gICAgICBcIlZhbHVlXCI6ICdncm91cC4nICsgZ3JpZFZhbHVlLFxyXG4gICAgICBcIlZpc2libGVcIjogdHJ1ZSxcclxuICAgICAgXCJXaWR0aFJlZHVjZVwiOiA1MDBcclxuICAgIH1cclxuXHJcbiAgICAvLyBjcmVhdGUgcHJvcGVydHkgaW4gdGhlIGdyb3VwIGJhc2Ugb24gYWJvdmUgZGVjbGFyYXRpb24gZXhjZXB0IE5hbWUgYW5kIGFsc28gaW5zZXJ0IGNvbHVtbiBmaWVsZC5cclxuICAgIC8vIHVzZSBncm91cGluZyB2YWx1ZSBhcyBjb2x1bW4uIHNraXAgaW5zZXJ0IGFueSBjb250YWluZXIgdHlwZS5cclxuICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBkYXRhLk5hbWU7XHJcbiAgICBjb25zdCBncm91cEZpZWxkRWxlbWVudHMgPSBbXTtcclxuXHJcbiAgICBkYXRhLlZhbHVlLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZE1vZGVsID0gT2JqZWN0LmFzc2lnbih7fSwgZmllbGQpO1xyXG4gICAgICBmaWVsZE1vZGVsWydEaXNwbGF5TmFtZSddID0gZmllbGRNb2RlbC5MYWJlbDtcclxuICAgICAgZmllbGRNb2RlbC5OYW1lID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZE1vZGVsWydOYW1lJ10sIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgICBmaWVsZE1vZGVsLlZhbHVlID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZE1vZGVsWydWYWx1ZSddLCBjb250YWluZXJOYW1lKTtcclxuXHJcbiAgICAgIGdyb3VwRmllbGRFbGVtZW50cy5wdXNoKGZpZWxkTW9kZWwpO1xyXG5cclxuICAgICAgLy8gdGhpcyBmb3IgdGFsbHkgYW5kIHJlbW92ZSB6bW9kZWwgd2hlbiBnZXRtb2RlbCgpLlxyXG4gICAgICAvLyBub3Qgc3VwcG9zZSB0byBzYXZlIHptb2RlbCBmaWVsZCB2YWx1ZSBzaW5jZSBpdCB2YWx1ZSBzdXBwb3NlIHRvIGFkZCB0byB0aGUgZ3JpZC5cclxuICAgICAgdGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdLnB1c2goZmllbGRNb2RlbC5WYWx1ZSk7XHJcblxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlXSA9IFtdO1xyXG4gICAgdGhpcy5ncm91cFtncmlkQ29sdW1uRmllbGRzXSA9IGdyb3VwRmllbGRFbGVtZW50cztcclxuXHJcbiAgICAvLyBncmlkIGNvbHVtbiB0byBiYXNlIG9uIGZpZWxkIGVsZW1lbnQgYW5kIGluc2VydCB0byBncmlkIGNvbHVtbi4gXHJcbiAgICB0aGlzLmdyb3VwW25hbWUgKyAnX0N1c3RvbUFkZEJ1dHRvbk9uQ2xpY2snXSA9IHRoaXMuY2FwdHVyZUNvbnRhaW5lckZpZWxkVmFsdWVUb01vZGVsLmJpbmQodGhpcywgdGhpcy5ncm91cCwgZ3JpZFZhbHVlLCBncmlkRGF0YVNvdXJjZSwgY29udGFpbmVyTmFtZSk7IC8vX3p1ZGZfZm9ybVByZXZpZXdcclxuICAgIHRoaXMuZ3JvdXBbbmFtZSArICdfQ3VzdG9tUmVzZXRCdXR0b25PbkNsaWNrJ10gPSB0aGlzLmNsZWFyQ29udGFpbmVyUmVsYXRlZEZpZWxkVmFsdWUuYmluZCh0aGlzLCB0aGlzLmdyb3VwLCBjb250YWluZXJOYW1lKTsgLy9fenVkZl9mb3JtUHJldmlld1xyXG4gICAgdGhpcy5ncm91cFtuYW1lICsgJ19DdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrJ10gPSB0aGlzLnJlbW92ZUdyaWRSb3cuYmluZCh0aGlzLCBncmlkVmFsdWUsIGdyaWREYXRhU291cmNlKTsgLy9fenVkZl9mb3JtUHJldmlld1xyXG5cclxuICAgIGlmIChkYXRhSW5kZXgpIHtcclxuICAgICAgdGhpcy5hcHBlbmRUb0Rpc3BsYXlNb2RlbChlbGVtZW50LCBkYXRhSW5kZXgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGRhdGEuVmFsdWUucHVzaChlbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybUZpZWxkKCkge1xyXG4gICAgdGhpcy5mb3JtRmllbGRzID0gdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXB0dXJlQ29udGFpbmVyRmllbGRWYWx1ZVRvTW9kZWwoZ3JvdXA6IFpHcm91cCwgZ3JpZFZhbHVlOiBhbnksIGdyaWREYXRhU291cmNlOiBhbnksIGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gZ2V0IGNvbnRhaW5lciBtb2RlbCB2YWx1ZSwgc2V0IHRvIGdyb3VwIGdyaWQgZGF0YXNvdXJjZVxyXG4gICAgZ3JvdXBbZ3JpZERhdGFTb3VyY2VdLnB1c2godGhpcy5nZXRDb250YWluZXJNb2RlbFZhbHVlKGNvbnRhaW5lck5hbWUpKTtcclxuXHJcbiAgICAvLyBzZXQgZGF0YXNvdXJjZSB0byBncmlkXHJcbiAgICBncm91cFtncmlkVmFsdWVdLnNldERhdGEodGhpcy5ncm91cFtncmlkRGF0YVNvdXJjZV0pO1xyXG5cclxuICAgIC8vIGNsZWFyIGNvbnRhaW5lciBmaWVsZCB2YWx1ZVxyXG4gICAgdGhpcy5jbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlKGdyb3VwLCBjb250YWluZXJOYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJDb250YWluZXJSZWxhdGVkRmllbGRWYWx1ZShncm91cDogWkdyb3VwLCBjb250YWluZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgIC8vIGFmdGVyIHNldCB0byBncmlkLCBjbGVhciB0aGUgem1vZGVsLiBcclxuICAgIHRoaXMuY2xlYXJDb250YWluZXJGaWVsZEVsZW1lbnRWYWx1ZShjb250YWluZXJOYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlR3JpZFJvdyhncmlkVmFsdWU6IGFueSwgZ3JpZERhdGFTb3VyY2U6IGFueSwgZGF0YUl0ZW06IGFueSwgaW5kZXg6IGFueSkge1xyXG4gICAgdGhpcy5ncm91cFtncmlkRGF0YVNvdXJjZV0uc3BsaWNlKGluZGV4LCAxKTtcclxuXHJcbiAgICAvLyBzZXQgZGF0YXNvdXJjZSB0byBncmlkXHJcbiAgICB0aGlzLmdyb3VwW2dyaWRWYWx1ZV0uc2V0RGF0YSh0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlXSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gZnVuY3Rpb24gZm9yIGNvbXBvbmVudCBldmVudFxyXG4gIC8vI2VuZHJlZ3Jpb25cclxuXHJcbiAgLy8gVE9ETzogdG8gYmUgY29uc2lkZXIgdG8gYWRkIHRvIFpDb21wb25lbnRIZWxwZXIgXHJcblxyXG4gIHByaXZhdGUgaXNEcm9wZG93blR5cGUoZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBjb21wb25lbnREYXRhVHlwZSA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IGRhdGEgOiBkYXRhLlR5cGUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBpZiAoY29tcG9uZW50RGF0YVR5cGUgPT0gQ29tcG9uZW50VHlwZS5kcm9wZG93biB8fCBjb21wb25lbnREYXRhVHlwZSA9PSBDb21wb25lbnRUeXBlLnp1aXNlbGVjdG11bHRpcGxlIHx8IGNvbXBvbmVudERhdGFUeXBlID09IENvbXBvbmVudFR5cGUuenNlbGVjdG11bHRpcGxlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB2YWxpZGF0ZUFuZFNob3dFcnJvck1lc3NhZ2UoKSB7XHJcbiAgICBjb25zdCBmZyA9IHRoaXMuZm9ybSBhcyBGb3JtR3JvdXA7XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2Uuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZSh0aGlzLmdyb3VwLCBmZyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWYWxpZGF0ZWRGb3JtWk1vZGVsKCkge1xyXG4gICAgY29uc3QgaXNWYWxpZEZvcm0gPSB0aGlzLnZhbGlkYXRlQW5kU2hvd0Vycm9yTWVzc2FnZSgpO1xyXG5cclxuICAgIGlmIChpc1ZhbGlkRm9ybSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRaTW9kZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG59XHJcblxyXG5lbnVtIENvbXBvbmVudFR5cGUge1xyXG4gIHRleHQgPSAndGV4dCcsXHJcbiAgdGV4dGFyZWEgPSAndGV4dGFyZWEnLFxyXG4gIGNoZWNrYm94ID0gJ2NoZWNrYm94JyxcclxuICBsYWJlbCA9ICd6bGFiZWwnLFxyXG4gIGRhdGUgPSAnZGF0ZScsXHJcbiAgemRhdGV0aW1lID0gJ3pkYXRldGltZScsXHJcbiAgenVpZGF0ZXRpbWUgPSAnenVpZGF0ZXRpbWUnLFxyXG4gIG51bWJlciA9ICdudW1iZXInLFxyXG4gIHpudW1lcmljID0gJ3pudW1lcmljJyxcclxuICBlbWFpbCA9ICdlbWFpbCcsXHJcbiAgZmlsZSA9ICdmaWxlJyxcclxuICBwcmljZSA9ICdwcmljZScsXHJcbiAgd2Vic2l0ZSA9ICd3ZWJzaXRlJyxcclxuICBkcm9wZG93biA9ICdkcm9wZG93bicsXHJcbiAgenVpc2VsZWN0bXVsdGlwbGUgPSAnenVpc2VsZWN0bXVsdGlwbGUnLFxyXG4gIHpzZWxlY3RtdWx0aXBsZSA9ICd6c2VsZWN0bXVsdGlwbGUnLFxyXG4gIGdyb3VwaW5nID0gJ2tjYXJkJyxcclxuICBidXR0b24gPSAnemJ1dHRvbnMnLFxyXG4gIGdyaWQgPSAnemdyaWQnXHJcbn1cclxuIiwiPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE1cHhcIiAqbmdJZj1cImRhdGEuVGl0bGUgJiYgKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCIgd2lkdGg9XCIxMDAlXCI+XHJcbiAgPGtlbmRvLWNhcmQgKm5nSWY9XCJkYXRhLlRpdGxlXCIgd2lkdGg9XCIxMDAlXCI+XHJcbiAgICA8a2VuZG8tY2FyZC1oZWFkZXI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImNhcmQtaGVhZGVyLXRpdGxlXCI+e3tkYXRhLlRpdGxlfX08L2lvbi1sYWJlbD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2tlbmRvLWNhcmQtaGVhZGVyPlxyXG4gICAgPGtlbmRvLWNhcmQtYm9keT5cclxuICAgICAgPGFwcC16Zm9ybWNvbnRyb2wgW25nQ2xhc3NdPVwiZ3JvdXBbZmllbGQuaXNWaXNpYmxlRmllbGRdID8gZmllbGQuRGl2Q2xhc3MgOiAoKGZpZWxkLlZpc2libGUgPT09IHRydWUpID8gIGZpZWxkLkRpdkNsYXNzIDogJ2ZsZXgtaGlkZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvcm1GaWVsZHMgfCBkaXZ6bGF5b3V0OiBkYXRhLnpsYXlvdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiZ3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2ZpZWxkLk5hbWV9fVwiPlxyXG4gICAgICA8L2FwcC16Zm9ybWNvbnRyb2w+XHJcbiAgICA8L2tlbmRvLWNhcmQtYm9keT5cclxuICA8L2tlbmRvLWNhcmQ+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIiFkYXRhLlRpdGxlICYmICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiIHdpZHRoPVwiMTAwJVwiPlxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgPGlvbi1ncmlkIHdpZHRoPVwiMTAwJVwiPlxyXG4gICAgICA8aW9uLXJvdyBpZD1cImR5bmFtaWMtZm9ybS1ob3N0XCIgY2xhc3M9XCJpb24tYWxpZ24taXRlbXMtc3RhcnRcIj5cclxuICAgICAgICA8YXBwLXpmb3JtY29udHJvbCBbbmdDbGFzc109XCJncm91cFtmaWVsZC5pc1Zpc2libGVGaWVsZF0gPyBmaWVsZC5EaXZDbGFzcyA6ICgoZmllbGQuVmlzaWJsZSA9PT0gdHJ1ZSkgPyAgZmllbGQuRGl2Q2xhc3MgOiAnZmxleC1oaWRlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRmllbGRzIHwgZGl2emxheW91dDogZGF0YS56bGF5b3V0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2ZpZWxkLk5hbWV9fVwiPlxyXG4gICAgICAgIDwvYXBwLXpmb3JtY29udHJvbD5cclxuICAgICAgPC9pb24tcm93PlxyXG4gICAgPC9pb24tZ3JpZD5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
@@ -11395,7 +11395,8 @@ class ZudfComponent {
|
|
|
11395
11395
|
}
|
|
11396
11396
|
updateDisplayModel(value, flatIndex) {
|
|
11397
11397
|
ZComponentHelper.updateArrayObjectByFlatIndex(this.displayElementModel, flatIndex, value);
|
|
11398
|
-
this.
|
|
11398
|
+
this.updateFormField();
|
|
11399
|
+
//this.cdr.detectChanges();
|
|
11399
11400
|
}
|
|
11400
11401
|
appendToDisplayModel(value, flatIndex) {
|
|
11401
11402
|
// append to display model mean it will base on flat index to insert the form control.
|
|
@@ -11414,7 +11415,7 @@ class ZudfComponent {
|
|
|
11414
11415
|
}
|
|
11415
11416
|
removeElementFromDisplayModel(flatIndex) {
|
|
11416
11417
|
ZComponentHelper.removeArrayObjectByFlatIndex(this.displayElementModel, flatIndex);
|
|
11417
|
-
this.
|
|
11418
|
+
this.updateFormField();
|
|
11418
11419
|
// TODO: remove from zmodel
|
|
11419
11420
|
//delete this.group[this.componentScopeName].zModel[''];
|
|
11420
11421
|
}
|
|
@@ -11432,7 +11433,7 @@ class ZudfComponent {
|
|
|
11432
11433
|
}
|
|
11433
11434
|
this.displayElementModel = (_a = this.displayElementModel) !== null && _a !== void 0 ? _a : [];
|
|
11434
11435
|
this.displayElementModel.push(fieldData);
|
|
11435
|
-
this.
|
|
11436
|
+
this.updateFormField();
|
|
11436
11437
|
this.cdr.detectChanges();
|
|
11437
11438
|
}
|
|
11438
11439
|
renderFieldElement(fieldElements) {
|
|
@@ -11484,8 +11485,13 @@ class ZudfComponent {
|
|
|
11484
11485
|
}
|
|
11485
11486
|
// keep a list of dropdown option variable name
|
|
11486
11487
|
if (this.isDropdownType(field.Type) && field.ZDataOptionName && field.DropdownOptions) {
|
|
11487
|
-
this.group.zData[field.ZDataOptionName] = eval('this.' + field.DropdownOptions);
|
|
11488
|
+
this.group.zData[field.ZDataOptionName] = Object.assign([], eval('this.' + field.DropdownOptions));
|
|
11489
|
+
}
|
|
11490
|
+
// auto append current user to the zmodel base on field element attribute "zudfSetDefaultUser"
|
|
11491
|
+
if (field.zudfSetDefaultUser) {
|
|
11492
|
+
this.setModelValue(field.Name, this.authService.e1Token.userName, true);
|
|
11488
11493
|
}
|
|
11494
|
+
// validator for the component
|
|
11489
11495
|
const validators = ZComponentHelper.getValidators(field, isVisible, isRequired);
|
|
11490
11496
|
formControls[field.Value] = new FormControl(
|
|
11491
11497
|
// TODO: need handle if field.value + container.
|
|
@@ -11524,7 +11530,9 @@ class ZudfComponent {
|
|
|
11524
11530
|
const gridValue = model + '_Options';
|
|
11525
11531
|
const gridDataSource = model + '_DataSource';
|
|
11526
11532
|
grp[gridDataSource] = patchedModelData[model];
|
|
11527
|
-
grp[gridValue]
|
|
11533
|
+
if (grp[gridValue]) {
|
|
11534
|
+
grp[gridValue].setData(grp[gridDataSource]);
|
|
11535
|
+
}
|
|
11528
11536
|
}
|
|
11529
11537
|
}
|
|
11530
11538
|
// patch formgroup model
|
|
@@ -11570,7 +11578,7 @@ class ZudfComponent {
|
|
|
11570
11578
|
let fg = this.group[this.componentScopeName].form;
|
|
11571
11579
|
fg.patchValue(zModels);
|
|
11572
11580
|
}
|
|
11573
|
-
getZModel(skipRemovePrefix) {
|
|
11581
|
+
getZModel(skipRemovePrefix, skipRemoveMvgFieldValue) {
|
|
11574
11582
|
const zModel = this.group[this.componentScopeName].zModel;
|
|
11575
11583
|
// need to loop zModel, remove mvg(multi value group) zmodel. mvg data suppose to be only from the mvg grid.
|
|
11576
11584
|
for (let prop in zModel) {
|
|
@@ -11584,7 +11592,7 @@ class ZudfComponent {
|
|
|
11584
11592
|
if (this.group[multiValueGroupScopeName]) {
|
|
11585
11593
|
const mvgField = this.group[multiValueGroupScopeName].find(record => record == prop);
|
|
11586
11594
|
if (mvgField) {
|
|
11587
|
-
zModel[prop] = null;
|
|
11595
|
+
zModel[prop] = !skipRemoveMvgFieldValue ? null : zModel[prop];
|
|
11588
11596
|
this.form.patchValue(zModel);
|
|
11589
11597
|
}
|
|
11590
11598
|
}
|
|
@@ -11593,26 +11601,28 @@ class ZudfComponent {
|
|
|
11593
11601
|
}
|
|
11594
11602
|
// important: loop zmodel, replace prefix base by default.(allow to skip remove prefix).
|
|
11595
11603
|
const patchedModelData = skipRemovePrefix ? zModel : this.removeZModelPropertyPrefix(zModel);
|
|
11596
|
-
|
|
11597
|
-
|
|
11598
|
-
|
|
11599
|
-
|
|
11600
|
-
|
|
11601
|
-
|
|
11602
|
-
|
|
11603
|
-
|
|
11604
|
-
|
|
11605
|
-
|
|
11606
|
-
|
|
11607
|
-
|
|
11608
|
-
|
|
11609
|
-
|
|
11610
|
-
|
|
11611
|
-
|
|
11612
|
-
|
|
11613
|
-
|
|
11614
|
-
|
|
11615
|
-
|
|
11604
|
+
if (this.multiValueGroupGridValue) {
|
|
11605
|
+
// get all mvg grid value and put in respective object in the array.
|
|
11606
|
+
this.multiValueGroupGridValue.forEach(mvgGridValue => {
|
|
11607
|
+
// get grid container name. confirm will be at least 4 length.
|
|
11608
|
+
// 3rd segment will be container name.
|
|
11609
|
+
const mvgGridValueSegment = mvgGridValue.split('_');
|
|
11610
|
+
mvgGridValueSegment.pop();
|
|
11611
|
+
const containerName = skipRemovePrefix ? mvgGridValueSegment.join('_') : mvgGridValueSegment[2];
|
|
11612
|
+
// get grid data
|
|
11613
|
+
const mvgGrid = this.group[mvgGridValue];
|
|
11614
|
+
const gridData = mvgGrid.getGridData();
|
|
11615
|
+
if (gridData.length > 0) {
|
|
11616
|
+
// need to remove property prefix.
|
|
11617
|
+
const newGridData = [];
|
|
11618
|
+
gridData.forEach(data => {
|
|
11619
|
+
const patchedModelData = skipRemovePrefix ? data : this.removeZModelPropertyPrefix(data, true);
|
|
11620
|
+
newGridData.push(patchedModelData);
|
|
11621
|
+
});
|
|
11622
|
+
patchedModelData[containerName] = newGridData;
|
|
11623
|
+
}
|
|
11624
|
+
});
|
|
11625
|
+
}
|
|
11616
11626
|
return patchedModelData;
|
|
11617
11627
|
}
|
|
11618
11628
|
removeZModelPropertyPrefix(zModel, getOnlyFieldName) {
|
|
@@ -11753,6 +11763,9 @@ class ZudfComponent {
|
|
|
11753
11763
|
data.Value.push(element);
|
|
11754
11764
|
}
|
|
11755
11765
|
}
|
|
11766
|
+
updateFormField() {
|
|
11767
|
+
this.formFields = this.displayElementModel;
|
|
11768
|
+
}
|
|
11756
11769
|
captureContainerFieldValueToModel(group, gridValue, gridDataSource, containerName) {
|
|
11757
11770
|
// get container model value, set to group grid datasource
|
|
11758
11771
|
group[gridDataSource].push(this.getContainerModelValue(containerName));
|