@huntsman-cancer-institute/cod 15.0.2 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/components/attribute-base.d.ts +1 -1
  2. package/components/attribute-configuration.component.d.ts +1 -1
  3. package/components/attribute-container.component.d.ts +1 -1
  4. package/components/attribute-default.component.d.ts +1 -1
  5. package/{esm2020 → esm2022}/cod.module.mjs +42 -42
  6. package/{esm2020 → esm2022}/components/attribute-absolute.component.mjs +6 -6
  7. package/{esm2020 → esm2022}/components/attribute-base.mjs +4 -4
  8. package/{esm2020 → esm2022}/components/attribute-configuration.component.mjs +6 -6
  9. package/{esm2020 → esm2022}/components/attribute-container.component.mjs +6 -6
  10. package/{esm2020 → esm2022}/components/attribute-default.component.mjs +12 -12
  11. package/{esm2020 → esm2022}/components/attribute-edit.component.mjs +6 -6
  12. package/{esm2020 → esm2022}/components/attribute-flex.component.mjs +6 -6
  13. package/{esm2020 → esm2022}/date/date-util.mjs +4 -4
  14. package/{esm2020 → esm2022}/pipes/is-group-attribute.pipe.mjs +4 -4
  15. package/{esm2020 → esm2022}/services/attribute.service.mjs +4 -4
  16. package/{fesm2020 → fesm2022}/huntsman-cancer-institute-cod.mjs +89 -89
  17. package/{fesm2020 → fesm2022}/huntsman-cancer-institute-cod.mjs.map +1 -1
  18. package/package.json +14 -20
  19. package/fesm2015/huntsman-cancer-institute-cod.mjs +0 -5047
  20. package/fesm2015/huntsman-cancer-institute-cod.mjs.map +0 -1
  21. /package/{esm2020 → esm2022}/huntsman-cancer-institute-cod.mjs +0 -0
  22. /package/{esm2020 → esm2022}/index.mjs +0 -0
  23. /package/{esm2020 → esm2022}/model/attribute-choice.entity.mjs +0 -0
  24. /package/{esm2020 → esm2022}/model/attribute-configuration.dto.mjs +0 -0
  25. /package/{esm2020 → esm2022}/model/attribute-configuration.entity.mjs +0 -0
  26. /package/{esm2020 → esm2022}/model/attribute-container.entity.mjs +0 -0
  27. /package/{esm2020 → esm2022}/model/attribute-dictionary.entity.mjs +0 -0
  28. /package/{esm2020 → esm2022}/model/attribute-long-text.entity.mjs +0 -0
  29. /package/{esm2020 → esm2022}/model/attribute-value-grid-row.entity.mjs +0 -0
  30. /package/{esm2020 → esm2022}/model/attribute-value-set.entity.mjs +0 -0
  31. /package/{esm2020 → esm2022}/model/attribute-value.entity.mjs +0 -0
  32. /package/{esm2020 → esm2022}/model/attribute.entity.mjs +0 -0
  33. /package/{esm2020 → esm2022}/model/dictionary-entries.dto.mjs +0 -0
  34. /package/{esm2020 → esm2022}/model/extractable-field-status.entity.mjs +0 -0
  35. /package/{esm2020 → esm2022}/model/graphical-attribute.entity.mjs +0 -0
  36. /package/{esm2020 → esm2022}/model/pre-eval.dto.mjs +0 -0
@@ -1199,13 +1199,13 @@ export class AttributeService {
1199
1199
  getUniqueId() {
1200
1200
  return --this.uniqueId;
1201
1201
  }
1202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttributeService, deps: [{ token: i1.DictionaryService }, { token: i2.HttpClient }, { token: i3.Router }, { token: ATTRIBUTE_ENDPOINT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1203
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttributeService }); }
1202
1204
  }
1203
- AttributeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AttributeService, deps: [{ token: i1.DictionaryService }, { token: i2.HttpClient }, { token: i3.Router }, { token: ATTRIBUTE_ENDPOINT }], target: i0.ɵɵFactoryTarget.Injectable });
1204
- AttributeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AttributeService });
1205
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AttributeService, decorators: [{
1205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttributeService, decorators: [{
1206
1206
  type: Injectable
1207
1207
  }], ctorParameters: function () { return [{ type: i1.DictionaryService }, { type: i2.HttpClient }, { type: i3.Router }, { type: undefined, decorators: [{
1208
1208
  type: Inject,
1209
1209
  args: [ATTRIBUTE_ENDPOINT]
1210
1210
  }] }]; } });
1211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBV2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFHckUsTUFBTSxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE4QzNCLFlBQW9CLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixNQUFjLEVBQ2MsaUJBQXlCO1FBSHJELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Msc0JB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O0lBQ1IsQ0FBQztJQUVELGlDQUFpQztRQUMvQixPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYSxDQUFDLG9CQUE0QixFQUFFLDRCQUFvQztRQUM5RSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEtBQUssNEJBQTRCLENBQUM7UUFDbEksQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLG9CQUE0QixFQUFFLDRCQUFvQyxFQUFFLFNBQWlCO1FBQ2pHLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixLQUFLLG9CQUFvQjttQkFDcEQsSUFBSSxDQUFDLDRCQUE0QixLQUFLLDRCQUE0QjttQkFDbEUsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDOzs4R0FsNUNVLGdCQUFnQixtR0FpRFAsa0JBQWtCO2tIQWpEM0IsZ0JBQWdCOzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQWtESSxNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgaXNEZXZNb2RlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBQYXJhbXN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSBcIkBodW50c21hbi1jYW5jZXItaW5zdGl0dXRlL2RpY3Rpb25hcnktc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ2hvaWNlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNob2ljZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNvbmZpZ3VyYXRpb24uZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWVTZXR9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUtc2V0LmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE99IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi5kdG9cIjtcclxuaW1wb3J0IHtHcmFwaGljYWxBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9ncmFwaGljYWwtYXR0cmlidXRlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbnRhaW5lcn0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jb250YWluZXIuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWVHcmlkUm93fSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93LmVudGl0eVwiO1xyXG5pbXBvcnQge1ByZUV2YWxEVE99IGZyb20gXCIuLi9tb2RlbC9wcmUtZXZhbC5kdG9cIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5RW50cmllc0RUT30gZnJvbSBcIi4uL21vZGVsL2RpY3Rpb25hcnktZW50cmllcy5kdG9cIjtcclxuXHJcblxyXG5leHBvcnQgbGV0IEFUVFJJQlVURV9FTkRQT0lOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXR0cmlidXRlRW5kcG9pbnRcIik7XHJcbmV4cG9ydCBjb25zdCBCT09MRUFOOiBzdHJpbmdbXSA9IFtcIk5cIiwgXCJZXCJdO1xyXG5leHBvcnQgY29uc3QgRVhURU5ERURfQk9PTEVBTjogc3RyaW5nW10gPSBbXCJOXCIsIFwiWVwiLCBcIlVcIl07XHJcblxyXG4vKipcclxuICogQSBzZXJ2aWNlIGNyZWF0ZWQgZm9yIGVhY2ggYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuICBUaGlzIG1ha2VzIGNhbGxzIHRvIHRoZSBiYWNrZW5kIHRvIGdldCB0aGUgY29uZmlndXJhdGlvblxyXG4gKiBhbmQgdmFsdWUgc2V0LiAgSXQgYWxzbyBzdG9yZXMgY29tbW9uIGRhdGEgdGhhdCBkaWZmZXJlbnQgYXR0cmlidXRlcyBtaWdodCBuZWVkIChlLmcuIGEgbGlzdCBvZiBhdHRyaWJ1dGUgY2hvaWNlcykuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVTZXJ2aWNlIHtcclxuXHJcbiAgbmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IG51bWJlcjtcclxuICBpZEZpbHRlcjE6IG51bWJlcjtcclxuICBpZEZpbHRlcjI6IG51bWJlcjtcclxuICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXI7XHJcbiAgaWRQYXJlbnRPYmplY3Q6IG51bWJlcjtcclxuICBib3VuZERhdGE6IGFueTtcclxuXHJcbiAgYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgZmlsdGVyMUxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBmaWx0ZXIyTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGRpY3Rpb25hcnlMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcblxyXG5cclxuICBwb3N0Q29uZmlndXJhdGlvblN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EaW1lbnNpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih1bmRlZmluZWQpO1xyXG5cclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+KHVuZGVmaW5lZCk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+KCk7XHJcblxyXG4gIGxvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlTWFwOiBNYXA8bnVtYmVyLCBBdHRyaWJ1dGU+ID0gbmV3IE1hcDxudW1iZXIsIEF0dHJpYnV0ZT4oKTtcclxuXHJcbiAgd2lkdGg6IG51bWJlcjtcclxuXHJcbiAgY29udGFpbmVyVXBkYXRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgZ3JpZFJvd1NhdmVkOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+KCk7XHJcbiAgZ3JpZFJvd0RlbGV0ZWQ6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4oKTtcclxuICBkaXJ0eTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgdXBkYXRlZEF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG4gIHNsaWNlZEF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHVuaXF1ZUlkOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICAgICAgICBASW5qZWN0KEFUVFJJQlVURV9FTkRQT0lOVCkgcHJpdmF0ZSBhdHRyaWJ1dGVFbmRwb2ludDogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkNyZWF0ZWQgTmV3IEF0dHJpYnV0ZVNlcnZpY2VcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRCb3VuZERhdGEoYm91bmREYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuYm91bmREYXRhID0gYm91bmREYXRhO1xyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIHRoaXMubm90aWZ5QXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVDb3VudEJ5QXR0cmlidXRlKGlkQXR0cmlidXRlOiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZVwiLCBpZEF0dHJpYnV0ZS50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVDb3VudEJ5Q29udGFpbmVyKGlkQXR0cmlidXRlQ29udGFpbmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZUNvbnRhaW5lclwiLCBpZEF0dHJpYnV0ZUNvbnRhaW5lci50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGljdGlvbmFyeVZhbHVlQ291bnQoaWRBdHRyaWJ1dGVEaWN0aW9uYXJ5OiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtZGljdGlvbmFyeS1jb3VudFwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkQXR0cmlidXRlRGljdGlvbmFyeVwiLCBpZEF0dHJpYnV0ZURpY3Rpb25hcnkudG9TdHJpbmcoKSl9KTtcclxuICB9XHJcblxyXG4gIGZldGNoQXR0cmlidXRlQ29udGV4dCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgZm9ya0pvaW4oW1xyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlQ29udGV4dFwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkZpbHRlcjFcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5GaWx0ZXIyXCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlRGljdGlvbmFyeVwiKVxyXG4gICAgXSkuc3Vic2NyaWJlKChyZXNwb25zZXM6IGFueVtdKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1s0XSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzJdKTtcclxuICAgICAgdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbM10pO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1sxXSk7XHJcblxyXG4gICAgICByZXNwb25zZXNbMF0uc29ydCh0aGlzLnNvcnRBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0KTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1swXSk7XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy9HZXRzIHRoZSBkaWN0aW9uYXJ5IGVudHJpZXMgZnJvbSB0aGUgbWFwIChzbyB3ZSBkb24ndCBsb2FkIG92ZXIgYW5kIG92ZXIgYW5kIG92ZXIgZm9yIHRoZSBzYW1lIGRpY3Rpb25hcnkpXHJcbiAgZ2V0RGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlczogQXR0cmlidXRlVmFsdWVbXSwgZ3JvdXBBdHRyaWJ1dGVSb3dJZD86IG51bWJlciwgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlPzogQXR0cmlidXRlVmFsdWUpOiBPYnNlcnZhYmxlPERpY3Rpb25hcnlFbnRyaWVzRFRPPiB7XHJcbiAgICBsZXQgYnMgPSBuZXcgU3ViamVjdDxEaWN0aW9uYXJ5RW50cmllc0RUTz4oKTtcclxuXHJcbiAgICAvL0hhbmRsZSBYUEFUSFxyXG4gICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoKSB7XHJcbiAgICAgIGxldCBlbnRyaWVzRFRPID0gbmV3IERpY3Rpb25hcnlFbnRyaWVzRFRPKCk7XHJcbiAgICAgIGxldCB4cGF0aCA9IGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoO1xyXG5cclxuICAgICAgLy9GaWx0ZXJlZCBieSBhbm90aGVyIGRpY3Rpb25hcnk/IFBhcnNlIHRvIGdldCBhcnJheSBvZiBhbGwgZGljdGlvbmFyeSBjbGFzcyBuYW1lcyBuZWVkZWRcclxuICAgICAgbGV0IGRpY3RDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBsZXQgcG9zID0gMDtcclxuICAgICAgd2hpbGUgKHhwYXRoLmluZGV4T2YoXCIvRGljdGlvbmFyaWVzL0RpY3Rpb25hcnlcIiwgcG9zKSA+PSAwKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0geHBhdGguaW5kZXhPZihcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVwiLCBwb3MpO1xyXG4gICAgICAgIHN0YXJ0ID0geHBhdGguaW5kZXhPZihcIidcIiwgc3RhcnQpO1xyXG4gICAgICAgIGxldCBlbmQgPSB4cGF0aC5pbmRleE9mKFwiJ1wiLCBzdGFydCArIDEpO1xyXG4gICAgICAgIGRpY3RDbGFzc2VzLnB1c2goYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGguc3Vic3RyaW5nKHN0YXJ0ICsgMSwgZW5kKSlcclxuICAgICAgICBwb3MgPSBlbmQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vUG90ZW50aWFsbHkgbG9hZCBtdWx0aXBsZSBkaWN0aW9uYXJpZXNcclxuICAgICAgbGV0IGZvcmtDYWxscyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjbGFzc05hbWUgb2YgZGljdENsYXNzZXMpIHtcclxuICAgICAgICBmb3JrQ2FsbHMucHVzaCh0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzQXNYTUwoY2xhc3NOYW1lKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vRGVhbCB3aXRoIHRoZSByZXN1bHRzIHRvZ2V0aGVyXHJcbiAgICAgIGZvcmtKb2luKGZvcmtDYWxscykuc3Vic2NyaWJlKChyZXNwb25zZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy9XZSdyZSBvbmx5IGdvaW5nIHRvIGRvIHhwYXRoIG9uIHRoZSB4bWwgZm9yIHRoZSBmaXJzdCBkaWN0aW9uYXJ5XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICAgIGxldCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3BvbnNlc1swXSwgXCJhcHBsaWNhdGlvbi94bWxcIik7XHJcblxyXG4gICAgICAgIC8vSGF2ZSB0byBldmFsdWF0ZSBzdWItZXhwcmVzc2lvbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgZXhwcmVzc2lvbnMgbGlrZSBbQHggPSAoL3hwYXRoLXN1Yi1leHByZXNzaW9uKV1cclxuICAgICAgICBsZXQgc2Vjb25kYXJ5WG1sID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChyZXNwb25zZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgc2Vjb25kYXJ5WG1sID0gcmVzcG9uc2VzWzFdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9QcmUtZXZhbHVhdGUgYW5kIHNpbXBsaWZ5IFhQQVRIXHJcbiAgICAgICAgbGV0IGR0bzpQcmVFdmFsRFRPID0gdGhpcy5wcmVFdmFsdWF0ZVhwYXRoKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoLCBzZWNvbmRhcnlYbWwsIGdyb3VwQXR0cmlidXRlUm93SWQsIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vRXZhbHVhdGUgWFBBVEggZXhwcmVzc2lvblxyXG4gICAgICAgIGxldCBlbnRyaWVzID0gW107XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgbGV0IHhQYXRoUmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoZHRvLmV4cHJlc3Npb24sIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xyXG5cclxuICAgICAgICAgIC8vSXRlcmF0ZSB4cGF0aCByZXN1bHRzIChub2RlcylcclxuICAgICAgICAgIHZhciBub2RlID0gbnVsbDtcclxuICAgICAgICAgIHdoaWxlKG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGUpO1xyXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gTm8gbWF0Y2hpbmcgZW50cmllcyBoZXJlLlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9XaGF0IGFib3V0IGRpY3Rpb25hcnkgZW50cmllcyB3aGVyZSBpc0FjdGl2ZT0nTicsIGJ1dCB0aGUgaWQgd2FzIHVzZWQgaW4gYSBwcmV2aW91c2x5IHNhdmVkIHZhbHVlP1xyXG4gICAgICAgIC8vV2UgYWRkIHRoYXQgdmFsdWUgdG8gdGhlIGRyb3Bkb3duLCBpbiB0aGF0IGNhc2UsIHNvIGl0IGNhbiBiZSBzZWxlY3RlZFxyXG4gICAgICAgIC8vUmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlIG9ubHkgZ2V0cyBwYXNzZWQgaW4gd2hlbiB0aGUgZmlsdGVyIGF0dHJpYnV0ZSBjaGFuZ2VzLiBJbiB0aGF0IHNjZW5hcmlvIHdlIGRvIG5vdCB3YW50IHRvIGFkZCB0aGUgb2xkIHZhbHVlIHRvIHRoZSBsaXN0XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5pc011bHRpVmFsdWUgIT09IFwiWVwiKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdiBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHByZXNlbnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChhdiAmJiAhIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIGZvcih2YXIgaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldLnZhbHVlID09PSBhdi52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIC8vSWYgdGhlIGN1cnJlbnRseSBzYXZlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIGxpc3QsIGFkZCBpdC5cclxuICAgICAgICAgICAgICBpZiAoISBwcmVzZW50KSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgeHBhdGggPSBcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVtAY2xhc3NOYW1lPSdcIiArIGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LmNsYXNzTmFtZSArIFwiJ10vRGljdGlvbmFyeUVudHJ5W0B2YWx1ZT0nXCIgKyBhdi52YWx1ZUlkRGljdGlvbmFyeSArIFwiJ11cIjtcclxuICAgICAgICAgICAgICAgIC8vVGhlIGVudHJ5IHdhcyBwcm9iYWJseSBhbHJlYWR5IGxvYWRlZCwgYnV0IGV4Y2x1ZGVkIGJ5IHRoZSB4cGF0aC4gV2UgY2FuIHVzZSB0aGF0LlxyXG4gICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZXZhbHVhdGUoeHBhdGgsIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1VOT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaCh0aGlzLmdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGUpKTtcclxuICAgICAgICAgICAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8vU2V0IHRoZSBiZWhhdmlvciBzdWJqZWN0IHdpdGggdGhlIGZpbHRlcmVkIHZhbHVlcyBmb3IgdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXMgPSBlbnRyaWVzO1xyXG4gICAgICAgIGVudHJpZXNEVE8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGR0by5yZWZlcmVuY2VkQXR0cmlidXRlO1xyXG4gICAgICAgIGJzLm5leHQoZW50cmllc0RUTyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuICAgIC8vTm9uLXhwYXRoXHJcbiAgICBlbHNlIHtcclxuICAgICAgLy9EaWN0aW9uYXlTZXJ2aWNlIGp1c3QgdXNlZCBodHRwIGdldCwgc28gc2hvdWxkIG5vdCBuZWVkIHRvIHVuc3Vic2NyaWJlLCBzaW5jZSBodHRwIGRvZXMgdGhhdFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlEcm9wZG93bkVudHJpZXMoYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkuY2xhc3NOYW1lKS5zdWJzY3JpYmUoKGVudHJpZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy9NYWtlIHZhbHVlIGZpZWxkc1xyXG4gICAgICAgIGZvcih2YXIgaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgIGVudHJpZXNbaV0udmFsdWUgPSBlbnRyaWVzW2ldLmlkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZW50cmllc0RUTyA9IG5ldyBEaWN0aW9uYXJ5RW50cmllc0RUTygpO1xyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllcyA9IGVudHJpZXM7XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSB0cnVlOyAvL0EgYml0IG9mIGFuIGFzc3VtcHRpb24sIGJ1dCBpZiBpdCBpc24ndCBmaWx0ZXJlZCwgaXQgaGFkIGJldHRlciBpbmNsdWRlIGFsbCB0aGUgdmFsdWVzIVxyXG4gICAgICAgIGJzLm5leHQoZW50cmllc0RUTyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBicztcclxuICB9XHJcblxyXG4gIGdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGU6IGFueSk6IGFueSB7XHJcbiAgICAvL0NyZWF0ZSBKU09OIG9iamVjdHMgZnJvbSB0aGUgbm9kZXNcclxuICAgIGxldCBlbnRyeTogYW55ID0ge307XHJcbiAgICBmb3IodmFyIGkgPSBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgZW50cnlbbm9kZS5hdHRyaWJ1dGVzW2ldLm5hbWVdID0gbm9kZS5hdHRyaWJ1dGVzW2ldLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBlbnRyeTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlRXZhbHVhdGVYcGF0aCh4cGF0aDogc3RyaW5nLCBzZWNvbmRhcnlYbWw6IHN0cmluZywgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogUHJlRXZhbERUTyB7XHJcbiAgICBsZXQgZHRvOlByZUV2YWxEVE8gPSBuZXcgUHJlRXZhbERUTygpO1xyXG5cclxuICAgIC8vU2VjdXJpdHlBZHZpc29yL0Bjb2RlQ2FuY2VyR3JvdXBcclxuICAgIHdoaWxlICh4cGF0aC5pbmRleE9mKFwiL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXCIpID49IDApIHtcclxuICAgICAgeHBhdGggPSB4cGF0aC5yZXBsYWNlKFwiL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXCIsIFwiJ1wiICsgdGhpcy5nZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdCgpLnZhbHVlLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgKyBcIidcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXBsYWNlIHNvbWUgb2YgdGhlIGNvbnRleHQgcGFyYW1ldGVycyAke3gudmFsdWV9IC0gVGhpcyBpcyBtb3JlIEFsdGlvIHNwZWNpZmljIHN0dWZmIHRoYXQgd2FzIHVzZWQgaW4gQ0NSXHJcbiAgICBsZXQgcGFyYW1Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcJHtbQS1aYS16MC05X10rXFxcXC52YWx1ZX1cIik7XHJcbiAgICB3aGlsZSAocGFyYW1Qb3MgPj0gMCkge1xyXG4gICAgICBsZXQgcHJlZml4ID0geHBhdGguc3Vic3RyaW5nKDAsIHBhcmFtUG9zKTtcclxuICAgICAgbGV0IHZhck5hbWUgPSB4cGF0aC5zdWJzdHJpbmcocGFyYW1Qb3MgKyAyLCB4cGF0aC5pbmRleE9mKFwiLlwiLCBwYXJhbVBvcykpO1xyXG4gICAgICBsZXQgc3VmZml4ID0geHBhdGguc3Vic3RyaW5nKHhwYXRoLmluZGV4T2YoXCJ9XCIsIHBhcmFtUG9zKSArIDEpO1xyXG5cclxuICAgICAgdmFyIGF2O1xyXG5cclxuICAgICAgLy9JZiB0aGVyZSBJUyBhIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSwgd2UgY2FuIHVzZSB0aGUgdmFsdWUgZGlyZWN0bHkuIE90aGVyd2lzZSB3ZSB0cnkgdG8gZmluZCBpdCBpbiB0aGUgQVZTXHJcbiAgICAgIGlmICghIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG5cclxuICAgICAgICAvL0ZpbmQgdGhlIGF0dHJpYnV0ZSwgbWF0Y2hpbmcgdGhlIHZhck5hbWUuXHJcbiAgICAgICAgLy9EbyB0aGlzIGZpcnN0LCBzbyB3ZSBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHJlbGF0ZWQgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIHZhbHVlXHJcblxyXG4gICAgICAgIC8vSXRlcmF0ZSBhdHRyaWJ1dGVzIHRvIGZpbmQgb25lIHRoYXQgbWF0Y2hlcyB0aGUgdmFsdWVcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5mb3JFYWNoKChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgLy9BdHRyaWJ1dGVzIHRoYXQgbWF0Y2ggdGhlIG5hbWVcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlTmFtZSA9PT0gdmFyTmFtZSkge1xyXG4gICAgICAgICAgICBkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vSWYgdGhpcyBpcyBhIGdyaWQsIGxvb2sgZm9yIGF0dHJpYnV0ZXMgaW4gdGhlIHJvd1xyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGdyaWRDb2x1bW5BdHRyaWJ1dGUgIG9mIGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgLy9JZiB0aGUgbmFtZSBtYXRjaGVzIEFORCB0aGUgdmFsdWUgaW4gdGhlIEFWUyB3YXMgcGFydCBvZiB0aGUgU0FNRSBST1cgd2UgYXJlIGV2YWx1YXRpbmcgWFBBVEggZm9yLCB3ZSBjYW4gdXNlIHRoZSB2YWx1ZSBmb3IgZXZhbHVhdGlvblxyXG4gICAgICAgICAgICAgIGlmIChncmlkQ29sdW1uQXR0cmlidXRlLmF0dHJpYnV0ZU5hbWUgPT09IHZhck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGR0by5yZWZlcmVuY2VkQXR0cmlidXRlID0gZ3JpZENvbHVtbkF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAgICAgICBsZXQgYXZzID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuICAgICAgICAvL0lmIHdlIGZvdW5kIHRoZSBhdHRyaWJ1dGUgYW5kIGhhdmUgdmFsdWVzLi4uXHJcbiAgICAgICAgaWYgKGR0by5yZWZlcmVuY2VkQXR0cmlidXRlICYmIGF2cykge1xyXG5cclxuICAgICAgICAgIC8vTG9vayB0aHJvdWdoIGFsbCB0aGUgdmFsdWVzIHRvIGZpbmQgdGhlIG9uZSBmb3IgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIChhbmQgU0FNRSBncmlkIHJvdyBpZiBpbiBhIGdyaWQgcm93KVxyXG4gICAgICAgICAgYXYgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmQoKGF2KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvL0lmIHRoaXMgaXMgYW4gQVYgZm9yIGEgZ3JpZCByb3csIGl0IG11c3QgYmUgZm9yIHRoZSBzYW1lIGdyaWQgcm93IHdlIGFyZSBsb29raW5nIGZvclxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBncm91cEF0dHJpYnV0ZVJvd0lkICE9PSAndW5kZWZpbmVkJyAmJiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgLy9JZiB3ZSBsb29rZWQgdXAgdGhlIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgdmFsdWUgYnkgaWQgQU5EIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaXMgdGhlIG9uZSB3ZSBhciBsb29raW5nIGZvciBmcm9tIHRoZSBYUEFUSCwgd2UgY2FuIHVzZSBpdCBmb3IgZXZhbHVhdGlvblxyXG4gICAgICAgICAgICAgLy9Gb3VuZCBhbiBBdHRyaWJ1dGVWYWx1ZSB0aGF0IHRoZSBkaWN0aW9uYXJ5IGlzIGZpbHRlcmVkIGJ5XHJcbiAgICAgICAgICAgIGlmIChkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9PT0gYXYuaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL1VzZSB0aGUgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlIGlmIHByb3ZpZGVkICh0aGlzIGhhcHBlbnMgd2hlbiBhbHJlYWR5IGtub3duLCBkdXJpbmcgY2hhbmdlcyB0byB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUpXHJcbiAgICAgIGlmIChyZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJ1wiICsgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlLnZhbHVlICsgXCInXCIgKyBzdWZmaXg7XHJcbiAgICAgIH1cclxuICAgICAgLy9Gb3VuZCB0aGUgQXR0cmlidXRlVmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdGhhdCB0aGUgZGljdGlvbmFyeSBpcyBmaWx0ZXJlZCBieVxyXG4gICAgICBlbHNlIGlmIChhdikge1xyXG4gICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyBhdi52YWx1ZSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICB9XHJcbiAgICAgIC8vRGlkbid0IGZpbmQgYW4gYXR0cmlidXRlIGZvciB2YXJOYW1lXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vTWF5YmUgdGhlIHZhck5hbWUgaXMgZnJvbSBlbHNld2hlcmUgaW4gdGhlIGFwcCAobm9uLUNPRCksIGFuZCBwcm92aWRlZCBpbiBib3VuZERhdGFcclxuICAgICAgICBpZiAodGhpcy5ib3VuZERhdGEgJiYgdGhpcy5ib3VuZERhdGFbdmFyTmFtZV0pIHtcclxuICAgICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyB0aGlzLmJvdW5kRGF0YVt2YXJOYW1lXSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL05vdGhpbmcgbWF0Y2hlcy4gQ2hhbmdlIHRvIGVtcHR5IHN0cmluZy4gV2lsbCBwcm9iYWJseSByZXN1bHQgaW4gTk8gZW50cmllcywgd2hpY2ggd291bGQgYmUgY29ycmVjdC5cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInJ1wiICsgc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcGFyYW1Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcJHtbQS1aYS16MC05X10rXFxcXC52YWx1ZX1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9IYXZlIHRvIGV2YWx1YXRlIHN1Yi1leHByZXNzaW9uLiBUaGlzIGhhbmRsZXMgZXhwcmVzc2lvbnMgbGlrZSBbQHggPSAoL3hwYXRoLXN1Yi1leHByZXNzaW9uKV1cclxuICAgIGxldCBpbkV4cHJlc3Npb25Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcW0BbQS1aYS16MC05X10rXFxcXHMqPVxcXFxzKlxcXFwoXCIpO1xyXG5cclxuICAgIGlmIChpbkV4cHJlc3Npb25Qb3MgPiAwICYmIHNlY29uZGFyeVhtbCkge1xyXG4gICAgICBsZXQgcHJlZml4ID0geHBhdGguc3Vic3RyaW5nKDAsIGluRXhwcmVzc2lvblBvcyArIDEpO1xyXG4gICAgICBsZXQgZXhwcmVzc2lvbkVuZCA9IHhwYXRoLmluZGV4T2YoXCIpXCIsIGluRXhwcmVzc2lvblBvcyk7XHJcbiAgICAgIGxldCB2YXJpYWJsZSA9IHhwYXRoLnN1YnN0cmluZyhpbkV4cHJlc3Npb25Qb3MgKyAxLCB4cGF0aC5pbmRleE9mKFwiPVwiLCBpbkV4cHJlc3Npb25Qb3MpKTtcclxuICAgICAgbGV0IHN1YkV4cHJlc3Npb24gPSB4cGF0aC5zdWJzdHJpbmcoeHBhdGguaW5kZXhPZihcIihcIiwgaW5FeHByZXNzaW9uUG9zKSArIDEsIGV4cHJlc3Npb25FbmQpO1xyXG4gICAgICBsZXQgc3VmZml4ID0geHBhdGguc3Vic3RyaW5nKGV4cHJlc3Npb25FbmQgKyAxKTtcclxuXHJcbiAgICAgIHhwYXRoID0gcHJlZml4O1xyXG5cclxuICAgICAgLy9FdmFsdWF0ZSBYUEFUSCBleHByZXNzaW9uXHJcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgbGV0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc2Vjb25kYXJ5WG1sLCBcImFwcGxpY2F0aW9uL3htbFwiKTtcclxuICAgICAgbGV0IHhQYXRoUmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoc3ViRXhwcmVzc2lvbiwgZG9jLCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XHJcblxyXG4gICAgICAvL0l0ZXJhdGUgeHBhdGggcmVzdWx0cyAobm9kZXMpXHJcbiAgICAgIHZhciBub2RlID0geFBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKTtcclxuXHJcbiAgICAgIHdoaWxlKG5vZGUpIHtcclxuICAgICAgICB4cGF0aCA9IHhwYXRoICsgdmFyaWFibGUgKyBcIj0nXCIgKyBub2RlLm5vZGVWYWx1ZSArIFwiJ1wiXHJcblxyXG4gICAgICAgIG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgeHBhdGggPSB4cGF0aCArIFwiIG9yIFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgeHBhdGggPSB4cGF0aCArIHN1ZmZpeDtcclxuICAgIH1cclxuXHJcbiAgICBkdG8uZXhwcmVzc2lvbiA9IHhwYXRoO1xyXG4gICAgcmV0dXJuIGR0bztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3QoYTogYW55LCBiOiBhbnkpIHtcclxuICAgIHJldHVybiBhLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdChjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcImZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3Q6IFwiICsgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdExvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnNcIjtcclxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uW10+KHVybCwge3BhcmFtczogcGFyYW1zfSkuc3Vic2NyaWJlKChjb25maWd1cmF0aW9uTGlzdDogQXR0cmlidXRlQ29uZmlndXJhdGlvbltdKSA9PiB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgIGxldCBkdG9zOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgY2ZnIG9mIGNvbmZpZ3VyYXRpb25MaXN0KSB7XHJcbiAgICAgICAgbGV0IGR0bzogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyA9IHRoaXMuZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyhjZmcpO1xyXG4gICAgICAgIGlmIChkdG8pIHtcclxuICAgICAgICAgIGR0b3MucHVzaChkdG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZHRvcy5zb3J0KHRoaXMuc29ydEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KTtcclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RTdWJqZWN0Lm5leHQoZHRvcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KGE6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8sIGI6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8pIHtcclxuICAgIGNvbnN0IGRpc3BsYXlhID0gYS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheVxyXG4gICAgICArIGEuZXh0ZW5zaW9uRGVzY3JpcHRpb25cclxuICAgICAgKyAoYS5maWx0ZXIxRGlzcGxheSB8fCBcIlwiKVxyXG4gICAgICArIChhLmZpbHRlcjJEaXNwbGF5IHx8IFwiXCIpO1xyXG5cclxuICAgIGNvbnN0IGRpc3BsYXliID0gYi5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheVxyXG4gICAgICArIGIuZXh0ZW5zaW9uRGVzY3JpcHRpb25cclxuICAgICAgKyAoYi5maWx0ZXIxRGlzcGxheSB8fCBcIlwiKVxyXG4gICAgICArIChiLmZpbHRlcjJEaXNwbGF5IHx8IFwiXCIpO1xyXG5cclxuICAgIHJldHVybiBkaXNwbGF5YS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoZGlzcGxheWIudG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICAvL1VzZWQgYnkgY29kLWVkaXRvclxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmlkRmlsdGVyMSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIyID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zXCIsIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG5cclxuICAgICAgdGhpcy5wb3N0Q29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFwiL2VkaXRvci9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi9cIiArIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkJ5SWQoaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBudW1iZXIsIGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAhPT0gLTEpIHtcclxuICAgICAgdGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBsb2FkIGlmIHRoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkXHJcbiAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gIT09IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAvL0NsZWFyIEFTQVBcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IGlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIHRoaXMuaWRGaWx0ZXIxID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmlkRmlsdGVyMiA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAuY2xlYXIoKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG5cclxuICAgICAgdGhpcy5mZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgLy9PciBsb2FkIHRoZSBBdHRyaWJ1dGVWYWx1ZVNldCBpZiB0aGF0IGNoYW5nZWQgKHBvc3NpYmxlIHRvIHN3aXRjaCBmcm9tIG9uZSBldmVudCB0byBhbm90aGVyIG9mIHRoZSBzYW1lIHR5cGUsIGZvciBleGFtcGxlXHJcbiAgICAvL1RoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIG11c3QgYWxzbyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgYW5kIG5vdCBhbHJlYWR5IHdvcmtpbmcgb24gbG9hZGluZyB0aGUgdmFsdWVzXHJcbiAgICBlbHNlIGlmICh0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgIT09IGlkQXR0cmlidXRlVmFsdWVTZXQgJiYgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlVmFsdWVTZXQoaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBpZGVudGlmaWVycyB0byBiZSB1c2VkIGJ5IHRoaXMgc2VydmljZS4gIFRoaXMgcHJvbXB0cyBhIG5ldyBjb25maWd1cmF0aW9uXHJcbiAgICogcmVxdWVzdCB0byBiZSBtYWRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkRmlsdGVyMVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEZpbHRlcjJcclxuICAgKi9cclxuLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGZvciBub3cgYmVjYXVzZSBpdCBpcyBib3RoIHVuaW1wbGVtZW50ZWQgYW5kIGluY29tcGxldGUgKGxvYWRpbmcgYSBjb25maWd1cmF0aW9uXHJcbiAqIGZpbHRlciB3b3VsZCByZWFsbHkgYWxzbyByZXF1aXJlIHRoZSBhdHRyaWJ1dGUgY29udGV4dCBhbmQgYXR0cmlidXRlc2VjdXJpdHkgY29udGV4dCBwbHVzIGEgc2VydmljZSBvblxyXG4gKiB0aGUgYmFjayBlbmQgdGhhdCBhY3R1YWxseSBkb2VzIHRoaXMgd29yay4gRm9yIG5vdywgb25seSBsb2FkaW5nIGJ5IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gKlxyXG4gIHNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUZpbHRlcihpZEZpbHRlcjE6IG51bWJlciwgaWRGaWx0ZXIyPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUZpbHRlcjogXCIgKyBpZEZpbHRlcjEgKyBcIiBcIiArIGlkRmlsdGVyMik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgLy90aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIxID0gaWRGaWx0ZXIxO1xyXG4gICAgdGhpcy5pZEZpbHRlcjIgPSBpZEZpbHRlcjI7XHJcblxyXG4gICAgdGhpcy5mZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oKTtcclxuICB9XHJcbiovXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGlkIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2V0LiAgVGhpcyB3aWxsIHByb21wdCBhIHJlcXVlc3QgdG8gcHVsbCB0aGlzIGZyb20gdGhlIGJhY2tlbmQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVWYWx1ZVNldFxyXG4gICAqL1xyXG4gIHNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcikge1xyXG4gICAgLy9Pbmx5IGxvYWQgdGhlIEF0dHJpYnV0ZVZhbHVlU2V0IGlmIGl0IGhhcyBiZWVuIGNoYW5nZWRcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgIT09IGlkQXR0cmlidXRlVmFsdWVTZXQpIHtcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuXHJcbiAgICAgIHRoaXMuZmV0Y2hBdHRyaWJ1dGVWYWx1ZVNldChpZFBhcmVudE9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVxdWVzdCB0byBkb3dubG9hZCB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICovXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID09PSAtMSkge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPntcclxuICAgICAgICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IC0yXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAmJiB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA+IC0xKSB7XHJcbiAgICAgIHVybCA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL1wiICsgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL1RoaXMgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkXHJcblx0ICAvL3VybCA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL2ZpbHRlci9cIiArIHRoaXMuaWRGaWx0ZXIxO1xyXG4gICAgICAvL2lmICh0aGlzLmlkRmlsdGVyMikge1xyXG4gICAgICAgIC8vdXJsICs9IFwiL1wiICsgdGhpcy5pZEZpbHRlcjI7XHJcbiAgICAgIC8vfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odXJsKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgLy9Ob3cgbG9hZCB0aGUgYXR0cmlidXRlVmFsdWVTZXQgLSBUaGlzIHdpbGwgYWx3YXlzIGhhcHBlbiB3aGVuIGEgbmV3IGNvbmZpZ3VyYXRpb24gaXMgbG9hZGVkXHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IHVuZGVmaW5lZDsgLy9Gb3JjZSBpdCB0byBjaGFuZ2UgaW4gdGhpcyBzY2VuYXJpb1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQsIGlkUGFyZW50T2JqZWN0KTtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbih1bmRlZmluZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLmNsZWFyKCk7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVTZXJ2aWNlLnNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYmFzZVdpbmRvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5nZXRCYXNlV2luZG93RGltZW5zaW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYmFzZVdpbmRvd1RlbXBsYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycy5zb3J0KChhOiBBdHRyaWJ1dGVDb250YWluZXIsIGI6IEF0dHJpYnV0ZUNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGEuc29ydE9yZGVyIDwgYi5zb3J0T3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLnNvcnRPcmRlciA+IGIuc29ydE9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZUNvbnRhaW5lciBvZiBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmF0dHJpYnV0ZUNvbnRhaW5lcnMpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGaXJzdCBzb3J0IGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHkgYW5kIHggcG9zaXRpb25pbmcuICBJZiB1c2luZyBhYnNvbHV0ZSBwb3NpdGlvbiwgdGhlIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLFxyXG4gICAgICAgICAqIGJ1dCBpZiB3ZSB3YW50IHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmluZyB0byBndWlkZSBhdXRvIGxheW91dCwgdGhlbiB1c2UgdGhpcyBvcmRlci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcy5zb3J0KChhOiBHcmFwaGljYWxBdHRyaWJ1dGUsIGI6IEdyYXBoaWNhbEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGEudGFiT3JkZXIgPCBiLnRhYk9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS50YWJPcmRlciA+IGIudGFiT3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5zZXQoYXR0cmlidXRlLmlkQXR0cmlidXRlLCBhdHRyaWJ1dGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh0aGlzLmdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oYXR0cmlidXRlQ29uZmlndXJhdGlvbikpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlcXVlc3QgdG8gcHVsbCB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC5cclxuICAgKiBSZXF1aXJlZCB0aGUgQXR0cmlidXRlQ29uZmlndXJhdGlvbiB0byBiZSBwcmUtbG9hZGVkXHJcbiAgICovXHJcbiAgZmV0Y2hBdHRyaWJ1dGVWYWx1ZVNldChpZFBhcmVudE9iamVjdDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmlkUGFyZW50T2JqZWN0ID0gaWRQYXJlbnRPYmplY3Q7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLXNldC9cIiArIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAoaWRQYXJlbnRPYmplY3QpP2lkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG4gICAgLy9DbGVhciBBU0FQXHJcbiAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVWYWx1ZVNldD4odXJsLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVTZXQ6IEF0dHJpYnV0ZVZhbHVlU2V0KSA9PiB7XHJcbiAgICAgIC8vSW5pdGlhbGl6ZSBhdHRyaWJ1dGVWYWx1ZXMgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRCYXNlV2luZG93RGltZW5zaW9uKGJhc2VXaW5kb3dUZW1wbGF0ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmh0dHAuZ2V0KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImJhc2Utd2luZG93LWRpbWVuc2lvblwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImJhc2VXaW5kb3dUZW1wbGF0ZVwiLCBiYXNlV2luZG93VGVtcGxhdGUpfSlcclxuICAgICAgLnN1YnNjcmliZSgoZGltZW5zaW9uOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EaW1lbnNpb25TdWJqZWN0Lm5leHQoZGltZW5zaW9uKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDdXJyZW50bHkgYSBzaW1wbGUgbm90aWZpZXIgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBvciBhdHRyaWJ1dGUgdmFsdWUgc2V0IGhhcyBjaGFuZ2VkIGFuZCBjb21wb25lbnRzIG1heSBuZWVkIHRvIGJlIHJlZnJlc2hlZC5cclxuICAgKlxyXG4gICAqL1xyXG4gIG5vdGlmeUF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnRhaW5lclVwZGF0ZWQubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBvc3QgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGFmdGVyIGVkaXRpbmcuICBQb3N0IHRoZSBlbnRpcmUgdGhpbmcgYXMgaXQgY2FzY2FkZXMgZG93bi4gIFRoZSBlZGl0b3IgYWxsb3dzIHlvdVxyXG4gICAqIHRvIG1vZGlmeSBldmVyeSBjb250YWluZXIgYW5kIG9ubHkgdGhlbiBzYXZlIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gYXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHBvc3RBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL1wiICsgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIHRoaXMuc2V0TmVnYXRpdmVJZHNUb1VuZGVmaW5lZChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoKSA9PiB7XHJcblxyXG4gICAgICAvLyBQcmV2ZW50IGVycm9yIGluIHN1YnNlcXVlbnQgc2F2ZXMuIFNlZSBNZXRhYnVpbGRlciAvIE1CLTIzXHJcbiAgICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odXJsKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBvc3RDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIH0sXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1dCB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC4gIFdoZW4gZWRpdGluZywgYXR0cmlidXRlcyBhbHJlYWR5IHBvc3QgdGhlaXIgdXBkYXRlZCB2YWx1ZXMgdG8gdGhpcyBzZXJ2aWNlcyB1bmRlclxyXG4gICAqIGEgc2VwYXJhdGUgYXJyYXkuICBXaGF0IHdlIGRvIGlzIG1lcmdlIGluIHRoZXNlIHVwZGF0ZWQgb3IgY3JlYXRlZCB2YWx1ZXMgd2l0aCB0aGUgY3VycmVudCBhdHRyaWJ1dGUgdmFsdWUgc2V0IChhdnMpLlxyXG4gICAqIFdoaWxlIGRvaW5nIHRoaXMsIHNldCB0aGUgaWQgb2YgdGhlIGF2cyBhbmQgbnVsbGlmeSBhbnkgbmVnYXRpdmUgaWRzLlxyXG4gICAqL1xyXG4gIHVwZGF0ZUF0dHJpYnV0ZVZhbHVlU2V0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+IHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1zZXQvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVDb250ZXh0KVxyXG4gICAgLnNldChcImlkUGFyZW50T2JqZWN0XCIsICh0aGlzLmlkUGFyZW50T2JqZWN0KT90aGlzLmlkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG4gICAgbGV0IGF2czogQXR0cmlidXRlVmFsdWVTZXQgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKTtcclxuICAgIGZvciAobGV0IGkgPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdnMuYXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXSA9IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdnMuYXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmNvbmNhdCh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMpO1xyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0U3ViamVjdDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4oKTtcclxuXHJcbiAgICB0aGlzLmh0dHAucHV0KHVybCwgYXZzLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVTZXQ6IEF0dHJpYnV0ZVZhbHVlU2V0KSA9PiB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vSW5pdGlhbGl6ZSBhdHRyaWJ1dGVWYWx1ZXMgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuICAgICAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vU2VuZCB0aGUgcmVzdWx0cyB0byB0aGUgb2JzZXJ2ZXIgKGlmIGFueSksIHRoZW4gY29tcGxldGVcclxuICAgICAgICByZXN1bHRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICAgIHJlc3VsdFN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgICByZXN1bHRTdWJqZWN0LmVycm9yKGVycm9yKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge0JlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdCgpOiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXREaXJ0eVN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmRpcnR5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3Q7XHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7QmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0Pn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZVNldCgpOiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0O1xyXG4gICAqXHJcbiAgICogQHJldHVybnMge1N1YmplY3Q8QXR0cmlidXRlVmFsdWU+fVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgYmFzZWQgdXBvbiB0aGUgaWRBdHRyaWJ1dGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVzXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZVZhbHVlW119XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVzKGlkQXR0cmlidXRlOiBudW1iZXIsIGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlcik6IEF0dHJpYnV0ZVZhbHVlW10ge1xyXG5cclxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuXHJcbiAgICBpZih0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcblxyXG4gICAgICAvL0dvIHRocm91Z2ggYWxsIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgZmlyc3QgKHNvIHdlIHByZXNlcnZlIGFjcm9zcyBjaGFuZ2luZyB0YWJzLCBldGMpXHJcbiAgICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgJiYgKCFncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGdyb3VwQXR0cmlidXRlUm93SWQgPT09IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5ncm91cEF0dHJpYnV0ZVJvd0lkKSkge1xyXG4gICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSAmJiAoIWdyb3VwQXR0cmlidXRlUm93SWQgfHwgZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmdyb3VwQXR0cmlidXRlUm93SWQpKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHVzaChPYmplY3QuYXNzaWduKHt9LCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vR28gdGhyb3VnaCBhbGwgdGhlIHJlZ3VsYXIgYXR0cmlidXRlc1xyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGVWYWx1ZSBvZiB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgIC8vUmVndWxhciBhdHRyaWJ1dGVzIChub3JtYWwgYW5kIGdyb3VwLCB3aGljaCBnZXQgbXVsdGlwbGUpXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSB8fCBhdHRyaWJ1dGVWYWx1ZS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgLy9JZiByb3cgaWQgc3BlY2lmaWVkLCBvbmx5IGNhcmUgYWJvdXQgdmFsdWVzIGZvciB0aGF0IHJvd1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBncm91cEF0dHJpYnV0ZVJvd0lkID09PSAndW5kZWZpbmVkJyB8fCBhdHRyaWJ1dGVWYWx1ZS5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcblxyXG4gICAgICAgICAgICAvL0lmIG5vdCBhbHJlYWR5IGFkZGVkLi4uXHJcbiAgICAgICAgICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlcy5maW5kKChleGlzdGluZykgPT4gZXhpc3RpbmcuaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGVWYWx1ZSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgLy9Eb24ndCB3YW50IHRoZSBvcmlnaW5hbCBpZiBpdCB3YXMgcmVtb3ZlZCAoc2xpY2VkKVxyXG4gICAgICAgICAgICAgIGlmICghIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbmQoKHNhdikgPT4gc2F2LmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHVzaChPYmplY3QuYXNzaWduKHt9LCBhdHRyaWJ1dGVWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGNoaWxkIGF0dHJpYnV0ZXMgb2YgdGhlIGlkQXR0cmlidXRlLiAgTW9zdCBsaWtlbHkgZm9yIGF0dHJpYnV0ZXMgdGhhdCBkZWZpbmUgY29sdW1ucyBvZiBhIGdyaWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVcclxuICAgKiBAcmV0dXJucyB7QXR0cmlidXRlW119XHJcbiAgICovXHJcbiAgZ2V0R3JvdXBBdHRyaWJ1dGVzKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGVbXSB7XHJcbiAgICBsZXQgYXR0cmlidXRlczogQXR0cmlidXRlW10gPSBbXTtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZU1hcC5mb3JFYWNoKChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICBpZiAoYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlKSB7XHJcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB3aWR0aCB3aGljaCBpcyBhIHJlcXVpcmVtZW50IG9mIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxyXG4gICAqL1xyXG4gIHNldFdpZHRoKHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgd2lkdGguXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldFdpZHRoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy53aWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXJyYXkgb2YgYXR0cmlidXRlIGNob2ljZXMgZm9yIHRoZSBpZEF0dHJpYnV0ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVxyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGVDaG9pY2VbXX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVDaG9pY2VzKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGVDaG9pY2VbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXAuZ2V0KGlkQXR0cmlidXRlKS5hdHRyaWJ1dGVDaG9pY2VzO1xyXG4gIH1cclxuXHJcbiAgZ2V0TG9hZGluZ1N1YmplY3QoKTogU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY29udGFpbmVyVXBkYXRlZCBzdWJqZWN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge1N1YmplY3Q8bnVtYmVyPn1cclxuICAgKi9cclxuICBnZXRDb250YWluZXJVcGRhdGVkKCk6IFN1YmplY3Q8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyVXBkYXRlZDtcclxuICB9XHJcblxyXG4gIGdldEdyaWRSb3dTYXZlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRSb3dTYXZlZDtcclxuICB9XHJcblxyXG4gIGdldEdyaWRSb3dEZWxldGVkU3ViamVjdCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZFJvd0RlbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgdXBkYXRlZCBhbmQgZGVsZXRlZCBhdHRyaWJ1dGUgdmFsdWUgYXJyYXlzLlxyXG4gICAqXHJcbiAgICovXHJcbiAgY2xlYXJVcGRhdGVkQXR0cmlidXRlVmFsdWVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMubm90aWZ5QXR0cmlidXRlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIHVwZGF0ZWQgYW5kIGRlbGV0ZWQgZ3JpZCByb3cgYXR0cmlidXRlcyBmb3IgdGhlIHNwZWNpZmllZCBncmlkIHJvd1xyXG4gICAqXHJcbiAgICovXHJcbiAgY2xlYXJVcGRhdGVkR3JpZFJvd0F0dHJpYnV0ZVZhbHVlcyhncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByZW1haW5pbmdBdHRyaWJ1dGVzID0gW107XHJcblxyXG4gICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9ICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcblxyXG4gICAgLy9TaG91bGRuJ3QgYmUgYSBuZWVkIHRvIGNoYW5nZSBkaXJ0eSBvciBub3RpZnkgYXR0cmlidXRlc1xyXG4gIH1cclxuXHJcbiAgc2F2ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByb3dWYWx1ZXMgPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgLy9zZXQgdGhlIGlkQXR0cmlidXRlVmFsdWVTZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIGlmICghIHJvd1ZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlU2V0KSB7XHJcbiAgICAgICAgcm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vcmVtb3ZlIGFsbCBuZWdhdGl2ZSBpZHMgKG5ldyB2YWx1ZXMpXHJcbiAgICAgIGlmIChyb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICByb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRm9yIG11bHRpIHZhbHVlcyB0aGF0IHdlcmUgc2xpY2VkIChkZS1zZWxlY3RlZCkgd2UncmUgZ29pbmcgdG8gZmluZCB0aGVtIGFuZCBudWxsIG91dCB0aGUgdmFsdWUsIGluc3RlYWQgb2YgcmVtb3ZpbmcuXHJcbiAgICAvL1RoYXQgbWVhbnMgdGhleSBhY3RhdWxseSBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSByb3dWYWx1ZXNcclxuICAgIC8vUmVtb3ZlZCBtdWx0aSB2YWx1ZXMgd2l0aGluIGFuIGV4aXN0aW5nIHJvd1xyXG4gICAgbGV0IHJlbW92ZWRWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlID0gdW5kZWZpbmVkO1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICByb3dWYWx1ZXMucHVzaChyZW1vdmVkVmFsdWVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogcm93VmFsdWVzXHJcbiAgICAgIH07XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93L1wiIDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgLy9TYXZlIG5ldyByb3dcclxuICAgIGlmIChncm91cEF0dHJpYnV0ZVJvd0lkIDwgMCkge1xyXG4gICAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGF2Z3IsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG5cclxuICAgICAgICAvL0FkZCB0aGUgZ3JpZCByb3cgdG8gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgICBsZXQgYXZzOkF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVHcmlkUm93LmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1JlbW92ZSB0aGUgdXBkYXRlZCBhbmQgc2xpY2VkIHZhbHVlcyBmb3IgdGhlIGdyaWQgcm93LCBub3cgKHRoZXNlIGFyZSB0aGUgb2xkIG9uZXMgd2l0aCB0aGUgbmVnYXRpdmUgcm93aWQpXHJcbiAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG5cclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgICAgdGhpcy5ncmlkUm93U2F2ZWQubmV4dChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9VcGRhdGUgZXhpc3Rpbmcgcm93XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5odHRwLnB1dCh1cmwsIGF2Z3IsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG5cclxuICAgICAgICAvL0FkZCB0aGUgZ3JpZCByb3cgdG8gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgICBsZXQgYXZzOkF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgLy9SZW1vdmUgYWxsIG9sZCB2YWx1ZXMgZm9yIHJvd1xyXG4gICAgICAgIGxldCBpbmRleCA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmluZEluZGV4KChhdik9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgICAgICB3aGlsZSAoaW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAvL1JlbW92ZSB2YWx1ZVxyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIC8vRmluZCB0aGUgbmV4dCBvbmVcclxuICAgICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9BZGQgYWxsIHRoZSBjdXJyZW50IHZhbHVlc1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlVmFsdWVHcmlkUm93LmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9SZW1vdmUgdGhlIHNsaWNlZCBhbmQgdXBkYXRlZCB2YWx1ZXMgZm9yIHRoZSBncmlkIHJvd1xyXG4gICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIHVybCwge2JvZHk6IGF2Z3IsIHBhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgIHRoaXMuZ3JpZFJvd0RlbGV0ZWQubmV4dChhdmdyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgbWFwLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLnNldChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlTXVsdGlDaG9pY2UoYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogdm9pZCB7XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBpZiBwcmVzZW50XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlICYmIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBhdHRyaWJ1dGUgdmFsdWVzIChubyBsb25nZXIgcmVtb3ZpbmcpXHJcbiAgICBpZiAoaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL090aGVyd2lzZSBwdXNoIHRoZSB2YWx1ZSwgc28gaXQgd2lsbCBiZSBzYXZlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZU11bHRpRGljdChhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiB2b2lkIHtcclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGlmIHByZXNlbnRcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGUgJiYgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5KSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vIGxvbmdlciByZW1vdmluZylcclxuICAgIGlmIChpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8vT3RoZXJ3aXNlIHB1c2ggdGhlIHZhbHVlLCBzbyBpdCB3aWxsIGJlIHNhdmVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5wdXNoQXR0cmlidXRlVmFsdWUoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVzaCBhIG5ldyBvciB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSBjdXJyZW50IG9uZSBpcyBqdXN0IHJlbW92ZWQgYW5kIHRoZSBuZXcgb25lIGFwcGVuZGVkIHRvIHRoZSBhcnJheS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWV9IGF0dHJpYnV0ZVZhbHVlXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJwdXNoQXR0cmlidXRlVmFsdWVcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIHB1c2hpbmcgbXVsdGlwbGUgYXR0cmlidXRlIHZhbHVlcyBhdCBvbmNlLiAgVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgZm9yIGEgbXVsdGkgY2hvaWNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWVbXX0gYXR0cmlidXRlVmFsdWVzXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInB1c2hBdHRyaWJ1dGVWYWx1ZXNcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGUgIT09IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0gPSBhdHRyaWJ1dGVWYWx1ZXNbaV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYSB2YWx1ZSBpbiB0aGUgY2FzZSB3aGVyZSBhbiBhdHRyaWJ1dGUgdmFsdWUgZG9lc24ndCBleGlzdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKi9cclxuICBwdXNoVmFsdWUoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUgPSA8QXR0cmlidXRlVmFsdWU+e1xyXG4gICAgICBpZEF0dHJpYnV0ZTogYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXRcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiVFhUXCIpIHtcclxuICAgICAgYXR0cmlidXRlVmFsdWUudmFsdWVMb25nVGV4dCA9IHtcclxuICAgICAgICBpZExvbmdUZXh0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dERhdGE6IHZhbHVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFR5cGljYWxseSBpbiB0aGUgY2FzZSBvZiBhIG11bHRpIHNlbGVjdCB3aGVyZSB0aGUgdW5zZWxlY3RlZCB2YWx1ZSBpcyByZW1vdmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ2hvaWNlfSBhdHRyaWJ1dGVDaG9pY2VcclxuICAgKi9cclxuICBzcGxpY2VBdHRyaWJ1dGVWYWx1ZUNob2ljZShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlQ2hvaWNlOiBBdHRyaWJ1dGVDaG9pY2UpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2xpY2VBdHRyaWJ1dGVWYWx1ZTogXCIgKyBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgKyBcIiwgXCIgKyBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgJiYgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPT09IGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMucHVzaCh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgZmxhZ2dpbmcgZGlydHkgZm9yIG5vbi1ncmlkIHJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYW4gYXR0cmlidXRlIHZhbHVlLiAgVHlwaWNhbGx5IGluIHRoZSBjYXNlIG9mIGEgbXVsdGkgc2VsZWN0IHdoZXJlIHRoZSB1bnNlbGVjdGVkIHZhbHVlIGlzIHJlbW92ZWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZX0gYXR0cmlidXRlXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDaG9pY2V9IGF0dHJpYnV0ZUNob2ljZVxyXG4gICAqL1xyXG4gIHNwbGljZUF0dHJpYnV0ZVZhbHVlRGljdChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJzbGljZUF0dHJpYnV0ZVZhbHVlOiBcIiArIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSArIFwiLCBcIiArIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlICYmIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUlkRGljdGlvbmFyeSA9PT0gdmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBmbGFnZ2luZyBkaXJ0eSBmb3Igbm9uLWdyaWQgcm93cyAodGhvc2UgYXJlIHNhdmVkIGltbWVkaWF0ZWx5KVxyXG4gICAgaWYgKCEgYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGUgYmFzZWQgdXBvbiB0aGUgaWRBdHRyaWJ1dGUuICBUaGlzIGlzIGZyb20gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGUoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXAuZ2V0KGlkQXR0cmlidXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24sIHNldCBhbGwgb2YgdGhlIG5lZ2F0aXZlIGlkcyB0byB1bmRlZmluZWQgcHJpb3IgdG8gcG9zdGluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gYXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHNldE5lZ2F0aXZlSWRzVG9VbmRlZmluZWQoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uIDwgMCkge1xyXG4gICAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGVDb250YWluZXIgb2YgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb250YWluZXIuaWRBdHRyaWJ1dGVDb250YWluZXIgIDwgMCkge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRhaW5lci5pZEF0dHJpYnV0ZUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgIDwgMCkge1xyXG4gICAgICAgICAgYXR0cmlidXRlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVDaG9pY2VzKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGVDaG9pY2Ugb2YgYXR0cmlidXRlLmF0dHJpYnV0ZUNob2ljZXMpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZVtcInZhbHVlXCJdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZSAgPCAwKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgIDwgMCkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBjb250ZXh0IGNvZGUgYW5kIGlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBjb25maWd1cmF0aW9uXHJcbiAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgKi9cclxuICBnZXRDb25maWd1cmF0aW9uTmFtZShjb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKTogc3RyaW5nIHtcclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFwiTmV3XCI7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IGNvbmZpZ3VyYXRpb24uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXkgKyBcIjogXCIgKyBjb25maWd1cmF0aW9uLmV4dGVuc2lvbkRlc2NyaXB0aW9uO1xyXG5cclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkRmlsdGVyMSkge1xyXG4gICAgICBuYW1lICs9IFwiIC0gXCIgKyBjb25maWd1cmF0aW9uLmZpbHRlcjFEaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZ3VyYXRpb24uaWRGaWx0ZXIyKSB7XHJcbiAgICAgIG5hbWUgKz0gXCIgLSBcIiArIGNvbmZpZ3VyYXRpb24uZmlsdGVyMkRpc3BsYXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oY2ZnOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyB7XHJcbiAgICBpZiAoIWNmZykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkdG86IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8gPSA8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz57XHJcbiAgICAgIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogY2ZnLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbixcclxuICAgICAgY29kZUF0dHJpYnV0ZUNvbnRleHQ6IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dCxcclxuICAgICAgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQsXHJcbiAgICAgIGlkRmlsdGVyMTogY2ZnLmlkRmlsdGVyMSxcclxuICAgICAgaWRGaWx0ZXIyOiBjZmcuaWRGaWx0ZXIyXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGR0by5leHRlbnNpb25EZXNjcmlwdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChjdHg6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjdHguY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dDtcclxuICAgICAgfSlbMF0uZXh0ZW5zaW9uRGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjZmcuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgICAgfSk7XHJcbiAgICAgIGR0by5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheSA9IChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApID8gcmVzdWx0WzBdLmRlc2NyaXB0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIxTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjE7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMURpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjFcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjIgPT09IGNmZy5pZEZpbHRlcjI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMkRpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkdG87XHJcbiAgfVxyXG5cclxuICBnZXRTZWN1cml0eUNvZGVDb250ZXh0KGNvZGU6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlO1xyXG4gICAgfSlbMF07XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcjFGb3IoY29kZUF0dHJpYnV0ZUNvbnRleHQ6IHN0cmluZywgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0ICYmIGl0ZW0uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyMkZvcihjb2RlQXR0cmlidXRlQ29udGV4dDogc3RyaW5nLCBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0OiBzdHJpbmcsIGlkRmlsdGVyMTogbnVtYmVyKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5pZEZpbHRlcjEgPT09IGlkRmlsdGVyMTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgbmV3IGlkQXR0cmlidXRlVmFsdWVzIHZpYSBhIG5lZ2F0aXZlIG51bWJlciBmb3IgaW50ZXJuYWwgdHJhY2tpbmcuICBSZW1vdmUgdGhpcyBmYWtlIGlkIHByaW9yIHRvIHBvc3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldFVuaXF1ZUlkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gLS10aGlzLnVuaXF1ZUlkO1xyXG4gIH1cclxufVxyXG4iXX0=
1211
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL3NlcnZpY2VzL2F0dHJpYnV0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBV2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFHckUsTUFBTSxDQUFDLElBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLENBQVMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUE4QzNCLFlBQW9CLGlCQUFvQyxFQUNwQyxJQUFnQixFQUNoQixNQUFjLEVBQ2MsaUJBQXlCO1FBSHJELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Msc0JB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O0lBQ1IsQ0FBQztJQUVELGlDQUFpQztRQUMvQixPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYSxDQUFDLG9CQUE0QixFQUFFLDRCQUFvQztRQUM5RSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEtBQUssNEJBQTRCLENBQUM7UUFDbEksQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLG9CQUE0QixFQUFFLDRCQUFvQyxFQUFFLFNBQWlCO1FBQ2pHLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixLQUFLLG9CQUFvQjttQkFDcEQsSUFBSSxDQUFDLDRCQUE0QixLQUFLLDRCQUE0QjttQkFDbEUsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDOytHQWw1Q1UsZ0JBQWdCLG1HQWlEUCxrQkFBa0I7bUhBakQzQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQWtESSxNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgaXNEZXZNb2RlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBQYXJhbXN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHtEaWN0aW9uYXJ5U2VydmljZX0gZnJvbSBcIkBodW50c21hbi1jYW5jZXItaW5zdGl0dXRlL2RpY3Rpb25hcnktc2VydmljZVwiO1xyXG5cclxuaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ2hvaWNlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNob2ljZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVWYWx1ZX0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS12YWx1ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNvbmZpZ3VyYXRpb24uZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWVTZXR9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUtc2V0LmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE99IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi5kdG9cIjtcclxuaW1wb3J0IHtHcmFwaGljYWxBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9ncmFwaGljYWwtYXR0cmlidXRlLmVudGl0eVwiO1xyXG5pbXBvcnQge0F0dHJpYnV0ZUNvbnRhaW5lcn0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1jb250YWluZXIuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWVHcmlkUm93fSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93LmVudGl0eVwiO1xyXG5pbXBvcnQge1ByZUV2YWxEVE99IGZyb20gXCIuLi9tb2RlbC9wcmUtZXZhbC5kdG9cIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5RW50cmllc0RUT30gZnJvbSBcIi4uL21vZGVsL2RpY3Rpb25hcnktZW50cmllcy5kdG9cIjtcclxuXHJcblxyXG5leHBvcnQgbGV0IEFUVFJJQlVURV9FTkRQT0lOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KFwiYXR0cmlidXRlRW5kcG9pbnRcIik7XHJcbmV4cG9ydCBjb25zdCBCT09MRUFOOiBzdHJpbmdbXSA9IFtcIk5cIiwgXCJZXCJdO1xyXG5leHBvcnQgY29uc3QgRVhURU5ERURfQk9PTEVBTjogc3RyaW5nW10gPSBbXCJOXCIsIFwiWVwiLCBcIlVcIl07XHJcblxyXG4vKipcclxuICogQSBzZXJ2aWNlIGNyZWF0ZWQgZm9yIGVhY2ggYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuICBUaGlzIG1ha2VzIGNhbGxzIHRvIHRoZSBiYWNrZW5kIHRvIGdldCB0aGUgY29uZmlndXJhdGlvblxyXG4gKiBhbmQgdmFsdWUgc2V0LiAgSXQgYWxzbyBzdG9yZXMgY29tbW9uIGRhdGEgdGhhdCBkaWZmZXJlbnQgYXR0cmlidXRlcyBtaWdodCBuZWVkIChlLmcuIGEgbGlzdCBvZiBhdHRyaWJ1dGUgY2hvaWNlcykuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVTZXJ2aWNlIHtcclxuXHJcbiAgbmV3QXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbjtcclxuICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IG51bWJlcjtcclxuICBpZEZpbHRlcjE6IG51bWJlcjtcclxuICBpZEZpbHRlcjI6IG51bWJlcjtcclxuICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiBudW1iZXI7XHJcbiAgaWRQYXJlbnRPYmplY3Q6IG51bWJlcjtcclxuICBib3VuZERhdGE6IGFueTtcclxuXHJcbiAgYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcbiAgZmlsdGVyMUxpc3RTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4odW5kZWZpbmVkKTtcclxuICBmaWx0ZXIyTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPih1bmRlZmluZWQpO1xyXG4gIGRpY3Rpb25hcnlMaXN0U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KHVuZGVmaW5lZCk7XHJcblxyXG5cclxuICBwb3N0Q29uZmlndXJhdGlvblN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EaW1lbnNpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih1bmRlZmluZWQpO1xyXG5cclxuICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8+KHVuZGVmaW5lZCk7XHJcblxyXG4gIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHVuZGVmaW5lZCk7XHJcbiAgYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4odW5kZWZpbmVkKTtcclxuICBhdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+ID0gbmV3IFN1YmplY3Q8QXR0cmlidXRlVmFsdWU+KCk7XHJcblxyXG4gIGxvYWRpbmdTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgYXR0cmlidXRlTWFwOiBNYXA8bnVtYmVyLCBBdHRyaWJ1dGU+ID0gbmV3IE1hcDxudW1iZXIsIEF0dHJpYnV0ZT4oKTtcclxuXHJcbiAgd2lkdGg6IG51bWJlcjtcclxuXHJcbiAgY29udGFpbmVyVXBkYXRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgZ3JpZFJvd1NhdmVkOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+KCk7XHJcbiAgZ3JpZFJvd0RlbGV0ZWQ6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVHcmlkUm93PiA9IG5ldyBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4oKTtcclxuICBkaXJ0eTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgdXBkYXRlZEF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG4gIHNsaWNlZEF0dHJpYnV0ZVZhbHVlczogQXR0cmlidXRlVmFsdWVbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHVuaXF1ZUlkOiBudW1iZXIgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICAgICAgICBASW5qZWN0KEFUVFJJQlVURV9FTkRQT0lOVCkgcHJpdmF0ZSBhdHRyaWJ1dGVFbmRwb2ludDogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkNyZWF0ZWQgTmV3IEF0dHJpYnV0ZVNlcnZpY2VcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRCb3VuZERhdGEoYm91bmREYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuYm91bmREYXRhID0gYm91bmREYXRhO1xyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIHRoaXMubm90aWZ5QXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVDb3VudEJ5QXR0cmlidXRlKGlkQXR0cmlidXRlOiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZVwiLCBpZEF0dHJpYnV0ZS50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVDb3VudEJ5Q29udGFpbmVyKGlkQXR0cmlidXRlQ29udGFpbmVyOiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtdmFsdWUtY291bnRcIiwge3BhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoXCJpZEF0dHJpYnV0ZUNvbnRhaW5lclwiLCBpZEF0dHJpYnV0ZUNvbnRhaW5lci50b1N0cmluZygpKX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGljdGlvbmFyeVZhbHVlQ291bnQoaWRBdHRyaWJ1dGVEaWN0aW9uYXJ5OiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih0aGlzLmF0dHJpYnV0ZUVuZHBvaW50ICsgXCJhdHRyaWJ1dGUtZGljdGlvbmFyeS1jb3VudFwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImlkQXR0cmlidXRlRGljdGlvbmFyeVwiLCBpZEF0dHJpYnV0ZURpY3Rpb25hcnkudG9TdHJpbmcoKSl9KTtcclxuICB9XHJcblxyXG4gIGZldGNoQXR0cmlidXRlQ29udGV4dCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlQ29udGV4dExvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgZm9ya0pvaW4oW1xyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlQ29udGV4dFwiKSxcclxuICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXREaWN0aW9uYXJ5RW50cmllcyhcImhjaS5yaS5hdHRyLm1vZGVsLkZpbHRlcjFcIiksXHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoXCJoY2kucmkuYXR0ci5tb2RlbC5GaWx0ZXIyXCIpLFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKFwiaGNpLnJpLmF0dHIubW9kZWwuQXR0cmlidXRlRGljdGlvbmFyeVwiKVxyXG4gICAgXSkuc3Vic2NyaWJlKChyZXNwb25zZXM6IGFueVtdKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1s0XSk7XHJcbiAgICAgIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0Lm5leHQocmVzcG9uc2VzWzJdKTtcclxuICAgICAgdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QubmV4dChyZXNwb25zZXNbM10pO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1sxXSk7XHJcblxyXG4gICAgICByZXNwb25zZXNbMF0uc29ydCh0aGlzLnNvcnRBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0KTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5uZXh0KHJlc3BvbnNlc1swXSk7XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy9HZXRzIHRoZSBkaWN0aW9uYXJ5IGVudHJpZXMgZnJvbSB0aGUgbWFwIChzbyB3ZSBkb24ndCBsb2FkIG92ZXIgYW5kIG92ZXIgYW5kIG92ZXIgZm9yIHRoZSBzYW1lIGRpY3Rpb25hcnkpXHJcbiAgZ2V0RGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlczogQXR0cmlidXRlVmFsdWVbXSwgZ3JvdXBBdHRyaWJ1dGVSb3dJZD86IG51bWJlciwgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlPzogQXR0cmlidXRlVmFsdWUpOiBPYnNlcnZhYmxlPERpY3Rpb25hcnlFbnRyaWVzRFRPPiB7XHJcbiAgICBsZXQgYnMgPSBuZXcgU3ViamVjdDxEaWN0aW9uYXJ5RW50cmllc0RUTz4oKTtcclxuXHJcbiAgICAvL0hhbmRsZSBYUEFUSFxyXG4gICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoKSB7XHJcbiAgICAgIGxldCBlbnRyaWVzRFRPID0gbmV3IERpY3Rpb25hcnlFbnRyaWVzRFRPKCk7XHJcbiAgICAgIGxldCB4cGF0aCA9IGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoO1xyXG5cclxuICAgICAgLy9GaWx0ZXJlZCBieSBhbm90aGVyIGRpY3Rpb25hcnk/IFBhcnNlIHRvIGdldCBhcnJheSBvZiBhbGwgZGljdGlvbmFyeSBjbGFzcyBuYW1lcyBuZWVkZWRcclxuICAgICAgbGV0IGRpY3RDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICBsZXQgcG9zID0gMDtcclxuICAgICAgd2hpbGUgKHhwYXRoLmluZGV4T2YoXCIvRGljdGlvbmFyaWVzL0RpY3Rpb25hcnlcIiwgcG9zKSA+PSAwKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0geHBhdGguaW5kZXhPZihcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVwiLCBwb3MpO1xyXG4gICAgICAgIHN0YXJ0ID0geHBhdGguaW5kZXhPZihcIidcIiwgc3RhcnQpO1xyXG4gICAgICAgIGxldCBlbmQgPSB4cGF0aC5pbmRleE9mKFwiJ1wiLCBzdGFydCArIDEpO1xyXG4gICAgICAgIGRpY3RDbGFzc2VzLnB1c2goYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkueHBhdGguc3Vic3RyaW5nKHN0YXJ0ICsgMSwgZW5kKSlcclxuICAgICAgICBwb3MgPSBlbmQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vUG90ZW50aWFsbHkgbG9hZCBtdWx0aXBsZSBkaWN0aW9uYXJpZXNcclxuICAgICAgbGV0IGZvcmtDYWxscyA9IFtdO1xyXG4gICAgICBmb3IgKGxldCBjbGFzc05hbWUgb2YgZGljdENsYXNzZXMpIHtcclxuICAgICAgICBmb3JrQ2FsbHMucHVzaCh0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzQXNYTUwoY2xhc3NOYW1lKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vRGVhbCB3aXRoIHRoZSByZXN1bHRzIHRvZ2V0aGVyXHJcbiAgICAgIGZvcmtKb2luKGZvcmtDYWxscykuc3Vic2NyaWJlKChyZXNwb25zZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy9XZSdyZSBvbmx5IGdvaW5nIHRvIGRvIHhwYXRoIG9uIHRoZSB4bWwgZm9yIHRoZSBmaXJzdCBkaWN0aW9uYXJ5XHJcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICAgIGxldCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3BvbnNlc1swXSwgXCJhcHBsaWNhdGlvbi94bWxcIik7XHJcblxyXG4gICAgICAgIC8vSGF2ZSB0byBldmFsdWF0ZSBzdWItZXhwcmVzc2lvbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgZXhwcmVzc2lvbnMgbGlrZSBbQHggPSAoL3hwYXRoLXN1Yi1leHByZXNzaW9uKV1cclxuICAgICAgICBsZXQgc2Vjb25kYXJ5WG1sID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChyZXNwb25zZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgc2Vjb25kYXJ5WG1sID0gcmVzcG9uc2VzWzFdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9QcmUtZXZhbHVhdGUgYW5kIHNpbXBsaWZ5IFhQQVRIXHJcbiAgICAgICAgbGV0IGR0bzpQcmVFdmFsRFRPID0gdGhpcy5wcmVFdmFsdWF0ZVhwYXRoKGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LnhwYXRoLCBzZWNvbmRhcnlYbWwsIGdyb3VwQXR0cmlidXRlUm93SWQsIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vRXZhbHVhdGUgWFBBVEggZXhwcmVzc2lvblxyXG4gICAgICAgIGxldCBlbnRyaWVzID0gW107XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgbGV0IHhQYXRoUmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoZHRvLmV4cHJlc3Npb24sIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1RZUEUsIG51bGwpO1xyXG5cclxuICAgICAgICAgIC8vSXRlcmF0ZSB4cGF0aCByZXN1bHRzIChub2RlcylcclxuICAgICAgICAgIHZhciBub2RlID0gbnVsbDtcclxuICAgICAgICAgIHdoaWxlKG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGUpO1xyXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1jYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gTm8gbWF0Y2hpbmcgZW50cmllcyBoZXJlLlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9XaGF0IGFib3V0IGRpY3Rpb25hcnkgZW50cmllcyB3aGVyZSBpc0FjdGl2ZT0nTicsIGJ1dCB0aGUgaWQgd2FzIHVzZWQgaW4gYSBwcmV2aW91c2x5IHNhdmVkIHZhbHVlP1xyXG4gICAgICAgIC8vV2UgYWRkIHRoYXQgdmFsdWUgdG8gdGhlIGRyb3Bkb3duLCBpbiB0aGF0IGNhc2UsIHNvIGl0IGNhbiBiZSBzZWxlY3RlZFxyXG4gICAgICAgIC8vUmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlIG9ubHkgZ2V0cyBwYXNzZWQgaW4gd2hlbiB0aGUgZmlsdGVyIGF0dHJpYnV0ZSBjaGFuZ2VzLiBJbiB0aGF0IHNjZW5hcmlvIHdlIGRvIG5vdCB3YW50IHRvIGFkZCB0aGUgb2xkIHZhbHVlIHRvIHRoZSBsaXN0XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5pc011bHRpVmFsdWUgIT09IFwiWVwiKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdiBvZiB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgbGV0IHByZXNlbnQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChhdiAmJiAhIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIGZvcih2YXIgaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldLnZhbHVlID09PSBhdi52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIC8vSWYgdGhlIGN1cnJlbnRseSBzYXZlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIGxpc3QsIGFkZCBpdC5cclxuICAgICAgICAgICAgICBpZiAoISBwcmVzZW50KSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgeHBhdGggPSBcIi9EaWN0aW9uYXJpZXMvRGljdGlvbmFyeVtAY2xhc3NOYW1lPSdcIiArIGF0dHJpYnV0ZS5hdHRyaWJ1dGVEaWN0aW9uYXJ5LmNsYXNzTmFtZSArIFwiJ10vRGljdGlvbmFyeUVudHJ5W0B2YWx1ZT0nXCIgKyBhdi52YWx1ZUlkRGljdGlvbmFyeSArIFwiJ11cIjtcclxuICAgICAgICAgICAgICAgIC8vVGhlIGVudHJ5IHdhcyBwcm9iYWJseSBhbHJlYWR5IGxvYWRlZCwgYnV0IGV4Y2x1ZGVkIGJ5IHRoZSB4cGF0aC4gV2UgY2FuIHVzZSB0aGF0LlxyXG4gICAgICBcclxuICAgICAgICAgICAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZXZhbHVhdGUoeHBhdGgsIGRvYywgbnVsbCwgWFBhdGhSZXN1bHQuQU5ZX1VOT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaCh0aGlzLmdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGUpKTtcclxuICAgICAgICAgICAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8vU2V0IHRoZSBiZWhhdmlvciBzdWJqZWN0IHdpdGggdGhlIGZpbHRlcmVkIHZhbHVlcyBmb3IgdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICBlbnRyaWVzRFRPLmVudHJpZXMgPSBlbnRyaWVzO1xyXG4gICAgICAgIGVudHJpZXNEVE8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGR0by5yZWZlcmVuY2VkQXR0cmlidXRlO1xyXG4gICAgICAgIGJzLm5leHQoZW50cmllc0RUTyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuICAgIC8vTm9uLXhwYXRoXHJcbiAgICBlbHNlIHtcclxuICAgICAgLy9EaWN0aW9uYXlTZXJ2aWNlIGp1c3QgdXNlZCBodHRwIGdldCwgc28gc2hvdWxkIG5vdCBuZWVkIHRvIHVuc3Vic2NyaWJlLCBzaW5jZSBodHRwIGRvZXMgdGhhdFxyXG4gICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldERpY3Rpb25hcnlEcm9wZG93bkVudHJpZXMoYXR0cmlidXRlLmF0dHJpYnV0ZURpY3Rpb25hcnkuY2xhc3NOYW1lKS5zdWJzY3JpYmUoKGVudHJpZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgLy9NYWtlIHZhbHVlIGZpZWxkc1xyXG4gICAgICAgIGZvcih2YXIgaSA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgIGVudHJpZXNbaV0udmFsdWUgPSBlbnRyaWVzW2ldLmlkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZW50cmllc0RUTyA9IG5ldyBEaWN0aW9uYXJ5RW50cmllc0RUTygpO1xyXG4gICAgICAgIGVudHJpZXNEVE8uZW50cmllcyA9IGVudHJpZXM7XHJcbiAgICAgICAgZW50cmllc0RUTy5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUgPSB0cnVlOyAvL0EgYml0IG9mIGFuIGFzc3VtcHRpb24sIGJ1dCBpZiBpdCBpc24ndCBmaWx0ZXJlZCwgaXQgaGFkIGJldHRlciBpbmNsdWRlIGFsbCB0aGUgdmFsdWVzIVxyXG4gICAgICAgIGJzLm5leHQoZW50cmllc0RUTyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBicztcclxuICB9XHJcblxyXG4gIGdldEpzb25FbnRyeUZyb21Ob2RlKG5vZGU6IGFueSk6IGFueSB7XHJcbiAgICAvL0NyZWF0ZSBKU09OIG9iamVjdHMgZnJvbSB0aGUgbm9kZXNcclxuICAgIGxldCBlbnRyeTogYW55ID0ge307XHJcbiAgICBmb3IodmFyIGkgPSBub2RlLmF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgZW50cnlbbm9kZS5hdHRyaWJ1dGVzW2ldLm5hbWVdID0gbm9kZS5hdHRyaWJ1dGVzW2ldLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBlbnRyeTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlRXZhbHVhdGVYcGF0aCh4cGF0aDogc3RyaW5nLCBzZWNvbmRhcnlYbWw6IHN0cmluZywgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogUHJlRXZhbERUTyB7XHJcbiAgICBsZXQgZHRvOlByZUV2YWxEVE8gPSBuZXcgUHJlRXZhbERUTygpO1xyXG5cclxuICAgIC8vU2VjdXJpdHlBZHZpc29yL0Bjb2RlQ2FuY2VyR3JvdXBcclxuICAgIHdoaWxlICh4cGF0aC5pbmRleE9mKFwiL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXCIpID49IDApIHtcclxuICAgICAgeHBhdGggPSB4cGF0aC5yZXBsYWNlKFwiL1NlY3VyaXR5QWR2aXNvci9AY29kZUNhbmNlckdyb3VwXCIsIFwiJ1wiICsgdGhpcy5nZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdCgpLnZhbHVlLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQgKyBcIidcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9SZXBsYWNlIHNvbWUgb2YgdGhlIGNvbnRleHQgcGFyYW1ldGVycyAke3gudmFsdWV9IC0gVGhpcyBpcyBtb3JlIEFsdGlvIHNwZWNpZmljIHN0dWZmIHRoYXQgd2FzIHVzZWQgaW4gQ0NSXHJcbiAgICBsZXQgcGFyYW1Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcJHtbQS1aYS16MC05X10rXFxcXC52YWx1ZX1cIik7XHJcbiAgICB3aGlsZSAocGFyYW1Qb3MgPj0gMCkge1xyXG4gICAgICBsZXQgcHJlZml4ID0geHBhdGguc3Vic3RyaW5nKDAsIHBhcmFtUG9zKTtcclxuICAgICAgbGV0IHZhck5hbWUgPSB4cGF0aC5zdWJzdHJpbmcocGFyYW1Qb3MgKyAyLCB4cGF0aC5pbmRleE9mKFwiLlwiLCBwYXJhbVBvcykpO1xyXG4gICAgICBsZXQgc3VmZml4ID0geHBhdGguc3Vic3RyaW5nKHhwYXRoLmluZGV4T2YoXCJ9XCIsIHBhcmFtUG9zKSArIDEpO1xyXG5cclxuICAgICAgdmFyIGF2O1xyXG5cclxuICAgICAgLy9JZiB0aGVyZSBJUyBhIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSwgd2UgY2FuIHVzZSB0aGUgdmFsdWUgZGlyZWN0bHkuIE90aGVyd2lzZSB3ZSB0cnkgdG8gZmluZCBpdCBpbiB0aGUgQVZTXHJcbiAgICAgIGlmICghIHJlZmVyZW5jZWRBdHRyaWJ1dGVWYWx1ZSkge1xyXG5cclxuICAgICAgICAvL0ZpbmQgdGhlIGF0dHJpYnV0ZSwgbWF0Y2hpbmcgdGhlIHZhck5hbWUuXHJcbiAgICAgICAgLy9EbyB0aGlzIGZpcnN0LCBzbyB3ZSBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIHJlbGF0ZWQgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlcmUgaXMgYWxyZWFkeSBhIHZhbHVlXHJcblxyXG4gICAgICAgIC8vSXRlcmF0ZSBhdHRyaWJ1dGVzIHRvIGZpbmQgb25lIHRoYXQgbWF0Y2hlcyB0aGUgdmFsdWVcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5mb3JFYWNoKChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgLy9BdHRyaWJ1dGVzIHRoYXQgbWF0Y2ggdGhlIG5hbWVcclxuICAgICAgICAgIGlmIChhdHRyaWJ1dGUuYXR0cmlidXRlTmFtZSA9PT0gdmFyTmFtZSkge1xyXG4gICAgICAgICAgICBkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vSWYgdGhpcyBpcyBhIGdyaWQsIGxvb2sgZm9yIGF0dHJpYnV0ZXMgaW4gdGhlIHJvd1xyXG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGdyaWRDb2x1bW5BdHRyaWJ1dGUgIG9mIGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgICAgLy9JZiB0aGUgbmFtZSBtYXRjaGVzIEFORCB0aGUgdmFsdWUgaW4gdGhlIEFWUyB3YXMgcGFydCBvZiB0aGUgU0FNRSBST1cgd2UgYXJlIGV2YWx1YXRpbmcgWFBBVEggZm9yLCB3ZSBjYW4gdXNlIHRoZSB2YWx1ZSBmb3IgZXZhbHVhdGlvblxyXG4gICAgICAgICAgICAgIGlmIChncmlkQ29sdW1uQXR0cmlidXRlLmF0dHJpYnV0ZU5hbWUgPT09IHZhck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGR0by5yZWZlcmVuY2VkQXR0cmlidXRlID0gZ3JpZENvbHVtbkF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAgICAgICBsZXQgYXZzID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuICAgICAgICAvL0lmIHdlIGZvdW5kIHRoZSBhdHRyaWJ1dGUgYW5kIGhhdmUgdmFsdWVzLi4uXHJcbiAgICAgICAgaWYgKGR0by5yZWZlcmVuY2VkQXR0cmlidXRlICYmIGF2cykge1xyXG5cclxuICAgICAgICAgIC8vTG9vayB0aHJvdWdoIGFsbCB0aGUgdmFsdWVzIHRvIGZpbmQgdGhlIG9uZSBmb3IgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIChhbmQgU0FNRSBncmlkIHJvdyBpZiBpbiBhIGdyaWQgcm93KVxyXG4gICAgICAgICAgYXYgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbmQoKGF2KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvL0lmIHRoaXMgaXMgYW4gQVYgZm9yIGEgZ3JpZCByb3csIGl0IG11c3QgYmUgZm9yIHRoZSBzYW1lIGdyaWQgcm93IHdlIGFyZSBsb29raW5nIGZvclxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBncm91cEF0dHJpYnV0ZVJvd0lkICE9PSAndW5kZWZpbmVkJyAmJiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgLy9JZiB3ZSBsb29rZWQgdXAgdGhlIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgdmFsdWUgYnkgaWQgQU5EIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaXMgdGhlIG9uZSB3ZSBhciBsb29raW5nIGZvciBmcm9tIHRoZSBYUEFUSCwgd2UgY2FuIHVzZSBpdCBmb3IgZXZhbHVhdGlvblxyXG4gICAgICAgICAgICAgLy9Gb3VuZCBhbiBBdHRyaWJ1dGVWYWx1ZSB0aGF0IHRoZSBkaWN0aW9uYXJ5IGlzIGZpbHRlcmVkIGJ5XHJcbiAgICAgICAgICAgIGlmIChkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9PT0gYXYuaWRBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL1VzZSB0aGUgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlIGlmIHByb3ZpZGVkICh0aGlzIGhhcHBlbnMgd2hlbiBhbHJlYWR5IGtub3duLCBkdXJpbmcgY2hhbmdlcyB0byB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUpXHJcbiAgICAgIGlmIChyZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICB4cGF0aCA9IHByZWZpeCArIFwiJ1wiICsgcmVmZXJlbmNlZEF0dHJpYnV0ZVZhbHVlLnZhbHVlICsgXCInXCIgKyBzdWZmaXg7XHJcbiAgICAgIH1cclxuICAgICAgLy9Gb3VuZCB0aGUgQXR0cmlidXRlVmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdGhhdCB0aGUgZGljdGlvbmFyeSBpcyBmaWx0ZXJlZCBieVxyXG4gICAgICBlbHNlIGlmIChhdikge1xyXG4gICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyBhdi52YWx1ZSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICB9XHJcbiAgICAgIC8vRGlkbid0IGZpbmQgYW4gYXR0cmlidXRlIGZvciB2YXJOYW1lXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vTWF5YmUgdGhlIHZhck5hbWUgaXMgZnJvbSBlbHNld2hlcmUgaW4gdGhlIGFwcCAobm9uLUNPRCksIGFuZCBwcm92aWRlZCBpbiBib3VuZERhdGFcclxuICAgICAgICBpZiAodGhpcy5ib3VuZERhdGEgJiYgdGhpcy5ib3VuZERhdGFbdmFyTmFtZV0pIHtcclxuICAgICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInXCIgKyB0aGlzLmJvdW5kRGF0YVt2YXJOYW1lXSArIFwiJ1wiICsgc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL05vdGhpbmcgbWF0Y2hlcy4gQ2hhbmdlIHRvIGVtcHR5IHN0cmluZy4gV2lsbCBwcm9iYWJseSByZXN1bHQgaW4gTk8gZW50cmllcywgd2hpY2ggd291bGQgYmUgY29ycmVjdC5cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHhwYXRoID0gcHJlZml4ICsgXCInJ1wiICsgc3VmZml4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcGFyYW1Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcJHtbQS1aYS16MC05X10rXFxcXC52YWx1ZX1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy9IYXZlIHRvIGV2YWx1YXRlIHN1Yi1leHByZXNzaW9uLiBUaGlzIGhhbmRsZXMgZXhwcmVzc2lvbnMgbGlrZSBbQHggPSAoL3hwYXRoLXN1Yi1leHByZXNzaW9uKV1cclxuICAgIGxldCBpbkV4cHJlc3Npb25Qb3MgPSB4cGF0aC5zZWFyY2goXCJcXFxcW0BbQS1aYS16MC05X10rXFxcXHMqPVxcXFxzKlxcXFwoXCIpO1xyXG5cclxuICAgIGlmIChpbkV4cHJlc3Npb25Qb3MgPiAwICYmIHNlY29uZGFyeVhtbCkge1xyXG4gICAgICBsZXQgcHJlZml4ID0geHBhdGguc3Vic3RyaW5nKDAsIGluRXhwcmVzc2lvblBvcyArIDEpO1xyXG4gICAgICBsZXQgZXhwcmVzc2lvbkVuZCA9IHhwYXRoLmluZGV4T2YoXCIpXCIsIGluRXhwcmVzc2lvblBvcyk7XHJcbiAgICAgIGxldCB2YXJpYWJsZSA9IHhwYXRoLnN1YnN0cmluZyhpbkV4cHJlc3Npb25Qb3MgKyAxLCB4cGF0aC5pbmRleE9mKFwiPVwiLCBpbkV4cHJlc3Npb25Qb3MpKTtcclxuICAgICAgbGV0IHN1YkV4cHJlc3Npb24gPSB4cGF0aC5zdWJzdHJpbmcoeHBhdGguaW5kZXhPZihcIihcIiwgaW5FeHByZXNzaW9uUG9zKSArIDEsIGV4cHJlc3Npb25FbmQpO1xyXG4gICAgICBsZXQgc3VmZml4ID0geHBhdGguc3Vic3RyaW5nKGV4cHJlc3Npb25FbmQgKyAxKTtcclxuXHJcbiAgICAgIHhwYXRoID0gcHJlZml4O1xyXG5cclxuICAgICAgLy9FdmFsdWF0ZSBYUEFUSCBleHByZXNzaW9uXHJcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgbGV0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc2Vjb25kYXJ5WG1sLCBcImFwcGxpY2F0aW9uL3htbFwiKTtcclxuICAgICAgbGV0IHhQYXRoUmVzdWx0ID0gZG9jdW1lbnQuZXZhbHVhdGUoc3ViRXhwcmVzc2lvbiwgZG9jLCBudWxsLCBYUGF0aFJlc3VsdC5BTllfVFlQRSwgbnVsbCk7XHJcblxyXG4gICAgICAvL0l0ZXJhdGUgeHBhdGggcmVzdWx0cyAobm9kZXMpXHJcbiAgICAgIHZhciBub2RlID0geFBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKTtcclxuXHJcbiAgICAgIHdoaWxlKG5vZGUpIHtcclxuICAgICAgICB4cGF0aCA9IHhwYXRoICsgdmFyaWFibGUgKyBcIj0nXCIgKyBub2RlLm5vZGVWYWx1ZSArIFwiJ1wiXHJcblxyXG4gICAgICAgIG5vZGUgPSB4UGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpO1xyXG5cclxuICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgeHBhdGggPSB4cGF0aCArIFwiIG9yIFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgeHBhdGggPSB4cGF0aCArIHN1ZmZpeDtcclxuICAgIH1cclxuXHJcbiAgICBkdG8uZXhwcmVzc2lvbiA9IHhwYXRoO1xyXG4gICAgcmV0dXJuIGR0bztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dExpc3QoYTogYW55LCBiOiBhbnkpIHtcclxuICAgIHJldHVybiBhLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdChjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcImZldGNoQXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3Q6IFwiICsgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uTGlzdExvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiY29uZmlndXJhdGlvbnNcIjtcclxuICAgIGxldCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG4gICAgaWYgKGNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uW10+KHVybCwge3BhcmFtczogcGFyYW1zfSkuc3Vic2NyaWJlKChjb25maWd1cmF0aW9uTGlzdDogQXR0cmlidXRlQ29uZmlndXJhdGlvbltdKSA9PiB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RMb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuXHJcbiAgICAgIGxldCBkdG9zOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPW10gPSBbXTtcclxuICAgICAgZm9yIChsZXQgY2ZnIG9mIGNvbmZpZ3VyYXRpb25MaXN0KSB7XHJcbiAgICAgICAgbGV0IGR0bzogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyA9IHRoaXMuZ2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyhjZmcpO1xyXG4gICAgICAgIGlmIChkdG8pIHtcclxuICAgICAgICAgIGR0b3MucHVzaChkdG8pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZHRvcy5zb3J0KHRoaXMuc29ydEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KTtcclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkxpc3RTdWJqZWN0Lm5leHQoZHRvcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25MaXN0KGE6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8sIGI6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8pIHtcclxuICAgIGNvbnN0IGRpc3BsYXlhID0gYS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheVxyXG4gICAgICArIGEuZXh0ZW5zaW9uRGVzY3JpcHRpb25cclxuICAgICAgKyAoYS5maWx0ZXIxRGlzcGxheSB8fCBcIlwiKVxyXG4gICAgICArIChhLmZpbHRlcjJEaXNwbGF5IHx8IFwiXCIpO1xyXG5cclxuICAgIGNvbnN0IGRpc3BsYXliID0gYi5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheVxyXG4gICAgICArIGIuZXh0ZW5zaW9uRGVzY3JpcHRpb25cclxuICAgICAgKyAoYi5maWx0ZXIxRGlzcGxheSB8fCBcIlwiKVxyXG4gICAgICArIChiLmZpbHRlcjJEaXNwbGF5IHx8IFwiXCIpO1xyXG5cclxuICAgIHJldHVybiBkaXNwbGF5YS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoZGlzcGxheWIudG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICAvL1VzZWQgYnkgY29kLWVkaXRvclxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmlkRmlsdGVyMSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIyID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuaHR0cC5wb3N0PEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zXCIsIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uO1xyXG5cclxuICAgICAgdGhpcy5wb3N0Q29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKFwiL2VkaXRvci9hdHRyaWJ1dGUtY29uZmlndXJhdGlvbi9cIiArIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbkJ5SWQoaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uOiBudW1iZXIsIGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAhPT0gLTEpIHtcclxuICAgICAgdGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBsb2FkIGlmIHRoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkXHJcbiAgICBpZiAodGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gIT09IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAvL0NsZWFyIEFTQVBcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IGlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIHRoaXMuaWRGaWx0ZXIxID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLmlkRmlsdGVyMiA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVNYXAuY2xlYXIoKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG5cclxuICAgICAgdGhpcy5mZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gICAgLy9PciBsb2FkIHRoZSBBdHRyaWJ1dGVWYWx1ZVNldCBpZiB0aGF0IGNoYW5nZWQgKHBvc3NpYmxlIHRvIHN3aXRjaCBmcm9tIG9uZSBldmVudCB0byBhbm90aGVyIG9mIHRoZSBzYW1lIHR5cGUsIGZvciBleGFtcGxlXHJcbiAgICAvL1RoZSBBdHRyaWJ1dGVDb25maWd1cmF0aW9uIG11c3QgYWxzbyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgYW5kIG5vdCBhbHJlYWR5IHdvcmtpbmcgb24gbG9hZGluZyB0aGUgdmFsdWVzXHJcbiAgICBlbHNlIGlmICh0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgIT09IGlkQXR0cmlidXRlVmFsdWVTZXQgJiYgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlVmFsdWVTZXQoaWRBdHRyaWJ1dGVWYWx1ZVNldCwgaWRQYXJlbnRPYmplY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgY29uZmlndXJhdGlvbiBpZGVudGlmaWVycyB0byBiZSB1c2VkIGJ5IHRoaXMgc2VydmljZS4gIFRoaXMgcHJvbXB0cyBhIG5ldyBjb25maWd1cmF0aW9uXHJcbiAgICogcmVxdWVzdCB0byBiZSBtYWRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkRmlsdGVyMVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEZpbHRlcjJcclxuICAgKi9cclxuLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGZvciBub3cgYmVjYXVzZSBpdCBpcyBib3RoIHVuaW1wbGVtZW50ZWQgYW5kIGluY29tcGxldGUgKGxvYWRpbmcgYSBjb25maWd1cmF0aW9uXHJcbiAqIGZpbHRlciB3b3VsZCByZWFsbHkgYWxzbyByZXF1aXJlIHRoZSBhdHRyaWJ1dGUgY29udGV4dCBhbmQgYXR0cmlidXRlc2VjdXJpdHkgY29udGV4dCBwbHVzIGEgc2VydmljZSBvblxyXG4gKiB0aGUgYmFjayBlbmQgdGhhdCBhY3R1YWxseSBkb2VzIHRoaXMgd29yay4gRm9yIG5vdywgb25seSBsb2FkaW5nIGJ5IGlkQXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gKlxyXG4gIHNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUZpbHRlcihpZEZpbHRlcjE6IG51bWJlciwgaWRGaWx0ZXIyPzogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25CeUZpbHRlcjogXCIgKyBpZEZpbHRlcjEgKyBcIiBcIiArIGlkRmlsdGVyMik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uZXdBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgLy90aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuaWRGaWx0ZXIxID0gaWRGaWx0ZXIxO1xyXG4gICAgdGhpcy5pZEZpbHRlcjIgPSBpZEZpbHRlcjI7XHJcblxyXG4gICAgdGhpcy5mZXRjaEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24oKTtcclxuICB9XHJcbiovXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGlkIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgc2V0LiAgVGhpcyB3aWxsIHByb21wdCBhIHJlcXVlc3QgdG8gcHVsbCB0aGlzIGZyb20gdGhlIGJhY2tlbmQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVWYWx1ZVNldFxyXG4gICAqL1xyXG4gIHNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcikge1xyXG4gICAgLy9Pbmx5IGxvYWQgdGhlIEF0dHJpYnV0ZVZhbHVlU2V0IGlmIGl0IGhhcyBiZWVuIGNoYW5nZWRcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQgIT09IGlkQXR0cmlidXRlVmFsdWVTZXQpIHtcclxuICAgICAgdGhpcy5pZEF0dHJpYnV0ZVZhbHVlU2V0ID0gaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuXHJcbiAgICAgIHRoaXMuZmV0Y2hBdHRyaWJ1dGVWYWx1ZVNldChpZFBhcmVudE9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmVxdWVzdCB0byBkb3dubG9hZCB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICovXHJcbiAgZmV0Y2hBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGlkQXR0cmlidXRlVmFsdWVTZXQ6IG51bWJlciwgaWRQYXJlbnRPYmplY3Q6IG51bWJlcik6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dCh0aGlzLm5ld0F0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uID09PSAtMSkge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE9TdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPntcclxuICAgICAgICBpZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IC0yXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIGxldCB1cmw6IHN0cmluZztcclxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiAmJiB0aGlzLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA+IC0xKSB7XHJcbiAgICAgIHVybCA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL1wiICsgdGhpcy5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL1RoaXMgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkXHJcblx0ICAvL3VybCA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL2ZpbHRlci9cIiArIHRoaXMuaWRGaWx0ZXIxO1xyXG4gICAgICAvL2lmICh0aGlzLmlkRmlsdGVyMikge1xyXG4gICAgICAgIC8vdXJsICs9IFwiL1wiICsgdGhpcy5pZEZpbHRlcjI7XHJcbiAgICAgIC8vfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odXJsKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgLy9Ob3cgbG9hZCB0aGUgYXR0cmlidXRlVmFsdWVTZXQgLSBUaGlzIHdpbGwgYWx3YXlzIGhhcHBlbiB3aGVuIGEgbmV3IGNvbmZpZ3VyYXRpb24gaXMgbG9hZGVkXHJcbiAgICAgIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldCA9IHVuZGVmaW5lZDsgLy9Gb3JjZSBpdCB0byBjaGFuZ2UgaW4gdGhpcyBzY2VuYXJpb1xyXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZVZhbHVlU2V0KGlkQXR0cmlidXRlVmFsdWVTZXQsIGlkUGFyZW50T2JqZWN0KTtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlQ29uZmlndXJhdGlvbih1bmRlZmluZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLmNsZWFyKCk7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVTZXJ2aWNlLnNldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYmFzZVdpbmRvd1RlbXBsYXRlKSB7XHJcbiAgICAgICAgdGhpcy5nZXRCYXNlV2luZG93RGltZW5zaW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYmFzZVdpbmRvd1RlbXBsYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycykge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uYXR0cmlidXRlQ29udGFpbmVycy5zb3J0KChhOiBBdHRyaWJ1dGVDb250YWluZXIsIGI6IEF0dHJpYnV0ZUNvbnRhaW5lcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGEuc29ydE9yZGVyIDwgYi5zb3J0T3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhLnNvcnRPcmRlciA+IGIuc29ydE9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZUNvbnRhaW5lciBvZiBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmF0dHJpYnV0ZUNvbnRhaW5lcnMpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBGaXJzdCBzb3J0IGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHkgYW5kIHggcG9zaXRpb25pbmcuICBJZiB1c2luZyBhYnNvbHV0ZSBwb3NpdGlvbiwgdGhlIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLFxyXG4gICAgICAgICAqIGJ1dCBpZiB3ZSB3YW50IHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmluZyB0byBndWlkZSBhdXRvIGxheW91dCwgdGhlbiB1c2UgdGhpcyBvcmRlci5cclxuICAgICAgICAgKi9cclxuICAgICAgICBhdHRyaWJ1dGVDb250YWluZXIuZ3JhcGhpY2FsQXR0cmlidXRlcy5zb3J0KChhOiBHcmFwaGljYWxBdHRyaWJ1dGUsIGI6IEdyYXBoaWNhbEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGEudGFiT3JkZXIgPCBiLnRhYk9yZGVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYS50YWJPcmRlciA+IGIudGFiT3JkZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZU1hcC5zZXQoYXR0cmlidXRlLmlkQXR0cmlidXRlLCBhdHRyaWJ1dGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvbkRUT1N1YmplY3QubmV4dCh0aGlzLmdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oYXR0cmlidXRlQ29uZmlndXJhdGlvbikpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHJlcXVlc3QgdG8gcHVsbCB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC5cclxuICAgKiBSZXF1aXJlZCB0aGUgQXR0cmlidXRlQ29uZmlndXJhdGlvbiB0byBiZSBwcmUtbG9hZGVkXHJcbiAgICovXHJcbiAgZmV0Y2hBdHRyaWJ1dGVWYWx1ZVNldChpZFBhcmVudE9iamVjdDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmlkUGFyZW50T2JqZWN0ID0gaWRQYXJlbnRPYmplY3Q7XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLXNldC9cIiArIHRoaXMuaWRBdHRyaWJ1dGVWYWx1ZVNldDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAoaWRQYXJlbnRPYmplY3QpP2lkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG4gICAgLy9DbGVhciBBU0FQXHJcbiAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XHJcblxyXG4gICAgdGhpcy5odHRwLmdldDxBdHRyaWJ1dGVWYWx1ZVNldD4odXJsLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVTZXQ6IEF0dHJpYnV0ZVZhbHVlU2V0KSA9PiB7XHJcbiAgICAgIC8vSW5pdGlhbGl6ZSBhdHRyaWJ1dGVWYWx1ZXMgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuICAgICAgaWYgKCEgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgYXR0cmlidXRlVmFsdWVTZXQuYXR0cmlidXRlVmFsdWVzID0gW107XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmRpcnR5Lm5leHQoZmFsc2UpO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRCYXNlV2luZG93RGltZW5zaW9uKGJhc2VXaW5kb3dUZW1wbGF0ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmh0dHAuZ2V0KHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImJhc2Utd2luZG93LWRpbWVuc2lvblwiLCB7cGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldChcImJhc2VXaW5kb3dUZW1wbGF0ZVwiLCBiYXNlV2luZG93VGVtcGxhdGUpfSlcclxuICAgICAgLnN1YnNjcmliZSgoZGltZW5zaW9uOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EaW1lbnNpb25TdWJqZWN0Lm5leHQoZGltZW5zaW9uKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDdXJyZW50bHkgYSBzaW1wbGUgbm90aWZpZXIgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBvciBhdHRyaWJ1dGUgdmFsdWUgc2V0IGhhcyBjaGFuZ2VkIGFuZCBjb21wb25lbnRzIG1heSBuZWVkIHRvIGJlIHJlZnJlc2hlZC5cclxuICAgKlxyXG4gICAqL1xyXG4gIG5vdGlmeUF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbnRhaW5lclVwZGF0ZWQubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBvc3QgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGFmdGVyIGVkaXRpbmcuICBQb3N0IHRoZSBlbnRpcmUgdGhpbmcgYXMgaXQgY2FzY2FkZXMgZG93bi4gIFRoZSBlZGl0b3IgYWxsb3dzIHlvdVxyXG4gICAqIHRvIG1vZGlmeSBldmVyeSBjb250YWluZXIgYW5kIG9ubHkgdGhlbiBzYXZlIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gYXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHBvc3RBdHRyaWJ1dGVDb25maWd1cmF0aW9uKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImNvbmZpZ3VyYXRpb25zL1wiICsgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5pZEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KHRydWUpO1xyXG5cclxuICAgIHRoaXMuc2V0TmVnYXRpdmVJZHNUb1VuZGVmaW5lZChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pLnN1YnNjcmliZSgoKSA9PiB7XHJcblxyXG4gICAgICAvLyBQcmV2ZW50IGVycm9yIGluIHN1YnNlcXVlbnQgc2F2ZXMuIFNlZSBNZXRhYnVpbGRlciAvIE1CLTIzXHJcbiAgICAgIHRoaXMuaHR0cC5nZXQ8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4odXJsKS5zdWJzY3JpYmUoKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb246IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24pID0+IHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlQ29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBvc3RDb25maWd1cmF0aW9uU3ViamVjdC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QubmV4dChhdHRyaWJ1dGVDb25maWd1cmF0aW9uKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIH0sXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1dCB0aGUgYXR0cmlidXRlIHZhbHVlIHNldC4gIFdoZW4gZWRpdGluZywgYXR0cmlidXRlcyBhbHJlYWR5IHBvc3QgdGhlaXIgdXBkYXRlZCB2YWx1ZXMgdG8gdGhpcyBzZXJ2aWNlcyB1bmRlclxyXG4gICAqIGEgc2VwYXJhdGUgYXJyYXkuICBXaGF0IHdlIGRvIGlzIG1lcmdlIGluIHRoZXNlIHVwZGF0ZWQgb3IgY3JlYXRlZCB2YWx1ZXMgd2l0aCB0aGUgY3VycmVudCBhdHRyaWJ1dGUgdmFsdWUgc2V0IChhdnMpLlxyXG4gICAqIFdoaWxlIGRvaW5nIHRoaXMsIHNldCB0aGUgaWQgb2YgdGhlIGF2cyBhbmQgbnVsbGlmeSBhbnkgbmVnYXRpdmUgaWRzLlxyXG4gICAqL1xyXG4gIHVwZGF0ZUF0dHJpYnV0ZVZhbHVlU2V0KCk6IFN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+IHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1zZXQvXCIgO1xyXG5cclxuICAgIGxldCBhYzogQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBsZXQgcXVlcnlQYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0KVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVDb250ZXh0KVxyXG4gICAgLnNldChcImlkUGFyZW50T2JqZWN0XCIsICh0aGlzLmlkUGFyZW50T2JqZWN0KT90aGlzLmlkUGFyZW50T2JqZWN0LnRvU3RyaW5nKCk6XCJcIik7XHJcblxyXG4gICAgbGV0IGF2czogQXR0cmlidXRlVmFsdWVTZXQgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKTtcclxuICAgIGZvciAobGV0IGkgPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICAgIGZvciAoaiA9IDA7IGogPCBhdnMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdnMuYXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlc1tqXSA9IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGogPSAwOyBqIDwgYXZzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZVZhbHVlID09PSBhdnMuYXR0cmlidXRlVmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IGF2cy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmNvbmNhdCh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMpO1xyXG5cclxuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh0cnVlKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0U3ViamVjdDogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4gPSBuZXcgU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZVNldD4oKTtcclxuXHJcbiAgICB0aGlzLmh0dHAucHV0KHVybCwgYXZzLCB7cGFyYW1zOiBxdWVyeVBhcmFtc30pLnN1YnNjcmliZSgoYXR0cmlidXRlVmFsdWVTZXQ6IEF0dHJpYnV0ZVZhbHVlU2V0KSA9PiB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vSW5pdGlhbGl6ZSBhdHRyaWJ1dGVWYWx1ZXMgaWYgaXQgZG9lcyBub3QgZXhpc3RcclxuICAgICAgICBpZiAoISBhdHRyaWJ1dGVWYWx1ZVNldC5hdHRyaWJ1dGVWYWx1ZXMpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlU2V0LmF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF0dHJpYnV0ZVZhbHVlU2V0KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZGlydHkubmV4dChmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vU2VuZCB0aGUgcmVzdWx0cyB0byB0aGUgb2JzZXJ2ZXIgKGlmIGFueSksIHRoZW4gY29tcGxldGVcclxuICAgICAgICByZXN1bHRTdWJqZWN0Lm5leHQoYXR0cmlidXRlVmFsdWVTZXQpO1xyXG4gICAgICAgIHJlc3VsdFN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgICByZXN1bHRTdWJqZWN0LmVycm9yKGVycm9yKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge0JlaGF2aW9yU3ViamVjdDxBdHRyaWJ1dGVDb25maWd1cmF0aW9uPn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdCgpOiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlQ29uZmlndXJhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlQ29uZmlndXJhdGlvblN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICBnZXREaXJ0eVN1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmRpcnR5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3Q7XHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7QmVoYXZpb3JTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlU2V0Pn1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVWYWx1ZVNldCgpOiBCZWhhdmlvclN1YmplY3Q8QXR0cmlidXRlVmFsdWVTZXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0O1xyXG4gICAqXHJcbiAgICogQHJldHVybnMge1N1YmplY3Q8QXR0cmlidXRlVmFsdWU+fVxyXG4gICAqL1xyXG4gIGdldEF0dHJpYnV0ZVZhbHVlUHVzaGVkU3ViamVjdCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgYmFzZWQgdXBvbiB0aGUgaWRBdHRyaWJ1dGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVzXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZVZhbHVlW119XHJcbiAgICovXHJcbiAgZ2V0QXR0cmlidXRlVmFsdWVzKGlkQXR0cmlidXRlOiBudW1iZXIsIGdyb3VwQXR0cmlidXRlUm93SWQ6IG51bWJlcik6IEF0dHJpYnV0ZVZhbHVlW10ge1xyXG5cclxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuXHJcbiAgICBpZih0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcblxyXG4gICAgICAvL0dvIHRocm91Z2ggYWxsIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgZmlyc3QgKHNvIHdlIHByZXNlcnZlIGFjcm9zcyBjaGFuZ2luZyB0YWJzLCBldGMpXHJcbiAgICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gaWRBdHRyaWJ1dGUgJiYgKCFncm91cEF0dHJpYnV0ZVJvd0lkIHx8IGdyb3VwQXR0cmlidXRlUm93SWQgPT09IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5ncm91cEF0dHJpYnV0ZVJvd0lkKSkge1xyXG4gICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSAmJiAoIWdyb3VwQXR0cmlidXRlUm93SWQgfHwgZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmdyb3VwQXR0cmlidXRlUm93SWQpKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHVzaChPYmplY3QuYXNzaWduKHt9LCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vR28gdGhyb3VnaCBhbGwgdGhlIHJlZ3VsYXIgYXR0cmlidXRlc1xyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGVWYWx1ZSBvZiB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgIC8vUmVndWxhciBhdHRyaWJ1dGVzIChub3JtYWwgYW5kIGdyb3VwLCB3aGljaCBnZXQgbXVsdGlwbGUpXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSB8fCBhdHRyaWJ1dGVWYWx1ZS5pZEdyb3VwQXR0cmlidXRlID09PSBpZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgLy9JZiByb3cgaWQgc3BlY2lmaWVkLCBvbmx5IGNhcmUgYWJvdXQgdmFsdWVzIGZvciB0aGF0IHJvd1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiBncm91cEF0dHJpYnV0ZVJvd0lkID09PSAndW5kZWZpbmVkJyB8fCBhdHRyaWJ1dGVWYWx1ZS5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcblxyXG4gICAgICAgICAgICAvL0lmIG5vdCBhbHJlYWR5IGFkZGVkLi4uXHJcbiAgICAgICAgICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlcy5maW5kKChleGlzdGluZykgPT4gZXhpc3RpbmcuaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGVWYWx1ZSkpIHtcclxuXHJcbiAgICAgICAgICAgICAgLy9Eb24ndCB3YW50IHRoZSBvcmlnaW5hbCBpZiBpdCB3YXMgcmVtb3ZlZCAoc2xpY2VkKVxyXG4gICAgICAgICAgICAgIGlmICghIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmZpbmQoKHNhdikgPT4gc2F2LmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHVzaChPYmplY3QuYXNzaWduKHt9LCBhdHRyaWJ1dGVWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGNoaWxkIGF0dHJpYnV0ZXMgb2YgdGhlIGlkQXR0cmlidXRlLiAgTW9zdCBsaWtlbHkgZm9yIGF0dHJpYnV0ZXMgdGhhdCBkZWZpbmUgY29sdW1ucyBvZiBhIGdyaWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge251bWJlcn0gaWRBdHRyaWJ1dGVcclxuICAgKiBAcmV0dXJucyB7QXR0cmlidXRlW119XHJcbiAgICovXHJcbiAgZ2V0R3JvdXBBdHRyaWJ1dGVzKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGVbXSB7XHJcbiAgICBsZXQgYXR0cmlidXRlczogQXR0cmlidXRlW10gPSBbXTtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZU1hcC5mb3JFYWNoKChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSkgPT4ge1xyXG4gICAgICBpZiAoYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUgPT09IGlkQXR0cmlidXRlKSB7XHJcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB3aWR0aCB3aGljaCBpcyBhIHJlcXVpcmVtZW50IG9mIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxyXG4gICAqL1xyXG4gIHNldFdpZHRoKHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgd2lkdGguXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldFdpZHRoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy53aWR0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYXJyYXkgb2YgYXR0cmlidXRlIGNob2ljZXMgZm9yIHRoZSBpZEF0dHJpYnV0ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpZEF0dHJpYnV0ZVxyXG4gICAqIEByZXR1cm5zIHtBdHRyaWJ1dGVDaG9pY2VbXX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGVDaG9pY2VzKGlkQXR0cmlidXRlOiBudW1iZXIpOiBBdHRyaWJ1dGVDaG9pY2VbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXAuZ2V0KGlkQXR0cmlidXRlKS5hdHRyaWJ1dGVDaG9pY2VzO1xyXG4gIH1cclxuXHJcbiAgZ2V0TG9hZGluZ1N1YmplY3QoKTogU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nU3ViamVjdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY29udGFpbmVyVXBkYXRlZCBzdWJqZWN0LlxyXG4gICAqXHJcbiAgICogQHJldHVybnMge1N1YmplY3Q8bnVtYmVyPn1cclxuICAgKi9cclxuICBnZXRDb250YWluZXJVcGRhdGVkKCk6IFN1YmplY3Q8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyVXBkYXRlZDtcclxuICB9XHJcblxyXG4gIGdldEdyaWRSb3dTYXZlZFN1YmplY3QoKTogU3ViamVjdDxBdHRyaWJ1dGVWYWx1ZUdyaWRSb3c+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRSb3dTYXZlZDtcclxuICB9XHJcblxyXG4gIGdldEdyaWRSb3dEZWxldGVkU3ViamVjdCgpOiBTdWJqZWN0PEF0dHJpYnV0ZVZhbHVlR3JpZFJvdz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JpZFJvd0RlbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgdXBkYXRlZCBhbmQgZGVsZXRlZCBhdHRyaWJ1dGUgdmFsdWUgYXJyYXlzLlxyXG4gICAqXHJcbiAgICovXHJcbiAgY2xlYXJVcGRhdGVkQXR0cmlidXRlVmFsdWVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy5kaXJ0eS5uZXh0KGZhbHNlKTtcclxuICAgIHRoaXMubm90aWZ5QXR0cmlidXRlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIHVwZGF0ZWQgYW5kIGRlbGV0ZWQgZ3JpZCByb3cgYXR0cmlidXRlcyBmb3IgdGhlIHNwZWNpZmllZCBncmlkIHJvd1xyXG4gICAqXHJcbiAgICovXHJcbiAgY2xlYXJVcGRhdGVkR3JpZFJvd0F0dHJpYnV0ZVZhbHVlcyhncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByZW1haW5pbmdBdHRyaWJ1dGVzID0gW107XHJcblxyXG4gICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyA9ICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcblxyXG4gICAgLy9TaG91bGRuJ3QgYmUgYSBuZWVkIHRvIGNoYW5nZSBkaXJ0eSBvciBub3RpZnkgYXR0cmlidXRlc1xyXG4gIH1cclxuXHJcbiAgc2F2ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCByb3dWYWx1ZXMgPSB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCA9PT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcblxyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dWYWx1ZXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgLy9zZXQgdGhlIGlkQXR0cmlidXRlVmFsdWVTZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICAgIGlmICghIHJvd1ZhbHVlc1tqXS5pZEF0dHJpYnV0ZVZhbHVlU2V0KSB7XHJcbiAgICAgICAgcm93VmFsdWVzW2pdLmlkQXR0cmlidXRlVmFsdWVTZXQgPSB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vcmVtb3ZlIGFsbCBuZWdhdGl2ZSBpZHMgKG5ldyB2YWx1ZXMpXHJcbiAgICAgIGlmIChyb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA8IDApIHtcclxuICAgICAgICByb3dWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vRm9yIG11bHRpIHZhbHVlcyB0aGF0IHdlcmUgc2xpY2VkIChkZS1zZWxlY3RlZCkgd2UncmUgZ29pbmcgdG8gZmluZCB0aGVtIGFuZCBudWxsIG91dCB0aGUgdmFsdWUsIGluc3RlYWQgb2YgcmVtb3ZpbmcuXHJcbiAgICAvL1RoYXQgbWVhbnMgdGhleSBhY3RhdWxseSBuZWVkIHRvIGJlIGFkZGVkIHRvIHRoZSByb3dWYWx1ZXNcclxuICAgIC8vUmVtb3ZlZCBtdWx0aSB2YWx1ZXMgd2l0aGluIGFuIGV4aXN0aW5nIHJvd1xyXG4gICAgbGV0IHJlbW92ZWRWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlID0gdW5kZWZpbmVkO1xyXG4gICAgICByZW1vdmVkVmFsdWVzW2ldLnZhbHVlSWREaWN0aW9uYXJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgICByb3dWYWx1ZXMucHVzaChyZW1vdmVkVmFsdWVzW2ldKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogcm93VmFsdWVzXHJcbiAgICAgIH07XHJcblxyXG4gICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5hdHRyaWJ1dGVFbmRwb2ludCArIFwiYXR0cmlidXRlLXZhbHVlLWdyaWQtcm93L1wiIDtcclxuXHJcbiAgICBsZXQgYWM6IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25TdWJqZWN0LmdldFZhbHVlKCk7XHJcblxyXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxyXG4gICAgLnNldChcImNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlQ29udGV4dFwiLCBhYy5jb2RlQXR0cmlidXRlQ29udGV4dClcclxuICAgIC5zZXQoXCJpZFBhcmVudE9iamVjdFwiLCAodGhpcy5pZFBhcmVudE9iamVjdCk/dGhpcy5pZFBhcmVudE9iamVjdC50b1N0cmluZygpOlwiXCIpO1xyXG5cclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgLy9TYXZlIG5ldyByb3dcclxuICAgIGlmIChncm91cEF0dHJpYnV0ZVJvd0lkIDwgMCkge1xyXG4gICAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGF2Z3IsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG5cclxuICAgICAgICAvL0FkZCB0aGUgZ3JpZCByb3cgdG8gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgICBsZXQgYXZzOkF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhdnMuYXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVHcmlkUm93LmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1JlbW92ZSB0aGUgdXBkYXRlZCBhbmQgc2xpY2VkIHZhbHVlcyBmb3IgdGhlIGdyaWQgcm93LCBub3cgKHRoZXNlIGFyZSB0aGUgb2xkIG9uZXMgd2l0aCB0aGUgbmVnYXRpdmUgcm93aWQpXHJcbiAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG5cclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgICAgdGhpcy5ncmlkUm93U2F2ZWQubmV4dChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3cpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy9VcGRhdGUgZXhpc3Rpbmcgcm93XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5odHRwLnB1dCh1cmwsIGF2Z3IsIHtwYXJhbXM6IHF1ZXJ5UGFyYW1zfSkuc3Vic2NyaWJlKChhdHRyaWJ1dGVWYWx1ZUdyaWRSb3c6IEF0dHJpYnV0ZVZhbHVlR3JpZFJvdykgPT4ge1xyXG5cclxuICAgICAgICAvL0FkZCB0aGUgZ3JpZCByb3cgdG8gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgICBsZXQgYXZzOkF0dHJpYnV0ZVZhbHVlU2V0ID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICAgICAgLy9SZW1vdmUgYWxsIG9sZCB2YWx1ZXMgZm9yIHJvd1xyXG4gICAgICAgIGxldCBpbmRleCA9IGF2cy5hdHRyaWJ1dGVWYWx1ZXMuZmluZEluZGV4KChhdik9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgICAgICB3aGlsZSAoaW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAvL1JlbW92ZSB2YWx1ZVxyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICAgIC8vRmluZCB0aGUgbmV4dCBvbmVcclxuICAgICAgICAgIGluZGV4ID0gYXZzLmF0dHJpYnV0ZVZhbHVlcy5maW5kSW5kZXgoKGF2KT0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9BZGQgYWxsIHRoZSBjdXJyZW50IHZhbHVlc1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlVmFsdWVHcmlkUm93LmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYXZzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKGF0dHJpYnV0ZVZhbHVlR3JpZFJvdy5hdHRyaWJ1dGVWYWx1ZXNbaV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9SZW1vdmUgdGhlIHNsaWNlZCBhbmQgdXBkYXRlZCB2YWx1ZXMgZm9yIHRoZSBncmlkIHJvd1xyXG4gICAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzID0gdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdikgPT4gYXYuZ3JvdXBBdHRyaWJ1dGVSb3dJZCAhPT0gZ3JvdXBBdHRyaWJ1dGVSb3dJZCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzID0gIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5maWx0ZXIoKGF2KSA9PiBhdi5ncm91cEF0dHJpYnV0ZVJvd0lkICE9PSBncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QubmV4dChhdnMpO1xyXG4gICAgICAgIHRoaXMuZ3JpZFJvd1NhdmVkLm5leHQoYXR0cmlidXRlVmFsdWVHcmlkUm93KTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZUdyaWRSb3dBdHRyaWJ1dGVWYWx1ZXMoaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYXR0cmlidXRlRW5kcG9pbnQgKyBcImF0dHJpYnV0ZS12YWx1ZS1ncmlkLXJvdy9cIiA7XHJcblxyXG4gICAgbGV0IGFjOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uID0gdGhpcy5hdHRyaWJ1dGVDb25maWd1cmF0aW9uU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG5cclxuICAgIGxldCBxdWVyeVBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgIC5zZXQoXCJjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XCIsIGFjLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQpXHJcbiAgICAuc2V0KFwiY29kZUF0dHJpYnV0ZUNvbnRleHRcIiwgYWMuY29kZUF0dHJpYnV0ZUNvbnRleHQpXHJcbiAgICAuc2V0KFwiaWRQYXJlbnRPYmplY3RcIiwgKHRoaXMuaWRQYXJlbnRPYmplY3QpP3RoaXMuaWRQYXJlbnRPYmplY3QudG9TdHJpbmcoKTpcIlwiKTtcclxuXHJcbiAgICBsZXQgYXZncjpBdHRyaWJ1dGVWYWx1ZUdyaWRSb3cgPSA8QXR0cmlidXRlVmFsdWVHcmlkUm93PntcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogaWRHcm91cEF0dHJpYnV0ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGF0dHJpYnV0ZVZhbHVlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIHVybCwge2JvZHk6IGF2Z3IsIHBhcmFtczogcXVlcnlQYXJhbXN9KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cclxuICAgICAgLy9SZW1vdmUgdGhlIGdyaWQgcm93IGZyb20gdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSB2YWx1ZXNcclxuICAgICAgbGV0IGF2czpBdHRyaWJ1dGVWYWx1ZVNldCA9IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgICAgIGF2cy5hdHRyaWJ1dGVWYWx1ZXMgPSBhdnMuYXR0cmlidXRlVmFsdWVzLmZpbHRlcigoYXYpID0+IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgIT09IGdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5uZXh0KGF2cyk7XHJcbiAgICAgIHRoaXMuZ3JpZFJvd0RlbGV0ZWQubmV4dChhdmdyKTtcclxuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgIH0sXHJcbiAgICAoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYW4gYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgbWFwLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqL1xyXG4gIHB1c2hBdHRyaWJ1dGUoYXR0cmlidXRlOiBBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlTWFwLnNldChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUsIGF0dHJpYnV0ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlTXVsdGlDaG9pY2UoYXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKTogdm9pZCB7XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBpZiBwcmVzZW50XHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0uaWRBdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlICYmIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvL1JlbW92ZSBmcm9tIHNsaWNlZCBhdHRyaWJ1dGUgdmFsdWVzIChubyBsb25nZXIgcmVtb3ZpbmcpXHJcbiAgICBpZiAoaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL090aGVyd2lzZSBwdXNoIHRoZSB2YWx1ZSwgc28gaXQgd2lsbCBiZSBzYXZlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1c2hBdHRyaWJ1dGVWYWx1ZU11bHRpRGljdChhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUpOiB2b2lkIHtcclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGlmIHByZXNlbnRcclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlVmFsdWUuaWRBdHRyaWJ1dGUgJiYgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5KSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vUmVtb3ZlIGZyb20gc2xpY2VkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vIGxvbmdlciByZW1vdmluZylcclxuICAgIGlmIChpIDwgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2xpY2VkQXR0cmlidXRlVmFsdWVzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICAgIC8vT3RoZXJ3aXNlIHB1c2ggdGhlIHZhbHVlLCBzbyBpdCB3aWxsIGJlIHNhdmVkXHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5wdXNoQXR0cmlidXRlVmFsdWUoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHVzaCBhIG5ldyBvciB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSBjdXJyZW50IG9uZSBpcyBqdXN0IHJlbW92ZWQgYW5kIHRoZSBuZXcgb25lIGFwcGVuZGVkIHRvIHRoZSBhcnJheS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWV9IGF0dHJpYnV0ZVZhbHVlXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZVZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJwdXNoQXR0cmlidXRlVmFsdWVcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUgPT09IGF0dHJpYnV0ZVZhbHVlLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZVB1c2hlZFN1YmplY3QubmV4dChhdHRyaWJ1dGVWYWx1ZSk7XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZVZhbHVlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIHB1c2hpbmcgbXVsdGlwbGUgYXR0cmlidXRlIHZhbHVlcyBhdCBvbmNlLiAgVGhpcyB3b3VsZCB0eXBpY2FsbHkgYmUgZm9yIGEgbXVsdGkgY2hvaWNlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlVmFsdWVbXX0gYXR0cmlidXRlVmFsdWVzXHJcbiAgICovXHJcbiAgcHVzaEF0dHJpYnV0ZVZhbHVlcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlVmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcInB1c2hBdHRyaWJ1dGVWYWx1ZXNcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoYXR0cmlidXRlVmFsdWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgajogbnVtYmVyID0gMDtcclxuICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGUgIT09IGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0uaWRBdHRyaWJ1dGVWYWx1ZSA9PT0gYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlVmFsdWUpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoaiA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXNbal0gPSBhdHRyaWJ1dGVWYWx1ZXNbaV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Pbmx5IHNldHRpbmcgZGlydHkgZm9yIG5vbiBncmlkLXJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1c2ggYSB2YWx1ZSBpbiB0aGUgY2FzZSB3aGVyZSBhbiBhdHRyaWJ1dGUgdmFsdWUgZG9lc24ndCBleGlzdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlfSBhdHRyaWJ1dGVcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKi9cclxuICBwdXNoVmFsdWUoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBhdHRyaWJ1dGVWYWx1ZTogQXR0cmlidXRlVmFsdWUgPSA8QXR0cmlidXRlVmFsdWU+e1xyXG4gICAgICBpZEF0dHJpYnV0ZTogYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmlkQXR0cmlidXRlVmFsdWVTZXRcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiVFhUXCIpIHtcclxuICAgICAgYXR0cmlidXRlVmFsdWUudmFsdWVMb25nVGV4dCA9IHtcclxuICAgICAgICBpZExvbmdUZXh0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dERhdGE6IHZhbHVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzLnB1c2goYXR0cmlidXRlVmFsdWUpO1xyXG4gICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFR5cGljYWxseSBpbiB0aGUgY2FzZSBvZiBhIG11bHRpIHNlbGVjdCB3aGVyZSB0aGUgdW5zZWxlY3RlZCB2YWx1ZSBpcyByZW1vdmVkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGV9IGF0dHJpYnV0ZVxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ2hvaWNlfSBhdHRyaWJ1dGVDaG9pY2VcclxuICAgKi9cclxuICBzcGxpY2VBdHRyaWJ1dGVWYWx1ZUNob2ljZShhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgYXR0cmlidXRlQ2hvaWNlOiBBdHRyaWJ1dGVDaG9pY2UpOiB2b2lkIHtcclxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwic2xpY2VBdHRyaWJ1dGVWYWx1ZTogXCIgKyBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgKyBcIiwgXCIgKyBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgJiYgdGhpcy51cGRhdGVkQXR0cmlidXRlVmFsdWVzW2ldLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlID09PSBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPT09IGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgICAgdGhpcy5zbGljZWRBdHRyaWJ1dGVWYWx1ZXMucHVzaCh0aGlzLmF0dHJpYnV0ZVZhbHVlU2V0U3ViamVjdC5nZXRWYWx1ZSgpLmF0dHJpYnV0ZVZhbHVlc1tpXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL09ubHkgZmxhZ2dpbmcgZGlydHkgZm9yIG5vbi1ncmlkIHJvd3MgKHRob3NlIGFyZSBzYXZlZCBpbW1lZGlhdGVseSlcclxuICAgIGlmICghIGF0dHJpYnV0ZS5pZEdyb3VwQXR0cmlidXRlKSB7XHJcbiAgICAgIHRoaXMuZGlydHkubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYW4gYXR0cmlidXRlIHZhbHVlLiAgVHlwaWNhbGx5IGluIHRoZSBjYXNlIG9mIGEgbXVsdGkgc2VsZWN0IHdoZXJlIHRoZSB1bnNlbGVjdGVkIHZhbHVlIGlzIHJlbW92ZWQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0F0dHJpYnV0ZX0gYXR0cmlidXRlXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDaG9pY2V9IGF0dHJpYnV0ZUNob2ljZVxyXG4gICAqL1xyXG4gIHNwbGljZUF0dHJpYnV0ZVZhbHVlRGljdChhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJzbGljZUF0dHJpYnV0ZVZhbHVlOiBcIiArIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSArIFwiLCBcIiArIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS5pZEF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlLmlkQXR0cmlidXRlICYmIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlc1tpXS52YWx1ZUlkRGljdGlvbmFyeSA9PT0gdmFsdWUpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgZnJvbSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMgKG5vdCBwcmV2aW91c2x5IHNhdmVkKVxyXG4gICAgaWYgKGkgPCB0aGlzLnVwZGF0ZWRBdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlZEF0dHJpYnV0ZVZhbHVlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZCB0byBzbGljZWQgdmFsdWVzIChwcmV2aW91c2x5IHNhdmVkIC0gbmVlZCB0byByZW1vdmUpXHJcbiAgICBlbHNlIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldLmlkQXR0cmlidXRlID09PSBhdHRyaWJ1dGUuaWRBdHRyaWJ1dGVcclxuICAgICAgICAgICAgJiYgdGhpcy5hdHRyaWJ1dGVWYWx1ZVNldFN1YmplY3QuZ2V0VmFsdWUoKS5hdHRyaWJ1dGVWYWx1ZXNbaV0udmFsdWVJZERpY3Rpb25hcnkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLnNsaWNlZEF0dHJpYnV0ZVZhbHVlcy5wdXNoKHRoaXMuYXR0cmlidXRlVmFsdWVTZXRTdWJqZWN0LmdldFZhbHVlKCkuYXR0cmlidXRlVmFsdWVzW2ldKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vT25seSBmbGFnZ2luZyBkaXJ0eSBmb3Igbm9uLWdyaWQgcm93cyAodGhvc2UgYXJlIHNhdmVkIGltbWVkaWF0ZWx5KVxyXG4gICAgaWYgKCEgYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUpIHtcclxuICAgICAgdGhpcy5kaXJ0eS5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBhdHRyaWJ1dGUgYmFzZWQgdXBvbiB0aGUgaWRBdHRyaWJ1dGUuICBUaGlzIGlzIGZyb20gdGhlIG1hcCBvZiBhdHRyaWJ1dGVzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGlkQXR0cmlidXRlXHJcbiAgICogQHJldHVybnMge0F0dHJpYnV0ZX1cclxuICAgKi9cclxuICBnZXRBdHRyaWJ1dGUoaWRBdHRyaWJ1dGU6IG51bWJlcik6IEF0dHJpYnV0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXAuZ2V0KGlkQXR0cmlidXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciB0aGUgYXR0cmlidXRlIGNvbmZpZ3VyYXRpb24sIHNldCBhbGwgb2YgdGhlIG5lZ2F0aXZlIGlkcyB0byB1bmRlZmluZWQgcHJpb3IgdG8gcG9zdGluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7QXR0cmlidXRlQ29uZmlndXJhdGlvbn0gYXR0cmlidXRlQ29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHNldE5lZ2F0aXZlSWRzVG9VbmRlZmluZWQoYXR0cmlidXRlQ29uZmlndXJhdGlvbjogQXR0cmlidXRlQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKGF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uaWRBdHRyaWJ1dGVDb25maWd1cmF0aW9uIDwgMCkge1xyXG4gICAgICBhdHRyaWJ1dGVDb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGVDb250YWluZXIgb2YgYXR0cmlidXRlQ29uZmlndXJhdGlvbi5hdHRyaWJ1dGVDb250YWluZXJzKSB7XHJcbiAgICAgIGlmIChhdHRyaWJ1dGVDb250YWluZXIuaWRBdHRyaWJ1dGVDb250YWluZXIgIDwgMCkge1xyXG4gICAgICAgIGF0dHJpYnV0ZUNvbnRhaW5lci5pZEF0dHJpYnV0ZUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZUNvbnRhaW5lci5ncmFwaGljYWxBdHRyaWJ1dGVzKSB7XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUuaWRBdHRyaWJ1dGUgIDwgMCkge1xyXG4gICAgICAgICAgYXR0cmlidXRlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5hdHRyaWJ1dGVDaG9pY2VzKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBhdHRyaWJ1dGVDaG9pY2Ugb2YgYXR0cmlidXRlLmF0dHJpYnV0ZUNob2ljZXMpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZVtcInZhbHVlXCJdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZSAgPCAwKSB7XHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgIDwgMCkge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZUNob2ljZS5pZEF0dHJpYnV0ZUNob2ljZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBjb250ZXh0IGNvZGUgYW5kIGlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVDb25maWd1cmF0aW9ufSBjb25maWd1cmF0aW9uXHJcbiAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgKi9cclxuICBnZXRDb25maWd1cmF0aW9uTmFtZShjb25maWd1cmF0aW9uOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uRFRPKTogc3RyaW5nIHtcclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbiA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIFwiTmV3XCI7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IGNvbmZpZ3VyYXRpb24uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dERpc3BsYXkgKyBcIjogXCIgKyBjb25maWd1cmF0aW9uLmV4dGVuc2lvbkRlc2NyaXB0aW9uO1xyXG5cclxuICAgIGlmIChjb25maWd1cmF0aW9uLmlkRmlsdGVyMSkge1xyXG4gICAgICBuYW1lICs9IFwiIC0gXCIgKyBjb25maWd1cmF0aW9uLmZpbHRlcjFEaXNwbGF5O1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZ3VyYXRpb24uaWRGaWx0ZXIyKSB7XHJcbiAgICAgIG5hbWUgKz0gXCIgLSBcIiArIGNvbmZpZ3VyYXRpb24uZmlsdGVyMkRpc3BsYXk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIGdldEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8oY2ZnOiBBdHRyaWJ1dGVDb25maWd1cmF0aW9uKTogQXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTyB7XHJcbiAgICBpZiAoIWNmZykge1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkdG86IEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25EVE8gPSA8QXR0cmlidXRlQ29uZmlndXJhdGlvbkRUTz57XHJcbiAgICAgIGlkQXR0cmlidXRlQ29uZmlndXJhdGlvbjogY2ZnLmlkQXR0cmlidXRlQ29uZmlndXJhdGlvbixcclxuICAgICAgY29kZUF0dHJpYnV0ZUNvbnRleHQ6IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dCxcclxuICAgICAgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHQsXHJcbiAgICAgIGlkRmlsdGVyMTogY2ZnLmlkRmlsdGVyMSxcclxuICAgICAgaWRGaWx0ZXIyOiBjZmcuaWRGaWx0ZXIyXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGR0by5leHRlbnNpb25EZXNjcmlwdGlvbiA9IHRoaXMuYXR0cmlidXRlQ29udGV4dExpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChjdHg6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBjdHguY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNmZy5jb2RlQXR0cmlidXRlQ29udGV4dDtcclxuICAgICAgfSlbMF0uZXh0ZW5zaW9uRGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKSkge1xyXG4gICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IHRoaXMuYXR0cmlidXRlU2VjdXJpdHlDb250ZXh0TGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjZmcuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgICAgfSk7XHJcbiAgICAgIGR0by5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0RGlzcGxheSA9IChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApID8gcmVzdWx0WzBdLmRlc2NyaXB0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjFMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIxTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjE7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMURpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmZpbHRlcjJMaXN0U3ViamVjdC5nZXRWYWx1ZSgpKSB7XHJcbiAgICAgIGxldCByZXN1bHQ6IGFueVtdID0gdGhpcy5maWx0ZXIyTGlzdFN1YmplY3QuZ2V0VmFsdWUoKS5maWx0ZXIoKGZpbHRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlQ29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgICAmJiBmaWx0ZXIuY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY2ZnLmNvZGVBdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjEgPT09IGNmZy5pZEZpbHRlcjFcclxuICAgICAgICAgICYmIGZpbHRlci5pZEZpbHRlcjIgPT09IGNmZy5pZEZpbHRlcjI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBkdG8uZmlsdGVyMkRpc3BsYXkgPSAocmVzdWx0ICYmIHJlc3VsdC5sZW5ndGggPiAwKSA/IHJlc3VsdFswXS5kaXNwbGF5IDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkdG87XHJcbiAgfVxyXG5cclxuICBnZXRTZWN1cml0eUNvZGVDb250ZXh0KGNvZGU6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVTZWN1cml0eUNvbnRleHRMaXN0U3ViamVjdC5nZXRWYWx1ZSgpLmZpbHRlcigoZmlsdGVyOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGZpbHRlci5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlO1xyXG4gICAgfSlbMF07XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVDb250ZXh0TG9hZGluZ1N1YmplY3QoKTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZUNvbnRleHRMb2FkaW5nU3ViamVjdDtcclxuICB9XHJcblxyXG4gIGdldEZpbHRlcjFGb3IoY29kZUF0dHJpYnV0ZUNvbnRleHQ6IHN0cmluZywgY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDogc3RyaW5nKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMUxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0ICYmIGl0ZW0uY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dCA9PT0gY29kZUF0dHJpYnV0ZVNlY3VyaXR5Q29udGV4dDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyMkZvcihjb2RlQXR0cmlidXRlQ29udGV4dDogc3RyaW5nLCBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0OiBzdHJpbmcsIGlkRmlsdGVyMTogbnVtYmVyKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyMkxpc3RTdWJqZWN0LmdldFZhbHVlKCkuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW0uY29kZUF0dHJpYnV0ZUNvbnRleHQgPT09IGNvZGVBdHRyaWJ1dGVDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5jb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0ID09PSBjb2RlQXR0cmlidXRlU2VjdXJpdHlDb250ZXh0XHJcbiAgICAgICAgJiYgaXRlbS5pZEZpbHRlcjEgPT09IGlkRmlsdGVyMTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgbmV3IGlkQXR0cmlidXRlVmFsdWVzIHZpYSBhIG5lZ2F0aXZlIG51bWJlciBmb3IgaW50ZXJuYWwgdHJhY2tpbmcuICBSZW1vdmUgdGhpcyBmYWtlIGlkIHByaW9yIHRvIHBvc3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAqL1xyXG4gIGdldFVuaXF1ZUlkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gLS10aGlzLnVuaXF1ZUlkO1xyXG4gIH1cclxufVxyXG4iXX0=