mmhglobal-dynamicform 2.12.2 → 2.12.3

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.
@@ -24,7 +24,7 @@ export class ZudfComponent extends ContainerFieldBase {
24
24
  this.toastService = toastService;
25
25
  this.componentErrorHandlerService = componentErrorHandlerService;
26
26
  this.cdr = cdr;
27
- // formFields: any[]; // populate using field element.
27
+ // formFields: any[]; // populate using field element.
28
28
  this.componentProperties = new ZComponentProperties();
29
29
  this.prefixValueOption = '_zudfmvgOptions';
30
30
  this.prefixDataSourceName = '_zudfmvgDataSource';
@@ -381,7 +381,7 @@ export class ZudfComponent extends ContainerFieldBase {
381
381
  });
382
382
  }
383
383
  // validator for the component
384
- const validators = ZComponentHelper.getValidators(field, isVisible, isRequired);
384
+ const validators = ZComponentHelper.getValidators(field, isVisible, isRequired, this.group);
385
385
  formControls[field.Value] = new FormControl(zudfGroup.zModel[field.Value], validators);
386
386
  if (ZComponentHelper.hasCCField(field.Type)) {
387
387
  const ccValidators = ZComponentHelper.getCCValidators(field, isVisible, isRequired);
@@ -430,7 +430,7 @@ export class ZudfComponent extends ContainerFieldBase {
430
430
  const patchedModelData = this.addZModelPropertyPrefix(modelData);
431
431
  // Update the zModel values of the form group
432
432
  Object.assign(group[this.componentScopeName].zModel, patchedModelData);
433
- // Update grid values for any arrays in the model data base on kcard component.
433
+ // Update grid values for any arrays in the model data base on kcard component.
434
434
  for (const model in patchedModelData) {
435
435
  if (Array.isArray(patchedModelData[model])) {
436
436
  const gridValue = `${model}${this.prefixValueOption}`;
@@ -692,7 +692,7 @@ export class ZudfComponent extends ContainerFieldBase {
692
692
  });
693
693
  this.group[gridDataSourceName] = [];
694
694
  this.group[gridColumnFieldsName] = groupFieldElements;
695
- // Create grid column based on field elements and insert them into the grid.
695
+ // Create grid column based on field elements and insert them into the grid.
696
696
  this.group[`${name}${this.prefixCustomAddButtonOnClick}`] = this.captureContainerFieldValueToModel.bind(this, this.group, gridValueName, gridDataSourceName, containerName);
697
697
  this.group[`${name}${this.prefixCustomResetButtonOnClick}`] = this.clearContainerRelatedFieldValue.bind(this, this.group, containerName);
698
698
  this.group[`${name}${this.prefixCustomRemoveButtonOnClick}`] = this.removeGridRow.bind(this, gridValueName, gridDataSourceName);
@@ -951,4 +951,4 @@ var ComponentType;
951
951
  ComponentType["button"] = "zbuttons";
952
952
  ComponentType["grid"] = "zgrid";
953
953
  })(ComponentType || (ComponentType = {}));
954
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVkZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96dWRmL3p1ZGYuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenVkZi96dWRmLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRiw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBc0MsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQWtCLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSwyQ0FBMkM7QUFDM0MsT0FBTyxFQUdMLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDL0MsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7O0FBU2hGLE1BQU0sT0FBTyxhQUFjLFNBQVEsa0JBQWtCO0lBbUJuRCxZQUNTLGdCQUFtQyxFQUNsQyxZQUEwQixFQUMxQixZQUEwQixFQUMxQiw0QkFBMEQsRUFDMUQsR0FBc0I7UUFFOUIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFOaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQThCO1FBQzFELFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBdEJoQyx1REFBdUQ7UUFDdkQsd0JBQW1CLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBU2pDLHNCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQ3RDLHlCQUFvQixHQUFHLG9CQUFvQixDQUFDO1FBQzVDLDJCQUFzQixHQUFHLHNCQUFzQixDQUFDO1FBQ2hELGlDQUE0QixHQUFHLHlCQUF5QixDQUFDO1FBQ3pELG1DQUE4QixHQUFHLDJCQUEyQixDQUFDO1FBQzdELG9DQUErQixHQUFHLDRCQUE0QixDQUFDO1FBa2pCeEUsY0FBUyxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFTSxlQUFVLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDN0IsQ0FBQyxDQUFBO1FBRU0sZUFBVSxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDN0MsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFckgsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUU7Z0JBQ3BDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsK0NBQStDLENBQUMsQ0FBQzthQUNuSztpQkFDSTtnQkFDSCxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLG9DQUFvQyxDQUFDLENBQUM7YUFDeEo7UUFDSCxDQUFDLENBQUE7SUEzakJELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxHQUFHLEdBQW9CLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9DLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDOUQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pGLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ2xGO1FBRUQsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FDeEIsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUNwQixTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzlCLHlFQUF5RTtnQkFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQ3pCO2lCQUNJO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzthQUN4QjtZQUVELDhEQUE4RDtZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDeEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNuRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUVoRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssUUFBUTtRQUNkLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUk7UUFDbEIsNkJBQTZCO1FBQzdCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDN0IsQ0FBQyxDQUFDO1FBQ0Ysd0RBQXdEO1FBQ3hELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxrRUFBa0U7WUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQzthQUNwRDtZQUVELDhDQUE4QztZQUM5QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzNELGNBQWMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBRTNCLDRCQUE0QjtZQUM1QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV6QyxxQ0FBcUM7WUFDckMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDbkIsZ0RBQWdEO2dCQUNoRCxjQUFjLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsa0VBQWtFO2dCQUNsRSxNQUFNLFdBQVcsR0FBbUMsRUFBRSxDQUFDO2dCQUN2RCxjQUFjLENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2xEO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsMkNBQTJDO1FBQzNDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCx3REFBd0Q7WUFFeEQsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLElBQUksQ0FBQyxrQkFBa0IsU0FBUyxDQUFDLENBQUM7WUFFL0Ysa0VBQWtFO1lBQ2xFLE1BQU0sU0FBUyxHQUFHLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDMUcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ25DO2FBQ0Y7WUFFRCxzQkFBc0I7WUFDdEIsOERBQThEO1lBQzlELGtIQUFrSDtRQUNwSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVNLHdCQUF3QixDQUFDLGVBQXVCLEVBQUUsU0FBYztRQUNyRSxRQUFRLENBQUM7SUFDWCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLDhCQUE4QixDQUFDLEtBQWEsRUFBRSxVQUFrQixFQUFFLG1CQUEyQixFQUFFO1FBQ3BHLHlEQUF5RDtRQUN6RCxNQUFNLCtCQUErQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFL0QsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywrQkFBK0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCx1QkFBdUI7SUFDdkI7Ozs7T0FJRztJQUNJLGVBQWUsQ0FBQyxLQUFVO1FBQy9CLHFEQUFxRDtRQUNyRCxJQUFJLEtBQUssRUFBRTtZQUNULHlCQUF5QjtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUV4Qix1RUFBdUU7WUFDdkUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3RCwwREFBMEQ7WUFDMUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ25EO2FBQ0k7WUFDSCxpREFBaUQ7WUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RFO0lBQ0gsQ0FBQztJQUVEOzs7O01BSUU7SUFDSyxrQkFBa0IsQ0FBQyxLQUFVLEVBQUUsU0FBaUI7UUFDckQsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsMkJBQTJCO0lBQzdCLENBQUM7SUFFRDs7OztNQUlFO0lBQ0ssb0JBQW9CLENBQUMsS0FBVSxFQUFFLFNBQWlCO1FBQ3ZELHFGQUFxRjtRQUNyRixJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3pCLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDOUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0csY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxxQkFBcUI7UUFDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksNkJBQTZCLENBQUMsU0FBaUI7UUFDcEQsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QiwyQkFBMkI7UUFDM0Isd0RBQXdEO0lBQzFELENBQUM7SUFDRCxZQUFZO0lBRVo7OztPQUdHO0lBQ0ksaUJBQWlCLENBQUMsU0FBUztRQUNoQyw2RUFBNkU7UUFDN0UsU0FBUyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUMxRixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFeEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUMzRCxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksa0JBQWtCLENBQUMsYUFBa0IsRUFBRSxtQkFBMkIsRUFBRTtRQUN6RSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbkIsSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztZQUMvQixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDeEIsYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFdkUsbURBQW1EO1lBQ25ELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNqQztZQUVELHlDQUF5QztZQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsc0JBQXNCLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFFeEYsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUMvRSx1Q0FBdUM7Z0JBRXZDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3RELElBQUksU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7b0JBQ2hDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDMUMsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDdEQsTUFBTSxtQkFBbUIsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQzt3QkFDdkcsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO3dCQUM5RixNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFFcEYsSUFBSSxlQUFlLElBQUksY0FBYyxFQUFFOzRCQUNyQyxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDOzRCQUNuSSxNQUFNLHdCQUF3QixHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQzs0QkFFMUksa0RBQWtEOzRCQUNsRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBaUIsQ0FBQzs0QkFDN0MsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQWdCLENBQUM7NEJBQzFFLElBQUksb0JBQW9CLEVBQUU7Z0NBQ3hCLGNBQWMsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQ0FDekQsb0JBQW9CLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0NBRTlELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7NkJBQzFCO2lDQUNJO2dDQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUMzRCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzZCQUN2Qjt5QkFDRjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFFRCx3REFBd0Q7Z0JBQ3hELElBQUksZ0JBQWdCLElBQUksRUFBRSxFQUFFO29CQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLEVBQUU7d0JBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUN0RDtpQkFDRjtnQkFFRCx3RkFBd0Y7WUFDMUYsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxVQUFlLEVBQUUsWUFBNEMsRUFBRSxhQUFzQixFQUFFLGlCQUFpQixHQUFHLEtBQUssRUFBRSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLEVBQUU7UUFDbEwsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUV4RCxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQ3pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNoRTthQUNGO2lCQUNJO2dCQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBRXRELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzlCLG1EQUFtRDtvQkFDbkQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUM5RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEdBQUc7d0JBQ3RDLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNySixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7d0JBQ2xCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTt3QkFDaEIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixJQUFJLEtBQUs7d0JBQ2xELFNBQVMsRUFBRSxLQUFLO3dCQUNoQixTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLO3dCQUNqQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLO3dCQUNyQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLO3dCQUNuQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQywrQ0FBK0M7cUJBQ2pHLENBQUM7b0JBRUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7d0JBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDaEM7b0JBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDO2lCQUN6SDtxQkFDSTtvQkFDSCxvRkFBb0Y7b0JBQ3BGLG1HQUFtRztvQkFDbkcsSUFBSSxhQUFhLEVBQUU7d0JBQ2pCLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBRyxhQUFhLENBQUM7d0JBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUU7NEJBQzdCLFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7eUJBQy9CO3FCQUNGO29CQUVELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNyRSxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBRXZFLElBQUksYUFBYSxLQUFLLElBQUksRUFBRTt3QkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTs0QkFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQzt5QkFDaEM7d0JBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLG1CQUFtQixFQUFFOzRCQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO3lCQUNyRDt3QkFDRCxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3dCQUNyRSxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO3dCQUV2RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLEdBQUc7NEJBQ3RDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTs0QkFDaEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLOzRCQUNsQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7NEJBQ2hCLGlCQUFpQixFQUFFLGlCQUFpQjs0QkFDcEMsU0FBUyxFQUFFLGlCQUFpQjs0QkFDNUIsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSzs0QkFDakMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSzs0QkFDckMsVUFBVSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSzs0QkFDbkMsY0FBYyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsK0NBQStDO3lCQUNqRyxDQUFDO3dCQUVGLElBQUksYUFBYSxFQUFFOzRCQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0NBQ25ELFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBOzZCQUMzQzt5QkFDRjt3QkFFRCxrREFBa0Q7d0JBQ2xELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFOzRCQUNyRixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQzt5QkFDcEc7d0JBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUU7NEJBQ2hFLHFGQUFxRjs0QkFDckYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dDQUNqQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUM7NkJBQ25DOzRCQUVELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQztnQ0FDaEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2dDQUNsQixlQUFlLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjs2QkFDM0MsQ0FBQyxDQUFDOzRCQUVILDBFQUEwRTs0QkFDMUUsK0dBQStHOzRCQUMvRyxLQUFLLENBQUMsdUJBQXVCLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7NEJBQ3hFLEtBQUssQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO3lCQUMxQjt3QkFFRCw4RkFBOEY7d0JBQzlGLElBQUksS0FBSyxDQUFDLGtCQUFrQixFQUFFOzRCQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLEVBQUU7Z0NBQzFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs2QkFDNUM7NEJBRUQsNkRBQTZEOzRCQUM3RCxTQUFTLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0NBQ3pDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtnQ0FDckIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXOzZCQUMvQixDQUFDLENBQUM7eUJBQ0o7d0JBRUQsOEJBQThCO3dCQUM5QixNQUFNLFVBQVUsR0FBa0IsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQy9GLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQ3pDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUM3QixVQUFVLENBQ1gsQ0FBQzt3QkFDRixJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzNDLE1BQU0sWUFBWSxHQUFrQixnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQzs0QkFDbkcsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FDM0MsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQy9CLFlBQVksQ0FDYixDQUFDO3lCQUNIO3dCQUNELHFCQUFxQjtxQkFFdEI7aUJBQ0Y7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxnQkFBZ0I7UUFDckIsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUN4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTO1FBQ3JELDREQUE0RDtRQUM1RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRSw2Q0FBNkM7UUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFdkUsZ0ZBQWdGO1FBQ2hGLEtBQUssTUFBTSxLQUFLLElBQUksZ0JBQWdCLEVBQUU7WUFDcEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQzFDLE1BQU0sU0FBUyxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLGNBQWMsR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFFOUQsNEVBQTRFO2dCQUM1RSwrRUFBK0U7Z0JBQy9FLHNDQUFzQztnQkFDdEMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVoRCx3QkFBd0I7Z0JBQ3hCLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFO29CQUNwQixLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2lCQUNqRDtnQkFDRCxHQUFHO2FBRUo7U0FDRjtRQUVELDhCQUE4QjtRQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBaUIsQ0FBQztRQUN6QyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7O0tBTUM7SUFDTyx1QkFBdUIsQ0FBQyxTQUFjLEVBQUUsZUFBcUI7UUFDbkUsZ0RBQWdEO1FBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRTVCLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN0SCxPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELGlEQUFpRDtRQUNqRCxLQUFLLE1BQU0sWUFBWSxJQUFJLFNBQVMsRUFBRTtZQUNwQywwQ0FBMEM7WUFDMUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFO2dCQUMxQyw0QkFBNEI7Z0JBQzVCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztnQkFFeEIseUNBQXlDO2dCQUN6QyxLQUFLLE1BQU0sWUFBWSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtvQkFDbEQscUZBQXFGO29CQUNyRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUVoRix1Q0FBdUM7b0JBQ3ZDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ25DO2dCQUVELDZDQUE2QztnQkFDN0MsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3ZFLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsWUFBWSxDQUFDO2FBQ3ZEO2lCQUNJLElBQUksT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUNwRCxvQ0FBb0M7Z0JBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFFaEcscURBQXFEO2dCQUNyRCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDdkUsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxtQkFBbUIsQ0FBQzthQUM5RDtpQkFDSTtnQkFDSCxrRUFBa0U7Z0JBQ2xFLElBQUksb0JBQW9CLENBQUM7Z0JBQ3pCLElBQUksZUFBZSxFQUFFO29CQUNuQixvQkFBb0IsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksZUFBZSxJQUFJLFlBQVksRUFBRSxDQUFDO2lCQUNyRjtxQkFBTTtvQkFDTCxvQkFBb0IsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksWUFBWSxFQUFFLENBQUM7aUJBQ2xFO2dCQUNELGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xFO1NBQ0Y7UUFFRCw0QkFBNEI7UUFDNUIsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBYTtRQUM5QixPQUFPLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQXVCTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLHVCQUF1QixDQUFDLFdBQW1CLEVBQUUsYUFBc0I7UUFDeEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyRyxtQ0FBbUM7UUFDbkMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO2FBQ0k7WUFDSCxxREFBcUQ7WUFDckQseUdBQXlHO1lBQ3pHLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsRCxXQUFXLEdBQUcsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsT0FBTyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxZQUFZLENBQUMsTUFBZ0IsRUFBRSxNQUFXO1FBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3hDO2lCQUNJO2dCQUNILEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRTtvQkFDNUIsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMvQztnQkFDRCxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzthQUN4QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZTtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxzQkFBc0IsQ0FBQyxhQUFxQjtRQUNqRCw2RUFBNkU7UUFDN0UsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUV0QixvRUFBb0U7UUFDcEUsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFFNUIscUZBQXFGO1FBQ3JGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEQsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25GLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXRFLGtGQUFrRjtZQUNsRixJQUFJLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDekcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRywyRUFBMkUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDL0osZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixPQUFPLEVBQUUsQ0FBQzthQUNYO1lBRUQsOERBQThEO1lBQzlELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25ELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN4RCxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUMvQixJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxXQUFXLEVBQUU7d0JBQzNELFdBQVcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUE7cUJBQ3JEO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCx5RkFBeUY7WUFDekYsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFdBQVcsQ0FBQztTQUNuQztRQUFBLENBQUM7UUFFRiwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxxREFBcUQ7UUFDckQsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7TUFHRTtJQUNLLCtCQUErQixDQUFDLGFBQXFCO1FBQzFELHVEQUF1RDtRQUN2RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUUsc0RBQXNEO1FBQ3RELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNqQyw4RUFBOEU7WUFDOUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRXhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDJGQUEyRjtJQUMzRjs7OztPQUlHO0lBQ0ksa0JBQWtCLENBQUMsSUFBUyxFQUFFLFNBQWU7UUFDbEQsNEVBQTRFO1FBQzVFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxhQUFhLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNqRSxNQUFNLG9CQUFvQixHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRXJFLDBEQUEwRDtRQUMxRCxNQUFNLHdCQUF3QixHQUFHLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXBELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQzVCO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsbUVBQW1FO1FBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFMUMsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbEQsbUVBQW1FO1FBQ25FLE1BQU0sT0FBTyxHQUFHO1lBQ2Qsc0JBQXNCLEVBQUUsS0FBSztZQUM3QixhQUFhLEVBQUUsS0FBSztZQUNwQixxQkFBcUIsRUFBRSxLQUFLO1lBQzVCLGtCQUFrQixFQUFFLEtBQUs7WUFDekIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixnQkFBZ0IsRUFBRSxLQUFLO1lBQ3ZCLGNBQWMsRUFBRSxRQUFRLEdBQUcsb0JBQW9CO1lBQy9DLFlBQVksRUFBRSxRQUFRLEdBQUcsa0JBQWtCO1lBQzNDLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsNkJBQTZCLEVBQUUsSUFBSTtZQUNuQyxVQUFVLEVBQUUseUNBQXlDO1lBQ3JELHdCQUF3QixFQUFFLElBQUk7WUFDOUIsMkJBQTJCLEVBQUUsSUFBSTtZQUNqQywwQkFBMEIsRUFBRSxJQUFJO1lBQ2hDLHFCQUFxQixFQUFFLEtBQUs7WUFDNUIsb0JBQW9CLEVBQUUsS0FBSztZQUMzQixjQUFjLEVBQUUsR0FBRztZQUNuQixhQUFhLEVBQUUsS0FBSztZQUNwQixNQUFNLEVBQUUsSUFBSTtZQUNaLFVBQVUsRUFBRSxFQUFFO1lBQ2QsV0FBVyxFQUFFLEtBQUs7WUFDbEIsYUFBYSxFQUFFLElBQUk7WUFDbkIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsb0JBQW9CLEVBQUUsS0FBSztZQUMzQixTQUFTLEVBQUUsTUFBTTtZQUNqQixNQUFNLEVBQUUsT0FBTztZQUNmLE9BQU8sRUFBRSxRQUFRLEdBQUcsYUFBYTtZQUNqQyxTQUFTLEVBQUUsSUFBSTtZQUNmLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLG9DQUFvQyxFQUFFLElBQUk7U0FDM0MsQ0FBQTtRQUVELG9IQUFvSDtRQUNwSCw4RUFBOEU7UUFDOUUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNoQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUM3QyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDbEYsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBRXBGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVwQyx1REFBdUQ7WUFDdkQscUdBQXFHO1lBQ3JHLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFFdEQsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM1SyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN6SSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRWhJLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztTQUMvQzthQUNJO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRU8saUNBQWlDLENBQUMsS0FBYSxFQUFFLFNBQWMsRUFBRSxjQUFtQixFQUFFLGFBQXFCO1FBQ2pILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUUzQixLQUFLLElBQUksR0FBRyxJQUFJLG1CQUFtQixFQUFFO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNwRSxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixNQUFNLENBQUMscURBQXFEO2FBQzdEO1NBQ0Y7UUFFRCxJQUFJLGNBQWMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLG1CQUFtQixDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUMsRUFBRTtZQUNuSCwwREFBMEQ7WUFDMUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRWhELHlCQUF5QjtZQUN6QixLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUVyRCw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLCtCQUErQixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztTQUM1RDthQUNJO1lBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsNEVBQTRFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDcEk7SUFDSCxDQUFDO0lBRU8sK0JBQStCLENBQUMsS0FBYSxFQUFFLGFBQXFCO1FBQzFFLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsK0JBQStCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLGFBQWEsQ0FBQyxTQUFjLEVBQUUsY0FBbUIsRUFBRSxRQUFhLEVBQUUsS0FBVTtRQUNsRixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFNUMseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsWUFBWTtJQUVKLGNBQWMsQ0FBQyxJQUFTO1FBQzlCLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFcEYsSUFBSSxpQkFBaUIsSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLGlCQUFpQixJQUFJLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxpQkFBaUIsSUFBSSxhQUFhLENBQUMsZUFBZSxFQUFFO1lBQzdKLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSSwyQkFBMkI7UUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQWlCLENBQUM7UUFFbEMsMkZBQTJGO1FBQzNGLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFO1lBQ2IsMkZBQTJGO1lBQzNGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDNUM7WUFFRCxzQ0FBc0M7WUFDdEMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFO2dCQUNaLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFNUUsc0RBQXNEO1lBQ3RELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxpREFBaUQ7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyw0QkFBNEIsQ0FBQyxFQUFhLEVBQUUsR0FBVztRQUM3RCxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0MsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ25DLGlEQUFpRDtZQUNqRCxPQUFPO1NBQ1I7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDMUIsT0FBTztTQUNSO1FBRUQsNkRBQTZEO1FBQzdELE1BQU0sU0FBUyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzlDLE9BQU87U0FDUjtRQUVELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFNUIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLHFEQUFxRDtZQUNyRCxPQUFPO1NBQ1I7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFFRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRXJDLElBQUksYUFBYSxFQUFFO1lBQ2pCLG9DQUFvQztZQUNwQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxzQkFBc0IsQ0FBQyxnQkFBMEIsRUFBRSx1QkFBaUM7UUFDekYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFFdkQsSUFBSSxXQUFXLEVBQUU7WUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztTQUNsRTtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFNBQVMsQ0FBQyxnQkFBMEIsRUFBRSx1QkFBaUM7UUFDNUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFMUQsb0RBQW9EO1FBQ3BELEtBQUssTUFBTSxjQUFjLElBQUksTUFBTSxFQUFFO1lBQ25DLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsRUFBRTtnQkFDaEUsTUFBTSxzQkFBc0IsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV6RCx3REFBd0Q7Z0JBQ3hELElBQUksc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDckMsZ0VBQWdFO29CQUNoRSxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEQsK0NBQStDO29CQUMvQyxNQUFNLHdCQUF3QixHQUFHLE9BQU8sYUFBYSxFQUFFLENBQUM7b0JBRXhELHNIQUFzSDtvQkFDdEgsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLEVBQUU7d0JBQ3hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsQ0FBQzt3QkFDbEcsSUFBSSxRQUFRLEVBQUU7NEJBQ1osTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDakYsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7eUJBQzlCO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELHdIQUF3SDtRQUN4SCxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3Riw2SUFBNkk7UUFDN0ksSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7WUFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQ2hFLGlEQUFpRDtnQkFDakQsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFOUgsc0ZBQXNGO2dCQUN0RixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQVUsQ0FBQztnQkFDekUsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBRXhJLGtGQUFrRjtnQkFDbEYsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdkIsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDO2lCQUM1QztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksYUFBYSxDQUFDLFNBQWlCLEVBQUUsVUFBZSxFQUFFLFVBQW9CO1FBQzNFLDRDQUE0QztRQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMzRCxzRkFBc0Y7UUFDdEYsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQztRQUNuRixrREFBa0Q7UUFDbEQsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUVqQywyQ0FBMkM7UUFDM0MsSUFBSSxFQUFFLEdBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFpQixDQUFDO1FBRTFFLHNEQUFzRDtRQUN0RCxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O01BTUU7SUFDTSwwQkFBMEIsQ0FBQyxNQUFXLEVBQUUsZ0JBQTBCO1FBQ3hFLDBEQUEwRDtRQUMxRCxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUU1QixrREFBa0Q7UUFDbEQsS0FBSyxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUU7WUFDdkIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUN0RCx5Q0FBeUM7Z0JBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BDLHFEQUFxRDtnQkFDckQsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUUzSCxnREFBZ0Q7Z0JBQ2hELGdCQUFnQixDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQztTQUNGO1FBRUQsbUNBQW1DO1FBQ25DLE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFTSxnQ0FBZ0MsQ0FBQyxhQUFxQixFQUFFLFNBQWtCO1FBQy9FLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDLGVBQWUsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxVQUFVLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1lBQ3ZHLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxFQUFFO2dCQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO2FBQ2xDO1NBQ0Y7SUFDSCxDQUFDOzswR0EvakNVLGFBQWE7OEZBQWIsYUFBYSx1RUMxQjFCLGt6REFnQ0E7MkZETmEsYUFBYTtrQkFMekIsU0FBUzsrQkFDRSxVQUFVOztBQXNrQ3RCLElBQUssYUFvQko7QUFwQkQsV0FBSyxhQUFhO0lBQ2hCLDhCQUFhLENBQUE7SUFDYixzQ0FBcUIsQ0FBQTtJQUNyQixzQ0FBcUIsQ0FBQTtJQUNyQixpQ0FBZ0IsQ0FBQTtJQUNoQiw4QkFBYSxDQUFBO0lBQ2Isd0NBQXVCLENBQUE7SUFDdkIsNENBQTJCLENBQUE7SUFDM0Isa0NBQWlCLENBQUE7SUFDakIsc0NBQXFCLENBQUE7SUFDckIsZ0NBQWUsQ0FBQTtJQUNmLDhCQUFhLENBQUE7SUFDYixnQ0FBZSxDQUFBO0lBQ2Ysb0NBQW1CLENBQUE7SUFDbkIsc0NBQXFCLENBQUE7SUFDckIsd0RBQXVDLENBQUE7SUFDdkMsb0RBQW1DLENBQUE7SUFDbkMsbUNBQWtCLENBQUE7SUFDbEIsb0NBQW1CLENBQUE7SUFDbkIsK0JBQWMsQ0FBQTtBQUNoQixDQUFDLEVBcEJJLGFBQWEsS0FBYixhQUFhLFFBb0JqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IEFzeW5jU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBjb25jYXRNYXAsIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHtcclxuICBaQ29tcG9uZW50LCBaRmllbGQsXHJcbiAgQWxlcnRTZXJ2aWNlLCBBdXRoU2VydmljZSwgRmllbGRTZXJ2aWNlLCBUb2FzdFNlcnZpY2UsXHJcbiAgWkdyb3VwLCBaQ29tcG9uZW50UHJvcGVydGllcywgWkNvbXBvbmVudEhlbHBlciwgQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZVxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7IFxyXG5pbXBvcnQgeyBaR3JpZCB9IGZyb20gXCIuLi96Z3JpZC96Z3JpZC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ29udGFpbmVyRmllbGRCYXNlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvY29udGFpbmVyZmllbGRiYXNlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy96Y29tcG9uZW50LnNlcnZpY2VcIjtcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC16dWRmJyxcclxuICB0ZW1wbGF0ZVVybDogJy4venVkZi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4venVkZi5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgWnVkZkNvbXBvbmVudCBleHRlbmRzIENvbnRhaW5lckZpZWxkQmFzZSBpbXBsZW1lbnRzIFpDb21wb25lbnQsIE9uSW5pdCB7XHJcblxyXG4gIC8vIGZvcm1GaWVsZHM6IGFueVtdOyAvLyBwb3B1bGF0ZSB1c2luZyBmaWVsZCBlbGVtZW50LiBcclxuICBjb21wb25lbnRQcm9wZXJ0aWVzID0gbmV3IFpDb21wb25lbnRQcm9wZXJ0aWVzKCk7XHJcbiAgaW5pdGlhbERhdGFWYWx1ZTogYW55O1xyXG4gIGNvbXBvbmVudFByZWZpeDogc3RyaW5nO1xyXG4gIGNvbXBvbmVudFNjb3BlTmFtZTogc3RyaW5nO1xyXG4gIGRpc3BsYXlFbGVtZW50TW9kZWw6IGFueTtcclxuICBtdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWU6IHN0cmluZ1tdO1xyXG4gIGxvYWRlZEZpZWxkc1NlcXVlbmNlOiBhbnk7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpeFZhbHVlT3B0aW9uID0gJ196dWRmbXZnT3B0aW9ucyc7XHJcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpeERhdGFTb3VyY2VOYW1lID0gJ196dWRmbXZnRGF0YVNvdXJjZSc7XHJcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpeENvbHVtbkZpZWxkc05hbWUgPSAnX3p1ZGZtdmdDb2x1bW5GaWVsZHMnO1xyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhDdXN0b21BZGRCdXR0b25PbkNsaWNrID0gJ19DdXN0b21BZGRCdXR0b25PbkNsaWNrJztcclxuICBwdWJsaWMgcmVhZG9ubHkgcHJlZml4Q3VzdG9tUmVzZXRCdXR0b25PbkNsaWNrID0gJ19DdXN0b21SZXNldEJ1dHRvbk9uQ2xpY2snO1xyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhDdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrID0gJ19DdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZTogQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gICAgc3VwZXIoY29tcG9uZW50U2VydmljZSlcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgbGV0IG9iczogT2JzZXJ2YWJsZTxhbnk+ID0gb2YodGhpcy5kYXRhLlZhbHVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLlZhbHVlID09IHVuZGVmaW5lZCAmJiB0aGlzLmRhdGEuRmllbGRFbGVtZW50Q29kZSkge1xyXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLkZpZWxkRWxlbWVudENvZGUsIHRoaXMuZ3JvdXApO1xyXG4gICAgICBvYnMgPSB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKGZpZWxkTmFtZSwgJ0Zvcm1GaWVsZCcsIHRoaXMsICdmaWVsZHMnKTtcclxuICAgIH1cclxuXHJcbiAgICBzdXBlci5pbml0Q29tcG9uZW50KCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9icyksXHJcbiAgICAgIHN3aXRjaE1hcCgoZmllbGQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhLkZpZWxkRWxlbWVudENvZGUpIHtcclxuICAgICAgICAgIC8vIHVzZSBvYnMgdmFsdWUgb25seSBpZiBGaWVsZEVsZW1lbnRDb2RlIGlzIHNldC4gaWYgbnRvIGRlZmF1bHQgYXMgbnVsbC5cclxuICAgICAgICAgIHRoaXMuZGF0YS5WYWx1ZSA9IGZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGF0YS5WYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTdG9yZSBpbml0aWFsIGRhdGEgdmFsdWUgYW5kIHNldCBjb21wb25lbnQgc2NvcGUgYW5kIHByZWZpeFxyXG4gICAgICAgIHRoaXMuaW5pdGlhbERhdGFWYWx1ZSA9IHRoaXMuZGF0YS5WYWx1ZTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFNjb3BlTmFtZSA9ICd6dWRmXycgKyB0aGlzLmRhdGEuTmFtZTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFByZWZpeCA9ICd6dWRmXycgKyB0aGlzLmRhdGEuTmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5ncm91cFt0aGlzLmRhdGEuTmFtZSArICdNb2RlbCddID0gW107XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEZvcm0oKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZmllbGQgZWxlbWVudCBhbmQgc2V0cyB1cCB0aGUgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRGb3JtKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShcclxuICAgICAgLy8gU2V0IHRoZSBTdWJUeXBlIHRvICd6dWRmJy5cclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGEuU3ViVHlwZSA9ICd6dWRmJztcclxuICAgICAgfSksXHJcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBncm91cCBmb3IgdGhlIGZpZWxkIGFuZCBzZXQgdXAgdGhlIGZvcm0uXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFpHcm91cCBmb3IgdGhlIGZpZWxkIGlmIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXSkge1xyXG4gICAgICAgICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0gPSBuZXcgWkdyb3VwKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZWNsYXJlIGEgbmV3IHpNb2RlbCBvYmplY3QgZm9yIHRoZSBaR3JvdXAuXHJcbiAgICAgICAgY29uc3QgenVkZlNjb3BlR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXTtcclxuICAgICAgICB6dWRmU2NvcGVHcm91cC56TW9kZWwgPSB7fTtcclxuXHJcbiAgICAgICAgLy8gUmVuZGVyIHRoZSBmaWVsZCBlbGVtZW50LlxyXG4gICAgICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KHRoaXMuZGF0YS5WYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgZm9ybSBmb3IgdGhlIFpHcm91cCBzY29wZS5cclxuICAgICAgICBpZiAodGhpcy5kYXRhLlZhbHVlKSB7XHJcbiAgICAgICAgICAvLyBJZiBWYWx1ZSBpcyBub3QgbnVsbCwgYmluZCB0aGUgZXhpc3RpbmcgZm9ybS5cclxuICAgICAgICAgIHp1ZGZTY29wZUdyb3VwLmZvcm0gPSB0aGlzLmZvcm07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIFZhbHVlIGlzIG51bGwsIGNyZWF0ZSBhIG5ldyBmb3JtIHdpdGggYW4gZW1wdHkgZm9ybSBjb250cm9sLlxyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2w6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgICAgenVkZlNjb3BlR3JvdXAuZm9ybSA9IG5ldyBGb3JtR3JvdXAoZm9ybUNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIC8vIFNldCB0aGUgZm9ybUZpZWxkcyBwcm9wZXJ0eSBmb3IgZGlzcGxheS5cclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAvLyB0aGlzLmZvcm1GaWVsZHMgPSBPYmplY3QuYXNzaWduKFtdLCB0aGlzLmRhdGEuVmFsdWUpO1xyXG5cclxuICAgICAgICBaQ29tcG9uZW50SGVscGVyLmFwcGVuZENvbnNvbGVXYXRjaExpc3QodGhpcy5ncm91cCwgYGdyb3VwLiR7dGhpcy5jb21wb25lbnRTY29wZU5hbWV9LnpNb2RlbGApO1xyXG5cclxuICAgICAgICAvLyBDYWxsIHRoZSBhZnRlcjxGaWVsZD5Mb2FkZWQgZnVuY3Rpb24gaWYgaXQgZXhpc3RzIGluIHRoZSBncm91cC5cclxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSAnYWZ0ZXInICsgKHRoaXMuZGF0YS5OYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5kYXRhLk5hbWUuc2xpY2UoMSkpICsgJ0xvYWRlZCc7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwW2ZpZWxkTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cFtmaWVsZE5hbWVdKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IEZpZWxkIGRpdiBjbGFzc1xyXG4gICAgICAgIC8vIFJlcGxhY2VkIHdpdGg6IHRoaXMuZmllbGRTZXJ2aWNlLnBhdGNoRmllbGRQcm9wZXJ0eShmaWVsZCk7XHJcbiAgICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5zZXRGaWVsZHNEaXZDbGFzcyh0aGlzLmdyb3VwLl9wcm9qZWN0TmFtZSwgdGhpcy5ncm91cC5maWVsZE5hbWUsIHRoaXMuZGF0YSwgdGhpcy5hdXRoU2VydmljZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZvcm1Db250cm9sVmFsaWRhdGlvbihmb3JtQ29udHJvbE5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBhbnkpIHtcclxuICAgIGRlYnVnZ2VyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBmaWVsZCBlbGVtZW50cyBiYXNlZCBvbiBhIEpTT04gc3RyaW5nLlxyXG4gICAqIEBwYXJhbSBncm91cCBUaGUgWkdyb3VwIG9iamVjdCB0byB3aGljaCB0aGUgZmllbGQgZWxlbWVudHMgd2lsbCBiZSBhZGRlZC5cclxuICAgKiBAcGFyYW0ganNvblN0cmluZyBUaGUgSlNPTiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCBlbGVtZW50cy5cclxuICAgKi9cclxuICBwdWJsaWMgcmVuZGVyRmllbGRFbGVtZW50QnlKc29uU3RyaW5nKGdyb3VwOiBaR3JvdXAsIGpzb25TdHJpbmc6IHN0cmluZywgZmllbGRFbGVtZW50TmFtZTogc3RyaW5nID0gJycpOiB2b2lkIHtcclxuICAgIC8vIFBhcnNlIHRoZSBKU09OIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIGZpZWxkIGVsZW1lbnRzLlxyXG4gICAgY29uc3QgZmllbGRFbGVtZW50TWFzdGVyQ29kZUpzb25BcnJheSA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBmaWVsZCBlbGVtZW50cy5cclxuICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KGZpZWxkRWxlbWVudE1hc3RlckNvZGVKc29uQXJyYXksIGZpZWxkRWxlbWVudE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIERpc3BsYXkgbW9kZWxcclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkaXNwbGF5IG1vZGVsIGZvciBhIHp1ZGYgKHplcm8tdXRpbGl0eSBkYXRhIGZpZWxkKSBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGRpc3BsYXkgbW9kZWwuXHJcbiAgICovXHJcbiAgcHVibGljIHNldERpc3BsYXlNb2RlbCh2YWx1ZTogYW55KSB7XHJcbiAgICAvLyBSZXBsYWNlIHRoZSB3aG9sZSBkaXNwbGF5IG1vZGVsIHdpdGggdGhlIG5ldyB2YWx1ZVxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIC8vIENsZWFyIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAgdGhpcy5jbGVhckZvcm1Db250cm9sKCk7XHJcblxyXG4gICAgICAvLyBNYWtlIGEgZGVlcCBjb3B5IG9mIHRoZSB2YWx1ZSB0byBhdm9pZCBhbnkgdW53YW50ZWQgcmVmZXJlbmNlIGVycm9yc1xyXG4gICAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPSBaQ29tcG9uZW50SGVscGVyLmRlZXBDbG9uZSh2YWx1ZSk7XHJcblxyXG4gICAgICAvLyBSZW5kZXIgdGhlIGZpZWxkIGVsZW1lbnQgYmFzZWQgb24gdGhlIG5ldyBkaXNwbGF5IG1vZGVsXHJcbiAgICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGludmFsaWQsIGxvZyBhIHdhcm5pbmcgbWVzc2FnZVxyXG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgdXNlZCBmb3IgcmVuZGVyIHp1ZGYgJyArIHRoaXMuZGF0YS5OYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVXBkYXRlcyBhIHZhbHVlIGluIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwgYXQgdGhlIHNwZWNpZmllZCBmbGF0IGluZGV4LlxyXG4gICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0LlxyXG4gICogQHBhcmFtIHtzdHJpbmd9IGZsYXRJbmRleCAtIFRoZSBmbGF0IGluZGV4IGluZGljYXRpbmcgdGhlIGxvY2F0aW9uIGluIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwgd2hlcmUgdGhlIHZhbHVlIHNob3VsZCBiZSB1cGRhdGVkLlxyXG4gICovXHJcbiAgcHVibGljIHVwZGF0ZURpc3BsYXlNb2RlbCh2YWx1ZTogYW55LCBmbGF0SW5kZXg6IHN0cmluZykge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci51cGRhdGVBcnJheU9iamVjdEJ5RmxhdEluZGV4KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCwgZmxhdEluZGV4LCB2YWx1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG4gICAgLy90aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFwcGVuZHMgYSB2YWx1ZSB0byB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIGF0IHRoZSBzcGVjaWZpZWQgZmxhdCBpbmRleC5cclxuICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgYXBwZW5kZWQuXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdEluZGV4IC0gVGhlIGZsYXQgaW5kZXggaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gaW4gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIGFwcGVuZGVkLlxyXG4gICovXHJcbiAgcHVibGljIGFwcGVuZFRvRGlzcGxheU1vZGVsKHZhbHVlOiBhbnksIGZsYXRJbmRleDogc3RyaW5nKSB7XHJcbiAgICAvLyBBcHBlbmQgdG8gZGlzcGxheSBtb2RlbCBtZWFucyBpdCB3aWxsIGluc2VydCB0aGUgZm9ybSBjb250cm9sIGJhc2VkIG9uIGZsYXQgaW5kZXguXHJcbiAgICBpZiAoZmxhdEluZGV4Lmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgIGZsYXRJbmRleC5zdWJzdHJpbmcoMCwgZmxhdEluZGV4Lmxlbmd0aCAtIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkUmVjb3JkID0gWkNvbXBvbmVudEhlbHBlci5nZXRGcm9tQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCk7XHJcbiAgICBzZWxlY3RlZFJlY29yZC5WYWx1ZS5wdXNoKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbC5cclxuICAgKiBAcmV0dXJucyB7YW55fSBBIGRlZXAgY29weSBvZiB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXREaXNwbGF5TW9kZWwoKSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCBhbmQgY2xlYXJzIHRoZSBmb3JtIGNvbnRyb2wuXHJcbiAgICovXHJcbiAgcHVibGljIHJlbW92ZUFsbERpc3BsYXlNb2RlbCgpIHtcclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IFtdO1xyXG4gICAgdGhpcy5jbGVhckZvcm1Db250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIGF0IHRoZSBzcGVjaWZpZWQgZmxhdCBpbmRleCBhbmQgdXBkYXRlcyB0aGUgZm9ybSBmaWVsZC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdEluZGV4IC0gVGhlIGZsYXQgaW5kZXggaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gaW4gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCB3aGVyZSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcmVtb3ZlZC5cclxuICAgKi9cclxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudEZyb21EaXNwbGF5TW9kZWwoZmxhdEluZGV4OiBzdHJpbmcpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVtb3ZlQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG5cclxuICAgIC8vIFRPRE86IHJlbW92ZSBmcm9tIHptb2RlbFxyXG4gICAgLy9kZWxldGUgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsWycnXTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZHMgYSBmb3JtIGNvbnRyb2wgdG8gdGhlIGZvcm0gYW5kIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwuXHJcbiAgICogQHBhcmFtIHtaRmllbGR9IGZpZWxkRGF0YSAtIFRoZSBkYXRhIGZvciB0aGUgZm9ybSBjb250cm9sIHRvIGJlIGFwcGVuZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhcHBlbmRGb3JtQ29udHJvbChmaWVsZERhdGEpIHtcclxuICAgIC8vIEFwcGVuZCBmb3JtIGNvbnRyb2wgbWVhbnMgaXQgd2lsbCBqdXN0IGluc2VydCB0aGUgZm9ybSBjb250cm9sIGF0IHRoZSBlbmQuXHJcbiAgICBmaWVsZERhdGEuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGREYXRhLk5hbWUsIGZpZWxkRGF0YVsnY29udGFpbmVyTmFtZSddKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9scyA9IHt9O1xyXG5cclxuICAgIGZvcm1Db250cm9sc1tmaWVsZERhdGEuTmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbFtmaWVsZERhdGEuTmFtZV1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGREYXRhLk5hbWUsIGZvcm1Db250cm9sc1tmaWVsZERhdGEuTmFtZV0pO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhLlZhbHVlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdmb3JtRmllbGQgJyArIHRoaXMuZGF0YS5OYW1lICsgJyBpcyB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPSB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPz8gW107XHJcbiAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwucHVzaChmaWVsZERhdGEpO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtRmllbGQoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgZmllbGQgZWxlbWVudHMgYXMgZm9ybSBjb250cm9scyBpbiBhIG5ldyBmb3JtIGdyb3VwLlxyXG4gICAqIEBwYXJhbSB7YW55fSBmaWVsZEVsZW1lbnRzIC0gVGhlIGZpZWxkIGVsZW1lbnRzIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW5kZXJGaWVsZEVsZW1lbnQoZmllbGRFbGVtZW50czogYW55LCBmaWVsZEVsZW1lbnROYW1lOiBzdHJpbmcgPSAnJykge1xyXG4gICAgdGhpcy5jbGVhclpNb2RlbCgpO1xyXG5cclxuICAgIGlmIChmaWVsZEVsZW1lbnRzKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2UgPSB7fTtcclxuICAgICAgY29uc3QgZm9ybUNvbnRyb2xzID0ge307XHJcbiAgICAgIGZpZWxkRWxlbWVudHMgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xzKGZpZWxkRWxlbWVudHMsIGZvcm1Db250cm9scyk7XHJcblxyXG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIHByZXZpb3VzIHN1YnNjcmlwdGlvbiBpZiBleGlzdHNcclxuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVuZGVyIGZvcm0gY29udHJvbHMgdG8gbmV3IGZvcm0gZ3JvdXBcclxuICAgICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cChmb3JtQ29udHJvbHMpO1xyXG4gICAgICB0aGlzLmRhdGEuVmFsdWUgPSBmaWVsZEVsZW1lbnRzO1xyXG4gICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS5mb3JtID0gdGhpcy5mb3JtO1xyXG4gICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVsnbG9hZGVkRmllbGRzU2VxdWVuY2UnXSA9IHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2U7XHJcblxyXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gY29tcG9uZW50TG9hZGVkJCBldmVudFxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuZmllbGRTZXJ2aWNlLmdldENvbXBvbmVudExvYWRlZCQoJ3p1ZGYnKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIEFsbCBjb21wb25lbnRzIGhhdmUgZmluaXNoZWQgbG9hZGluZ1xyXG5cclxuICAgICAgICBjb25zdCB6dWRmR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXTtcclxuICAgICAgICBpZiAoenVkZkdyb3VwWydsaW5rZWRDb21wb25lbnQnXSkge1xyXG4gICAgICAgICAgenVkZkdyb3VwWydsaW5rZWRDb21wb25lbnQnXS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rZWRDb21wb25lbnRTZWdtZW50cyA9IGl0ZW0udmFsdWUuc3BsaXQoJ18nKTtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50TmFtZSA9IGxpbmtlZENvbXBvbmVudFNlZ21lbnRzLnNsaWNlKDAsIDIpLmpvaW4oJ18nKSArICdfJyArIGl0ZW0ubGlua2VkQ29tcG9uZW50O1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEJ5VmFsdWUodGhpcy5ncm91cCwgcGFyZW50Q29tcG9uZW50TmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRCeVZhbHVlKHRoaXMuZ3JvdXAsIGl0ZW0udmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudENvbXBvbmVudCAmJiBjaGlsZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU2VsZWN0T3B0aW9ucyA9IGNoaWxkQ29tcG9uZW50LmRhdGFbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID8/IE9iamVjdC5hc3NpZ24oW10sIGNoaWxkQ29tcG9uZW50LmRhdGEuU2VsZWN0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRTZWxlY3Rpb25PcHRpb25zID0gb3JpZ2luYWxTZWxlY3RPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnBhcmVudEV4cHJlc3Npb24gPT0genVkZkdyb3VwLnpNb2RlbFtwYXJlbnRDb21wb25lbnROYW1lXSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIE1hbnVhbGx5IHBhdGNoIHRoZSBjb21wb25lbnQgZm9ybSBjb250cm9sIHZhbHVlXHJcbiAgICAgICAgICAgICAgY29uc3QgenVkZkZvcm0gPSB6dWRmR3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Rm9ybUNvbnRyb2wgPSB6dWRmRm9ybS5jb250cm9sc1tpdGVtLnZhbHVlXSBhcyBGb3JtQ29udHJvbDtcclxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkQ29tcG9uZW50LnNldFNlbGVjdE9wdGlvbihmaWx0ZXJlZFNlbGVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Rm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh6dWRmR3JvdXAuek1vZGVsW2l0ZW0udmFsdWVdKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBnZXQgZm9ybWNvbnRyb2wgZm9yICcgKyBpdGVtLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHp1ZGZGb3JtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbmVlZCB0byBjYWxsIGJhY2sgZmllbGQgZWxlbWVudCBcIjxmaWVsZCBuYW1lPl9sb2FkZWRcIlxyXG4gICAgICAgIGlmIChmaWVsZEVsZW1lbnROYW1lICE9ICcnKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cFtmaWVsZEVsZW1lbnROYW1lICsgJ19sb2FkZWQnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmdyb3VwW2ZpZWxkRWxlbWVudE5hbWUgKyAnX2xvYWRlZCddKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVG8gY29uc2lkZXI6IFRyaWdnZXIgdGhlIFwib25jaGFuZ2VcIiBldmVudCBvciBwZXJmb3JtIGFueSBvdGhlciBuZWNlc3NhcnkgYWN0aW9ucyBoZXJlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUZvcm1Db250cm9scyhmaWVsZEFycmF5OiBhbnksIGZvcm1Db250cm9sczogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB9LCBjb250YWluZXJOYW1lPzogc3RyaW5nLCBpc011bHRpVmFsdWVHcm91cCA9IGZhbHNlLCBmaWVsZFZhbHVlR3JvdXBlZCA9IGZhbHNlLCBpbmRleCA9ICcnKSB7XHJcbiAgICBmaWVsZEFycmF5LmZvckVhY2goKGZpZWxkLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkSW5kZXggPSBpbmRleCA/IGAke2luZGV4fS4ke2kgKyAxfWAgOiBgJHtpfWA7XHJcblxyXG4gICAgICB0aGlzLmZpZWxkU2VydmljZS5wYXRjaEZpZWxkUHJvcGVydHkoZmllbGQpO1xyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkLlZhbHVlID09PSBcInN0cmluZ1wiICYmIGZpZWxkLlZhbHVlLmluZGV4T2YoXCIuXCIpICE9PSAtMSkge1xyXG4gICAgICAgIGlmIChbJ3pncmlkJywgJ3p0cmVlJywgJ3ppbWcnLCAndGV4dGFyZWFqc29uJ10uaW5kZXhPZihmaWVsZC5UeXBlKSA9PT0gLTEpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcIkZvcm1Db250cm9sIC0gaW52YWxpZCBmaWVsZCB2YWx1ZVwiLCBmaWVsZC5WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHp1ZGZHcm91cCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5WYWx1ZSkpIHtcclxuICAgICAgICAgIC8vIGluc2VydCBtdWx0aXZhbHVlZ3JvdXAgdG8gdGhlIGNhcmQgdmFsdWUgaWYgdHJ1ZVxyXG4gICAgICAgICAgY29uc3QgZmllbGRWYWx1ZUdyb3VwZWQgPSBmaWVsZC5UeXBlID09IENvbXBvbmVudFR5cGUuZ3JvdXBpbmcgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZEZpZWxkc1NlcXVlbmNlW2ZpZWxkSW5kZXhdID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBmaWVsZC5NdWx0aVZhbHVlZEdyb3VwID8gYCR7dGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZC5OYW1lKX0ke3RoaXMucHJlZml4VmFsdWVPcHRpb259YCA6IGAke3RoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGQuTmFtZSl9YCxcclxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLlRpdGxlLFxyXG4gICAgICAgICAgICB0eXBlOiBmaWVsZC5UeXBlLFxyXG4gICAgICAgICAgICBpc011bHRpVmFsdWVHcm91cDogZmllbGQuTXVsdGlWYWx1ZWRHcm91cCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgaXNHcm91cGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNWaXNpYmxlOiBmaWVsZC5WaXNpYmxlID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBpc1JlcXVpcmVkOiBmaWVsZC5Jc1JlcXVpcmVkID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBpc1JlYWRPbmx5OiBmaWVsZC5SZWFkT25seSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgZGF0YVNvdXJjZVR5cGU6IGZpZWxkLnp1ZGZEYXRhU291cmNlVHlwZSA/PyBudWxsIC8vdmFsdWUgYWthIG1hbnVhbCwgdXNlciwgcmVzb3VyY2UgYWthIHJlc291cmNlXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZC5NdWx0aVZhbHVlZEdyb3VwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TXVsdGlWYWx1ZUdyb3VwKGZpZWxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbHMoZmllbGQuVmFsdWUsIGZvcm1Db250cm9scywgZmllbGQuTmFtZSwgZmllbGQuTXVsdGlWYWx1ZWRHcm91cCwgZmllbGRWYWx1ZUdyb3VwZWQsIGZpZWxkSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGJlZm9yZSBnZW5lcmF0ZSBGb3JtQ29udHJvbCwgd2UgbmVlZCB0byBhZGQgMiBhdHRyaWJ1dGUgdG8gdGhlIGZpZWxkIHdoZW4gcmVuZGVyLlxyXG4gICAgICAgICAgLy8gdGhpcyBmb3IgbGF0ZXIgb24sIHdlIGNhbiBlYXNpbHkga25vdyB0aGlzIGZpZWxkIGJlbG9uZyB0byB3aGljaCB6dWRmIGFuZCB1bmRlciB3aGljaCBjb250YWluZXIuXHJcbiAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xyXG4gICAgICAgICAgICBmaWVsZFsnY29udGFpbmVyTmFtZSddID0gY29udGFpbmVyTmFtZTtcclxuICAgICAgICAgICAgaWYgKCF6dWRmR3JvdXBbY29udGFpbmVyTmFtZV0pIHtcclxuICAgICAgICAgICAgICB6dWRmR3JvdXBbY29udGFpbmVyTmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzRm9ybUNvbnRyb2wgPSBaQ29tcG9uZW50SGVscGVyLmlzRm9ybUNvbnRyb2woZmllbGQpO1xyXG4gICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gWkNvbXBvbmVudEhlbHBlci5pc1Zpc2libGVGb3JtQ29udHJvbCh0aGlzLCBmaWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBpc1JlcXVpcmVkID0gWkNvbXBvbmVudEhlbHBlci5pc1JlcXVpcmVkRm9ybUNvbnRyb2wodGhpcywgZmllbGQpO1xyXG5cclxuICAgICAgICAgIGlmIChpc0Zvcm1Db250cm9sID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWRGaWVsZHNTZXF1ZW5jZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2UgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT09ICd6dWlzZWxlY3RtdWx0aXBsZScpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpZWxkU2VydmljZS5pbmNyZW1lbnRDb21wb25lbnRDb3VudGVyKCd6dWRmJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmllbGQuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGQuTmFtZSwgY29udGFpbmVyTmFtZSk7XHJcbiAgICAgICAgICAgIGZpZWxkLlZhbHVlID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZC5WYWx1ZSwgY29udGFpbmVyTmFtZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRlZEZpZWxkc1NlcXVlbmNlW2ZpZWxkSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgIG5hbWU6IGZpZWxkLk5hbWUsXHJcbiAgICAgICAgICAgICAgbGFiZWw6IGZpZWxkLkxhYmVsLFxyXG4gICAgICAgICAgICAgIHR5cGU6IGZpZWxkLlR5cGUsXHJcbiAgICAgICAgICAgICAgaXNNdWx0aVZhbHVlR3JvdXA6IGlzTXVsdGlWYWx1ZUdyb3VwLFxyXG4gICAgICAgICAgICAgIGlzR3JvdXBlZDogZmllbGRWYWx1ZUdyb3VwZWQsXHJcbiAgICAgICAgICAgICAgaXNWaXNpYmxlOiBmaWVsZC5WaXNpYmxlID8/IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IGZpZWxkLklzUmVxdWlyZWQgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgaXNSZWFkT25seTogZmllbGQuUmVhZE9ubHkgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZVR5cGU6IGZpZWxkLnp1ZGZEYXRhU291cmNlVHlwZSA/PyBudWxsIC8vdmFsdWUgYWthIG1hbnVhbCwgdXNlciwgcmVzb3VyY2UgYWthIHJlc291cmNlXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xyXG4gICAgICAgICAgICAgIGlmICghenVkZkdyb3VwW2NvbnRhaW5lck5hbWVdLmluY2x1ZGVzKGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwW2NvbnRhaW5lck5hbWVdLnB1c2goZmllbGQuVmFsdWUpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGxpc3Qgb2YgZHJvcGRvd24gb3B0aW9uIHRvIHRoZSB2YXJpYWJsZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duVHlwZShmaWVsZC5UeXBlKSAmJiBmaWVsZC5aRGF0YU9wdGlvbk5hbWUgJiYgZmllbGQuRHJvcGRvd25PcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC56RGF0YVtmaWVsZC5aRGF0YU9wdGlvbk5hbWVdID0gT2JqZWN0LmFzc2lnbihbXSwgZXZhbCgndGhpcy4nICsgZmllbGQuRHJvcGRvd25PcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25UeXBlKGZpZWxkLlR5cGUpICYmIGZpZWxkLnp1ZGZMaW5rZWRDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAvLyBrZWVwIGEgbGlzdCBvZiBsaW5rZWQgQ29tcG9uZW50LCBsYXRlciB3aWxsIGJlIHVzZWQgaW4gb25DaGFuZ2UgYXQgaW5wdXRmaWVsZGJhc2UuXHJcbiAgICAgICAgICAgICAgaWYgKCF6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddKSB7XHJcbiAgICAgICAgICAgICAgICB6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddID0gW107XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkLlZhbHVlLFxyXG4gICAgICAgICAgICAgICAgbGlua2VkQ29tcG9uZW50OiBmaWVsZC56dWRmTGlua2VkQ29tcG9uZW50XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGtlZXAgYSBjb3B5IG9mIFNlbGVjdE9wdGlvbnMgdG8gb3JpZ2luYWxTZWxlY3RPcHRpb25zKHNhbWUgYXMgb25jaGFuZ2UpXHJcbiAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIFNlbGVjdGlvbk9wdGlvbiBzaW5jZSBpdCB3b250IGJlIHVzZWQgd2hlbiBmaXJzdCBpbml0LCB1bnRpbCBwYXJlbnQgZHJvcGRvd24gb3B0aW9uIGJlZW4gc2VsZWN0ZWQuXHJcbiAgICAgICAgICAgICAgZmllbGRbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID0gT2JqZWN0LmFzc2lnbihbXSwgZmllbGQuU2VsZWN0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgZmllbGQuU2VsZWN0T3B0aW9ucyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhdXRvIGFwcGVuZCBjdXJyZW50IHVzZXIgdG8gdGhlIHptb2RlbCBiYXNlIG9uIGZpZWxkIGVsZW1lbnQgYXR0cmlidXRlIFwienVkZlNldERlZmF1bHRVc2VyXCJcclxuICAgICAgICAgICAgaWYgKGZpZWxkLnp1ZGZTZXREZWZhdWx0VXNlcikge1xyXG4gICAgICAgICAgICAgIGlmICghenVkZkdyb3VwWydmaWVsZFJlcXVpcmVkRGVmYXVsdFVzZXInXSkge1xyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwWydmaWVsZFJlcXVpcmVkRGVmYXVsdFVzZXInXSA9IFtdO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8ga2VlcCBhIGxpc3Qgb2YgZGVmYXVsdCB1c2VyIG5lZWQgdG8gYmUgZmlsbGVkIGluIHRoZSBzY29wZVxyXG4gICAgICAgICAgICAgIHp1ZGZHcm91cFsnZmllbGRSZXF1aXJlZERlZmF1bHRVc2VyJ10ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLk5hbWUsXHJcbiAgICAgICAgICAgICAgICBjaGlsZEZpZWxkczogZmllbGQuQ2hpbGRGaWVsZHNcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gdmFsaWRhdG9yIGZvciB0aGUgY29tcG9uZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBaQ29tcG9uZW50SGVscGVyLmdldFZhbGlkYXRvcnMoZmllbGQsIGlzVmlzaWJsZSwgaXNSZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sc1tmaWVsZC5WYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgenVkZkdyb3VwLnpNb2RlbFtmaWVsZC5WYWx1ZV0sXHJcbiAgICAgICAgICAgICAgdmFsaWRhdG9yc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoWkNvbXBvbmVudEhlbHBlci5oYXNDQ0ZpZWxkKGZpZWxkLlR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY2NWYWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gWkNvbXBvbmVudEhlbHBlci5nZXRDQ1ZhbGlkYXRvcnMoZmllbGQsIGlzVmlzaWJsZSwgaXNSZXF1aXJlZCk7XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzW2ZpZWxkLkNDVmFsdWVdID0gbmV3IEZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwLnpNb2RlbFtmaWVsZC5DQ1ZhbHVlXSxcclxuICAgICAgICAgICAgICAgIGNjVmFsaWRhdG9yc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gb25jaGFuZ2UgaGFuZGxpbmc/XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpZWxkQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIHRoZSBmb3JtIGNvbnRyb2xzIGZyb20gdGhlIGZvcm0gZ3JvdXAgYW5kIHJlc2V0cyB0aGUgY29tcG9uZW50J3MgZGF0YSBhbmQgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIGNsZWFyRm9ybUNvbnRyb2woKSB7XHJcbiAgICAvLyBSZW1vdmUgZWFjaCBmb3JtIGNvbnRyb2wgZnJvbSB0aGUgZm9ybSBncm91cFxyXG4gICAgaWYgKHRoaXMuZGF0YS5WYWx1ZSAmJiB0aGlzLmRhdGEuVmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmRhdGEuVmFsdWUuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICB0aGlzLmZvcm0ucmVtb3ZlQ29udHJvbChkYXRhLlZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzZXQgdGhlIGNvbXBvbmVudCdzIGRhdGEgYW5kIGRpc3BsYXkgZWxlbWVudCBtb2RlbFxyXG4gICAgdGhpcy5kYXRhLlZhbHVlID0gdGhpcy5pbml0aWFsRGF0YVZhbHVlO1xyXG4gICAgdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBmb3JtIGZpZWxkcyBmb3IgdGhlIGNvbXBvbmVudC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtvYmplY3RbXX0gLSBBbiBhcnJheSBvZiBmb3JtIGZpZWxkIG9iamVjdHMuXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZvcm1Db250cm9sKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5WYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHpNb2RlbCB2YWx1ZXMgb2YgYSBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaR3JvdXB9IFtncm91cD10aGlzLmdyb3VwXSAtIFRoZSBmb3JtIGdyb3VwIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gbW9kZWxEYXRhIC0gVGhlIG1vZGVsIGRhdGEgdG8gYXBwbHkgdG8gdGhlIGZvcm0gZ3JvdXAuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldEZvcm1GaWVsZHpNb2RlbChncm91cCA9IHRoaXMuZ3JvdXAsIG1vZGVsRGF0YSkge1xyXG4gICAgLy8gQWRkIHRoZSBjb21wb25lbnQgcHJlZml4IHRvIHRoZSBtb2RlbCBkYXRhIHByb3BlcnR5IG5hbWVzXHJcbiAgICBjb25zdCBwYXRjaGVkTW9kZWxEYXRhID0gdGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChtb2RlbERhdGEpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgek1vZGVsIHZhbHVlcyBvZiB0aGUgZm9ybSBncm91cFxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsLCBwYXRjaGVkTW9kZWxEYXRhKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgZ3JpZCB2YWx1ZXMgZm9yIGFueSBhcnJheXMgaW4gdGhlIG1vZGVsIGRhdGEgYmFzZSBvbiBrY2FyZCBjb21wb25lbnQuIFxyXG4gICAgZm9yIChjb25zdCBtb2RlbCBpbiBwYXRjaGVkTW9kZWxEYXRhKSB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGNoZWRNb2RlbERhdGFbbW9kZWxdKSkge1xyXG4gICAgICAgIGNvbnN0IGdyaWRWYWx1ZSA9IGAke21vZGVsfSR7dGhpcy5wcmVmaXhWYWx1ZU9wdGlvbn1gO1xyXG4gICAgICAgIGNvbnN0IGdyaWREYXRhU291cmNlID0gYCR7bW9kZWx9JHt0aGlzLnByZWZpeERhdGFTb3VyY2VOYW1lfWA7XHJcblxyXG4gICAgICAgIC8vY29uc3QgY29tcG9uZW50ID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRCeVZhbHVlKHRoaXMuZ3JvdXAsIG1vZGVsKTtcclxuICAgICAgICAvL2lmIChjb21wb25lbnQ/LmRhdGE/LlR5cGUgPT09ICdrY2FyZCcgfHwgY29tcG9uZW50Py5kYXRhPy5UeXBlID09PSAnemdyaWQnKSB7XHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGdyaWRcclxuICAgICAgICBncm91cFtncmlkRGF0YVNvdXJjZV0gPSBwYXRjaGVkTW9kZWxEYXRhW21vZGVsXTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBncmlkIHZhbHVlXHJcbiAgICAgICAgaWYgKGdyb3VwW2dyaWRWYWx1ZV0pIHtcclxuICAgICAgICAgIGdyb3VwW2dyaWRWYWx1ZV0uc2V0RGF0YShncm91cFtncmlkRGF0YVNvdXJjZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL31cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGZvcm0gZ3JvdXAgbW9kZWxcclxuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBmb3JtR3JvdXAucGF0Y2hWYWx1ZShncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBBZGQgdGhlIGNvbXBvbmVudCBwcmVmaXggdG8gcHJvcGVydHkgbmFtZXMgaW4gYW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBAcGFyYW0geyp9IG1vZGVsRGF0YSAtIFRoZSBvYmplY3QgdG8gdXBkYXRlLlxyXG4gKiBAcGFyYW0geyp9IFtjb250YWluZXJQcmVmaXhdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGluZGljYXRpbmcgdGhlIHByZWZpeCB0byB1c2UgZm9yIHByb3BlcnRpZXMgaW4gbmVzdGVkIG9iamVjdHMuXHJcbiAqIEByZXR1cm5zIHsqfSBUaGUgdXBkYXRlZCBvYmplY3QuXHJcbiAqL1xyXG4gIHByaXZhdGUgYWRkWk1vZGVsUHJvcGVydHlQcmVmaXgobW9kZWxEYXRhOiBhbnksIGNvbnRhaW5lclByZWZpeD86IGFueSk6IGFueSB7XHJcbiAgICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHRvIHN0b3JlIHRoZSB1cGRhdGVkIGRhdGFcclxuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbERhdGEgPSB7fTtcclxuXHJcbiAgICBpZiAodHlwZW9mIG1vZGVsRGF0YSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG1vZGVsRGF0YSA9PT0gJ251bWJlcicgfHwgWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eShtb2RlbERhdGEpKSB7XHJcbiAgICAgIHJldHVybiBtb2RlbERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggcHJvcGVydHkgaW4gdGhlIGlucHV0IG9iamVjdFxyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gbW9kZWxEYXRhKSB7XHJcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhbiBhcnJheVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbERhdGFbcHJvcGVydHlOYW1lXSkpIHtcclxuICAgICAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZEFycmF5ID0gW107XHJcblxyXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5XHJcbiAgICAgICAgZm9yIChjb25zdCBhcnJheUVsZW1lbnQgb2YgbW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0pIHtcclxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNhbGwgdGhpcyBtZXRob2QgdG8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXlcclxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0gdGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChhcnJheUVsZW1lbnQsIHByb3BlcnR5TmFtZSk7XHJcblxyXG4gICAgICAgICAgLy8gQWRkIHRoZSB1cGRhdGVkIGVsZW1lbnQgdG8gdGhlIGFycmF5XHJcbiAgICAgICAgICB1cGRhdGVkQXJyYXkucHVzaCh1cGRhdGVkRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIHVwZGF0ZWQgYXJyYXkgdG8gdGhlIG91dHB1dCBvYmplY3RcclxuICAgICAgICBjb25zdCBwcmVmaXhlZFByb3BlcnR5TmFtZSA9IGAke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke3Byb3BlcnR5TmFtZX1gO1xyXG4gICAgICAgIHVwZGF0ZWRNb2RlbERhdGFbcHJlZml4ZWRQcm9wZXJ0eU5hbWVdID0gdXBkYXRlZEFycmF5O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBtb2RlbERhdGFbcHJvcGVydHlOYW1lXSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIG9iamVjdHMgcmVjdXJzaXZlbHlcclxuICAgICAgICBjb25zdCB1cGRhdGVkTmVzdGVkT2JqZWN0ID0gdGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChtb2RlbERhdGFbcHJvcGVydHlOYW1lXSwgcHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSB1cGRhdGVkIG5lc3RlZCBvYmplY3QgdG8gdGhlIG91dHB1dCBvYmplY3RcclxuICAgICAgICBjb25zdCBwcmVmaXhlZFByb3BlcnR5TmFtZSA9IGAke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke3Byb3BlcnR5TmFtZX1gO1xyXG4gICAgICAgIHVwZGF0ZWRNb2RlbERhdGFbcHJlZml4ZWRQcm9wZXJ0eU5hbWVdID0gdXBkYXRlZE5lc3RlZE9iamVjdDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSBvdXRwdXQgb2JqZWN0IHdpdGggdGhlIGNvbXBvbmVudCBwcmVmaXhcclxuICAgICAgICBsZXQgcHJlZml4ZWRQcm9wZXJ0eU5hbWU7XHJcbiAgICAgICAgaWYgKGNvbnRhaW5lclByZWZpeCkge1xyXG4gICAgICAgICAgcHJlZml4ZWRQcm9wZXJ0eU5hbWUgPSBgJHt0aGlzLmNvbXBvbmVudFByZWZpeH1fJHtjb250YWluZXJQcmVmaXh9XyR7cHJvcGVydHlOYW1lfWA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHByZWZpeGVkUHJvcGVydHlOYW1lID0gYCR7dGhpcy5jb21wb25lbnRQcmVmaXh9XyR7cHJvcGVydHlOYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHVwZGF0ZWRNb2RlbERhdGFbcHJlZml4ZWRQcm9wZXJ0eU5hbWVdID0gbW9kZWxEYXRhW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgb2JqZWN0XHJcbiAgICByZXR1cm4gdXBkYXRlZE1vZGVsRGF0YTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRaTW9kZWxBc1N0cmluZygpIHtcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmdldFpNb2RlbCgpKTtcclxuICB9XHJcblxyXG4gIENvbXBvbmVudElzVmlzaWJsZShmaWVsZDogWkZpZWxkKTogYW55IHtcclxuICAgIHJldHVybiBaQ29tcG9uZW50SGVscGVyLkNvbXBvbmVudElzVmlzaWJsZShmaWVsZCwgdGhpcy5ncm91cCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RW5hYmxlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkgPSAhc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZpc2libGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlID0gc3RhdHVzO1xyXG4gICAgdGhpcy5kYXRhLlZpc2libGUgPSBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0UmVxdWlyZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1JlcXVpcmVkID0gc3RhdHVzO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5jaGFuZ2VWYWxpZGF0b3Ioc3RhdHVzLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUsIHRoaXMuY29tcG9uZW50UHJvcGVydGllcywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5UeXBlID09PSAnenRleHRlZGl0b3InKSB7XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFpDb21wb25lbnRIZWxwZXIucmVxdWlyZWRWYWxpZGF0b3JfV2l0aG91dFdoaXRlU3BhY2VzX1RleHRFZGl0b3IpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuY2hhbmdlVmFsaWRhdG9yKHN0YXR1cywgdGhpcy5ncm91cCwgdGhpcy5kYXRhLlZhbHVlLCB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMsIFpDb21wb25lbnRIZWxwZXIucmVxdWlyZWRWYWxpZGF0b3JfV2l0aG91dFdoaXRlU3BhY2VzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyB0aGUgbmFtZSBvZiBhIGZvcm0gY29udHJvbCBiYXNlZCBvbiBpdHMgdHlwZSwgbmFtZSwgYW5kIGNvbnRhaW5lciBuYW1lLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250cm9sTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmb3JtIGNvbnRyb2wuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRhaW5lck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRoYXQgdGhlIGZvcm0gY29udHJvbCBpcyBpbi5cclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIG5hbWUgb2YgdGhlIGZvcm0gY29udHJvbC5cclxuICAgKi9cclxuICBwdWJsaWMgZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoY29udHJvbE5hbWU6IHN0cmluZywgY29udGFpbmVyTmFtZT86IHN0cmluZykge1xyXG4gICAgY29uc3QgbWFpblByZWZpeCA9IFt0aGlzLmRhdGEuVHlwZSwgdGhpcy5kYXRhLk5hbWUsIGNvbnRhaW5lck5hbWUgPz8gbnVsbF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ18nKTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBuYW1lIGhhcyBiZWVuIHByZWZpeGVkLlxyXG4gICAgaWYgKGNvbnRyb2xOYW1lLmluY2x1ZGVzKG1haW5QcmVmaXgpKSB7XHJcbiAgICAgIHJldHVybiBjb250cm9sTmFtZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBXZSB0cnkgdG8gc3BsaXQgdGhlIG5hbWUgYW5kIHVzZSB0aGUgbGFzdCBzZWdtZW50LlxyXG4gICAgICAvLyBTb21ldGltZXMgdGhlIGNvbnRyb2wgbmFtZSBjYW4gYmUgd2l0aG91dCB0aGUgY29udGFpbmVyIG5hbWUsIHNvIHdlIHNwbGl0IGFuZCB1c2UgdGhlIG5ldyBtYWluIHByZWZpeC5cclxuICAgICAgY29uc3QgY29udHJvbE5hbWVTZWdtZW50ID0gY29udHJvbE5hbWUuc3BsaXQoJ18nKTtcclxuICAgICAgY29udHJvbE5hbWUgPSBjb250cm9sTmFtZVNlZ21lbnRbY29udHJvbE5hbWVTZWdtZW50Lmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbbWFpblByZWZpeCwgY29udHJvbE5hbWVdLmpvaW4oJ18nKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZHMgYSBwcmVmaXggdG8gdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgZmllbGRzIHJlY3Vyc2l2ZWx5LlxyXG4gICAqIEBwYXJhbSB7WkZpZWxkW119IGZpZWxkcyAtIFRoZSBmaWVsZHMgdG8gYmUgcHJlZml4ZWQuXHJcbiAgICogQHBhcmFtIHthbnl9IHByZWZpeCAtIFRoZSBwcmVmaXggdG8gYmUgYWRkZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBlbmRQcmVmaXgoZmllbGRzOiBaRmllbGRbXSwgcHJlZml4OiBhbnkpIHtcclxuICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuVmFsdWUpKSB7XHJcbiAgICAgICAgdGhpcy5hcHBlbmRQcmVmaXgoZmllbGQuVmFsdWUsIHByZWZpeCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgZmllbGQuTmFtZSA9IFtwcmVmaXgsIGZpZWxkLk5hbWVdLmpvaW4oJ18nKTtcclxuICAgICAgICBpZiAoZmllbGQuVHlwZSAhPSAnemJ1dHRvbnMnKSB7XHJcbiAgICAgICAgICBmaWVsZC5WYWx1ZSA9IFtwcmVmaXgsIGZpZWxkLlZhbHVlXS5qb2luKCdfJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpZWxkLlN1YlR5cGUgPSBwcmVmaXg7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgZm9ybSBmaWVsZHMgd2l0aCB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlRm9ybUZpZWxkKCkge1xyXG4gICAgdGhpcy5kYXRhLlZhbHVlID0gdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIGNvbnRhaW5lciBtb2RlbCBpbiB0aGUgZm9ybS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGFpbmVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZyb20uXHJcbiAgICogQHJldHVybnMge09iamVjdH0gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgY29udGFpbmVyIG1vZGVsIHZhbHVlcy5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Q29udGFpbmVyTW9kZWxWYWx1ZShjb250YWluZXJOYW1lOiBzdHJpbmcpOiBPYmplY3Qge1xyXG4gICAgLy8gR2V0IHRoZSBjb250YWluZXIgZWxlbWVudCBhbmQgY3JlYXRlIGFuIGVtcHR5IG9iamVjdCBmb3IgdGhlIG1vZGVsIHZhbHVlcy5cclxuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVtjb250YWluZXJOYW1lXTtcclxuICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB7fTtcclxuXHJcbiAgICAvLyBGbGFnIHRvIGtlZXAgdHJhY2sgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgZ3JvdXAgYXJlIHZhbGlkLlxyXG4gICAgbGV0IHZhbGlkR3JvdXBGaWVsZHMgPSB0cnVlO1xyXG5cclxuICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBhbmQgcmV0cmlldmUgaXRzIHZhbHVlIGZyb20gdGhlIHpNb2RlbC5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGFpbmVyRWxlbWVudC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gY29udGFpbmVyRWxlbWVudFtpXTtcclxuICAgICAgY29uc3QgZWxlbWVudENvbXBvbmVudCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50QnlWYWx1ZSh0aGlzLmdyb3VwLCBlbGVtZW50KTtcclxuICAgICAgbGV0IHpNb2RlbFZhbHVlID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsW2VsZW1lbnRdO1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgcmVxdWlyZWQgYW5kIGhhcyBhIHZhbHVlLCBpZiBub3Qgc2hvdyBhbiBlcnJvciBtZXNzYWdlLlxyXG4gICAgICBpZiAoZWxlbWVudENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQgJiYgWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eSh6TW9kZWxWYWx1ZSkpIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KGVsZW1lbnRDb21wb25lbnQuZGF0YS5MYWJlbCArICcgaXMgcmVxdWlyZWQgZmllbGQuIFBsZWFzZSBmaWxsIGluIGFsbCB0aGUgcmVxdWlyZWQgZmllbGRzIGJlZm9yZSBhZGRpbmcuJywgJ3RvcCcsIHRydWUsIDMwMDAsICdkYW5nZXInKTtcclxuICAgICAgICB2YWxpZEdyb3VwRmllbGRzID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDaGVjayBpZiBEcm9wZG93biBUeXBlLCBjaGFuZ2Ugek1vZGVsVmFsdWUgdG8gZGlzcGxheSB0ZXh0LlxyXG4gICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duVHlwZShlbGVtZW50Q29tcG9uZW50LmRhdGEuVHlwZSkpIHtcclxuICAgICAgICBjb25zdCBkcm9wZG93bk9wdGlvbnMgPSBlbGVtZW50Q29tcG9uZW50LmdldEl0ZW1zRGF0YSgpO1xyXG4gICAgICAgIGRyb3Bkb3duT3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgICBpZiAob3B0aW9uW2VsZW1lbnRDb21wb25lbnQuaXRlbVZhbHVlRmllbGRdID09PSB6TW9kZWxWYWx1ZSkge1xyXG4gICAgICAgICAgICB6TW9kZWxWYWx1ZSA9IG9wdGlvbltlbGVtZW50Q29tcG9uZW50Lml0ZW1UZXh0RmllbGRdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCB0aGUgdmFsdWUgdG8gdGhlIG1vZGVsIG9iamVjdC5QbGVhc2UgZmlsbCBpbiBhbGwgdGhlIHJlcXVpcmVkIGZpZWxkcyBiZWZvcmUgYWRkaW5nXHJcbiAgICAgIG1vZGVsVmFsdWVbZWxlbWVudF0gPSB6TW9kZWxWYWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIGludmFsaWQgZmllbGRzIGluIHRoZSBncm91cCwgcmV0dXJuIGFuIGVtcHR5IG1vZGVsIG9iamVjdC5cclxuICAgIGlmICghdmFsaWRHcm91cEZpZWxkcykge1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSBtb2RlbCBvYmplY3Qgd2l0aCB0aGUgY29udGFpbmVyIHZhbHVlcy5cclxuICAgIHJldHVybiBtb2RlbFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBDbGVhcnMgdGhlIHZhbHVlIG9mIGFsbCBmaWVsZCBlbGVtZW50cyBpbnNpZGUgYSBjb250YWluZXIuXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gY29udGFpbmVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgd2hvc2UgZmllbGRzIHdpbGwgYmUgY2xlYXJlZC5cclxuICAqL1xyXG4gIHB1YmxpYyBjbGVhckNvbnRhaW5lckZpZWxkRWxlbWVudFZhbHVlKGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gR2V0IHRoZSBjb250YWluZXIgZWxlbWVudCBmcm9tIHRoZSBjb21wb25lbnQncyBncm91cFxyXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdW2NvbnRhaW5lck5hbWVdO1xyXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggZmllbGQgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXHJcbiAgICBjb250YWluZXJFbGVtZW50LmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIC8vIFNldCB0aGUgbW9kZWwgdmFsdWUgb2YgdGhlIGZpZWxkIGVsZW1lbnQgdG8gbnVsbCwgYW5kIGZvcmNlIHVwZGF0ZSB0aGUgdmlld1xyXG4gICAgICB0aGlzLnNldE1vZGVsVmFsdWUoZWxlbWVudCwgbnVsbCwgdHJ1ZSk7XHJcblxyXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uZm9ybTtcclxuICAgICAgT2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IGZvcm0uY29udHJvbHNba2V5XTtcclxuICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiAtLS0tLS0tLS0tPT09PT09PT09PT09PT09PT09PT0gTXVsdGkgVmFsdWUgR3JvdXAgPT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tKi9cclxuICAvKipcclxuICAgKiBTZXRzIHVwIGEgbXVsdGktdmFsdWUgZ3JvdXAsIHdoaWNoIGlzIGEgZ3JpZCBvZiBmaWVsZHMgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZSByb3dzLlxyXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIG11bHRpLXZhbHVlIGdyb3VwLlxyXG4gICAqIEBwYXJhbSBkYXRhSW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGRhdGEgaW4gdGhlIGRpc3BsYXlNb2RlbC4gT3B0aW9uYWwsIHVzZWQgd2hlbiB1cGRhdGluZyBleGlzdGluZyBkYXRhLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRNdWx0aVZhbHVlR3JvdXAoZGF0YTogYW55LCBkYXRhSW5kZXg/OiBhbnkpIHtcclxuICAgIC8vIE5lZWQgdG8gZGVjbGFyZSBuYW1lLCB2YWx1ZSwgZGF0YXNvdXJjZSwgY29sdW1uZmllbGRzIGF0dHJpYnV0ZSBmb3IgZ3JpZC5cclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xOYW1lKGRhdGEuTmFtZSk7XHJcbiAgICBjb25zdCBncmlkVmFsdWVOYW1lID0gYCR7bmFtZX0ke3RoaXMucHJlZml4VmFsdWVPcHRpb259YDtcclxuICAgIGNvbnN0IGdyaWREYXRhU291cmNlTmFtZSA9IGAke25hbWV9JHt0aGlzLnByZWZpeERhdGFTb3VyY2VOYW1lfWA7XHJcbiAgICBjb25zdCBncmlkQ29sdW1uRmllbGRzTmFtZSA9IGAke25hbWV9JHt0aGlzLnByZWZpeENvbHVtbkZpZWxkc05hbWV9YDtcclxuXHJcbiAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgbXVsdGktdmFsdWUgZ3JvdXAgc2NvcGUuXHJcbiAgICBjb25zdCBtdWx0aVZhbHVlR3JvdXBTY29wZU5hbWUgPSBgbXZnXyR7ZGF0YS5OYW1lfWA7XHJcblxyXG4gICAgaWYgKCF0aGlzLmdyb3VwWydtdmdsaXN0J10pIHtcclxuICAgICAgdGhpcy5ncm91cFsnbXZnbGlzdCddID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmdyb3VwWydtdmdsaXN0J10uaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgdGhpcy5ncm91cFsnbXZnbGlzdCddLnB1c2gobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgcHJvcGVydHkgaW4gdGhlIGdyb3VwIG9iamVjdCBmb3IgdGhlIG11bHRpLXZhbHVlIGdyb3VwLlxyXG4gICAgdGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdID0gW107XHJcblxyXG4gICAgLy8gU3RvcmUgdGhlIGdyaWQgdmFsdWUgbmFtZSB0byBiZSB1c2VkIGluIGdldFpNb2RlbCB0byBnZXQgdGhlIGdyaWQgZGF0YS5cclxuICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlID0gdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUgPz8gW107XHJcbiAgICB0aGlzLm11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZS5wdXNoKGdyaWRWYWx1ZU5hbWUpO1xyXG5cclxuICAgIC8vIE1hbnVhbGx5IGFkZCBhdHRyaWJ1dGVzIHRvIHRoZSBncmlkIGVsZW1lbnQgdG8gc3BlZWQgdXAgbG9hZGluZy5cclxuICAgIGNvbnN0IGVsZW1lbnQgPSB7XHJcbiAgICAgIFwiQWRkQ29tbWFuZEJ1dHRvbk5hbWVcIjogXCJBZGRcIixcclxuICAgICAgXCJBbGxvd0V4cG9ydFwiOiBmYWxzZSxcclxuICAgICAgXCJBbGxvd0dyaWREYXRhRXhwb3J0XCI6IGZhbHNlLFxyXG4gICAgICBcIkFsbG93TXVsdGlTZWxlY3RcIjogZmFsc2UsXHJcbiAgICAgIFwiQWxsb3dSb3dTZWxlY3RcIjogZmFsc2UsXHJcbiAgICAgIFwiQWxsb3dTYXZlU3RhdGVcIjogZmFsc2UsXHJcbiAgICAgIFwiQ29sdW1uRmllbGRzXCI6ICdncm91cC4nICsgZ3JpZENvbHVtbkZpZWxkc05hbWUsXHJcbiAgICAgIFwiRGF0YVNvdXJjZVwiOiAnZ3JvdXAuJyArIGdyaWREYXRhU291cmNlTmFtZSxcclxuICAgICAgXCJEaXNhYmxlQ2VsbENsaWNrSGFuZGxlclwiOiB0cnVlLFxyXG4gICAgICBcIkRpc2FibGVHZW5lcmF0ZUNvbHVtbkJ5Rm9ybVwiOiB0cnVlLFxyXG4gICAgICBcIkRpdkNsYXNzXCI6ICdjb2wteHMtMTIgY29sLXNtLTEyIGNvbC1tZC0xMiBjb2wtbGctMTInLFxyXG4gICAgICBcIkVuYWJsZUN1c3RvbUFkZENvbW1hbmRcIjogdHJ1ZSxcclxuICAgICAgXCJFbmFibGVDdXN0b21SZW1vdmVDb21tYW5kXCI6IHRydWUsXHJcbiAgICAgIFwiRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kXCI6IHRydWUsXHJcbiAgICAgIFwiRW5hYmxlU2F2ZUdyaWRTdGF0ZVwiOiBmYWxzZSxcclxuICAgICAgXCJFeHRlcm5hbFBhZ2luYXRpb25cIjogZmFsc2UsXHJcbiAgICAgIFwiSGVpZ2h0UmVkdWNlXCI6IDI1MCxcclxuICAgICAgXCJMaW1pdEZpZWxkc1wiOiBmYWxzZSxcclxuICAgICAgXCJOYW1lXCI6IG5hbWUsXHJcbiAgICAgIFwiUGFnZVNpemVcIjogMjAsXHJcbiAgICAgIFwiUGFnZVNpemVzXCI6IGZhbHNlLFxyXG4gICAgICBcIlJlc291cmNlVVJMXCI6IHRydWUsXHJcbiAgICAgIFwiU2VsZWN0T3B0aW9uc1wiOiBmYWxzZSxcclxuICAgICAgXCJTaG93R3JpZEVkaXRCdXR0b25cIjogZmFsc2UsXHJcbiAgICAgIFwiU3ViVHlwZVwiOiBcInp1ZGZcIixcclxuICAgICAgXCJUeXBlXCI6IFwiemdyaWRcIixcclxuICAgICAgXCJWYWx1ZVwiOiAnZ3JvdXAuJyArIGdyaWRWYWx1ZU5hbWUsXHJcbiAgICAgIFwiVmlzaWJsZVwiOiB0cnVlLFxyXG4gICAgICBcIldpZHRoUmVkdWNlXCI6IDUwMCxcclxuICAgICAgXCJEaXNhYmxlQXV0b0FwcGVuZEdyaWREYXRlRmlsdGVyQ29sXCI6IHRydWVcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgYSBwcm9wZXJ0eSBpbiB0aGUgZ3JvdXAgb2JqZWN0IGJhc2VkIG9uIHRoZSBhYm92ZSBkZWNsYXJhdGlvbiwgZXhjZXB0IE5hbWUsIGFuZCBhbHNvIGluc2VydCBjb2x1bW4gZmllbGRzLlxyXG4gICAgLy8gVXNlIHRoZSBncm91cGluZyB2YWx1ZSBhcyB0aGUgY29sdW1uIGFuZCBza2lwIGluc2VydGluZyBhbnkgY29udGFpbmVyIHR5cGUuXHJcbiAgICBjb25zdCBjb250YWluZXJOYW1lID0gZGF0YS5OYW1lO1xyXG4gICAgY29uc3QgZ3JvdXBGaWVsZEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgZGF0YS5WYWx1ZS5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgY29uc3QgZmllbGRNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIGZpZWxkKTtcclxuICAgICAgZmllbGRNb2RlbFsnRGlzcGxheU5hbWUnXSA9IGZpZWxkTW9kZWwuTGFiZWw7XHJcbiAgICAgIGZpZWxkTW9kZWwuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGRNb2RlbFsnTmFtZSddLCBjb250YWluZXJOYW1lKTtcclxuICAgICAgZmllbGRNb2RlbC5WYWx1ZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGRNb2RlbFsnVmFsdWUnXSwgY29udGFpbmVyTmFtZSk7XHJcblxyXG4gICAgICBncm91cEZpZWxkRWxlbWVudHMucHVzaChmaWVsZE1vZGVsKTtcclxuXHJcbiAgICAgIC8vIFRoaXMgaXMgZm9yIHRhbGx5IGFuZCByZW1vdmUgem1vZGVsIHdoZW4gZ2V0bW9kZWwoKS5cclxuICAgICAgLy8gV2UncmUgbm90IHN1cHBvc2VkIHRvIHNhdmUgem1vZGVsIGZpZWxkIHZhbHVlIHNpbmNlIGl0cyB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSBhZGRlZCB0byB0aGUgZ3JpZC5cclxuICAgICAgdGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdLnB1c2goZmllbGRNb2RlbC5WYWx1ZSk7XHJcblxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlTmFtZV0gPSBbXTtcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZENvbHVtbkZpZWxkc05hbWVdID0gZ3JvdXBGaWVsZEVsZW1lbnRzO1xyXG5cclxuICAgIC8vIENyZWF0ZSBncmlkIGNvbHVtbiBiYXNlZCBvbiBmaWVsZCBlbGVtZW50cyBhbmQgaW5zZXJ0IHRoZW0gaW50byB0aGUgZ3JpZC4gXHJcbiAgICB0aGlzLmdyb3VwW2Ake25hbWV9JHt0aGlzLnByZWZpeEN1c3RvbUFkZEJ1dHRvbk9uQ2xpY2t9YF0gPSB0aGlzLmNhcHR1cmVDb250YWluZXJGaWVsZFZhbHVlVG9Nb2RlbC5iaW5kKHRoaXMsIHRoaXMuZ3JvdXAsIGdyaWRWYWx1ZU5hbWUsIGdyaWREYXRhU291cmNlTmFtZSwgY29udGFpbmVyTmFtZSk7XHJcbiAgICB0aGlzLmdyb3VwW2Ake25hbWV9JHt0aGlzLnByZWZpeEN1c3RvbVJlc2V0QnV0dG9uT25DbGlja31gXSA9IHRoaXMuY2xlYXJDb250YWluZXJSZWxhdGVkRmllbGRWYWx1ZS5iaW5kKHRoaXMsIHRoaXMuZ3JvdXAsIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgdGhpcy5ncm91cFtgJHtuYW1lfSR7dGhpcy5wcmVmaXhDdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrfWBdID0gdGhpcy5yZW1vdmVHcmlkUm93LmJpbmQodGhpcywgZ3JpZFZhbHVlTmFtZSwgZ3JpZERhdGFTb3VyY2VOYW1lKTtcclxuXHJcbiAgICBpZiAoZGF0YUluZGV4KSB7XHJcbiAgICAgIHRoaXMuYXBwZW5kVG9EaXNwbGF5TW9kZWwoZWxlbWVudCwgZGF0YUluZGV4KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkYXRhLlZhbHVlLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhcHR1cmVDb250YWluZXJGaWVsZFZhbHVlVG9Nb2RlbChncm91cDogWkdyb3VwLCBncmlkVmFsdWU6IGFueSwgZ3JpZERhdGFTb3VyY2U6IGFueSwgY29udGFpbmVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBjb250YWluZXJGaWVsZFZhbHVlID0gdGhpcy5nZXRDb250YWluZXJNb2RlbFZhbHVlKGNvbnRhaW5lck5hbWUpO1xyXG4gICAgbGV0IGFsbG93VG9TZXREYXRhID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQga2V5IGluIGNvbnRhaW5lckZpZWxkVmFsdWUpIHtcclxuICAgICAgaWYgKCFaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KGNvbnRhaW5lckZpZWxkVmFsdWVba2V5XSkpIHtcclxuICAgICAgICBhbGxvd1RvU2V0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7IC8vIGV4aXQgdGhlIGxvb3AgZWFybHkgc2luY2UgdGhlIGZsYWcgaXMgYWxyZWFkeSB0cnVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWxsb3dUb1NldERhdGEgJiYgKE9iamVjdC5rZXlzKGNvbnRhaW5lckZpZWxkVmFsdWUpLmxlbmd0aCAhPT0gMCB8fCBjb250YWluZXJGaWVsZFZhbHVlLmNvbnN0cnVjdG9yICE9PSBPYmplY3QpKSB7XHJcbiAgICAgIC8vIGdldCBjb250YWluZXIgbW9kZWwgdmFsdWUsIHNldCB0byBncm91cCBncmlkIGRhdGFzb3VyY2VcclxuICAgICAgZ3JvdXBbZ3JpZERhdGFTb3VyY2VdLnB1c2goY29udGFpbmVyRmllbGRWYWx1ZSk7XHJcblxyXG4gICAgICAvLyBzZXQgZGF0YXNvdXJjZSB0byBncmlkXHJcbiAgICAgIGdyb3VwW2dyaWRWYWx1ZV0uc2V0RGF0YSh0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlXSk7XHJcblxyXG4gICAgICAvLyBjbGVhciBjb250YWluZXIgZmllbGQgdmFsdWVcclxuICAgICAgdGhpcy5jbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlKGdyb3VwLCBjb250YWluZXJOYW1lKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KCdUbyBhZGQgdGhlIHJlY29yZCwgcGxlYXNlIGVudGVyL3NlbGVjdCBhdCBsZWFzdCBvbmUgZmllbGQgaW4gdGhpcyBzZWN0aW9uLicsICd0b3AnLCB0cnVlLCAzMDAwLCAnd2FybmluZycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckNvbnRhaW5lclJlbGF0ZWRGaWVsZFZhbHVlKGdyb3VwOiBaR3JvdXAsIGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gYWZ0ZXIgc2V0IHRvIGdyaWQsIGNsZWFyIHRoZSB6bW9kZWwuXHJcbiAgICB0aGlzLmNsZWFyQ29udGFpbmVyRmllbGRFbGVtZW50VmFsdWUoY29udGFpbmVyTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUdyaWRSb3coZ3JpZFZhbHVlOiBhbnksIGdyaWREYXRhU291cmNlOiBhbnksIGRhdGFJdGVtOiBhbnksIGluZGV4OiBhbnkpIHtcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZERhdGFTb3VyY2VdLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgLy8gc2V0IGRhdGFzb3VyY2UgdG8gZ3JpZFxyXG4gICAgdGhpcy5ncm91cFtncmlkVmFsdWVdLnNldERhdGEodGhpcy5ncm91cFtncmlkRGF0YVNvdXJjZV0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBpc0Ryb3Bkb3duVHlwZShkYXRhOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbXBvbmVudERhdGFUeXBlID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gZGF0YSA6IGRhdGEuVHlwZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChjb21wb25lbnREYXRhVHlwZSA9PSBDb21wb25lbnRUeXBlLmRyb3Bkb3duIHx8IGNvbXBvbmVudERhdGFUeXBlID09IENvbXBvbmVudFR5cGUuenVpc2VsZWN0bXVsdGlwbGUgfHwgY29tcG9uZW50RGF0YVR5cGUgPT0gQ29tcG9uZW50VHlwZS56c2VsZWN0bXVsdGlwbGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHRoZSBmb3JtIGFuZCBzaG93cyBhbiBlcnJvciBtZXNzYWdlIGlmIGl0IGlzIGludmFsaWQuXHJcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBmb3JtIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHZhbGlkYXRlQW5kU2hvd0Vycm9yTWVzc2FnZSgpIHtcclxuICAgIGNvbnN0IGZnID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcclxuXHJcbiAgICAvLyBJZiB0aGUgZm9ybSBpcyBpbnZhbGlkLCBjbGVhciBhbnkgZXJyb3JzIGluIGNvbnRhaW5lciBmaWVsZHMgYW5kIHNob3cgdGhlIGVycm9yIG1lc3NhZ2UuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIGZvcm0gY29udHJvbHMgYW5kIHJlc2V0IGFueSBlcnJvcnMgdGhhdCBiZWxvbmcgdG8gYSBjb250YWluZXIgZmllbGRcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmcuY29udHJvbHMpKSB7XHJcbiAgICAgICAgdGhpcy5zZXRDb250YWluZXJGaWVsZEVycm9yQXNOdWxsKGZnLCBrZXkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDaGVjayBpcyB0aGUgZm9ybWdyb3VwIHZhbHVlIGFnYWluLlxyXG4gICAgICBpZiAoZmcudmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2hvdyB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGZvcm1cclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UodGhpcy5ncm91cCwgZmcpO1xyXG5cclxuICAgICAgLy8gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIGZvcm0gaXMgbm90IHZhbGlkXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmb3JtIGlzIHZhbGlkXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0cyB0aGUgZXJyb3JzIG9mIGEgY29udGFpbmVyIGZpZWxkIGluIGEgRm9ybUdyb3VwLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZnIFRoZSBGb3JtR3JvdXAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpZWxkLlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBGb3JtR3JvdXAuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRDb250YWluZXJGaWVsZEVycm9yQXNOdWxsKGZnOiBGb3JtR3JvdXAsIGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250cm9sTmFtZVNlZ21lbnRzID0ga2V5LnNwbGl0KCdfJyk7XHJcblxyXG4gICAgaWYgKGNvbnRyb2xOYW1lU2VnbWVudHMubGVuZ3RoIDw9IDMpIHtcclxuICAgICAgLy8gRmllbGQgaXMgbm90IGluc2lkZSBhIGNvbnRhaW5lciwgc28gd2Ugc2tpcCBpdFxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbm8gbXZnbGlzdCwgZGlyZWN0IHJldHVybi4gZG9udCBuZWVkIGRvIGFueXRoaW5nLlxyXG4gICAgaWYgKCF0aGlzLmdyb3VwWydtdmdsaXN0J10pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIGNvbnRhaW5lciBidXQgbm90IG11bHRpIHZhbHVlIGdyb3VwID0gdHJ1ZSwgd2Ugc2tpcCBpdC5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IFtjb250cm9sTmFtZVNlZ21lbnRzWzBdLCBjb250cm9sTmFtZVNlZ21lbnRzWzFdLCBjb250cm9sTmFtZVNlZ21lbnRzWzJdXS5qb2luKCdfJyk7XHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBbJ212Z2xpc3QnXS5pbmNsdWRlcyhjb250YWluZXIpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sID0gZmcuZ2V0KGtleSk7XHJcblxyXG4gICAgaWYgKCFjb250cm9sKSB7XHJcbiAgICAgIC8vIElmIHRoZSBjb250cm9sIGlzIG5vdCBpbnNpZGUgYSBjb250YWluZXIsIHNraXAgaXQuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXR1cm4gaWYgZm9ybWNvbnRyb2wgaXMgdmFsaWQuXHJcbiAgICBpZiAoY29udHJvbC5zdGF0dXMgPT09ICdWQUxJRCcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xFcnJvcnMgPSBjb250cm9sLmVycm9ycztcclxuXHJcbiAgICBpZiAoY29udHJvbEVycm9ycykge1xyXG4gICAgICAvLyBTZXQgdGhlIGNvbnRyb2wncyBlcnJvcnMgdG8gbnVsbC5cclxuICAgICAgY29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgYSBmb3JtIGFuZCByZXR1cm5zIGl0cyBaTW9kZWwgaWYgaXQgaXMgdmFsaWQuXHJcbiAgICogQHBhcmFtIHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlIFdoZXRoZXIgdG8gc2tpcCByZW1vdmluZyB0aGUgdmFsdWVzIG9mIG12ZyBmaWVsZHMgZnJvbSB0aGUgek1vZGVsIG9iamVjdC5cclxuICAgKiBAcmV0dXJucyBUaGUgZm9ybSdzIFpNb2RlbCBpZiBpdCBpcyB2YWxpZCwgb3IgdW5kZWZpbmVkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0VmFsaWRhdGVkRm9ybVpNb2RlbChza2lwUmVtb3ZlUHJlZml4PzogYm9vbGVhbiwgc2tpcFJlbW92ZU12Z0ZpZWxkVmFsdWU/OiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBpc1ZhbGlkRm9ybSA9IHRoaXMudmFsaWRhdGVBbmRTaG93RXJyb3JNZXNzYWdlKCk7XHJcblxyXG4gICAgaWYgKGlzVmFsaWRGb3JtKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldFpNb2RlbChza2lwUmVtb3ZlUHJlZml4LCBza2lwUmVtb3ZlTXZnRmllbGRWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHpNb2RlbCBvYmplY3QsIHdpdGggbXZnIChtdWx0aSB2YWx1ZSBncm91cCkgZmllbGRzIHJlbW92ZWQgYW5kIHByb3BlcnR5IHByZWZpeGVzIHJlbW92ZWQuXHJcbiAgICogQHBhcmFtIHNraXBSZW1vdmVQcmVmaXggV2hldGhlciB0byBza2lwIHJlbW92aW5nIHRoZSBkZWZhdWx0IHByb3BlcnR5IHByZWZpeC5cclxuICAgKiBAcGFyYW0gc2tpcFJlbW92ZU12Z0ZpZWxkVmFsdWUgV2hldGhlciB0byBza2lwIHJlbW92aW5nIHRoZSB2YWx1ZXMgb2YgbXZnIGZpZWxkcyBmcm9tIHRoZSB6TW9kZWwgb2JqZWN0LlxyXG4gICAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCB6TW9kZWwgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRaTW9kZWwoc2tpcFJlbW92ZVByZWZpeD86IGJvb2xlYW4sIHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlPzogYm9vbGVhbikge1xyXG4gICAgY29uc3Qgek1vZGVsID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsO1xyXG5cclxuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgcHJvcGVydGllcyBpbiB0aGUgek1vZGVsIG9iamVjdC5cclxuICAgIGZvciAoY29uc3Qgek1vZGVsUHJvcGVydHkgaW4gek1vZGVsKSB7XHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoek1vZGVsLCB6TW9kZWxQcm9wZXJ0eSkpIHtcclxuICAgICAgICBjb25zdCB6TW9kZWxQcm9wZXJ0eVNlZ21lbnRzID0gek1vZGVsUHJvcGVydHkuc3BsaXQoJ18nKTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IGlzIHBhcnQgb2YgYSBtdWx0aSB2YWx1ZSBncm91cC5cclxuICAgICAgICBpZiAoek1vZGVsUHJvcGVydHlTZWdtZW50cy5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgICAvLyBUaGUgdGhpcmQgc2VnbWVudCBvZiB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgY29udGFpbmVyIG5hbWUuXHJcbiAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gek1vZGVsUHJvcGVydHlTZWdtZW50c1syXTtcclxuICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbmFtZSBvZiB0aGUgbXVsdGkgdmFsdWUgZ3JvdXAuXHJcbiAgICAgICAgICBjb25zdCBtdWx0aVZhbHVlR3JvdXBTY29wZU5hbWUgPSBgbXZnXyR7Y29udGFpbmVyTmFtZX1gO1xyXG5cclxuICAgICAgICAgIC8vIElmIHRoZSBtdWx0aSB2YWx1ZSBncm91cCBleGlzdHMgYW5kIGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSwgcmVtb3ZlIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgZnJvbSB0aGUgek1vZGVsIG9iamVjdC5cclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgbXZnRmllbGQgPSB0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0uZmluZCgocmVjb3JkKSA9PiByZWNvcmQgPT09IHpNb2RlbFByb3BlcnR5KTtcclxuICAgICAgICAgICAgaWYgKG12Z0ZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgek1vZGVsW3pNb2RlbFByb3BlcnR5XSA9IHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlID8gek1vZGVsW3pNb2RlbFByb3BlcnR5XSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoek1vZGVsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGltcG9ydGFudDogUmVtb3ZlIHByb3BlcnR5IHByZWZpeGVzIGZyb20gdGhlIHpNb2RlbCBvYmplY3QgaWYgc2tpcFJlbW92ZVByZWZpeCBpcyBub3QgdHJ1ZSAoYnkgZGVmYXVsdCByZW1vdmUgcHJlZml4KVxyXG4gICAgY29uc3QgcGF0Y2hlZE1vZGVsRGF0YSA9IHNraXBSZW1vdmVQcmVmaXggPyB6TW9kZWwgOiB0aGlzLnJlbW92ZVpNb2RlbFByb3BlcnR5UHJlZml4KHpNb2RlbCk7XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpIHZhbHVlIGdyb3VwIGdyaWQgdmFsdWVzLCBleHRyYWN0IHRoZSBncmlkIGRhdGEgYW5kIGFkZCBpdCB0byB0aGUgY29ycmVzcG9uZGluZyBjb250YWluZXIgaW4gdGhlIG1vZGlmaWVkIHpNb2RlbCBvYmplY3QuXHJcbiAgICBpZiAodGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUpIHtcclxuICAgICAgdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUuZm9yRWFjaCgobXVsdGlWYWx1ZUdyb3VwR3JpZE5hbWUpID0+IHtcclxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBjb250YWluZXIgbmFtZSBmcm9tIHRoZSBncmlkIG5hbWUuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IHNraXBSZW1vdmVQcmVmaXggPyBtdWx0aVZhbHVlR3JvdXBHcmlkTmFtZS5zcGxpdCgnXycpLmpvaW4oJ18nKSA6IG11bHRpVmFsdWVHcm91cEdyaWROYW1lLnNwbGl0KCdfJylbMl07XHJcblxyXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIGdyaWQgZGF0YSBhbmQgcmVtb3ZlIHByb3BlcnR5IHByZWZpeGVzIGlmIHNraXBSZW1vdmVQcmVmaXggaXMgbm90IHRydWUuXHJcbiAgICAgICAgY29uc3QgbXVsdGlWYWx1ZUdyb3VwR3JpZCA9IHRoaXMuZ3JvdXBbbXVsdGlWYWx1ZUdyb3VwR3JpZE5hbWVdIGFzIFpHcmlkO1xyXG4gICAgICAgIGNvbnN0IGdyaWREYXRhID0gbXVsdGlWYWx1ZUdyb3VwR3JpZC5nZXRHcmlkRGF0YSgpLm1hcCgoZGF0YSkgPT4gc2tpcFJlbW92ZVByZWZpeCA/IGRhdGEgOiB0aGlzLnJlbW92ZVpNb2RlbFByb3BlcnR5UHJlZml4KGRhdGEsIHRydWUpKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSBncmlkIGRhdGEgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29udGFpbmVyIGluIHRoZSBtb2RpZmllZCB6TW9kZWwgb2JqZWN0LlxyXG4gICAgICAgIGlmIChncmlkRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW2NvbnRhaW5lck5hbWVdID0gZ3JpZERhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGF0Y2hlZE1vZGVsRGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgdmFsdWUgb2YgYSBtb2RlbCBpbiB0aGUgZm9ybSBncm91cC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZGVsIHRvIHNldC5cclxuICAgKiBAcGFyYW0geyp9IG1vZGVsVmFsdWUgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIG1vZGVsLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBQcmVmaXhdIE9wdGlvbmFsIHBhcmFtZXRlciBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gc2tpcCB0aGUgY29tcG9uZW50IHByZWZpeC5cclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgc2V0TW9kZWxWYWx1ZShtb2RlbE5hbWU6IHN0cmluZywgbW9kZWxWYWx1ZTogYW55LCBza2lwUHJlZml4PzogYm9vbGVhbikge1xyXG4gICAgLy8gR2V0IHRoZSB6TW9kZWwgb2JqZWN0IGZyb20gdGhlIGZvcm0gZ3JvdXBcclxuICAgIGNvbnN0IHpNb2RlbHMgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWw7XHJcbiAgICAvLyBJZiBza2lwUHJlZml4IGlzIGZhbHNlIG9yIHVuZGVmaW5lZCwgcHJlcGVuZCB0aGUgY29tcG9uZW50IHByZWZpeCB0byB0aGUgbW9kZWwgbmFtZVxyXG4gICAgY29uc3Qgek1vZGVsTmFtZSA9IHNraXBQcmVmaXggPyBtb2RlbE5hbWUgOiB0aGlzLmNvbXBvbmVudFByZWZpeCArICdfJyArIG1vZGVsTmFtZTtcclxuICAgIC8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIGluIHRoZSB6TW9kZWwgb2JqZWN0XHJcbiAgICB6TW9kZWxzW3pNb2RlbE5hbWVdID0gbW9kZWxWYWx1ZTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIGZvcm0gZ3JvdXAgYXMgYSBGb3JtR3JvdXAgb2JqZWN0XHJcbiAgICBsZXQgZmc6IEZvcm1Hcm91cCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG5cclxuICAgIC8vIFBhdGNoIHRoZSBmb3JtIGdyb3VwIHdpdGggdGhlIHVwZGF0ZWQgek1vZGVsIG9iamVjdFxyXG4gICAgZmcucGF0Y2hWYWx1ZSh6TW9kZWxzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmVtb3ZlIHRoZSBjb21wb25lbnQgcHJlZml4IGZyb20gcHJvcGVydHkgbmFtZXMgaW4gdGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgKlxyXG4gICogQHBhcmFtIHsqfSB6TW9kZWwgVGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRPbmx5RmllbGROYW1lXSBPcHRpb25hbCBwYXJhbWV0ZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRvIG9ubHkgcmV0dXJuIHRoZSBmaWVsZCBuYW1lIHdpdGhvdXQgdGhlIHByZWZpeC5cclxuICAqIEByZXR1cm5zIHsqfSBUaGUgdXBkYXRlZCB6TW9kZWwgb2JqZWN0LlxyXG4gICovXHJcbiAgcHJpdmF0ZSByZW1vdmVaTW9kZWxQcm9wZXJ0eVByZWZpeCh6TW9kZWw6IGFueSwgZ2V0T25seUZpZWxkTmFtZT86IGJvb2xlYW4pIHtcclxuICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBvYmplY3QgdG8gc3RvcmUgdGhlIHVwZGF0ZWQgek1vZGVsIGRhdGFcclxuICAgIGNvbnN0IHBhdGNoZWRNb2RlbERhdGEgPSB7fTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBpbiB0aGUgek1vZGVsIG9iamVjdFxyXG4gICAgZm9yIChsZXQgcHJvcCBpbiB6TW9kZWwpIHtcclxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh6TW9kZWwsIHByb3ApKSB7XHJcbiAgICAgICAgLy8gU3BsaXQgdGhlIHByb3BlcnR5IG5hbWUgYnkgdW5kZXJzY29yZXNcclxuICAgICAgICBjb25zdCBwcm9wU2VnbWVudCA9IHByb3Auc3BsaXQoJ18nKTtcclxuICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnR5IG5hbWUgd2l0aG91dCB0aGUgY29tcG9uZW50IHByZWZpeFxyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGdldE9ubHlGaWVsZE5hbWUgPyBwcm9wU2VnbWVudFtwcm9wU2VnbWVudC5sZW5ndGggLSAxXSA6IHByb3AucmVwbGFjZSh0aGlzLmNvbXBvbmVudFByZWZpeCArICdfJywgJycpO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5IHRvIHRoZSB1cGRhdGVkIHpNb2RlbCBvYmplY3RcclxuICAgICAgICBwYXRjaGVkTW9kZWxEYXRhW3Byb3BlcnR5TmFtZV0gPSB6TW9kZWxbcHJvcF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgek1vZGVsIG9iamVjdFxyXG4gICAgcmV0dXJuIHBhdGNoZWRNb2RlbERhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhcnMgdGhlIHpNb2RlbCBwcm9wZXJ0eSBvZiB0aGUgZ3JvdXAgaW4gdGhlIGNvbXBvbmVudCBzY29wZSBhbmQgcmVzZXRzIHRoZSBtdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUgYXJyYXkuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXJaTW9kZWwoKSB7XHJcbiAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWwgPSB7fTtcclxuICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TXVsdGlWYWx1ZUdyb3VwQnV0dG9uc0VuYWJsZWQoY29udGFpbmVyTmFtZTogc3RyaW5nLCBpc0VuYWJsZWQ6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50KHRoaXMuZ3JvdXAsIGB6Z3JpZF8ke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke2NvbnRhaW5lck5hbWV9YCk7XHJcbiAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBbJ0VuYWJsZUN1c3RvbUFkZENvbW1hbmQnLCAnRW5hYmxlQ3VzdG9tUmVzZXRDb21tYW5kJywgJ0VuYWJsZUN1c3RvbVJlbW92ZUNvbW1hbmQnXTtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICByZXN1bHRbJ2RhdGEnXVtwcm9wXSA9IGlzRW5hYmxlZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZW51bSBDb21wb25lbnRUeXBlIHtcclxuICB0ZXh0ID0gJ3RleHQnLFxyXG4gIHRleHRhcmVhID0gJ3RleHRhcmVhJyxcclxuICBjaGVja2JveCA9ICdjaGVja2JveCcsXHJcbiAgbGFiZWwgPSAnemxhYmVsJyxcclxuICBkYXRlID0gJ2RhdGUnLFxyXG4gIHpkYXRldGltZSA9ICd6ZGF0ZXRpbWUnLFxyXG4gIHp1aWRhdGV0aW1lID0gJ3p1aWRhdGV0aW1lJyxcclxuICBudW1iZXIgPSAnbnVtYmVyJyxcclxuICB6bnVtZXJpYyA9ICd6bnVtZXJpYycsXHJcbiAgZW1haWwgPSAnZW1haWwnLFxyXG4gIGZpbGUgPSAnZmlsZScsXHJcbiAgcHJpY2UgPSAncHJpY2UnLFxyXG4gIHdlYnNpdGUgPSAnd2Vic2l0ZScsXHJcbiAgZHJvcGRvd24gPSAnZHJvcGRvd24nLFxyXG4gIHp1aXNlbGVjdG11bHRpcGxlID0gJ3p1aXNlbGVjdG11bHRpcGxlJyxcclxuICB6c2VsZWN0bXVsdGlwbGUgPSAnenNlbGVjdG11bHRpcGxlJyxcclxuICBncm91cGluZyA9ICdrY2FyZCcsXHJcbiAgYnV0dG9uID0gJ3pidXR0b25zJyxcclxuICBncmlkID0gJ3pncmlkJ1xyXG59XHJcbiIsIjxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNXB4XCIgKm5nSWY9XCJkYXRhLlRpdGxlICYmICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiIGNsYXNzPVwienVkZi1jb250YWluZXJcIj5cclxuICA8a2VuZG8tY2FyZCAqbmdJZj1cImRhdGEuVGl0bGVcIj5cclxuICAgIDxrZW5kby1jYXJkLWhlYWRlcj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwiY2FyZC1oZWFkZXItdGl0bGVcIj57e2RhdGEuVGl0bGV9fTwvaW9uLWxhYmVsPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwva2VuZG8tY2FyZC1oZWFkZXI+XHJcbiAgICA8a2VuZG8tY2FyZC1ib2R5PlxyXG4gICAgICA8IS0tIDxhcHAtemZvcm1jb250cm9sIFtuZ0NsYXNzXT1cImdyb3VwW2ZpZWxkLmlzVmlzaWJsZUZpZWxkXSA/IGZpZWxkLkRpdkNsYXNzIDogKChmaWVsZC5WaXNpYmxlID09PSB0cnVlKSA/ICBmaWVsZC5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRmllbGRzIHwgZGl2emxheW91dDogZGF0YS56bGF5b3V0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tmaWVsZC5OYW1lfX1cIj5cclxuICAgICAgPC9hcHAtemZvcm1jb250cm9sPiAtLT5cclxuICAgICAgPGFwcC16ZGl2IFtkYXRhXT1cImRhdGFcIiBbZm9ybV09XCJmb3JtXCIgW2dyb3VwXT1cImdyb3VwXCIgW2NvbnRhaW5lckZpZWxkXT1cImNvbnRhaW5lckZpZWxkXCI+PC9hcHAtemRpdj5cclxuICAgIDwva2VuZG8tY2FyZC1ib2R5PlxyXG4gIDwva2VuZG8tY2FyZD5cclxuPC9kaXY+XHJcblxyXG48ZGl2ICpuZ0lmPVwiIWRhdGEuVGl0bGUgJiYgKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZCA/IGdyb3VwW2NvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUpXCIgW3N0eWxlXT1cImRhdGEuU3R5bGVcIiBjbGFzcz1cInp1ZGYtY29udGFpbmVyXCI+XHJcbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XHJcbiAgICA8IS0tIDxhcHAtemZvcm1jb250cm9sIFtuZ0NsYXNzXT1cImdyb3VwW2ZpZWxkLmlzVmlzaWJsZUZpZWxkXSA/IGZpZWxkLkRpdkNsYXNzIDogKChmaWVsZC5WaXNpYmxlID09PSB0cnVlKSA/ICBmaWVsZC5EaXZDbGFzcyA6ICdmbGV4LWhpZGUnKVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvcm1GaWVsZHMgfCBkaXZ6bGF5b3V0OiBkYXRhLnpsYXlvdXRcIlxyXG4gICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgW2dyb3VwXT1cImdyb3VwXCJcclxuICAgICAgICBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICBpZD1cInt7ZmllbGQuTmFtZX19XCI+XHJcbiAgICA8L2FwcC16Zm9ybWNvbnRyb2w+IC0tPlxyXG4gICAgPGFwcC16ZGl2IFtkYXRhXT1cImRhdGFcIiBbZm9ybV09XCJmb3JtXCIgW2dyb3VwXT1cImdyb3VwXCIgW2NvbnRhaW5lckZpZWxkXT1cImNvbnRhaW5lckZpZWxkXCI+PC9hcHAtemRpdj5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG4iXX0=
954
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVkZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tbWhnbG9iYWwtZHluYW1pY2Zvcm0vc3JjL2xpYi96dWRmL3p1ZGYuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenVkZi96dWRmLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRiw2QkFBNkI7QUFFN0IsOEJBQThCO0FBQzlCLE9BQU8sRUFBc0MsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQWtCLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSwyQ0FBMkM7QUFDM0MsT0FBTyxFQUdMLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFDL0MsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7Ozs7Ozs7O0FBU2hGLE1BQU0sT0FBTyxhQUFjLFNBQVEsa0JBQWtCO0lBbUJuRCxZQUNTLGdCQUFtQyxFQUNsQyxZQUEwQixFQUMxQixZQUEwQixFQUMxQiw0QkFBMEQsRUFDMUQsR0FBc0I7UUFFOUIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFOaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQThCO1FBQzFELFFBQUcsR0FBSCxHQUFHLENB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LENBQUM7YUFDbEM7U0FDRjtJQUNILENBQUM7OzBHQS9qQ1UsYUFBYTs4RkFBYixhQUFhLHVFQzFCMUIsa3pEQWdDQTsyRkROYSxhQUFhO2tCQUx6QixTQUFTOytCQUNFLFVBQVU7O0FBc2tDdEIsSUFBSyxhQW9CSjtBQXBCRCxXQUFLLGFBQWE7SUFDaEIsOEJBQWEsQ0FBQTtJQUNiLHNDQUFxQixDQUFBO0lBQ3JCLHNDQUFxQixDQUFBO0lBQ3JCLGlDQUFnQixDQUFBO0lBQ2hCLDhCQUFhLENBQUE7SUFDYix3Q0FBdUIsQ0FBQTtJQUN2Qiw0Q0FBMkIsQ0FBQTtJQUMzQixrQ0FBaUIsQ0FBQTtJQUNqQixzQ0FBcUIsQ0FBQTtJQUNyQixnQ0FBZSxDQUFBO0lBQ2YsOEJBQWEsQ0FBQTtJQUNiLGdDQUFlLENBQUE7SUFDZixvQ0FBbUIsQ0FBQTtJQUNuQixzQ0FBcUIsQ0FBQTtJQUNyQix3REFBdUMsQ0FBQTtJQUN2QyxvREFBbUMsQ0FBQTtJQUNuQyxtQ0FBa0IsQ0FBQTtJQUNsQixvQ0FBbUIsQ0FBQTtJQUNuQiwrQkFBYyxDQUFBO0FBQ2hCLENBQUMsRUFwQkksYUFBYSxLQUFiLGFBQWEsUUFvQmpCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgQXN5bmNTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQge1xyXG4gIFpDb21wb25lbnQsIFpGaWVsZCxcclxuICBBbGVydFNlcnZpY2UsIEF1dGhTZXJ2aWNlLCBGaWVsZFNlcnZpY2UsIFRvYXN0U2VydmljZSxcclxuICBaR3JvdXAsIFpDb21wb25lbnRQcm9wZXJ0aWVzLCBaQ29tcG9uZW50SGVscGVyLCBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuaW1wb3J0IHsgWkdyaWQgfSBmcm9tIFwiLi4vemdyaWQvemdyaWQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvbnRhaW5lckZpZWxkQmFzZSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2NvbnRhaW5lcmZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenVkZicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3p1ZGYuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3p1ZGYuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFp1ZGZDb21wb25lbnQgZXh0ZW5kcyBDb250YWluZXJGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQge1xyXG5cclxuICAvLyBmb3JtRmllbGRzOiBhbnlbXTsgLy8gcG9wdWxhdGUgdXNpbmcgZmllbGQgZWxlbWVudC5cclxuICBjb21wb25lbnRQcm9wZXJ0aWVzID0gbmV3IFpDb21wb25lbnRQcm9wZXJ0aWVzKCk7XHJcbiAgaW5pdGlhbERhdGFWYWx1ZTogYW55O1xyXG4gIGNvbXBvbmVudFByZWZpeDogc3RyaW5nO1xyXG4gIGNvbXBvbmVudFNjb3BlTmFtZTogc3RyaW5nO1xyXG4gIGRpc3BsYXlFbGVtZW50TW9kZWw6IGFueTtcclxuICBtdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWU6IHN0cmluZ1tdO1xyXG4gIGxvYWRlZEZpZWxkc1NlcXVlbmNlOiBhbnk7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpeFZhbHVlT3B0aW9uID0gJ196dWRmbXZnT3B0aW9ucyc7XHJcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpeERhdGFTb3VyY2VOYW1lID0gJ196dWRmbXZnRGF0YVNvdXJjZSc7XHJcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpeENvbHVtbkZpZWxkc05hbWUgPSAnX3p1ZGZtdmdDb2x1bW5GaWVsZHMnO1xyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhDdXN0b21BZGRCdXR0b25PbkNsaWNrID0gJ19DdXN0b21BZGRCdXR0b25PbkNsaWNrJztcclxuICBwdWJsaWMgcmVhZG9ubHkgcHJlZml4Q3VzdG9tUmVzZXRCdXR0b25PbkNsaWNrID0gJ19DdXN0b21SZXNldEJ1dHRvbk9uQ2xpY2snO1xyXG4gIHB1YmxpYyByZWFkb25seSBwcmVmaXhDdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrID0gJ19DdXN0b21SZW1vdmVCdXR0b25PbkNsaWNrJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZTogQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gICAgc3VwZXIoY29tcG9uZW50U2VydmljZSlcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgbGV0IG9iczogT2JzZXJ2YWJsZTxhbnk+ID0gb2YodGhpcy5kYXRhLlZhbHVlKTtcclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLlZhbHVlID09IHVuZGVmaW5lZCAmJiB0aGlzLmRhdGEuRmllbGRFbGVtZW50Q29kZSkge1xyXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUodGhpcy5kYXRhLkZpZWxkRWxlbWVudENvZGUsIHRoaXMuZ3JvdXApO1xyXG4gICAgICBvYnMgPSB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKGZpZWxkTmFtZSwgJ0Zvcm1GaWVsZCcsIHRoaXMsICdmaWVsZHMnKTtcclxuICAgIH1cclxuXHJcbiAgICBzdXBlci5pbml0Q29tcG9uZW50KCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9icyksXHJcbiAgICAgIHN3aXRjaE1hcCgoZmllbGQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhLkZpZWxkRWxlbWVudENvZGUpIHtcclxuICAgICAgICAgIC8vIHVzZSBvYnMgdmFsdWUgb25seSBpZiBGaWVsZEVsZW1lbnRDb2RlIGlzIHNldC4gaWYgbnRvIGRlZmF1bHQgYXMgbnVsbC5cclxuICAgICAgICAgIHRoaXMuZGF0YS5WYWx1ZSA9IGZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGF0YS5WYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTdG9yZSBpbml0aWFsIGRhdGEgdmFsdWUgYW5kIHNldCBjb21wb25lbnQgc2NvcGUgYW5kIHByZWZpeFxyXG4gICAgICAgIHRoaXMuaW5pdGlhbERhdGFWYWx1ZSA9IHRoaXMuZGF0YS5WYWx1ZTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFNjb3BlTmFtZSA9ICd6dWRmXycgKyB0aGlzLmRhdGEuTmFtZTtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFByZWZpeCA9ICd6dWRmXycgKyB0aGlzLmRhdGEuTmFtZTtcclxuXHJcbiAgICAgICAgdGhpcy5ncm91cFt0aGlzLmRhdGEuTmFtZSArICdNb2RlbCddID0gW107XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEZvcm0oKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZmllbGQgZWxlbWVudCBhbmQgc2V0cyB1cCB0aGUgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRGb3JtKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShcclxuICAgICAgLy8gU2V0IHRoZSBTdWJUeXBlIHRvICd6dWRmJy5cclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGEuU3ViVHlwZSA9ICd6dWRmJztcclxuICAgICAgfSksXHJcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBncm91cCBmb3IgdGhlIGZpZWxkIGFuZCBzZXQgdXAgdGhlIGZvcm0uXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFpHcm91cCBmb3IgdGhlIGZpZWxkIGlmIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXSkge1xyXG4gICAgICAgICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0gPSBuZXcgWkdyb3VwKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEZWNsYXJlIGEgbmV3IHpNb2RlbCBvYmplY3QgZm9yIHRoZSBaR3JvdXAuXHJcbiAgICAgICAgY29uc3QgenVkZlNjb3BlR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXTtcclxuICAgICAgICB6dWRmU2NvcGVHcm91cC56TW9kZWwgPSB7fTtcclxuXHJcbiAgICAgICAgLy8gUmVuZGVyIHRoZSBmaWVsZCBlbGVtZW50LlxyXG4gICAgICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KHRoaXMuZGF0YS5WYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgZm9ybSBmb3IgdGhlIFpHcm91cCBzY29wZS5cclxuICAgICAgICBpZiAodGhpcy5kYXRhLlZhbHVlKSB7XHJcbiAgICAgICAgICAvLyBJZiBWYWx1ZSBpcyBub3QgbnVsbCwgYmluZCB0aGUgZXhpc3RpbmcgZm9ybS5cclxuICAgICAgICAgIHp1ZGZTY29wZUdyb3VwLmZvcm0gPSB0aGlzLmZvcm07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIFZhbHVlIGlzIG51bGwsIGNyZWF0ZSBhIG5ldyBmb3JtIHdpdGggYW4gZW1wdHkgZm9ybSBjb250cm9sLlxyXG4gICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2w6IHsgW2tleTogc3RyaW5nXTogRm9ybUNvbnRyb2wgfSA9IHt9O1xyXG4gICAgICAgICAgenVkZlNjb3BlR3JvdXAuZm9ybSA9IG5ldyBGb3JtR3JvdXAoZm9ybUNvbnRyb2wpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIC8vIFNldCB0aGUgZm9ybUZpZWxkcyBwcm9wZXJ0eSBmb3IgZGlzcGxheS5cclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAvLyB0aGlzLmZvcm1GaWVsZHMgPSBPYmplY3QuYXNzaWduKFtdLCB0aGlzLmRhdGEuVmFsdWUpO1xyXG5cclxuICAgICAgICBaQ29tcG9uZW50SGVscGVyLmFwcGVuZENvbnNvbGVXYXRjaExpc3QodGhpcy5ncm91cCwgYGdyb3VwLiR7dGhpcy5jb21wb25lbnRTY29wZU5hbWV9LnpNb2RlbGApO1xyXG5cclxuICAgICAgICAvLyBDYWxsIHRoZSBhZnRlcjxGaWVsZD5Mb2FkZWQgZnVuY3Rpb24gaWYgaXQgZXhpc3RzIGluIHRoZSBncm91cC5cclxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSAnYWZ0ZXInICsgKHRoaXMuZGF0YS5OYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5kYXRhLk5hbWUuc2xpY2UoMSkpICsgJ0xvYWRlZCc7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgIGlmICh0aGlzLmdyb3VwW2ZpZWxkTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cFtmaWVsZE5hbWVdKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0IEZpZWxkIGRpdiBjbGFzc1xyXG4gICAgICAgIC8vIFJlcGxhY2VkIHdpdGg6IHRoaXMuZmllbGRTZXJ2aWNlLnBhdGNoRmllbGRQcm9wZXJ0eShmaWVsZCk7XHJcbiAgICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5zZXRGaWVsZHNEaXZDbGFzcyh0aGlzLmdyb3VwLl9wcm9qZWN0TmFtZSwgdGhpcy5ncm91cC5maWVsZE5hbWUsIHRoaXMuZGF0YSwgdGhpcy5hdXRoU2VydmljZSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZvcm1Db250cm9sVmFsaWRhdGlvbihmb3JtQ29udHJvbE5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBhbnkpIHtcclxuICAgIGRlYnVnZ2VyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBmaWVsZCBlbGVtZW50cyBiYXNlZCBvbiBhIEpTT04gc3RyaW5nLlxyXG4gICAqIEBwYXJhbSBncm91cCBUaGUgWkdyb3VwIG9iamVjdCB0byB3aGljaCB0aGUgZmllbGQgZWxlbWVudHMgd2lsbCBiZSBhZGRlZC5cclxuICAgKiBAcGFyYW0ganNvblN0cmluZyBUaGUgSlNPTiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCBlbGVtZW50cy5cclxuICAgKi9cclxuICBwdWJsaWMgcmVuZGVyRmllbGRFbGVtZW50QnlKc29uU3RyaW5nKGdyb3VwOiBaR3JvdXAsIGpzb25TdHJpbmc6IHN0cmluZywgZmllbGRFbGVtZW50TmFtZTogc3RyaW5nID0gJycpOiB2b2lkIHtcclxuICAgIC8vIFBhcnNlIHRoZSBKU09OIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIGZpZWxkIGVsZW1lbnRzLlxyXG4gICAgY29uc3QgZmllbGRFbGVtZW50TWFzdGVyQ29kZUpzb25BcnJheSA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBmaWVsZCBlbGVtZW50cy5cclxuICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KGZpZWxkRWxlbWVudE1hc3RlckNvZGVKc29uQXJyYXksIGZpZWxkRWxlbWVudE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIERpc3BsYXkgbW9kZWxcclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkaXNwbGF5IG1vZGVsIGZvciBhIHp1ZGYgKHplcm8tdXRpbGl0eSBkYXRhIGZpZWxkKSBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIGRpc3BsYXkgbW9kZWwuXHJcbiAgICovXHJcbiAgcHVibGljIHNldERpc3BsYXlNb2RlbCh2YWx1ZTogYW55KSB7XHJcbiAgICAvLyBSZXBsYWNlIHRoZSB3aG9sZSBkaXNwbGF5IG1vZGVsIHdpdGggdGhlIG5ldyB2YWx1ZVxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIC8vIENsZWFyIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAgdGhpcy5jbGVhckZvcm1Db250cm9sKCk7XHJcblxyXG4gICAgICAvLyBNYWtlIGEgZGVlcCBjb3B5IG9mIHRoZSB2YWx1ZSB0byBhdm9pZCBhbnkgdW53YW50ZWQgcmVmZXJlbmNlIGVycm9yc1xyXG4gICAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPSBaQ29tcG9uZW50SGVscGVyLmRlZXBDbG9uZSh2YWx1ZSk7XHJcblxyXG4gICAgICAvLyBSZW5kZXIgdGhlIGZpZWxkIGVsZW1lbnQgYmFzZWQgb24gdGhlIG5ldyBkaXNwbGF5IG1vZGVsXHJcbiAgICAgIHRoaXMucmVuZGVyRmllbGRFbGVtZW50KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGludmFsaWQsIGxvZyBhIHdhcm5pbmcgbWVzc2FnZVxyXG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgdXNlZCBmb3IgcmVuZGVyIHp1ZGYgJyArIHRoaXMuZGF0YS5OYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVXBkYXRlcyBhIHZhbHVlIGluIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwgYXQgdGhlIHNwZWNpZmllZCBmbGF0IGluZGV4LlxyXG4gICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0LlxyXG4gICogQHBhcmFtIHtzdHJpbmd9IGZsYXRJbmRleCAtIFRoZSBmbGF0IGluZGV4IGluZGljYXRpbmcgdGhlIGxvY2F0aW9uIGluIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwgd2hlcmUgdGhlIHZhbHVlIHNob3VsZCBiZSB1cGRhdGVkLlxyXG4gICovXHJcbiAgcHVibGljIHVwZGF0ZURpc3BsYXlNb2RlbCh2YWx1ZTogYW55LCBmbGF0SW5kZXg6IHN0cmluZykge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci51cGRhdGVBcnJheU9iamVjdEJ5RmxhdEluZGV4KHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCwgZmxhdEluZGV4LCB2YWx1ZSk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG4gICAgLy90aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFwcGVuZHMgYSB2YWx1ZSB0byB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIGF0IHRoZSBzcGVjaWZpZWQgZmxhdCBpbmRleC5cclxuICAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgYXBwZW5kZWQuXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdEluZGV4IC0gVGhlIGZsYXQgaW5kZXggaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gaW4gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCB3aGVyZSB0aGUgdmFsdWUgc2hvdWxkIGJlIGFwcGVuZGVkLlxyXG4gICovXHJcbiAgcHVibGljIGFwcGVuZFRvRGlzcGxheU1vZGVsKHZhbHVlOiBhbnksIGZsYXRJbmRleDogc3RyaW5nKSB7XHJcbiAgICAvLyBBcHBlbmQgdG8gZGlzcGxheSBtb2RlbCBtZWFucyBpdCB3aWxsIGluc2VydCB0aGUgZm9ybSBjb250cm9sIGJhc2VkIG9uIGZsYXQgaW5kZXguXHJcbiAgICBpZiAoZmxhdEluZGV4Lmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgIGZsYXRJbmRleC5zdWJzdHJpbmcoMCwgZmxhdEluZGV4Lmxlbmd0aCAtIDIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkUmVjb3JkID0gWkNvbXBvbmVudEhlbHBlci5nZXRGcm9tQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCk7XHJcbiAgICBzZWxlY3RlZFJlY29yZC5WYWx1ZS5wdXNoKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbC5cclxuICAgKiBAcmV0dXJucyB7YW55fSBBIGRlZXAgY29weSBvZiB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXREaXNwbGF5TW9kZWwoKSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCBhbmQgY2xlYXJzIHRoZSBmb3JtIGNvbnRyb2wuXHJcbiAgICovXHJcbiAgcHVibGljIHJlbW92ZUFsbERpc3BsYXlNb2RlbCgpIHtcclxuICAgIHRoaXMuZGlzcGxheUVsZW1lbnRNb2RlbCA9IFtdO1xyXG4gICAgdGhpcy5jbGVhckZvcm1Db250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgZGlzcGxheSBlbGVtZW50IG1vZGVsIGF0IHRoZSBzcGVjaWZpZWQgZmxhdCBpbmRleCBhbmQgdXBkYXRlcyB0aGUgZm9ybSBmaWVsZC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdEluZGV4IC0gVGhlIGZsYXQgaW5kZXggaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gaW4gdGhlIGRpc3BsYXkgZWxlbWVudCBtb2RlbCB3aGVyZSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcmVtb3ZlZC5cclxuICAgKi9cclxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudEZyb21EaXNwbGF5TW9kZWwoZmxhdEluZGV4OiBzdHJpbmcpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIucmVtb3ZlQXJyYXlPYmplY3RCeUZsYXRJbmRleCh0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwsIGZsYXRJbmRleCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCgpO1xyXG5cclxuICAgIC8vIFRPRE86IHJlbW92ZSBmcm9tIHptb2RlbFxyXG4gICAgLy9kZWxldGUgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsWycnXTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGVuZHMgYSBmb3JtIGNvbnRyb2wgdG8gdGhlIGZvcm0gYW5kIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwuXHJcbiAgICogQHBhcmFtIHtaRmllbGR9IGZpZWxkRGF0YSAtIFRoZSBkYXRhIGZvciB0aGUgZm9ybSBjb250cm9sIHRvIGJlIGFwcGVuZGVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhcHBlbmRGb3JtQ29udHJvbChmaWVsZERhdGEpIHtcclxuICAgIC8vIEFwcGVuZCBmb3JtIGNvbnRyb2wgbWVhbnMgaXQgd2lsbCBqdXN0IGluc2VydCB0aGUgZm9ybSBjb250cm9sIGF0IHRoZSBlbmQuXHJcbiAgICBmaWVsZERhdGEuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGREYXRhLk5hbWUsIGZpZWxkRGF0YVsnY29udGFpbmVyTmFtZSddKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9scyA9IHt9O1xyXG5cclxuICAgIGZvcm1Db250cm9sc1tmaWVsZERhdGEuTmFtZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgIHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbFtmaWVsZERhdGEuTmFtZV1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5mb3JtLmFkZENvbnRyb2woZmllbGREYXRhLk5hbWUsIGZvcm1Db250cm9sc1tmaWVsZERhdGEuTmFtZV0pO1xyXG5cclxuICAgIGlmICghdGhpcy5kYXRhLlZhbHVlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdmb3JtRmllbGQgJyArIHRoaXMuZGF0YS5OYW1lICsgJyBpcyB1bmRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPSB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwgPz8gW107XHJcbiAgICB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWwucHVzaChmaWVsZERhdGEpO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtRmllbGQoKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgZmllbGQgZWxlbWVudHMgYXMgZm9ybSBjb250cm9scyBpbiBhIG5ldyBmb3JtIGdyb3VwLlxyXG4gICAqIEBwYXJhbSB7YW55fSBmaWVsZEVsZW1lbnRzIC0gVGhlIGZpZWxkIGVsZW1lbnRzIHRvIGJlIHJlbmRlcmVkLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW5kZXJGaWVsZEVsZW1lbnQoZmllbGRFbGVtZW50czogYW55LCBmaWVsZEVsZW1lbnROYW1lOiBzdHJpbmcgPSAnJykge1xyXG4gICAgdGhpcy5jbGVhclpNb2RlbCgpO1xyXG5cclxuICAgIGlmIChmaWVsZEVsZW1lbnRzKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2UgPSB7fTtcclxuICAgICAgY29uc3QgZm9ybUNvbnRyb2xzID0ge307XHJcbiAgICAgIGZpZWxkRWxlbWVudHMgPSB0aGlzLmdlbmVyYXRlRm9ybUNvbnRyb2xzKGZpZWxkRWxlbWVudHMsIGZvcm1Db250cm9scyk7XHJcblxyXG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIHByZXZpb3VzIHN1YnNjcmlwdGlvbiBpZiBleGlzdHNcclxuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUmVuZGVyIGZvcm0gY29udHJvbHMgdG8gbmV3IGZvcm0gZ3JvdXBcclxuICAgICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cChmb3JtQ29udHJvbHMpO1xyXG4gICAgICB0aGlzLmRhdGEuVmFsdWUgPSBmaWVsZEVsZW1lbnRzO1xyXG4gICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS5mb3JtID0gdGhpcy5mb3JtO1xyXG4gICAgICB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXVsnbG9hZGVkRmllbGRzU2VxdWVuY2UnXSA9IHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2U7XHJcblxyXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gY29tcG9uZW50TG9hZGVkJCBldmVudFxyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuZmllbGRTZXJ2aWNlLmdldENvbXBvbmVudExvYWRlZCQoJ3p1ZGYnKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIC8vIEFsbCBjb21wb25lbnRzIGhhdmUgZmluaXNoZWQgbG9hZGluZ1xyXG5cclxuICAgICAgICBjb25zdCB6dWRmR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXTtcclxuICAgICAgICBpZiAoenVkZkdyb3VwWydsaW5rZWRDb21wb25lbnQnXSkge1xyXG4gICAgICAgICAgenVkZkdyb3VwWydsaW5rZWRDb21wb25lbnQnXS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rZWRDb21wb25lbnRTZWdtZW50cyA9IGl0ZW0udmFsdWUuc3BsaXQoJ18nKTtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50TmFtZSA9IGxpbmtlZENvbXBvbmVudFNlZ21lbnRzLnNsaWNlKDAsIDIpLmpvaW4oJ18nKSArICdfJyArIGl0ZW0ubGlua2VkQ29tcG9uZW50O1xyXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEJ5VmFsdWUodGhpcy5ncm91cCwgcGFyZW50Q29tcG9uZW50TmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRCeVZhbHVlKHRoaXMuZ3JvdXAsIGl0ZW0udmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudENvbXBvbmVudCAmJiBjaGlsZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU2VsZWN0T3B0aW9ucyA9IGNoaWxkQ29tcG9uZW50LmRhdGFbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID8/IE9iamVjdC5hc3NpZ24oW10sIGNoaWxkQ29tcG9uZW50LmRhdGEuU2VsZWN0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRTZWxlY3Rpb25PcHRpb25zID0gb3JpZ2luYWxTZWxlY3RPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnBhcmVudEV4cHJlc3Npb24gPT0genVkZkdyb3VwLnpNb2RlbFtwYXJlbnRDb21wb25lbnROYW1lXSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIE1hbnVhbGx5IHBhdGNoIHRoZSBjb21wb25lbnQgZm9ybSBjb250cm9sIHZhbHVlXHJcbiAgICAgICAgICAgICAgY29uc3QgenVkZkZvcm0gPSB6dWRmR3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Rm9ybUNvbnRyb2wgPSB6dWRmRm9ybS5jb250cm9sc1tpdGVtLnZhbHVlXSBhcyBGb3JtQ29udHJvbDtcclxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkQ29tcG9uZW50LnNldFNlbGVjdE9wdGlvbihmaWx0ZXJlZFNlbGVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Rm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh6dWRmR3JvdXAuek1vZGVsW2l0ZW0udmFsdWVdKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VuYWJsZSB0byBnZXQgZm9ybWNvbnRyb2wgZm9yICcgKyBpdGVtLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHp1ZGZGb3JtKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbmVlZCB0byBjYWxsIGJhY2sgZmllbGQgZWxlbWVudCBcIjxmaWVsZCBuYW1lPl9sb2FkZWRcIlxyXG4gICAgICAgIGlmIChmaWVsZEVsZW1lbnROYW1lICE9ICcnKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cFtmaWVsZEVsZW1lbnROYW1lICsgJ19sb2FkZWQnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmdyb3VwW2ZpZWxkRWxlbWVudE5hbWUgKyAnX2xvYWRlZCddKHRoaXMuZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVG8gY29uc2lkZXI6IFRyaWdnZXIgdGhlIFwib25jaGFuZ2VcIiBldmVudCBvciBwZXJmb3JtIGFueSBvdGhlciBuZWNlc3NhcnkgYWN0aW9ucyBoZXJlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUZvcm1Db250cm9scyhmaWVsZEFycmF5OiBhbnksIGZvcm1Db250cm9sczogeyBba2V5OiBzdHJpbmddOiBGb3JtQ29udHJvbCB9LCBjb250YWluZXJOYW1lPzogc3RyaW5nLCBpc011bHRpVmFsdWVHcm91cCA9IGZhbHNlLCBmaWVsZFZhbHVlR3JvdXBlZCA9IGZhbHNlLCBpbmRleCA9ICcnKSB7XHJcbiAgICBmaWVsZEFycmF5LmZvckVhY2goKGZpZWxkLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkSW5kZXggPSBpbmRleCA/IGAke2luZGV4fS4ke2kgKyAxfWAgOiBgJHtpfWA7XHJcblxyXG4gICAgICB0aGlzLmZpZWxkU2VydmljZS5wYXRjaEZpZWxkUHJvcGVydHkoZmllbGQpO1xyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkLlZhbHVlID09PSBcInN0cmluZ1wiICYmIGZpZWxkLlZhbHVlLmluZGV4T2YoXCIuXCIpICE9PSAtMSkge1xyXG4gICAgICAgIGlmIChbJ3pncmlkJywgJ3p0cmVlJywgJ3ppbWcnLCAndGV4dGFyZWFqc29uJ10uaW5kZXhPZihmaWVsZC5UeXBlKSA9PT0gLTEpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcIkZvcm1Db250cm9sIC0gaW52YWxpZCBmaWVsZCB2YWx1ZVwiLCBmaWVsZC5WYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHp1ZGZHcm91cCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5WYWx1ZSkpIHtcclxuICAgICAgICAgIC8vIGluc2VydCBtdWx0aXZhbHVlZ3JvdXAgdG8gdGhlIGNhcmQgdmFsdWUgaWYgdHJ1ZVxyXG4gICAgICAgICAgY29uc3QgZmllbGRWYWx1ZUdyb3VwZWQgPSBmaWVsZC5UeXBlID09IENvbXBvbmVudFR5cGUuZ3JvdXBpbmcgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZEZpZWxkc1NlcXVlbmNlW2ZpZWxkSW5kZXhdID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBmaWVsZC5NdWx0aVZhbHVlZEdyb3VwID8gYCR7dGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZC5OYW1lKX0ke3RoaXMucHJlZml4VmFsdWVPcHRpb259YCA6IGAke3RoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGQuTmFtZSl9YCxcclxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLlRpdGxlLFxyXG4gICAgICAgICAgICB0eXBlOiBmaWVsZC5UeXBlLFxyXG4gICAgICAgICAgICBpc011bHRpVmFsdWVHcm91cDogZmllbGQuTXVsdGlWYWx1ZWRHcm91cCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgaXNHcm91cGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNWaXNpYmxlOiBmaWVsZC5WaXNpYmxlID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBpc1JlcXVpcmVkOiBmaWVsZC5Jc1JlcXVpcmVkID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBpc1JlYWRPbmx5OiBmaWVsZC5SZWFkT25seSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgZGF0YVNvdXJjZVR5cGU6IGZpZWxkLnp1ZGZEYXRhU291cmNlVHlwZSA/PyBudWxsIC8vdmFsdWUgYWthIG1hbnVhbCwgdXNlciwgcmVzb3VyY2UgYWthIHJlc291cmNlXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmIChmaWVsZC5NdWx0aVZhbHVlZEdyb3VwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TXVsdGlWYWx1ZUdyb3VwKGZpZWxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbHMoZmllbGQuVmFsdWUsIGZvcm1Db250cm9scywgZmllbGQuTmFtZSwgZmllbGQuTXVsdGlWYWx1ZWRHcm91cCwgZmllbGRWYWx1ZUdyb3VwZWQsIGZpZWxkSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIGJlZm9yZSBnZW5lcmF0ZSBGb3JtQ29udHJvbCwgd2UgbmVlZCB0byBhZGQgMiBhdHRyaWJ1dGUgdG8gdGhlIGZpZWxkIHdoZW4gcmVuZGVyLlxyXG4gICAgICAgICAgLy8gdGhpcyBmb3IgbGF0ZXIgb24sIHdlIGNhbiBlYXNpbHkga25vdyB0aGlzIGZpZWxkIGJlbG9uZyB0byB3aGljaCB6dWRmIGFuZCB1bmRlciB3aGljaCBjb250YWluZXIuXHJcbiAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xyXG4gICAgICAgICAgICBmaWVsZFsnY29udGFpbmVyTmFtZSddID0gY29udGFpbmVyTmFtZTtcclxuICAgICAgICAgICAgaWYgKCF6dWRmR3JvdXBbY29udGFpbmVyTmFtZV0pIHtcclxuICAgICAgICAgICAgICB6dWRmR3JvdXBbY29udGFpbmVyTmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGlzRm9ybUNvbnRyb2wgPSBaQ29tcG9uZW50SGVscGVyLmlzRm9ybUNvbnRyb2woZmllbGQpO1xyXG4gICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gWkNvbXBvbmVudEhlbHBlci5pc1Zpc2libGVGb3JtQ29udHJvbCh0aGlzLCBmaWVsZCk7XHJcbiAgICAgICAgICBjb25zdCBpc1JlcXVpcmVkID0gWkNvbXBvbmVudEhlbHBlci5pc1JlcXVpcmVkRm9ybUNvbnRyb2wodGhpcywgZmllbGQpO1xyXG5cclxuICAgICAgICAgIGlmIChpc0Zvcm1Db250cm9sID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWRGaWVsZHNTZXF1ZW5jZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubG9hZGVkRmllbGRzU2VxdWVuY2UgPSB7fTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT09ICd6dWlzZWxlY3RtdWx0aXBsZScpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpZWxkU2VydmljZS5pbmNyZW1lbnRDb21wb25lbnRDb3VudGVyKCd6dWRmJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmllbGQuTmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZmllbGQuTmFtZSwgY29udGFpbmVyTmFtZSk7XHJcbiAgICAgICAgICAgIGZpZWxkLlZhbHVlID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZC5WYWx1ZSwgY29udGFpbmVyTmFtZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRlZEZpZWxkc1NlcXVlbmNlW2ZpZWxkSW5kZXhdID0ge1xyXG4gICAgICAgICAgICAgIG5hbWU6IGZpZWxkLk5hbWUsXHJcbiAgICAgICAgICAgICAgbGFiZWw6IGZpZWxkLkxhYmVsLFxyXG4gICAgICAgICAgICAgIHR5cGU6IGZpZWxkLlR5cGUsXHJcbiAgICAgICAgICAgICAgaXNNdWx0aVZhbHVlR3JvdXA6IGlzTXVsdGlWYWx1ZUdyb3VwLFxyXG4gICAgICAgICAgICAgIGlzR3JvdXBlZDogZmllbGRWYWx1ZUdyb3VwZWQsXHJcbiAgICAgICAgICAgICAgaXNWaXNpYmxlOiBmaWVsZC5WaXNpYmxlID8/IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGlzUmVxdWlyZWQ6IGZpZWxkLklzUmVxdWlyZWQgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgaXNSZWFkT25seTogZmllbGQuUmVhZE9ubHkgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZVR5cGU6IGZpZWxkLnp1ZGZEYXRhU291cmNlVHlwZSA/PyBudWxsIC8vdmFsdWUgYWthIG1hbnVhbCwgdXNlciwgcmVzb3VyY2UgYWthIHJlc291cmNlXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xyXG4gICAgICAgICAgICAgIGlmICghenVkZkdyb3VwW2NvbnRhaW5lck5hbWVdLmluY2x1ZGVzKGZpZWxkLlZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwW2NvbnRhaW5lck5hbWVdLnB1c2goZmllbGQuVmFsdWUpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGxpc3Qgb2YgZHJvcGRvd24gb3B0aW9uIHRvIHRoZSB2YXJpYWJsZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc0Ryb3Bkb3duVHlwZShmaWVsZC5UeXBlKSAmJiBmaWVsZC5aRGF0YU9wdGlvbk5hbWUgJiYgZmllbGQuRHJvcGRvd25PcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC56RGF0YVtmaWVsZC5aRGF0YU9wdGlvbk5hbWVdID0gT2JqZWN0LmFzc2lnbihbXSwgZXZhbCgndGhpcy4nICsgZmllbGQuRHJvcGRvd25PcHRpb25zKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25UeXBlKGZpZWxkLlR5cGUpICYmIGZpZWxkLnp1ZGZMaW5rZWRDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAvLyBrZWVwIGEgbGlzdCBvZiBsaW5rZWQgQ29tcG9uZW50LCBsYXRlciB3aWxsIGJlIHVzZWQgaW4gb25DaGFuZ2UgYXQgaW5wdXRmaWVsZGJhc2UuXHJcbiAgICAgICAgICAgICAgaWYgKCF6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddKSB7XHJcbiAgICAgICAgICAgICAgICB6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddID0gW107XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB6dWRmR3JvdXBbJ2xpbmtlZENvbXBvbmVudCddLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkLlZhbHVlLFxyXG4gICAgICAgICAgICAgICAgbGlua2VkQ29tcG9uZW50OiBmaWVsZC56dWRmTGlua2VkQ29tcG9uZW50XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGtlZXAgYSBjb3B5IG9mIFNlbGVjdE9wdGlvbnMgdG8gb3JpZ2luYWxTZWxlY3RPcHRpb25zKHNhbWUgYXMgb25jaGFuZ2UpXHJcbiAgICAgICAgICAgICAgLy8gY2xlYXIgdGhlIFNlbGVjdGlvbk9wdGlvbiBzaW5jZSBpdCB3b250IGJlIHVzZWQgd2hlbiBmaXJzdCBpbml0LCB1bnRpbCBwYXJlbnQgZHJvcGRvd24gb3B0aW9uIGJlZW4gc2VsZWN0ZWQuXHJcbiAgICAgICAgICAgICAgZmllbGRbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID0gT2JqZWN0LmFzc2lnbihbXSwgZmllbGQuU2VsZWN0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgZmllbGQuU2VsZWN0T3B0aW9ucyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhdXRvIGFwcGVuZCBjdXJyZW50IHVzZXIgdG8gdGhlIHptb2RlbCBiYXNlIG9uIGZpZWxkIGVsZW1lbnQgYXR0cmlidXRlIFwienVkZlNldERlZmF1bHRVc2VyXCJcclxuICAgICAgICAgICAgaWYgKGZpZWxkLnp1ZGZTZXREZWZhdWx0VXNlcikge1xyXG4gICAgICAgICAgICAgIGlmICghenVkZkdyb3VwWydmaWVsZFJlcXVpcmVkRGVmYXVsdFVzZXInXSkge1xyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwWydmaWVsZFJlcXVpcmVkRGVmYXVsdFVzZXInXSA9IFtdO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8ga2VlcCBhIGxpc3Qgb2YgZGVmYXVsdCB1c2VyIG5lZWQgdG8gYmUgZmlsbGVkIGluIHRoZSBzY29wZVxyXG4gICAgICAgICAgICAgIHp1ZGZHcm91cFsnZmllbGRSZXF1aXJlZERlZmF1bHRVc2VyJ10ucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBmaWVsZE5hbWU6IGZpZWxkLk5hbWUsXHJcbiAgICAgICAgICAgICAgICBjaGlsZEZpZWxkczogZmllbGQuQ2hpbGRGaWVsZHNcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gdmFsaWRhdG9yIGZvciB0aGUgY29tcG9uZW50XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBaQ29tcG9uZW50SGVscGVyLmdldFZhbGlkYXRvcnMoZmllbGQsIGlzVmlzaWJsZSwgaXNSZXF1aXJlZCwgdGhpcy5ncm91cCk7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sc1tmaWVsZC5WYWx1ZV0gPSBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgenVkZkdyb3VwLnpNb2RlbFtmaWVsZC5WYWx1ZV0sXHJcbiAgICAgICAgICAgICAgdmFsaWRhdG9yc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoWkNvbXBvbmVudEhlbHBlci5oYXNDQ0ZpZWxkKGZpZWxkLlR5cGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY2NWYWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gWkNvbXBvbmVudEhlbHBlci5nZXRDQ1ZhbGlkYXRvcnMoZmllbGQsIGlzVmlzaWJsZSwgaXNSZXF1aXJlZCk7XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xzW2ZpZWxkLkNDVmFsdWVdID0gbmV3IEZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgICAgenVkZkdyb3VwLnpNb2RlbFtmaWVsZC5DQ1ZhbHVlXSxcclxuICAgICAgICAgICAgICAgIGNjVmFsaWRhdG9yc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gb25jaGFuZ2UgaGFuZGxpbmc/XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpZWxkQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIHRoZSBmb3JtIGNvbnRyb2xzIGZyb20gdGhlIGZvcm0gZ3JvdXAgYW5kIHJlc2V0cyB0aGUgY29tcG9uZW50J3MgZGF0YSBhbmQgZGlzcGxheSBlbGVtZW50IG1vZGVsLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIGNsZWFyRm9ybUNvbnRyb2woKSB7XHJcbiAgICAvLyBSZW1vdmUgZWFjaCBmb3JtIGNvbnRyb2wgZnJvbSB0aGUgZm9ybSBncm91cFxyXG4gICAgaWYgKHRoaXMuZGF0YS5WYWx1ZSAmJiB0aGlzLmRhdGEuVmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmRhdGEuVmFsdWUuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICB0aGlzLmZvcm0ucmVtb3ZlQ29udHJvbChkYXRhLlZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzZXQgdGhlIGNvbXBvbmVudCdzIGRhdGEgYW5kIGRpc3BsYXkgZWxlbWVudCBtb2RlbFxyXG4gICAgdGhpcy5kYXRhLlZhbHVlID0gdGhpcy5pbml0aWFsRGF0YVZhbHVlO1xyXG4gICAgdGhpcy5kaXNwbGF5RWxlbWVudE1vZGVsID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBmb3JtIGZpZWxkcyBmb3IgdGhlIGNvbXBvbmVudC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHtvYmplY3RbXX0gLSBBbiBhcnJheSBvZiBmb3JtIGZpZWxkIG9iamVjdHMuXHJcbiAgICovXHJcbiAgcHVibGljIGdldEZvcm1Db250cm9sKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5WYWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHpNb2RlbCB2YWx1ZXMgb2YgYSBmb3JtIGdyb3VwIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBkYXRhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaR3JvdXB9IFtncm91cD10aGlzLmdyb3VwXSAtIFRoZSBmb3JtIGdyb3VwIHRvIHVwZGF0ZS5cclxuICAgKiBAcGFyYW0ge29iamVjdH0gbW9kZWxEYXRhIC0gVGhlIG1vZGVsIGRhdGEgdG8gYXBwbHkgdG8gdGhlIGZvcm0gZ3JvdXAuXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldEZvcm1GaWVsZHpNb2RlbChncm91cCA9IHRoaXMuZ3JvdXAsIG1vZGVsRGF0YSkge1xyXG4gICAgLy8gQWRkIHRoZSBjb21wb25lbnQgcHJlZml4IHRvIHRoZSBtb2RlbCBkYXRhIHByb3BlcnR5IG5hbWVzXHJcbiAgICBjb25zdCBwYXRjaGVkTW9kZWxEYXRhID0gdGhpcy5hZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChtb2RlbERhdGEpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgek1vZGVsIHZhbHVlcyBvZiB0aGUgZm9ybSBncm91cFxyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsLCBwYXRjaGVkTW9kZWxEYXRhKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgZ3JpZCB2YWx1ZXMgZm9yIGFueSBhcnJheXMgaW4gdGhlIG1vZGVsIGRhdGEgYmFzZSBvbiBrY2FyZCBjb21wb25lbnQuXHJcbiAgICBmb3IgKGNvbnN0IG1vZGVsIGluIHBhdGNoZWRNb2RlbERhdGEpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0Y2hlZE1vZGVsRGF0YVttb2RlbF0pKSB7XHJcbiAgICAgICAgY29uc3QgZ3JpZFZhbHVlID0gYCR7bW9kZWx9JHt0aGlzLnByZWZpeFZhbHVlT3B0aW9ufWA7XHJcbiAgICAgICAgY29uc3QgZ3JpZERhdGFTb3VyY2UgPSBgJHttb2RlbH0ke3RoaXMucHJlZml4RGF0YVNvdXJjZU5hbWV9YDtcclxuXHJcbiAgICAgICAgLy9jb25zdCBjb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEJ5VmFsdWUodGhpcy5ncm91cCwgbW9kZWwpO1xyXG4gICAgICAgIC8vaWYgKGNvbXBvbmVudD8uZGF0YT8uVHlwZSA9PT0gJ2tjYXJkJyB8fCBjb21wb25lbnQ/LmRhdGE/LlR5cGUgPT09ICd6Z3JpZCcpIHtcclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGRhdGEgc291cmNlIGZvciB0aGUgZ3JpZFxyXG4gICAgICAgIGdyb3VwW2dyaWREYXRhU291cmNlXSA9IHBhdGNoZWRNb2RlbERhdGFbbW9kZWxdO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGdyaWQgdmFsdWVcclxuICAgICAgICBpZiAoZ3JvdXBbZ3JpZFZhbHVlXSkge1xyXG4gICAgICAgICAgZ3JvdXBbZ3JpZFZhbHVlXS5zZXREYXRhKGdyb3VwW2dyaWREYXRhU291cmNlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB0aGUgZm9ybSBncm91cCBtb2RlbFxyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGZvcm1Hcm91cC5wYXRjaFZhbHVlKGdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWwpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIEFkZCB0aGUgY29tcG9uZW50IHByZWZpeCB0byBwcm9wZXJ0eSBuYW1lcyBpbiBhbiBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB7Kn0gbW9kZWxEYXRhIC0gVGhlIG9iamVjdCB0byB1cGRhdGUuXHJcbiAqIEBwYXJhbSB7Kn0gW2NvbnRhaW5lclByZWZpeF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgaW5kaWNhdGluZyB0aGUgcHJlZml4IHRvIHVzZSBmb3IgcHJvcGVydGllcyBpbiBuZXN0ZWQgb2JqZWN0cy5cclxuICogQHJldHVybnMgeyp9IFRoZSB1cGRhdGVkIG9iamVjdC5cclxuICovXHJcbiAgcHJpdmF0ZSBhZGRaTW9kZWxQcm9wZXJ0eVByZWZpeChtb2RlbERhdGE6IGFueSwgY29udGFpbmVyUHJlZml4PzogYW55KTogYW55IHtcclxuICAgIC8vIENyZWF0ZSBhIG5ldyBvYmplY3QgdG8gc3RvcmUgdGhlIHVwZGF0ZWQgZGF0YVxyXG4gICAgY29uc3QgdXBkYXRlZE1vZGVsRGF0YSA9IHt9O1xyXG5cclxuICAgIGlmICh0eXBlb2YgbW9kZWxEYXRhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbW9kZWxEYXRhID09PSAnbnVtYmVyJyB8fCBaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KG1vZGVsRGF0YSkpIHtcclxuICAgICAgcmV0dXJuIG1vZGVsRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBpbiB0aGUgaW5wdXQgb2JqZWN0XHJcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBtb2RlbERhdGEpIHtcclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGFuIGFycmF5XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsRGF0YVtwcm9wZXJ0eU5hbWVdKSkge1xyXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheXMgcmVjdXJzaXZlbHlcclxuICAgICAgICBjb25zdCB1cGRhdGVkQXJyYXkgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXlcclxuICAgICAgICBmb3IgKGNvbnN0IGFycmF5RWxlbWVudCBvZiBtb2RlbERhdGFbcHJvcGVydHlOYW1lXSkge1xyXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2FsbCB0aGlzIG1ldGhvZCB0byB1cGRhdGUgdGhlIHByb3BlcnRpZXMgb2YgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheVxyXG4gICAgICAgICAgY29uc3QgdXBkYXRlZEVsZW1lbnQgPSB0aGlzLmFkZFpNb2RlbFByb3BlcnR5UHJlZml4KGFycmF5RWxlbWVudCwgcHJvcGVydHlOYW1lKTtcclxuXHJcbiAgICAgICAgICAvLyBBZGQgdGhlIHVwZGF0ZWQgZWxlbWVudCB0byB0aGUgYXJyYXlcclxuICAgICAgICAgIHVwZGF0ZWRBcnJheS5wdXNoKHVwZGF0ZWRFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgdXBkYXRlZCBhcnJheSB0byB0aGUgb3V0cHV0IG9iamVjdFxyXG4gICAgICAgIGNvbnN0IHByZWZpeGVkUHJvcGVydHlOYW1lID0gYCR7dGhpcy5jb21wb25lbnRQcmVmaXh9XyR7cHJvcGVydHlOYW1lfWA7XHJcbiAgICAgICAgdXBkYXRlZE1vZGVsRGF0YVtwcmVmaXhlZFByb3BlcnR5TmFtZV0gPSB1cGRhdGVkQXJyYXk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodHlwZW9mIG1vZGVsRGF0YVtwcm9wZXJ0eU5hbWVdID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgb2JqZWN0cyByZWN1cnNpdmVseVxyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWROZXN0ZWRPYmplY3QgPSB0aGlzLmFkZFpNb2RlbFByb3BlcnR5UHJlZml4KG1vZGVsRGF0YVtwcm9wZXJ0eU5hbWVdLCBwcm9wZXJ0eU5hbWUpO1xyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIHVwZGF0ZWQgbmVzdGVkIG9iamVjdCB0byB0aGUgb3V0cHV0IG9iamVjdFxyXG4gICAgICAgIGNvbnN0IHByZWZpeGVkUHJvcGVydHlOYW1lID0gYCR7dGhpcy5jb21wb25lbnRQcmVmaXh9XyR7cHJvcGVydHlOYW1lfWA7XHJcbiAgICAgICAgdXBkYXRlZE1vZGVsRGF0YVtwcmVmaXhlZFByb3BlcnR5TmFtZV0gPSB1cGRhdGVkTmVzdGVkT2JqZWN0O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEFkZCB0aGUgcHJvcGVydHkgdG8gdGhlIG91dHB1dCBvYmplY3Qgd2l0aCB0aGUgY29tcG9uZW50IHByZWZpeFxyXG4gICAgICAgIGxldCBwcmVmaXhlZFByb3BlcnR5TmFtZTtcclxuICAgICAgICBpZiAoY29udGFpbmVyUHJlZml4KSB7XHJcbiAgICAgICAgICBwcmVmaXhlZFByb3BlcnR5TmFtZSA9IGAke3RoaXMuY29tcG9uZW50UHJlZml4fV8ke2NvbnRhaW5lclByZWZpeH1fJHtwcm9wZXJ0eU5hbWV9YDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcHJlZml4ZWRQcm9wZXJ0eU5hbWUgPSBgJHt0aGlzLmNvbXBvbmVudFByZWZpeH1fJHtwcm9wZXJ0eU5hbWV9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdXBkYXRlZE1vZGVsRGF0YVtwcmVmaXhlZFByb3BlcnR5TmFtZV0gPSBtb2RlbERhdGFbcHJvcGVydHlOYW1lXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiB0aGUgdXBkYXRlZCBvYmplY3RcclxuICAgIHJldHVybiB1cGRhdGVkTW9kZWxEYXRhO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFpNb2RlbEFzU3RyaW5nKCkge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0Wk1vZGVsKCkpO1xyXG4gIH1cclxuXHJcbiAgQ29tcG9uZW50SXNWaXNpYmxlKGZpZWxkOiBaRmllbGQpOiBhbnkge1xyXG4gICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuQ29tcG9uZW50SXNWaXNpYmxlKGZpZWxkLCB0aGlzLmdyb3VwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRFbmFibGUgPSAoc3RhdHVzOiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seSA9ICFzdGF0dXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmlzaWJsZSA9IChzdGF0dXM6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGUgPSBzdGF0dXM7XHJcbiAgICB0aGlzLmRhdGEuVmlzaWJsZSA9IHN0YXR1cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRSZXF1aXJlID0gKHN0YXR1czogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVxdWlyZWQgPSBzdGF0dXM7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLmNoYW5nZVZhbGlkYXRvcihzdGF0dXMsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YS5WYWx1ZSwgdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICBpZiAodGhpcy5kYXRhLlR5cGUgPT09ICd6dGV4dGVkaXRvcicpIHtcclxuICAgICAgWkNvbXBvbmVudEhlbHBlci5jaGFuZ2VWYWxpZGF0b3Ioc3RhdHVzLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUsIHRoaXMuY29tcG9uZW50UHJvcGVydGllcywgWkNvbXBvbmVudEhlbHBlci5yZXF1aXJlZFZhbGlkYXRvcl9XaXRob3V0V2hpdGVTcGFjZXNfVGV4dEVkaXRvcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgWkNvbXBvbmVudEhlbHBlci5jaGFuZ2VWYWxpZGF0b3Ioc3RhdHVzLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUsIHRoaXMuY29tcG9uZW50UHJvcGVydGllcywgWkNvbXBvbmVudEhlbHBlci5yZXF1aXJlZFZhbGlkYXRvcl9XaXRob3V0V2hpdGVTcGFjZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIHRoZSBuYW1lIG9mIGEgZm9ybSBjb250cm9sIGJhc2VkIG9uIGl0cyB0eXBlLCBuYW1lLCBhbmQgY29udGFpbmVyIG5hbWUuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyb2xOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZvcm0gY29udHJvbC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGFpbmVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdGhhdCB0aGUgZm9ybSBjb250cm9sIGlzIGluLlxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgbmFtZSBvZiB0aGUgZm9ybSBjb250cm9sLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZW5lcmF0ZUZvcm1Db250cm9sTmFtZShjb250cm9sTmFtZTogc3RyaW5nLCBjb250YWluZXJOYW1lPzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBtYWluUHJlZml4ID0gW3RoaXMuZGF0YS5UeXBlLCB0aGlzLmRhdGEuTmFtZSwgY29udGFpbmVyTmFtZSA/PyBudWxsXS5maWx0ZXIoQm9vbGVhbikuam9pbignXycpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIG5hbWUgaGFzIGJlZW4gcHJlZml4ZWQuXHJcbiAgICBpZiAoY29udHJvbE5hbWUuaW5jbHVkZXMobWFpblByZWZpeCkpIHtcclxuICAgICAgcmV0dXJuIGNvbnRyb2xOYW1lO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIFdlIHRyeSB0byBzcGxpdCB0aGUgbmFtZSBhbmQgdXNlIHRoZSBsYXN0IHNlZ21lbnQuXHJcbiAgICAgIC8vIFNvbWV0aW1lcyB0aGUgY29udHJvbCBuYW1lIGNhbiBiZSB3aXRob3V0IHRoZSBjb250YWluZXIgbmFtZSwgc28gd2Ugc3BsaXQgYW5kIHVzZSB0aGUgbmV3IG1haW4gcHJlZml4LlxyXG4gICAgICBjb25zdCBjb250cm9sTmFtZVNlZ21lbnQgPSBjb250cm9sTmFtZS5zcGxpdCgnXycpO1xyXG4gICAgICBjb250cm9sTmFtZSA9IGNvbnRyb2xOYW1lU2VnbWVudFtjb250cm9sTmFtZVNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFttYWluUHJlZml4LCBjb250cm9sTmFtZV0uam9pbignXycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwZW5kcyBhIHByZWZpeCB0byB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiBmaWVsZHMgcmVjdXJzaXZlbHkuXHJcbiAgICogQHBhcmFtIHtaRmllbGRbXX0gZmllbGRzIC0gVGhlIGZpZWxkcyB0byBiZSBwcmVmaXhlZC5cclxuICAgKiBAcGFyYW0ge2FueX0gcHJlZml4IC0gVGhlIHByZWZpeCB0byBiZSBhZGRlZC5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGVuZFByZWZpeChmaWVsZHM6IFpGaWVsZFtdLCBwcmVmaXg6IGFueSkge1xyXG4gICAgZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5WYWx1ZSkpIHtcclxuICAgICAgICB0aGlzLmFwcGVuZFByZWZpeChmaWVsZC5WYWx1ZSwgcHJlZml4KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBmaWVsZC5OYW1lID0gW3ByZWZpeCwgZmllbGQuTmFtZV0uam9pbignXycpO1xyXG4gICAgICAgIGlmIChmaWVsZC5UeXBlICE9ICd6YnV0dG9ucycpIHtcclxuICAgICAgICAgIGZpZWxkLlZhbHVlID0gW3ByZWZpeCwgZmllbGQuVmFsdWVdLmpvaW4oJ18nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmllbGQuU3ViVHlwZSA9IHByZWZpeDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBmb3JtIGZpZWxkcyB3aXRoIHRoZSBkaXNwbGF5IGVsZW1lbnQgbW9kZWwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtRmllbGQoKSB7XHJcbiAgICB0aGlzLmRhdGEuVmFsdWUgPSB0aGlzLmRpc3BsYXlFbGVtZW50TW9kZWw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgY29udGFpbmVyIG1vZGVsIGluIHRoZSBmb3JtLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250YWluZXJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byByZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbS5cclxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjb250YWluZXIgbW9kZWwgdmFsdWVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRDb250YWluZXJNb2RlbFZhbHVlKGNvbnRhaW5lck5hbWU6IHN0cmluZyk6IE9iamVjdCB7XHJcbiAgICAvLyBHZXQgdGhlIGNvbnRhaW5lciBlbGVtZW50IGFuZCBjcmVhdGUgYW4gZW1wdHkgb2JqZWN0IGZvciB0aGUgbW9kZWwgdmFsdWVzLlxyXG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdW2NvbnRhaW5lck5hbWVdO1xyXG4gICAgY29uc3QgbW9kZWxWYWx1ZSA9IHt9O1xyXG5cclxuICAgIC8vIEZsYWcgdG8ga2VlcCB0cmFjayBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIGluIHRoZSBncm91cCBhcmUgdmFsaWQuXHJcbiAgICBsZXQgdmFsaWRHcm91cEZpZWxkcyA9IHRydWU7XHJcblxyXG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggZWxlbWVudCBpbiB0aGUgY29udGFpbmVyIGFuZCByZXRyaWV2ZSBpdHMgdmFsdWUgZnJvbSB0aGUgek1vZGVsLlxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250YWluZXJFbGVtZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50W2ldO1xyXG4gICAgICBjb25zdCBlbGVtZW50Q29tcG9uZW50ID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRCeVZhbHVlKHRoaXMuZ3JvdXAsIGVsZW1lbnQpO1xyXG4gICAgICBsZXQgek1vZGVsVmFsdWUgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS56TW9kZWxbZWxlbWVudF07XHJcblxyXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZWxlbWVudCBpcyByZXF1aXJlZCBhbmQgaGFzIGEgdmFsdWUsIGlmIG5vdCBzaG93IGFuIGVycm9yIG1lc3NhZ2UuXHJcbiAgICAgIGlmIChlbGVtZW50Q29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXMuaXNSZXF1aXJlZCAmJiBaQ29tcG9uZW50SGVscGVyLmlzTnVsbFVuZGVmaW5lZEVtcHR5KHpNb2RlbFZhbHVlKSkge1xyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coZWxlbWVudENvbXBvbmVudC5kYXRhLkxhYmVsICsgJyBpcyByZXF1aXJlZCBmaWVsZC4gUGxlYXNlIGZpbGwgaW4gYWxsIHRoZSByZXF1aXJlZCBmaWVsZHMgYmVmb3JlIGFkZGluZy4nLCAndG9wJywgdHJ1ZSwgMzAwMCwgJ2RhbmdlcicpO1xyXG4gICAgICAgIHZhbGlkR3JvdXBGaWVsZHMgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIERyb3Bkb3duIFR5cGUsIGNoYW5nZSB6TW9kZWxWYWx1ZSB0byBkaXNwbGF5IHRleHQuXHJcbiAgICAgIGlmICh0aGlzLmlzRHJvcGRvd25UeXBlKGVsZW1lbnRDb21wb25lbnQuZGF0YS5UeXBlKSkge1xyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duT3B0aW9ucyA9IGVsZW1lbnRDb21wb25lbnQuZ2V0SXRlbXNEYXRhKCk7XHJcbiAgICAgICAgZHJvcGRvd25PcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgICAgIGlmIChvcHRpb25bZWxlbWVudENvbXBvbmVudC5pdGVtVmFsdWVGaWVsZF0gPT09IHpNb2RlbFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHpNb2RlbFZhbHVlID0gb3B0aW9uW2VsZW1lbnRDb21wb25lbnQuaXRlbVRleHRGaWVsZF1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIHRoZSB2YWx1ZSB0byB0aGUgbW9kZWwgb2JqZWN0LlBsZWFzZSBmaWxsIGluIGFsbCB0aGUgcmVxdWlyZWQgZmllbGRzIGJlZm9yZSBhZGRpbmdcclxuICAgICAgbW9kZWxWYWx1ZVtlbGVtZW50XSA9IHpNb2RlbFZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSBhcmUgaW52YWxpZCBmaWVsZHMgaW4gdGhlIGdyb3VwLCByZXR1cm4gYW4gZW1wdHkgbW9kZWwgb2JqZWN0LlxyXG4gICAgaWYgKCF2YWxpZEdyb3VwRmllbGRzKSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gdGhlIG1vZGVsIG9iamVjdCB3aXRoIHRoZSBjb250YWluZXIgdmFsdWVzLlxyXG4gICAgcmV0dXJuIG1vZGVsVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIENsZWFycyB0aGUgdmFsdWUgb2YgYWxsIGZpZWxkIGVsZW1lbnRzIGluc2lkZSBhIGNvbnRhaW5lci5cclxuICAqIEBwYXJhbSB7c3RyaW5nfSBjb250YWluZXJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB3aG9zZSBmaWVsZHMgd2lsbCBiZSBjbGVhcmVkLlxyXG4gICovXHJcbiAgcHVibGljIGNsZWFyQ29udGFpbmVyRmllbGRFbGVtZW50VmFsdWUoY29udGFpbmVyTmFtZTogc3RyaW5nKSB7XHJcbiAgICAvLyBHZXQgdGhlIGNvbnRhaW5lciBlbGVtZW50IGZyb20gdGhlIGNvbXBvbmVudCdzIGdyb3VwXHJcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV1bY29udGFpbmVyTmFtZV07XHJcbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBmaWVsZCBlbGVtZW50IGluIHRoZSBjb250YWluZXJcclxuICAgIGNvbnRhaW5lckVsZW1lbnQuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgLy8gU2V0IHRoZSBtb2RlbCB2YWx1ZSBvZiB0aGUgZmllbGQgZWxlbWVudCB0byBudWxsLCBhbmQgZm9yY2UgdXBkYXRlIHRoZSB2aWV3XHJcbiAgICAgIHRoaXMuc2V0TW9kZWxWYWx1ZShlbGVtZW50LCBudWxsLCB0cnVlKTtcclxuXHJcbiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS5mb3JtO1xyXG4gICAgICBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5jb250cm9sc1trZXldO1xyXG4gICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCgpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIC0tLS0tLS0tLS09PT09PT09PT09PT09PT09PT09PSBNdWx0aSBWYWx1ZSBHcm91cCA9PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0qL1xyXG4gIC8qKlxyXG4gICAqIFNldHMgdXAgYSBtdWx0aS12YWx1ZSBncm91cCwgd2hpY2ggaXMgYSBncmlkIG9mIGZpZWxkcyB0aGF0IGNhbiBoYXZlIG11bHRpcGxlIHJvd3MuXHJcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgbXVsdGktdmFsdWUgZ3JvdXAuXHJcbiAgICogQHBhcmFtIGRhdGFJbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgZGF0YSBpbiB0aGUgZGlzcGxheU1vZGVsLiBPcHRpb25hbCwgdXNlZCB3aGVuIHVwZGF0aW5nIGV4aXN0aW5nIGRhdGEuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE11bHRpVmFsdWVHcm91cChkYXRhOiBhbnksIGRhdGFJbmRleD86IGFueSkge1xyXG4gICAgLy8gTmVlZCB0byBkZWNsYXJlIG5hbWUsIHZhbHVlLCBkYXRhc291cmNlLCBjb2x1bW5maWVsZHMgYXR0cmlidXRlIGZvciBncmlkLlxyXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2VuZXJhdGVGb3JtQ29udHJvbE5hbWUoZGF0YS5OYW1lKTtcclxuICAgIGNvbnN0IGdyaWRWYWx1ZU5hbWUgPSBgJHtuYW1lfSR7dGhpcy5wcmVmaXhWYWx1ZU9wdGlvbn1gO1xyXG4gICAgY29uc3QgZ3JpZERhdGFTb3VyY2VOYW1lID0gYCR7bmFtZX0ke3RoaXMucHJlZml4RGF0YVNvdXJjZU5hbWV9YDtcclxuICAgIGNvbnN0IGdyaWRDb2x1bW5GaWVsZHNOYW1lID0gYCR7bmFtZX0ke3RoaXMucHJlZml4Q29sdW1uRmllbGRzTmFtZX1gO1xyXG5cclxuICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBtdWx0aS12YWx1ZSBncm91cCBzY29wZS5cclxuICAgIGNvbnN0IG11bHRpVmFsdWVHcm91cFNjb3BlTmFtZSA9IGBtdmdfJHtkYXRhLk5hbWV9YDtcclxuXHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBbJ212Z2xpc3QnXSkge1xyXG4gICAgICB0aGlzLmdyb3VwWydtdmdsaXN0J10gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZ3JvdXBbJ212Z2xpc3QnXS5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICB0aGlzLmdyb3VwWydtdmdsaXN0J10ucHVzaChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgYSBwcm9wZXJ0eSBpbiB0aGUgZ3JvdXAgb2JqZWN0IGZvciB0aGUgbXVsdGktdmFsdWUgZ3JvdXAuXHJcbiAgICB0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0gPSBbXTtcclxuXHJcbiAgICAvLyBTdG9yZSB0aGUgZ3JpZCB2YWx1ZSBuYW1lIHRvIGJlIHVzZWQgaW4gZ2V0Wk1vZGVsIHRvIGdldCB0aGUgZ3JpZCBkYXRhLlxyXG4gICAgdGhpcy5tdWx0aVZhbHVlR3JvdXBHcmlkVmFsdWUgPSB0aGlzLm11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZSA/PyBbXTtcclxuICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlLnB1c2goZ3JpZFZhbHVlTmFtZSk7XHJcblxyXG4gICAgLy8gTWFudWFsbHkgYWRkIGF0dHJpYnV0ZXMgdG8gdGhlIGdyaWQgZWxlbWVudCB0byBzcGVlZCB1cCBsb2FkaW5nLlxyXG4gICAgY29uc3QgZWxlbWVudCA9IHtcclxuICAgICAgXCJBZGRDb21tYW5kQnV0dG9uTmFtZVwiOiBcIkFkZFwiLFxyXG4gICAgICBcIkFsbG93RXhwb3J0XCI6IGZhbHNlLFxyXG4gICAgICBcIkFsbG93R3JpZERhdGFFeHBvcnRcIjogZmFsc2UsXHJcbiAgICAgIFwiQWxsb3dNdWx0aVNlbGVjdFwiOiBmYWxzZSxcclxuICAgICAgXCJBbGxvd1Jvd1NlbGVjdFwiOiBmYWxzZSxcclxuICAgICAgXCJBbGxvd1NhdmVTdGF0ZVwiOiBmYWxzZSxcclxuICAgICAgXCJDb2x1bW5GaWVsZHNcIjogJ2dyb3VwLicgKyBncmlkQ29sdW1uRmllbGRzTmFtZSxcclxuICAgICAgXCJEYXRhU291cmNlXCI6ICdncm91cC4nICsgZ3JpZERhdGFTb3VyY2VOYW1lLFxyXG4gICAgICBcIkRpc2FibGVDZWxsQ2xpY2tIYW5kbGVyXCI6IHRydWUsXHJcbiAgICAgIFwiRGlzYWJsZUdlbmVyYXRlQ29sdW1uQnlGb3JtXCI6IHRydWUsXHJcbiAgICAgIFwiRGl2Q2xhc3NcIjogJ2NvbC14cy0xMiBjb2wtc20tMTIgY29sLW1kLTEyIGNvbC1sZy0xMicsXHJcbiAgICAgIFwiRW5hYmxlQ3VzdG9tQWRkQ29tbWFuZFwiOiB0cnVlLFxyXG4gICAgICBcIkVuYWJsZUN1c3RvbVJlbW92ZUNvbW1hbmRcIjogdHJ1ZSxcclxuICAgICAgXCJFbmFibGVDdXN0b21SZXNldENvbW1hbmRcIjogdHJ1ZSxcclxuICAgICAgXCJFbmFibGVTYXZlR3JpZFN0YXRlXCI6IGZhbHNlLFxyXG4gICAgICBcIkV4dGVybmFsUGFnaW5hdGlvblwiOiBmYWxzZSxcclxuICAgICAgXCJIZWlnaHRSZWR1Y2VcIjogMjUwLFxyXG4gICAgICBcIkxpbWl0RmllbGRzXCI6IGZhbHNlLFxyXG4gICAgICBcIk5hbWVcIjogbmFtZSxcclxuICAgICAgXCJQYWdlU2l6ZVwiOiAyMCxcclxuICAgICAgXCJQYWdlU2l6ZXNcIjogZmFsc2UsXHJcbiAgICAgIFwiUmVzb3VyY2VVUkxcIjogdHJ1ZSxcclxuICAgICAgXCJTZWxlY3RPcHRpb25zXCI6IGZhbHNlLFxyXG4gICAgICBcIlNob3dHcmlkRWRpdEJ1dHRvblwiOiBmYWxzZSxcclxuICAgICAgXCJTdWJUeXBlXCI6IFwienVkZlwiLFxyXG4gICAgICBcIlR5cGVcIjogXCJ6Z3JpZFwiLFxyXG4gICAgICBcIlZhbHVlXCI6ICdncm91cC4nICsgZ3JpZFZhbHVlTmFtZSxcclxuICAgICAgXCJWaXNpYmxlXCI6IHRydWUsXHJcbiAgICAgIFwiV2lkdGhSZWR1Y2VcIjogNTAwLFxyXG4gICAgICBcIkRpc2FibGVBdXRvQXBwZW5kR3JpZERhdGVGaWx0ZXJDb2xcIjogdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBhIHByb3BlcnR5IGluIHRoZSBncm91cCBvYmplY3QgYmFzZWQgb24gdGhlIGFib3ZlIGRlY2xhcmF0aW9uLCBleGNlcHQgTmFtZSwgYW5kIGFsc28gaW5zZXJ0IGNvbHVtbiBmaWVsZHMuXHJcbiAgICAvLyBVc2UgdGhlIGdyb3VwaW5nIHZhbHVlIGFzIHRoZSBjb2x1bW4gYW5kIHNraXAgaW5zZXJ0aW5nIGFueSBjb250YWluZXIgdHlwZS5cclxuICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBkYXRhLk5hbWU7XHJcbiAgICBjb25zdCBncm91cEZpZWxkRWxlbWVudHMgPSBbXTtcclxuXHJcbiAgICBkYXRhLlZhbHVlLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBjb25zdCBmaWVsZE1vZGVsID0gT2JqZWN0LmFzc2lnbih7fSwgZmllbGQpO1xyXG4gICAgICBmaWVsZE1vZGVsWydEaXNwbGF5TmFtZSddID0gZmllbGRNb2RlbC5MYWJlbDtcclxuICAgICAgZmllbGRNb2RlbC5OYW1lID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZE1vZGVsWydOYW1lJ10sIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgICBmaWVsZE1vZGVsLlZhbHVlID0gdGhpcy5nZW5lcmF0ZUZvcm1Db250cm9sTmFtZShmaWVsZE1vZGVsWydWYWx1ZSddLCBjb250YWluZXJOYW1lKTtcclxuXHJcbiAgICAgIGdyb3VwRmllbGRFbGVtZW50cy5wdXNoKGZpZWxkTW9kZWwpO1xyXG5cclxuICAgICAgLy8gVGhpcyBpcyBmb3IgdGFsbHkgYW5kIHJlbW92ZSB6bW9kZWwgd2hlbiBnZXRtb2RlbCgpLlxyXG4gICAgICAvLyBXZSdyZSBub3Qgc3VwcG9zZWQgdG8gc2F2ZSB6bW9kZWwgZmllbGQgdmFsdWUgc2luY2UgaXRzIHZhbHVlIGlzIHN1cHBvc2VkIHRvIGJlIGFkZGVkIHRvIHRoZSBncmlkLlxyXG4gICAgICB0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cFNjb3BlTmFtZV0ucHVzaChmaWVsZE1vZGVsLlZhbHVlKTtcclxuXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZERhdGFTb3VyY2VOYW1lXSA9IFtdO1xyXG4gICAgdGhpcy5ncm91cFtncmlkQ29sdW1uRmllbGRzTmFtZV0gPSBncm91cEZpZWxkRWxlbWVudHM7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGdyaWQgY29sdW1uIGJhc2VkIG9uIGZpZWxkIGVsZW1lbnRzIGFuZCBpbnNlcnQgdGhlbSBpbnRvIHRoZSBncmlkLlxyXG4gICAgdGhpcy5ncm91cFtgJHtuYW1lfSR7dGhpcy5wcmVmaXhDdXN0b21BZGRCdXR0b25PbkNsaWNrfWBdID0gdGhpcy5jYXB0dXJlQ29udGFpbmVyRmllbGRWYWx1ZVRvTW9kZWwuYmluZCh0aGlzLCB0aGlzLmdyb3VwLCBncmlkVmFsdWVOYW1lLCBncmlkRGF0YVNvdXJjZU5hbWUsIGNvbnRhaW5lck5hbWUpO1xyXG4gICAgdGhpcy5ncm91cFtgJHtuYW1lfSR7dGhpcy5wcmVmaXhDdXN0b21SZXNldEJ1dHRvbk9uQ2xpY2t9YF0gPSB0aGlzLmNsZWFyQ29udGFpbmVyUmVsYXRlZEZpZWxkVmFsdWUuYmluZCh0aGlzLCB0aGlzLmdyb3VwLCBjb250YWluZXJOYW1lKTtcclxuICAgIHRoaXMuZ3JvdXBbYCR7bmFtZX0ke3RoaXMucHJlZml4Q3VzdG9tUmVtb3ZlQnV0dG9uT25DbGlja31gXSA9IHRoaXMucmVtb3ZlR3JpZFJvdy5iaW5kKHRoaXMsIGdyaWRWYWx1ZU5hbWUsIGdyaWREYXRhU291cmNlTmFtZSk7XHJcblxyXG4gICAgaWYgKGRhdGFJbmRleCkge1xyXG4gICAgICB0aGlzLmFwcGVuZFRvRGlzcGxheU1vZGVsKGVsZW1lbnQsIGRhdGFJbmRleCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZGF0YS5WYWx1ZS5wdXNoKGVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXB0dXJlQ29udGFpbmVyRmllbGRWYWx1ZVRvTW9kZWwoZ3JvdXA6IFpHcm91cCwgZ3JpZFZhbHVlOiBhbnksIGdyaWREYXRhU291cmNlOiBhbnksIGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgY29udGFpbmVyRmllbGRWYWx1ZSA9IHRoaXMuZ2V0Q29udGFpbmVyTW9kZWxWYWx1ZShjb250YWluZXJOYW1lKTtcclxuICAgIGxldCBhbGxvd1RvU2V0RGF0YSA9IGZhbHNlO1xyXG5cclxuICAgIGZvciAobGV0IGtleSBpbiBjb250YWluZXJGaWVsZFZhbHVlKSB7XHJcbiAgICAgIGlmICghWkNvbXBvbmVudEhlbHBlci5pc051bGxVbmRlZmluZWRFbXB0eShjb250YWluZXJGaWVsZFZhbHVlW2tleV0pKSB7XHJcbiAgICAgICAgYWxsb3dUb1NldERhdGEgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrOyAvLyBleGl0IHRoZSBsb29wIGVhcmx5IHNpbmNlIHRoZSBmbGFnIGlzIGFscmVhZHkgdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFsbG93VG9TZXREYXRhICYmIChPYmplY3Qua2V5cyhjb250YWluZXJGaWVsZFZhbHVlKS5sZW5ndGggIT09IDAgfHwgY29udGFpbmVyRmllbGRWYWx1ZS5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSkge1xyXG4gICAgICAvLyBnZXQgY29udGFpbmVyIG1vZGVsIHZhbHVlLCBzZXQgdG8gZ3JvdXAgZ3JpZCBkYXRhc291cmNlXHJcbiAgICAgIGdyb3VwW2dyaWREYXRhU291cmNlXS5wdXNoKGNvbnRhaW5lckZpZWxkVmFsdWUpO1xyXG5cclxuICAgICAgLy8gc2V0IGRhdGFzb3VyY2UgdG8gZ3JpZFxyXG4gICAgICBncm91cFtncmlkVmFsdWVdLnNldERhdGEodGhpcy5ncm91cFtncmlkRGF0YVNvdXJjZV0pO1xyXG5cclxuICAgICAgLy8gY2xlYXIgY29udGFpbmVyIGZpZWxkIHZhbHVlXHJcbiAgICAgIHRoaXMuY2xlYXJDb250YWluZXJSZWxhdGVkRmllbGRWYWx1ZShncm91cCwgY29udGFpbmVyTmFtZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdygnVG8gYWRkIHRoZSByZWNvcmQsIHBsZWFzZSBlbnRlci9zZWxlY3QgYXQgbGVhc3Qgb25lIGZpZWxkIGluIHRoaXMgc2VjdGlvbi4nLCAndG9wJywgdHJ1ZSwgMzAwMCwgJ3dhcm5pbmcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJDb250YWluZXJSZWxhdGVkRmllbGRWYWx1ZShncm91cDogWkdyb3VwLCBjb250YWluZXJOYW1lOiBzdHJpbmcpIHtcclxuICAgIC8vIGFmdGVyIHNldCB0byBncmlkLCBjbGVhciB0aGUgem1vZGVsLlxyXG4gICAgdGhpcy5jbGVhckNvbnRhaW5lckZpZWxkRWxlbWVudFZhbHVlKGNvbnRhaW5lck5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVHcmlkUm93KGdyaWRWYWx1ZTogYW55LCBncmlkRGF0YVNvdXJjZTogYW55LCBkYXRhSXRlbTogYW55LCBpbmRleDogYW55KSB7XHJcbiAgICB0aGlzLmdyb3VwW2dyaWREYXRhU291cmNlXS5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgIC8vIHNldCBkYXRhc291cmNlIHRvIGdyaWRcclxuICAgIHRoaXMuZ3JvdXBbZ3JpZFZhbHVlXS5zZXREYXRhKHRoaXMuZ3JvdXBbZ3JpZERhdGFTb3VyY2VdKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgaXNEcm9wZG93blR5cGUoZGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBjb21wb25lbnREYXRhVHlwZSA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IGRhdGEgOiBkYXRhLlR5cGUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBpZiAoY29tcG9uZW50RGF0YVR5cGUgPT0gQ29tcG9uZW50VHlwZS5kcm9wZG93biB8fCBjb21wb25lbnREYXRhVHlwZSA9PSBDb21wb25lbnRUeXBlLnp1aXNlbGVjdG11bHRpcGxlIHx8IGNvbXBvbmVudERhdGFUeXBlID09IENvbXBvbmVudFR5cGUuenNlbGVjdG11bHRpcGxlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlcyB0aGUgZm9ybSBhbmQgc2hvd3MgYW4gZXJyb3IgbWVzc2FnZSBpZiBpdCBpcyBpbnZhbGlkLlxyXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyB2YWxpZGF0ZUFuZFNob3dFcnJvck1lc3NhZ2UoKSB7XHJcbiAgICBjb25zdCBmZyA9IHRoaXMuZm9ybSBhcyBGb3JtR3JvdXA7XHJcblxyXG4gICAgLy8gSWYgdGhlIGZvcm0gaXMgaW52YWxpZCwgY2xlYXIgYW55IGVycm9ycyBpbiBjb250YWluZXIgZmllbGRzIGFuZCBzaG93IHRoZSBlcnJvciBtZXNzYWdlLlxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBmb3JtIGNvbnRyb2xzIGFuZCByZXNldCBhbnkgZXJyb3JzIHRoYXQgYmVsb25nIHRvIGEgY29udGFpbmVyIGZpZWxkXHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGZnLmNvbnRyb2xzKSkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29udGFpbmVyRmllbGRFcnJvckFzTnVsbChmZywga2V5KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQ2hlY2sgaXMgdGhlIGZvcm1ncm91cCB2YWx1ZSBhZ2Fpbi5cclxuICAgICAgaWYgKGZnLnZhbGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFNob3cgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBmb3JtXHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZS5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKHRoaXMuZ3JvdXAsIGZnKTtcclxuXHJcbiAgICAgIC8vIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmb3JtIGlzIG5vdCB2YWxpZFxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZm9ybSBpcyB2YWxpZFxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldHMgdGhlIGVycm9ycyBvZiBhIGNvbnRhaW5lciBmaWVsZCBpbiBhIEZvcm1Hcm91cC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmZyBUaGUgRm9ybUdyb3VwIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWVsZC5cclxuICAgKiBAcGFyYW0ga2V5IFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgRm9ybUdyb3VwLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0Q29udGFpbmVyRmllbGRFcnJvckFzTnVsbChmZzogRm9ybUdyb3VwLCBrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udHJvbE5hbWVTZWdtZW50cyA9IGtleS5zcGxpdCgnXycpO1xyXG5cclxuICAgIGlmIChjb250cm9sTmFtZVNlZ21lbnRzLmxlbmd0aCA8PSAzKSB7XHJcbiAgICAgIC8vIEZpZWxkIGlzIG5vdCBpbnNpZGUgYSBjb250YWluZXIsIHNvIHdlIHNraXAgaXRcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG5vIG12Z2xpc3QsIGRpcmVjdCByZXR1cm4uIGRvbnQgbmVlZCBkbyBhbnl0aGluZy5cclxuICAgIGlmICghdGhpcy5ncm91cFsnbXZnbGlzdCddKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiBjb250YWluZXIgYnV0IG5vdCBtdWx0aSB2YWx1ZSBncm91cCA9IHRydWUsIHdlIHNraXAgaXQuXHJcbiAgICBjb25zdCBjb250YWluZXIgPSBbY29udHJvbE5hbWVTZWdtZW50c1swXSwgY29udHJvbE5hbWVTZWdtZW50c1sxXSwgY29udHJvbE5hbWVTZWdtZW50c1syXV0uam9pbignXycpO1xyXG4gICAgaWYgKCF0aGlzLmdyb3VwWydtdmdsaXN0J10uaW5jbHVkZXMoY29udGFpbmVyKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29udHJvbCA9IGZnLmdldChrZXkpO1xyXG5cclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICAvLyBJZiB0aGUgY29udHJvbCBpcyBub3QgaW5zaWRlIGEgY29udGFpbmVyLCBza2lwIGl0LlxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmV0dXJuIGlmIGZvcm1jb250cm9sIGlzIHZhbGlkLlxyXG4gICAgaWYgKGNvbnRyb2wuc3RhdHVzID09PSAnVkFMSUQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250cm9sRXJyb3JzID0gY29udHJvbC5lcnJvcnM7XHJcblxyXG4gICAgaWYgKGNvbnRyb2xFcnJvcnMpIHtcclxuICAgICAgLy8gU2V0IHRoZSBjb250cm9sJ3MgZXJyb3JzIHRvIG51bGwuXHJcbiAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIGEgZm9ybSBhbmQgcmV0dXJucyBpdHMgWk1vZGVsIGlmIGl0IGlzIHZhbGlkLlxyXG4gICAqIEBwYXJhbSBza2lwUmVtb3ZlTXZnRmllbGRWYWx1ZSBXaGV0aGVyIHRvIHNraXAgcmVtb3ZpbmcgdGhlIHZhbHVlcyBvZiBtdmcgZmllbGRzIGZyb20gdGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgICogQHJldHVybnMgVGhlIGZvcm0ncyBaTW9kZWwgaWYgaXQgaXMgdmFsaWQsIG9yIHVuZGVmaW5lZCBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFZhbGlkYXRlZEZvcm1aTW9kZWwoc2tpcFJlbW92ZVByZWZpeD86IGJvb2xlYW4sIHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlPzogYm9vbGVhbikge1xyXG4gICAgY29uc3QgaXNWYWxpZEZvcm0gPSB0aGlzLnZhbGlkYXRlQW5kU2hvd0Vycm9yTWVzc2FnZSgpO1xyXG5cclxuICAgIGlmIChpc1ZhbGlkRm9ybSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRaTW9kZWwoc2tpcFJlbW92ZVByZWZpeCwgc2tpcFJlbW92ZU12Z0ZpZWxkVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSB6TW9kZWwgb2JqZWN0LCB3aXRoIG12ZyAobXVsdGkgdmFsdWUgZ3JvdXApIGZpZWxkcyByZW1vdmVkIGFuZCBwcm9wZXJ0eSBwcmVmaXhlcyByZW1vdmVkLlxyXG4gICAqIEBwYXJhbSBza2lwUmVtb3ZlUHJlZml4IFdoZXRoZXIgdG8gc2tpcCByZW1vdmluZyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBwcmVmaXguXHJcbiAgICogQHBhcmFtIHNraXBSZW1vdmVNdmdGaWVsZFZhbHVlIFdoZXRoZXIgdG8gc2tpcCByZW1vdmluZyB0aGUgdmFsdWVzIG9mIG12ZyBmaWVsZHMgZnJvbSB0aGUgek1vZGVsIG9iamVjdC5cclxuICAgKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgek1vZGVsIG9iamVjdC5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Wk1vZGVsKHNraXBSZW1vdmVQcmVmaXg/OiBib29sZWFuLCBza2lwUmVtb3ZlTXZnRmllbGRWYWx1ZT86IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHpNb2RlbCA9IHRoaXMuZ3JvdXBbdGhpcy5jb21wb25lbnRTY29wZU5hbWVdLnpNb2RlbDtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggYWxsIHByb3BlcnRpZXMgaW4gdGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgICBmb3IgKGNvbnN0IHpNb2RlbFByb3BlcnR5IGluIHpNb2RlbCkge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHpNb2RlbCwgek1vZGVsUHJvcGVydHkpKSB7XHJcbiAgICAgICAgY29uc3Qgek1vZGVsUHJvcGVydHlTZWdtZW50cyA9IHpNb2RlbFByb3BlcnR5LnNwbGl0KCdfJyk7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBpcyBwYXJ0IG9mIGEgbXVsdGkgdmFsdWUgZ3JvdXAuXHJcbiAgICAgICAgaWYgKHpNb2RlbFByb3BlcnR5U2VnbWVudHMubGVuZ3RoID4gMykge1xyXG4gICAgICAgICAgLy8gVGhlIHRoaXJkIHNlZ21lbnQgb2YgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNvbnRhaW5lciBuYW1lLlxyXG4gICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IHpNb2RlbFByb3BlcnR5U2VnbWVudHNbMl07XHJcbiAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIG5hbWUgb2YgdGhlIG11bHRpIHZhbHVlIGdyb3VwLlxyXG4gICAgICAgICAgY29uc3QgbXVsdGlWYWx1ZUdyb3VwU2NvcGVOYW1lID0gYG12Z18ke2NvbnRhaW5lck5hbWV9YDtcclxuXHJcbiAgICAgICAgICAvLyBJZiB0aGUgbXVsdGkgdmFsdWUgZ3JvdXAgZXhpc3RzIGFuZCBjb250YWlucyB0aGUgcHJvcGVydHksIHJlbW92ZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGZyb20gdGhlIHpNb2RlbCBvYmplY3QuXHJcbiAgICAgICAgICBpZiAodGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG12Z0ZpZWxkID0gdGhpcy5ncm91cFttdWx0aVZhbHVlR3JvdXBTY29wZU5hbWVdLmZpbmQoKHJlY29yZCkgPT4gcmVjb3JkID09PSB6TW9kZWxQcm9wZXJ0eSk7XHJcbiAgICAgICAgICAgIGlmIChtdmdGaWVsZCkge1xyXG4gICAgICAgICAgICAgIHpNb2RlbFt6TW9kZWxQcm9wZXJ0eV0gPSBza2lwUmVtb3ZlTXZnRmllbGRWYWx1ZSA/IHpNb2RlbFt6TW9kZWxQcm9wZXJ0eV0gOiBudWxsO1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHpNb2RlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBpbXBvcnRhbnQ6IFJlbW92ZSBwcm9wZXJ0eSBwcmVmaXhlcyBmcm9tIHRoZSB6TW9kZWwgb2JqZWN0IGlmIHNraXBSZW1vdmVQcmVmaXggaXMgbm90IHRydWUgKGJ5IGRlZmF1bHQgcmVtb3ZlIHByZWZpeClcclxuICAgIGNvbnN0IHBhdGNoZWRNb2RlbERhdGEgPSBza2lwUmVtb3ZlUHJlZml4ID8gek1vZGVsIDogdGhpcy5yZW1vdmVaTW9kZWxQcm9wZXJ0eVByZWZpeCh6TW9kZWwpO1xyXG5cclxuICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aSB2YWx1ZSBncm91cCBncmlkIHZhbHVlcywgZXh0cmFjdCB0aGUgZ3JpZCBkYXRhIGFuZCBhZGQgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29udGFpbmVyIGluIHRoZSBtb2RpZmllZCB6TW9kZWwgb2JqZWN0LlxyXG4gICAgaWYgKHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlKSB7XHJcbiAgICAgIHRoaXMubXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlLmZvckVhY2goKG11bHRpVmFsdWVHcm91cEdyaWROYW1lKSA9PiB7XHJcbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgY29udGFpbmVyIG5hbWUgZnJvbSB0aGUgZ3JpZCBuYW1lLlxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBza2lwUmVtb3ZlUHJlZml4ID8gbXVsdGlWYWx1ZUdyb3VwR3JpZE5hbWUuc3BsaXQoJ18nKS5qb2luKCdfJykgOiBtdWx0aVZhbHVlR3JvdXBHcmlkTmFtZS5zcGxpdCgnXycpWzJdO1xyXG5cclxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBncmlkIGRhdGEgYW5kIHJlbW92ZSBwcm9wZXJ0eSBwcmVmaXhlcyBpZiBza2lwUmVtb3ZlUHJlZml4IGlzIG5vdCB0cnVlLlxyXG4gICAgICAgIGNvbnN0IG11bHRpVmFsdWVHcm91cEdyaWQgPSB0aGlzLmdyb3VwW211bHRpVmFsdWVHcm91cEdyaWROYW1lXSBhcyBaR3JpZDtcclxuICAgICAgICBjb25zdCBncmlkRGF0YSA9IG11bHRpVmFsdWVHcm91cEdyaWQuZ2V0R3JpZERhdGEoKS5tYXAoKGRhdGEpID0+IHNraXBSZW1vdmVQcmVmaXggPyBkYXRhIDogdGhpcy5yZW1vdmVaTW9kZWxQcm9wZXJ0eVByZWZpeChkYXRhLCB0cnVlKSk7XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgZ3JpZCBkYXRhIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRhaW5lciBpbiB0aGUgbW9kaWZpZWQgek1vZGVsIG9iamVjdC5cclxuICAgICAgICBpZiAoZ3JpZERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcGF0Y2hlZE1vZGVsRGF0YVtjb250YWluZXJOYW1lXSA9IGdyaWREYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhdGNoZWRNb2RlbERhdGE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIGEgbW9kZWwgaW4gdGhlIGZvcm0gZ3JvdXAuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCB0byBzZXQuXHJcbiAgICogQHBhcmFtIHsqfSBtb2RlbFZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBtb2RlbC5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwUHJlZml4XSBPcHRpb25hbCBwYXJhbWV0ZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgdGhlIGNvbXBvbmVudCBwcmVmaXguXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIHNldE1vZGVsVmFsdWUobW9kZWxOYW1lOiBzdHJpbmcsIG1vZGVsVmFsdWU6IGFueSwgc2tpcFByZWZpeD86IGJvb2xlYW4pIHtcclxuICAgIC8vIEdldCB0aGUgek1vZGVsIG9iamVjdCBmcm9tIHRoZSBmb3JtIGdyb3VwXHJcbiAgICBjb25zdCB6TW9kZWxzID0gdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsO1xyXG4gICAgLy8gSWYgc2tpcFByZWZpeCBpcyBmYWxzZSBvciB1bmRlZmluZWQsIHByZXBlbmQgdGhlIGNvbXBvbmVudCBwcmVmaXggdG8gdGhlIG1vZGVsIG5hbWVcclxuICAgIGNvbnN0IHpNb2RlbE5hbWUgPSBza2lwUHJlZml4ID8gbW9kZWxOYW1lIDogdGhpcy5jb21wb25lbnRQcmVmaXggKyAnXycgKyBtb2RlbE5hbWU7XHJcbiAgICAvLyBTZXQgdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBpbiB0aGUgek1vZGVsIG9iamVjdFxyXG4gICAgek1vZGVsc1t6TW9kZWxOYW1lXSA9IG1vZGVsVmFsdWU7XHJcblxyXG4gICAgLy8gR2V0IHRoZSBmb3JtIGdyb3VwIGFzIGEgRm9ybUdyb3VwIG9iamVjdFxyXG4gICAgbGV0IGZnOiBGb3JtR3JvdXAgPSB0aGlzLmdyb3VwW3RoaXMuY29tcG9uZW50U2NvcGVOYW1lXS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuXHJcbiAgICAvLyBQYXRjaCB0aGUgZm9ybSBncm91cCB3aXRoIHRoZSB1cGRhdGVkIHpNb2RlbCBvYmplY3RcclxuICAgIGZnLnBhdGNoVmFsdWUoek1vZGVscyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFJlbW92ZSB0aGUgY29tcG9uZW50IHByZWZpeCBmcm9tIHByb3BlcnR5IG5hbWVzIGluIHRoZSB6TW9kZWwgb2JqZWN0LlxyXG4gICpcclxuICAqIEBwYXJhbSB7Kn0gek1vZGVsIFRoZSB6TW9kZWwgb2JqZWN0LlxyXG4gICogQHBhcmFtIHtib29sZWFufSBbZ2V0T25seUZpZWxkTmFtZV0gT3B0aW9uYWwgcGFyYW1ldGVyIGluZGljYXRpbmcgd2hldGhlciB0byBvbmx5IHJldHVybiB0aGUgZmllbGQgbmFtZSB3aXRob3V0IHRoZSBwcmVmaXguXHJcbiAgKiBAcmV0dXJucyB7Kn0gVGhlIHVwZGF0ZWQgek1vZGVsIG9iamVjdC5cclxuICAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlWk1vZGVsUHJvcGVydHlQcmVmaXgoek1vZGVsOiBhbnksIGdldE9ubHlGaWVsZE5hbWU/OiBib29sZWFuKSB7XHJcbiAgICAvLyBDcmVhdGUgYW4gZW1wdHkgb2JqZWN0IHRvIHN0b3JlIHRoZSB1cGRhdGVkIHpNb2RlbCBkYXRhXHJcbiAgICBjb25zdCBwYXRjaGVkTW9kZWxEYXRhID0ge307XHJcblxyXG4gICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggcHJvcGVydHkgaW4gdGhlIHpNb2RlbCBvYmplY3RcclxuICAgIGZvciAobGV0IHByb3AgaW4gek1vZGVsKSB7XHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoek1vZGVsLCBwcm9wKSkge1xyXG4gICAgICAgIC8vIFNwbGl0IHRoZSBwcm9wZXJ0eSBuYW1lIGJ5IHVuZGVyc2NvcmVzXHJcbiAgICAgICAgY29uc3QgcHJvcFNlZ21lbnQgPSBwcm9wLnNwbGl0KCdfJyk7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGhvdXQgdGhlIGNvbXBvbmVudCBwcmVmaXhcclxuICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSBnZXRPbmx5RmllbGROYW1lID8gcHJvcFNlZ21lbnRbcHJvcFNlZ21lbnQubGVuZ3RoIC0gMV0gOiBwcm9wLnJlcGxhY2UodGhpcy5jb21wb25lbnRQcmVmaXggKyAnXycsICcnKTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSBwcm9wZXJ0eSB0byB0aGUgdXBkYXRlZCB6TW9kZWwgb2JqZWN0XHJcbiAgICAgICAgcGF0Y2hlZE1vZGVsRGF0YVtwcm9wZXJ0eU5hbWVdID0gek1vZGVsW3Byb3BdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIHpNb2RlbCBvYmplY3RcclxuICAgIHJldHVybiBwYXRjaGVkTW9kZWxEYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXJzIHRoZSB6TW9kZWwgcHJvcGVydHkgb2YgdGhlIGdyb3VwIGluIHRoZSBjb21wb25lbnQgc2NvcGUgYW5kIHJlc2V0cyB0aGUgbXVsdGlWYWx1ZUdyb3VwR3JpZFZhbHVlIGFycmF5LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgcHVibGljIGNsZWFyWk1vZGVsKCkge1xyXG4gICAgdGhpcy5ncm91cFt0aGlzLmNvbXBvbmVudFNjb3BlTmFtZV0uek1vZGVsID0ge307XHJcbiAgICB0aGlzLm11bHRpVmFsdWVHcm91cEdyaWRWYWx1ZSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE11bHRpVmFsdWVHcm91cEJ1dHRvbnNFbmFibGVkKGNvbnRhaW5lck5hbWU6IHN0cmluZywgaXNFbmFibGVkOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudCh0aGlzLmdyb3VwLCBgemdyaWRfJHt0aGlzLmNvbXBvbmVudFByZWZpeH1fJHtjb250YWluZXJOYW1lfWApO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gWydFbmFibGVDdXN0b21BZGRDb21tYW5kJywgJ0VuYWJsZUN1c3RvbVJlc2V0Q29tbWFuZCcsICdFbmFibGVDdXN0b21SZW1vdmVDb21tYW5kJ107XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgcmVzdWx0WydkYXRhJ11bcHJvcF0gPSBpc0VuYWJsZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmVudW0gQ29tcG9uZW50VHlwZSB7XHJcbiAgdGV4dCA9ICd0ZXh0JyxcclxuICB0ZXh0YXJlYSA9ICd0ZXh0YXJlYScsXHJcbiAgY2hlY2tib3ggPSAnY2hlY2tib3gnLFxyXG4gIGxhYmVsID0gJ3psYWJlbCcsXHJcbiAgZGF0ZSA9ICdkYXRlJyxcclxuICB6ZGF0ZXRpbWUgPSAnemRhdGV0aW1lJyxcclxuICB6dWlkYXRldGltZSA9ICd6dWlkYXRldGltZScsXHJcbiAgbnVtYmVyID0gJ251bWJlcicsXHJcbiAgem51bWVyaWMgPSAnem51bWVyaWMnLFxyXG4gIGVtYWlsID0gJ2VtYWlsJyxcclxuICBmaWxlID0gJ2ZpbGUnLFxyXG4gIHByaWNlID0gJ3ByaWNlJyxcclxuICB3ZWJzaXRlID0gJ3dlYnNpdGUnLFxyXG4gIGRyb3Bkb3duID0gJ2Ryb3Bkb3duJyxcclxuICB6dWlzZWxlY3RtdWx0aXBsZSA9ICd6dWlzZWxlY3RtdWx0aXBsZScsXHJcbiAgenNlbGVjdG11bHRpcGxlID0gJ3pzZWxlY3RtdWx0aXBsZScsXHJcbiAgZ3JvdXBpbmcgPSAna2NhcmQnLFxyXG4gIGJ1dHRvbiA9ICd6YnV0dG9ucycsXHJcbiAgZ3JpZCA9ICd6Z3JpZCdcclxufVxyXG4iLCI8ZGl2IHN0eWxlPVwicGFkZGluZzogMTVweFwiICpuZ0lmPVwiZGF0YS5UaXRsZSAmJiAoISFjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1Zpc2libGVGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZSlcIiBjbGFzcz1cInp1ZGYtY29udGFpbmVyXCI+XHJcbiAgPGtlbmRvLWNhcmQgKm5nSWY9XCJkYXRhLlRpdGxlXCI+XHJcbiAgICA8a2VuZG8tY2FyZC1oZWFkZXI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cImNhcmQtaGVhZGVyLXRpdGxlXCI+e3tkYXRhLlRpdGxlfX08L2lvbi1sYWJlbD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2tlbmRvLWNhcmQtaGVhZGVyPlxyXG4gICAgPGtlbmRvLWNhcmQtYm9keT5cclxuICAgICAgPCEtLSA8YXBwLXpmb3JtY29udHJvbCBbbmdDbGFzc109XCJncm91cFtmaWVsZC5pc1Zpc2libGVGaWVsZF0gPyBmaWVsZC5EaXZDbGFzcyA6ICgoZmllbGQuVmlzaWJsZSA9PT0gdHJ1ZSkgPyAgZmllbGQuRGl2Q2xhc3MgOiAnZmxleC1oaWRlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZm9ybUZpZWxkcyB8IGRpdnpsYXlvdXQ6IGRhdGEuemxheW91dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJncm91cFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7ZmllbGQuTmFtZX19XCI+XHJcbiAgICAgIDwvYXBwLXpmb3JtY29udHJvbD4gLS0+XHJcbiAgICAgIDxhcHAtemRpdiBbZGF0YV09XCJkYXRhXCIgW2Zvcm1dPVwiZm9ybVwiIFtncm91cF09XCJncm91cFwiIFtjb250YWluZXJGaWVsZF09XCJjb250YWluZXJGaWVsZFwiPjwvYXBwLXpkaXY+XHJcbiAgICA8L2tlbmRvLWNhcmQtYm9keT5cclxuICA8L2tlbmRvLWNhcmQ+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIiFkYXRhLlRpdGxlICYmICghIWNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlRmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzVmlzaWJsZUZpZWxkXSA6IGNvbXBvbmVudFByb3BlcnRpZXMuaXNWaXNpYmxlKVwiIFtzdHlsZV09XCJkYXRhLlN0eWxlXCIgY2xhc3M9XCJ6dWRmLWNvbnRhaW5lclwiPlxyXG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gICAgPCEtLSA8YXBwLXpmb3JtY29udHJvbCBbbmdDbGFzc109XCJncm91cFtmaWVsZC5pc1Zpc2libGVGaWVsZF0gPyBmaWVsZC5EaXZDbGFzcyA6ICgoZmllbGQuVmlzaWJsZSA9PT0gdHJ1ZSkgPyAgZmllbGQuRGl2Q2xhc3MgOiAnZmxleC1oaWRlJylcIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmb3JtRmllbGRzIHwgZGl2emxheW91dDogZGF0YS56bGF5b3V0XCJcclxuICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgIFtncm91cF09XCJncm91cFwiXHJcbiAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgaWQ9XCJ7e2ZpZWxkLk5hbWV9fVwiPlxyXG4gICAgPC9hcHAtemZvcm1jb250cm9sPiAtLT5cclxuICAgIDxhcHAtemRpdiBbZGF0YV09XCJkYXRhXCIgW2Zvcm1dPVwiZm9ybVwiIFtncm91cF09XCJncm91cFwiIFtjb250YWluZXJGaWVsZF09XCJjb250YWluZXJGaWVsZFwiPjwvYXBwLXpkaXY+XHJcbiAgPC9mb3JtPlxyXG48L2Rpdj5cclxuIl19