@smartbit4all/ng-client 6.0.54 → 6.0.56

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 (21) hide show
  1. package/esm2022/lib/smart-client/smart-component-api-client.mjs +4 -1
  2. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +22 -1
  3. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +25 -23
  4. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +5 -1
  5. package/esm2022/lib/smart-filter-editor/project.mjs +2 -1
  6. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +1 -1
  7. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +8 -3
  8. package/esm2022/lib/smart-filter-editor/smart-filter-widget/smart-filter-widget.component.mjs +58 -0
  9. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +8 -5
  10. package/fesm2022/smartbit4all-ng-client.mjs +870 -785
  11. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  12. package/lib/smart-component-layout/smart-component-layout-utility.d.ts +6 -0
  13. package/lib/smart-component-layout/smart-component-layout.component.d.ts +6 -4
  14. package/lib/smart-component-layout/smart-component-layout.module.d.ts +4 -3
  15. package/lib/smart-filter-editor/project.d.ts +1 -0
  16. package/lib/smart-filter-editor/smart-filter-editor.module.d.ts +9 -8
  17. package/lib/smart-filter-editor/smart-filter-widget/smart-filter-widget.component.d.ts +23 -0
  18. package/lib/smart-form/smartfileuploader/smartfileuploader.component.d.ts +1 -1
  19. package/package.json +1 -1
  20. package/smartbit4all-ng-client-6.0.56.tgz +0 -0
  21. package/smartbit4all-ng-client-6.0.54.tgz +0 -0
@@ -354,6 +354,9 @@ export class SmartComponentApiClient {
354
354
  }
355
355
  getAllSmartFilterEditorContentComponents() {
356
356
  let filters = this.getSmartFilterEditorContentComponentsQL()?.toArray() ?? [];
357
+ this.getSmartComponentLayoutsQL()?.forEach((comp) => {
358
+ filters.push(...SmartComponentLayoutUtility.getFilters(comp));
359
+ });
357
360
  return filters;
358
361
  }
359
362
  getAllSmartUiActionToolbars() {
@@ -944,4 +947,4 @@ export class SmartComponentApiClient {
944
947
  this.model.constraints = changes[changeKey];
945
948
  }
946
949
  }
947
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY29tcG9uZW50LWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1jbGllbnQvc21hcnQtY29tcG9uZW50LWFwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUE4QyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFFTCwyQkFBMkIsR0FDNUIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwwRkFBMEYsQ0FBQztBQUM3SSxPQUFPLEVBR0wsbUJBQW1CLEVBR25CLGVBQWUsR0FDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBQ2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUlMLGNBQWMsRUFHZCx1QkFBdUIsRUFHdkIseUJBQXlCLEVBR3pCLGVBQWUsR0FJaEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHVCQUF1QixHQUN4QixNQUFNLDRDQUE0QyxDQUFDO0FBRXBELE1BQU0sT0FBZ0IsdUJBQXVCO0lBZTNDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBd0I7UUFDL0IsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDbEQsMkJBQTJCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3JDLElBQUksR0FBRyxZQUFZLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3RDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxRCxDQUFDO2lCQUFNLElBQUksR0FBRyxZQUFZLGlDQUFpQyxFQUFFLENBQUM7Z0JBQzVELEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3pFLENBQUM7aUJBQU0sSUFBSSxHQUFHLFlBQVkscUJBQXFCLEVBQUUsQ0FBQztnQkFDaEQsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUN4RCxpREFBaUQ7Z0JBQ2pELDZEQUE2RDtZQUMvRCxDQUFDO2lCQUFNLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsR0FBRywrQkFBK0IsQ0FBQyxDQUFDO1lBQzlFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFpQztRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUVwQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBSUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxLQUFvQjtRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFtQkQsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQVcsZ0JBQWdCLENBQUMsZ0JBQXFEO1FBQy9FLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztJQUM1QyxDQUFDO0lBWUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxLQUFjO1FBQzlCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztZQUM3QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFhRCxZQUNZLE1BQWdCLEVBQ2hCLFFBQWlCLEVBQ2pCLGNBQXVCLEVBQ3ZCLE9BQW9CLEVBQ3BCLFFBQW9CO1FBSnBCLFdBQU0sR0FBTixNQUFNLENBQVU7UUFDaEIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixtQkFBYyxHQUFkLGNBQWMsQ0FBUztRQUN2QixZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVk7UUF6SXRCLGNBQVMsR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVEzQyxpQkFBWSxHQUF1QyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFJbEYseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBNER6QyxtQkFBYyxHQUFvQixFQUFFLENBQUM7UUFFckMsZ0JBQVcsR0FBa0IsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBeUJyRSxvQkFBb0I7UUFDcEIsWUFBTyxHQUdILElBQUksR0FBRyxFQUFFLENBQUM7UUFFZCxnQkFBVyxHQUFnRCxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTdELG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBY3ZDLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUV6Qyw0QkFBdUIsR0FBYSxFQUFFLENBQUM7UUFDdkMsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBRXhCLDZCQUF3QixHQUFHLElBQUksR0FBRyxFQUEyQyxDQUFDO1FBRTlFLDhCQUF5QixHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO1FBV3JFLCtCQUErQjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQztZQUN2QyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLElBQUksS0FBSyxDQUNiLGFBQWEsUUFBUSx3QkFBd0IsY0FBYyxrQkFBa0IsQ0FDOUUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0Qsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBNEIsRUFBRSxFQUFFO1lBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sY0FBYyxDQUFDLElBQVksSUFBUyxDQUFDO0lBRS9DLGdCQUFnQjtRQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQ3pELENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ2hFLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdCLENBQUM7b0JBQ0QsMkJBQTJCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzFELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FDN0IsQ0FBQztvQkFDRixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3dCQUM5QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ25CLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEMsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCw4QkFBOEI7Z0JBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDaEUsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7b0JBQ3JDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDakQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3JELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO29CQUNyQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQzlDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNyRCxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNULElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNuQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzdCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQ0FDdkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNyQixDQUFDO3dCQUNILENBQUM7d0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7d0JBQ3hCLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDbEQsR0FBRyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7b0JBQzFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDeEMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUN2QixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsdUNBQXVDLEVBQUUsRUFBRSxDQUFDO2dCQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDdEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxFQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDbkYsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDZixJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs0QkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUNyQyxJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDOzRCQUNqQyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzs0QkFDM0MsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0NBQ2xFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQ0FDckUsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0NBQ2xFLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dDQUNuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0NBQ3JCLENBQUM7Z0NBQ0gsQ0FBQyxDQUFDLENBQUM7NEJBQ0wsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxJQUF3QjtRQUMvQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUM7WUFDNUUsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDckMsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxVQUE2QztRQUN2RSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2QixJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDcEMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFUyxxQkFBcUIsQ0FBSSxFQUFnQixFQUFFLE9BQW1CO1FBQ3RFLE9BQU8sRUFBRSxDQUFDO1FBQ1YsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFUyxlQUFlLENBQUksRUFBZ0IsRUFBRSxPQUF3QjtRQUNyRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoQyxFQUFFLENBQUMsT0FBTzthQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQy9CLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUUsSUFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQXNCUyxVQUFVO1FBU2xCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksT0FBTyxHQVFQLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMseUJBQXlCLEVBQUU7aUJBQzdCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbEUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEUscUVBQXFFO1lBQ3JFLG1GQUFtRjtZQUNuRixrRkFBa0Y7WUFDbEYsNkRBQTZEO1lBQzdELDhFQUE4RTtZQUM5RSxxRkFBcUY7WUFDckYsSUFBSSxDQUFDLHlCQUF5QixFQUFFO2lCQUM3QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2lCQUNoQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyx3Q0FBd0MsRUFBRTtpQkFDNUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDckUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtpQkFDNUIsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztpQkFDakMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsNEJBQTRCLEVBQUU7aUJBQ2hDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7aUJBQ3pDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbEUsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzNDLG9DQUFvQztvQkFDcEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQix3QkFBd0I7SUFDMUIsQ0FBQztJQUVTLHlCQUF5QjtRQUNqQyxJQUFJLEtBQUssR0FBeUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMxRSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUyx5QkFBeUI7UUFDakMsSUFBSSxLQUFLLEdBQXlCLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRVMsd0JBQXdCO1FBQ2hDLE1BQU0sSUFBSSxHQUE2QixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzdFLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVTLDRCQUE0QjtRQUNwQyxNQUFNLElBQUksR0FBaUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3JGLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVTLHlCQUF5QjtRQUNqQyxJQUFJLEtBQUssR0FDUCxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3BCLEVBQUUsT0FBTyxFQUFFO2FBQ1YsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVTLHdDQUF3QztRQUNoRCxJQUFJLE9BQU8sR0FDVCxJQUFJLENBQUMsdUNBQXVDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEUsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVTLDJCQUEyQjtRQUNuQyxJQUFJLFFBQVEsR0FBK0IsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzlGLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2pELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xELFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUM5QixFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3RDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDO2FBQzlELE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFtQyxDQUFDLENBQUMsQ0FBQztRQUU1RSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRVMsNEJBQTRCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHdDQUF3QyxFQUFFO2FBQ25ELE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ2xCLE1BQU0sQ0FBQyxlQUFlLEVBQUUsUUFBUSxLQUFLLFNBQVM7WUFDNUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRTtZQUNoRCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUN4QzthQUNBLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDO2FBQzlELEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBbUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFXLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWtCLEVBQUUsRUFBRTtnQkFDbEUsT0FBTztvQkFDTCxZQUFZLEVBQUUsSUFBSTtvQkFDbEIsUUFBUTtpQkFDVCxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN2RCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxNQUFNLENBQy9ELENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FDN0QsQ0FBQztZQUNGLElBQUksYUFBYSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1lBQ3ZELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0IsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxvQkFBb0IsR0FBb0IsRUFBRSxDQUFDO1lBQy9DLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxXQUFXLEdBQWdDLG9CQUFvQixDQUFDO2dCQUNwRSxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDeEMsSUFBSSxTQUFTLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUM5QyxXQUFXLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pCLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQztnQkFDckMsQ0FBQztnQkFDRCxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztZQUUzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQztpQkFDOUQsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLFFBQW9DLEVBQ3BDLGlCQUE2QyxFQUM3QyxhQUEyQztRQUUzQyxNQUFNLGFBQWEsR0FBb0IsRUFBRSxDQUFDO1FBRTFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUcsQ0FBQyxDQUFDO1lBQ3hELGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNwQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBRztRQUNQLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNsQyxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQWtCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ3ZELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNoRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sS0FBSyxDQUFDLEtBQUs7UUFDakIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxHQUFHLFlBQVksdUJBQXVCLEVBQUUsQ0FBQztnQkFDM0MsbUVBQW1FO2dCQUNuRSxpRUFBaUU7Z0JBQ2pFLDJEQUEyRDtnQkFDM0QseUNBQXlDO2dCQUN6QyxPQUFPLENBQUMsS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7Z0JBQ3ZFLE9BQU87WUFDVCxDQUFDO1lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQywyREFBMkQsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyx3RkFBd0Y7UUFDeEYsMEZBQTBGO1FBQzFGLHdGQUF3RjtRQUN4RixNQUFNLElBQUksR0FDUixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsQ0FBQztRQUM1RixxQ0FBcUM7UUFDckMsNkJBQTZCO1FBQzdCLHVCQUF1QjtRQUN2Qix3QkFBd0I7UUFDeEIsTUFBTTtRQUNOLHVEQUF1RDtRQUN2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFPLENBQUMsTUFBeUIsQ0FBQztRQUMvQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBa0IsRUFBRSxPQUFnQztRQUN4RSxNQUFNLGFBQWEsR0FBRztZQUNwQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxHQUFXLEVBQUUsZUFBZ0M7UUFDdEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFUyxhQUFhLENBQUMsZUFBZ0M7UUFDdEQsT0FBTyxlQUFlLEtBQUssZUFBZSxDQUFDLGdCQUFnQjtZQUN6RCxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QjtZQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQzlCLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxHQUFXO1FBQ3ZDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFUyx1QkFBdUIsQ0FDL0IsS0FBK0IsRUFDL0IsZUFBZ0M7UUFFaEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDbkIsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHO2dCQUNmLEtBQUssRUFBRSxJQUFJO2dCQUNYLE1BQU0sRUFBRTtvQkFDTixJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUs7aUJBQ2xCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFUywwQkFBMEIsQ0FBQyxJQUFtQztRQUN0RSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLG9CQUFvQixDQUFDLElBQXdCO1FBQ3JELElBQUksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEMsSUFDRSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxHQUFHO2dCQUN0RCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxhQUFhO2dCQUNoRSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxtQkFBbUI7Z0JBQ3RFLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUFDLGtCQUFrQixFQUNyRSxDQUFDO2dCQUNELE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyx1QkFBdUIsQ0FBQyxJQUF3QjtRQUN4RCxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN6QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDZixJQUNFLE1BQU0sQ0FBQyxlQUFlLEtBQUssZUFBZSxDQUFDLGdCQUFnQjtvQkFDM0QsTUFBTSxDQUFDLGVBQWUsS0FBSyxlQUFlLENBQUMsSUFBSSxFQUMvQyxDQUFDO29CQUNELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDdEUsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdDLElBQUksdUJBQXVCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QjtpQkFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQy9CLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNuQixJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsNEJBQTRCO2lCQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDL0IsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsdUJBQXVCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7SUFDSCxDQUFDO0lBRU0sNkJBQTZCLENBQUMsYUFBa0M7UUFDckUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDakYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFNUQsaUNBQWlDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzt3QkFDekMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksdUJBQXVCLEdBQTJCO1lBQ3BELGdCQUFnQixFQUFFLEVBQUU7WUFDcEIsaUJBQWlCLEVBQUUsRUFBRTtTQUN0QixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsQ0FDakQsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBRUQsT0FBTyx1QkFBdUIsQ0FBQztJQUNqQyxDQUFDO0lBRVMsWUFBWSxDQUNwQixJQUFvQyxFQUNwQyx1QkFBK0M7UUFFL0MsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDbkQsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUNuRCxDQUFDO1lBQ0YsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDcEQsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUI7SUFDckIsbUJBQW1CLENBQUMsUUFBa0I7UUFDcEMsT0FBTztZQUNMLFdBQVcsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLEVBQUU7U0FDakIsQ0FBQztJQUNKLENBQUM7SUFDRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBaUI7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixlQUFnQyxFQUNoQyxRQUFpQixFQUNqQixNQUFlO1FBRWYsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEQsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNuRCxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFNUMsa0NBQWtDO1lBRWxDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRixDQUFDO2lCQUFNLElBQUksZ0JBQWdCLElBQUksSUFBSSxJQUFJLGdCQUFnQixJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNyRSxJQUFJLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUMvRCxJQUFJLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7Z0JBRWpELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLFlBQVksR0FBVSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztnQkFFNUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO29CQUMxQixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO29CQUV6RSxNQUFNLGdCQUFnQixHQUNwQixPQUFPLFlBQVksS0FBSyxRQUFRO3dCQUNoQyxZQUFZLEdBQUcsQ0FBQzt3QkFDaEIsWUFBWSxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUM7b0JBRXRDLElBQUksZUFBZSxJQUFJLGdCQUFnQixFQUFFLENBQUM7d0JBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7d0JBQzNCLFlBQVksR0FBRyxFQUFFLENBQUM7d0JBQ2xCLGdCQUFnQixHQUFHLENBQUMsQ0FBQztvQkFDdkIsQ0FBQztvQkFFRCxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN4QixnQkFBZ0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNoQyxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztnQkFFRCxPQUFPLENBQUMsT0FBTyxDQUNiLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNkLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQywyQkFBMkIsQ0FDaEQsSUFBSSxDQUFDLElBQUssRUFDVixlQUFlLEVBQ2YsS0FBSyxFQUNMLEtBQUssQ0FDTixDQUNKLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUNoRCxJQUFJLENBQUMsSUFBSyxFQUNWLGVBQWUsRUFDZixLQUFLLEVBQ0wsS0FBSyxDQUNOLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzlCLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDN0MsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM1RixDQUFDO2FBQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNwQixrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN4RixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVTLHNCQUFzQixDQUFDLGVBQWdDO1FBQy9ELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLHNCQUFzQixDQUFDLE1BQThCO1FBQzFELElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2Qix1QkFBdUI7WUFDdkIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsNkJBQTZCO0lBQzdCLHVCQUF1QjtJQUN2QixtQ0FBbUM7SUFDbkMsa0JBQWtCO0lBQ2xCLHVDQUF1QztJQUN2QyxPQUFPO0lBQ1AsZ0VBQWdFO0lBQ2hFLElBQUk7SUFFSixtQ0FBbUMsQ0FDakMsUUFBa0IsRUFDbEIsZUFBZ0M7UUFFaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxZQUFZO0lBRVo7O09BRUc7SUFDSSxXQUFXLENBQUMsUUFBaUI7UUFDbEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pELElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVNLE9BQU8sQ0FDWixTQUFvQixFQUNwQixPQUFvQixFQUNwQixnQkFBMEIsRUFDMUIsa0JBQXVDO1FBRXZDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNqRCxTQUFTLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1FBQ3JFLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRWhELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsU0FBUyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxPQUFPLENBQ1osV0FBbUIsRUFDbkIsU0FBb0IsRUFDcEIsa0JBQXVDO1FBRXZDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDeEQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsNENBQTRDO1FBRTVDLGdEQUFnRDtRQUNoRCx1Q0FBdUM7UUFDdkMsOERBQThEO1FBQzlELDhDQUE4QztRQUM5QyxVQUFVO1FBQ1YsSUFBSTtRQUVKLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxNQUFjO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQWM7UUFDckMsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckYsMkVBQTJFO1FBQzNFLCtFQUErRTtRQUMvRSwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFTSxlQUFlLENBQ3BCLFlBQW9CLEVBQ3BCLFdBQXNCLEVBQ3RCLFNBQWtCLEVBQ2xCLFVBQW9CO1FBRXBCLE9BQU87WUFDTCxZQUFZO1lBQ1osY0FBYyxFQUFFLElBQUk7WUFDcEIsV0FBVztZQUNYLFVBQVU7WUFDVixTQUFTO1NBQ1YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFNLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNsQixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdEIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUE2QixtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRixPQUFPLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRCx5QkFBeUI7SUFDakIsa0JBQWtCLENBQUMsV0FBcUM7UUFDOUQsSUFBSSxVQUFzQixDQUFDO1FBQzNCLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxVQUFVLEdBQUc7Z0JBQ1gsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUztnQkFDckYsTUFBTTtnQkFDTixNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEMsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxHQUFHO2dCQUNYLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVM7Z0JBQ3JGLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRztnQkFDdkIsTUFBTSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQyxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVTLGFBQWEsQ0FBQyxNQUE0QjtRQUNsRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQy9CLGVBQWU7Z0JBQ2YsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsSUFBSSx1QkFBdUIsR0FBRyxLQUFLLENBQUM7WUFDcEMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBaUIsRUFBRSxFQUFFO29CQUM3QyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDNUMsQ0FBQzt5QkFBTSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQzt3QkFDbkUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDOUMsQ0FBQzt5QkFBTSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO3dCQUM1RSxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUN2RCxDQUFDO3lCQUFNLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO3dCQUN2RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNoRCxDQUFDO3lCQUFNLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUM5QyxDQUFDO3lCQUFNLElBQUksU0FBUyxLQUFLLGFBQWEsRUFBRSxDQUFDO3dCQUN2QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNsRCxDQUFDO3lCQUFNLElBQUksU0FBUyxLQUFLLEVBQUUsRUFBRSxDQUFDO3dCQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQW1CLENBQUM7d0JBQzNDLHVCQUF1QixHQUFHLElBQUksQ0FBQztvQkFDakMsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBdUIsQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUF1QixDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBRVMsbUJBQW1CLENBQUMsY0FBd0IsRUFBRSxXQUFvQixLQUFLO1FBQy9FLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQyxJQUFJLFNBQVMsWUFBWSxrQkFBa0IsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksU0FBUyxZQUFZLGdCQUFnQixFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDZCxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksU0FBUyxZQUFZLGlDQUFpQyxFQUFFLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEMsNERBQTREO2dCQUM1RCxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN6QixHQUFHO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFNBQVMsWUFBWSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNsRCxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsQ0FBQztpQkFBTSxJQUFJLFNBQVMsWUFBWSxxQkFBcUIsRUFBRSxDQUFDO2dCQUN0RCxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsQ0FBQztpQkFBTSxJQUFJLENBQUMsUUFBUSxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEQsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9ELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBVSxFQUFFLEdBQVcsRUFBRSxLQUFVO1FBQ3hELElBQUksWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEMsSUFBSSxTQUFTLEdBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLFNBQWMsQ0FBQztRQUVuQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3pELFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0IsSUFDRSxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxRQUFRO2dCQUNsRCxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxTQUFTO2dCQUNuRCxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxRQUFRO2dCQUNsRCxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUM1QyxDQUFDO2dCQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsQ0FBQztZQUVELElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDOUMsNkZBQTZGO2dCQUM3RixJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUNsRSxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN6QyxDQUFDO2dCQUNELE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxPQUErQixFQUFFLFNBQWlCO1FBQ3pFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFL0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztZQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUE2QyxFQUFFLEdBQVcsRUFBRSxFQUFFO2dCQUN0RixJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNwRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN4QixhQUFhLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztnQkFDbkQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE9BQStCLEVBQUUsU0FBaUI7UUFDM0UsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLDJCQUEyQixDQUFDLE9BQStCLEVBQUUsU0FBaUI7UUFDcEYsSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLGdCQUFnQixHQUE4QixJQUFJLENBQUMsS0FBTSxDQUFDLGdCQUU3RCxDQUFDO1FBQ0YsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxPQUErQixFQUFFLFNBQWlCO1FBQzdFLElBQUksV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQU0sQ0FBQyxTQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxPQUErQixFQUFFLFNBQWlCO1FBQzNFLElBQUksQ0FBQyxLQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQStCLEVBQUUsU0FBaUI7UUFDL0UsSUFBSSxDQUFDLEtBQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmLCBJbmplY3RvciwgUXVlcnlMaXN0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ0NvbmZpZyB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7XHJcbiAgU21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQsXHJcbiAgU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LFxyXG59IGZyb20gJy4uL3NtYXJ0LWNvbXBvbmVudC1sYXlvdXQvcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBTbWFydERpYWdyYW1Db21wb25lbnQgfSBmcm9tICcuLi9zbWFydC1kaWFncmFtL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtZmlsdGVyLWVkaXRvci9zbWFydC1maWx0ZXItZWRpdG9yLWNvbnRlbnQvc21hcnQtZmlsdGVyLWVkaXRvci1jb250ZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgU21hcnRGb3JtLFxyXG4gIFNtYXJ0Rm9ybUludmFsaWRGaWVsZHMsXHJcbiAgU21hcnRGb3JtV2lkZ2V0VHlwZSxcclxuICBTbWFydGZvcm1Db21wb25lbnQsXHJcbiAgU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLFxyXG4gIFZhbHVlQ2hhbmdlTW9kZSxcclxufSBmcm9tICcuLi9zbWFydC1mb3JtL3Byb2plY3RzJztcclxuaW1wb3J0IHsgR3JpZE9wdGlvbnMsIFNtYXJ0R3JpZCwgU21hcnRHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtZ3JpZC9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IFNtYXJ0TWFwQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtbWFwL3NtYXJ0LW1hcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTbWFydFN1YmplY3QgfSBmcm9tICcuLi9zbWFydC1zdWJqZWN0L3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBTbWFydFRyZWVDb21wb25lbnQsXHJcbiAgU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UsXHJcbiAgU21hcnR0cmVlU2VydmljZSxcclxufSBmcm9tICcuLi9zbWFydC10cmVlL3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRNb2RlbCxcclxuICBDb21wb25lbnRNb2RlbENoYW5nZSxcclxuICBEYXRhQ2hhbmdlLFxyXG4gIERhdGFDaGFuZ2VLaW5kLFxyXG4gIEV4ZWN1dGVVaUFjdGlvbk9wdGlvbnMsXHJcbiAgU21hcnRUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gIFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlLFxyXG4gIFVpQWN0aW9uLFxyXG4gIFVpQWN0aW9uQWRkaXRpb25hbFBhcmFtcyxcclxuICBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLFxyXG4gIFVpQWN0aW9uTW9kZWwsXHJcbiAgVWlBY3Rpb25SZXF1ZXN0LFxyXG4gIFVpQWN0aW9uU2VydmljZSxcclxuICBVaUFjdGlvblNwZWNpZmljRGVtYW5kUmVzcG9uc2UsXHJcbiAgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50LFxyXG4gIFVzZVVpQWN0aW9uMixcclxufSBmcm9tICcuLi92aWV3LWNvbnRleHQvcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBTbWFydFN0eWxlVXRpbGl0eSB9IGZyb20gJy4uL3ZpZXctY29udGV4dC91dGlsaXR5L3NtYXJ0LXN0eWxlLXV0aWxpdHknO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0QmFja2VuZEJvb3RzdHJhcFNlcnZpY2UsXHJcbiAgVmlld0NvbnRleHRSZWJ1aWx0RXJyb3IsXHJcbn0gZnJvbSAnLi4vc2Vzc2lvbi9zbWFydC1iYWNrZW5kLWJvb3RzdHJhcC5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTbWFydENvbXBvbmVudEFwaUNsaWVudDxUPiBpbXBsZW1lbnRzIFVzZVVpQWN0aW9uMiB7XHJcbiAgcHJvdGVjdGVkIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBpbi1mbGlnaHQge0BsaW5rIHJ1bn0sIHNvIHRoZSB0d28gcnVuKCkgY2FsbHMgb2YgYSBtb3VudCBzaGFyZSBvbmUgbG9hZC5cclxuICAgKiBLZXllZCBieSB1dWlkOiB2aWV3IHJldXNlIHNldHMgYSBuZXcgdXVpZCwgYW5kIG11c3Qgbm90IGpvaW4gdGhlIHN0YWxlIHJ1bi5cclxuICAgKi9cclxuICBwcml2YXRlIHJ1bkluRmxpZ2h0OiB7IHV1aWQ6IHN0cmluZyB8IHVuZGVmaW5lZDsgcHJvbWlzZTogUHJvbWlzZTx2b2lkPiB9IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PENvbXBvbmVudE1vZGVsQ2hhbmdlPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xyXG5cclxuICBwcml2YXRlIF91dWlkPzogc3RyaW5nO1xyXG5cclxuICBwcm90ZWN0ZWQgY29tcG9uZW50TW9kZWxMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZ2V0IHV1aWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl91dWlkO1xyXG4gIH1cclxuICBzZXQgdXVpZCh1dWlkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl91dWlkID09PSB1dWlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBmaXJzdFV1aWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMudXVpZCkge1xyXG4gICAgICB0aGlzLnZpZXdDb250ZXh0LnVuZm9sbG93KHRoaXMudXVpZCk7XHJcbiAgICAgIGZpcnN0VXVpZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdXVpZCA9IHV1aWQ7XHJcbiAgICBpZiAodGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpKSB7XHJcbiAgICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xyXG4gICAgICAgIFNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5zZXRVdWlkKGNvbXAsIHV1aWQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0V2lkZ2V0cygpLmZvckVhY2goKHJlZiwga2V5KSA9PiB7XHJcbiAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBTbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgICAgICByZWYudXVpZCA9IHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPyB1dWlkIDogdW5kZWZpbmVkO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudCkge1xyXG4gICAgICAgIHJlZi5zZXJ2aWNlLmNvbmZpZy51dWlkID0gdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCA/IHV1aWQgOiB1bmRlZmluZWQ7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVmIGluc3RhbmNlb2YgU21hcnREaWFncmFtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgcmVmLnV1aWQgPSB0aGlzLmNvbXBvbmVudE1vZGVsTG9hZGVkID8gdXVpZCA6IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyB9IGVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIFNtYXJ0TWFwQ29tcG9uZW50KSB7XHJcbiAgICAgICAgLy8gICByZWYudXVpZCA9IHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPyB1dWlkIDogdW5kZWZpbmVkO1xyXG4gICAgICB9IGVsc2UgaWYgKCFyZWYgJiYgIWZpcnN0VXVpZCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb3ZpZGVkIHJlZmVyZW5jZSBmb3IgJHtrZXl9IGlzIHVuZGVmaW5lZCBvbiB1dWlkIGNoYW5nZS5gKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodXVpZCkge1xyXG4gICAgICB0aGlzLnZpZXdDb250ZXh0LmZvbGxvdyh0aGlzLl91dWlkISwgdGhpcy5kZXRlY3RDaGFuZ2UpO1xyXG4gICAgICB0aGlzLm9uVXVpZFJlc29sdmVkKHV1aWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbW9kZWw6IENvbXBvbmVudE1vZGVsIHwgdW5kZWZpbmVkO1xyXG5cclxuICBnZXQgbW9kZWwoKTogQ29tcG9uZW50TW9kZWwgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xyXG4gIH1cclxuICBzZXQgbW9kZWwobW9kZWw6IENvbXBvbmVudE1vZGVsIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xyXG5cclxuICAgIHRoaXMuaW5pdENvbXBvbmVudEJ5TW9kZWwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RhdGE/OiBUO1xyXG5cclxuICBnZXQgZGF0YSgpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuICBzZXQgZGF0YShtb2RlbDogVCB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZGF0YSA9IG1vZGVsO1xyXG4gICAgdGhpcy5kYXRhQ2hhbmdlZC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdWlBY3Rpb25Nb2RlbHM6IFVpQWN0aW9uTW9kZWxbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgZGF0YUNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcclxuXHJcbiAgLy8gR3JpZFxyXG4gIHNtYXJ0R3JpZD86IFNtYXJ0R3JpZDtcclxuXHJcbiAgLy8gU2VydmljZXNcclxuICBwcm90ZWN0ZWQgdmlld0NvbnRleHQ6IFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBib290c3RyYXA6IFNtYXJ0QmFja2VuZEJvb3RzdHJhcFNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHVpQWN0aW9uU2VydmljZTogVWlBY3Rpb25TZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCB1aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlOiBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCB0cmFuc2xhdGU/OiBTbWFydFRyYW5zbGF0ZVNlcnZpY2U7XHJcblxyXG4gIC8vIFRyZWVcclxuICBwcml2YXRlIF9zbWFydFRyZWVTZXJ2aWNlPzogU21hcnR0cmVlR2VuZXJpY1NlcnZpY2U7XHJcblxyXG4gIHB1YmxpYyBnZXQgc21hcnRUcmVlU2VydmljZSgpOiBTbWFydHRyZWVHZW5lcmljU2VydmljZSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc21hcnRUcmVlU2VydmljZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBzbWFydFRyZWVTZXJ2aWNlKHNtYXJ0VHJlZVNlcnZpY2U6IFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5fc21hcnRUcmVlU2VydmljZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdUaGUgZGVmYXVsdCB0cmVlIGhhcyBhbHJlYWR5IHNldCB1cCEnKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NtYXJ0VHJlZVNlcnZpY2UgPSBzbWFydFRyZWVTZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29udGFpbmVkIFdpZGdldHNcclxuICB3aWRnZXRzOiBNYXA8XHJcbiAgICBzdHJpbmcsXHJcbiAgICBTbWFydEdyaWRDb21wb25lbnQgfCBTbWFydHRyZWVHZW5lcmljU2VydmljZSB8IFNtYXJ0TWFwQ29tcG9uZW50IHwgdW5kZWZpbmVkXHJcbiAgPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgZm9ybVdpZGdldHM6IE1hcDxzdHJpbmcsIFNtYXJ0Zm9ybUNvbXBvbmVudCB8IHVuZGVmaW5lZD4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByaXZhdGUgX3VzZVF1ZXJ5TGlzdHM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBnZXQgdXNlUXVlcnlMaXN0cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl91c2VRdWVyeUxpc3RzO1xyXG4gIH1cclxuXHJcbiAgc2V0IHVzZVF1ZXJ5TGlzdHModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gdHJ1ZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCd1c2VRdWVyeUxpc3RzIGNhbm5vdCBiZSBzZXQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdXNlUXVlcnlMaXN0cyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZW5kTW9kZWxPbldpZGdldEFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpbm1lZGlhdGVEYXRhQ2hhbmdlS2V5czogc3RyaW5nW10gPSBbXTtcclxuICBibHVyRGF0YUNoYW5nZUtleXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByb3RlY3RlZCBkYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcnMgPSBuZXcgTWFwPFNtYXJ0Zm9ybUNvbXBvbmVudCwgQXJyYXk8U3Vic2NyaXB0aW9uPj4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlck1vZGVsQ2hhbmdlU3ViamVjdHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDx2b2lkPj4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yPzogQ2hhbmdlRGV0ZWN0b3JSZWY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGluamVjdDogSW5qZWN0b3IsXHJcbiAgICBwcm90ZWN0ZWQgcGFnZU5hbWU/OiBzdHJpbmcsXHJcbiAgICBwcm90ZWN0ZWQgX2NvbXBvbmVudE5hbWU/OiBzdHJpbmcsXHJcbiAgICBwcm90ZWN0ZWQgZWxlbWVudD86IEVsZW1lbnRSZWYsXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI/OiBSZW5kZXJlcjJcclxuICApIHtcclxuICAgIC8vIGNoZWNrIGFuZCBjYWxjdWxhdGUgcGFnZU5hbWVcclxuICAgIGlmICghdGhpcy5wYWdlTmFtZSAmJiAhdGhpcy5fY29tcG9uZW50TmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZ2VOYW1lIG9yIGNvbXBvbmVudE5hbWUgbXVzdCBiZSBzcGVjaWZpZWQhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aWV3Q29udGV4dCA9IGluamVjdC5nZXQoU21hcnRWaWV3Q29udGV4dFNlcnZpY2UpO1xyXG4gICAgdGhpcy5ib290c3RyYXAgPSBpbmplY3QuZ2V0KFNtYXJ0QmFja2VuZEJvb3RzdHJhcFNlcnZpY2UpO1xyXG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudE5hbWUpIHtcclxuICAgICAgbGV0IHBhZ2VOYW1lRm9yQ29tcG9uZW50ID0gdGhpcy52aWV3Q29udGV4dC5nZXRQYWdlTmFtZU9mQ29tcG9uZW50KHRoaXMuX2NvbXBvbmVudE5hbWUpO1xyXG4gICAgICBpZiAoIXRoaXMucGFnZU5hbWUpIHtcclxuICAgICAgICB0aGlzLnBhZ2VOYW1lID0gcGFnZU5hbWVGb3JDb21wb25lbnQ7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYWdlTmFtZSAhPT0gcGFnZU5hbWVGb3JDb21wb25lbnQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBgcGFnZU5hbWUgKCR7cGFnZU5hbWV9KSBhbmQgY29tcG9uZW50TmFtZSAoJHtfY29tcG9uZW50TmFtZX0pIGRvZXNuJ3QgbWF0Y2ghYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGZyb20gdGhpcyBwb2ludCB3ZSBoYXZlIHRoaXMucGFnZU5hbWVcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlLnN1YnNjcmliZSgoY2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSkgPT4ge1xyXG4gICAgICB0aGlzLmhhbmRsZUNoYW5nZXMoY2hhbmdlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudWlBY3Rpb25TZXJ2aWNlID0gaW5qZWN0LmdldChVaUFjdGlvblNlcnZpY2UpO1xyXG4gICAgdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlID0gaW5qZWN0LmdldChVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIF9uZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucnVuKCk7XHJcbiAgfVxyXG4gIF9uZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0NvbnRleHQudW5mb2xsb3codGhpcy51dWlkISk7XHJcbiAgICB0aGlzLndpZGdldHMuY2xlYXIoKTtcclxuICAgIHRoaXMuZm9ybVdpZGdldHMuY2xlYXIoKTtcclxuICAgIHRoaXMuZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXJzLmNsZWFyKCk7XHJcbiAgICB0aGlzLmZpbHRlck1vZGVsQ2hhbmdlU3ViamVjdHMuY2xlYXIoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhpcyBjb21wb25lbnQncyB1dWlkIGlzIHNldCB0byBhIG5vbi1udWxsIHZhbHVlIChpdCBtYXlcclxuICAgKiBmaXJlIG1vcmUgdGhhbiBvbmNlIGlmIHRoZSB1dWlkIGNoYW5nZXMpLiBEZWZhdWx0OiBuby1vcC5cclxuICAgKiBDb25zdW1lcnMgdGhhdCByZXNvbHZlZCB0aGVpciB1dWlkIGluIHRoZSBjb25zdHJ1Y3RvciAoZS5nLiBmaWx0ZXIgY29uZmlnKVxyXG4gICAqIG92ZXJyaWRlIHRoaXMgdG8gZGVmZXIgdGhhdCB3aXJpbmcgdW50aWwgdGhlIHV1aWQgaXMgaW5qZWN0ZWQg4oCUIHJlcXVpcmVkIGZvclxyXG4gICAqIGR5bmFtaWMgZGVmYXVsdCBjb21wb25lbnRzIHdob3NlIHV1aWQgaXMgbm90IGtub3duIGF0IGNvbnN0cnVjdGlvbi4gKCMyODg3MClcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgb25VdWlkUmVzb2x2ZWQodXVpZDogc3RyaW5nKTogdm9pZCB7fVxyXG5cclxuICBfbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IHRoaXMuaW5qZWN0LmdldChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIGlmICghdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdTbWFydENvbXBvbmVudExheW91dHNRTCBub3QgYXZhaWxhYmxlIScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcnlMaXN0KHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKSEsIChjb21wKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy51dWlkICYmIHRoaXMudXVpZCAhPT0gY29tcC51dWlkKSB7XHJcbiAgICAgICAgICAgIGNvbXAudXBkYXRlVXVpZCh0aGlzLnV1aWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldEdyaWRzKGNvbXApLmZvckVhY2goKGdyaWQpID0+XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBHcmlkU2VydmljZXMoZ3JpZClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoY29tcC5zbWFydENvbXBvbmVudExheW91dCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRBY3Rpb25zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0VXBsb2FkQ2FsbGJhY2soY29tcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gZm9yIGhhbmRsaW5nIGVtYmVkZGVkIGZvcm1zXHJcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUxpc3QodGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpISwgKGZvcm0pID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRGF0YUNoYW5nZVN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0VXBsb2FkQ2FsbGJhY2soZm9ybSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmdldFNtYXJ0Rm9ybXNRTCgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdnZXRTbWFydEZvcm1zUUwgbm90IGF2YWlsYWJsZSEnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0Rm9ybXNRTCgpISwgKGZvcm0pID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRGF0YUNoYW5nZVN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlVXBsb2FkQ2FsbGJhY2soZm9ybSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmdldFNtYXJ0R3JpZHNRTCgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdTbWFydEdyaWRzUUwgbm90IGF2YWlsYWJsZSEnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0R3JpZHNRTCgpISwgKGdyaWQpID0+IHtcclxuICAgICAgICAgIGlmIChncmlkKSB7XHJcbiAgICAgICAgICAgIGlmIChncmlkLnNtYXJ0R3JpZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0dXBHcmlkU2VydmljZXMoZ3JpZCk7XHJcbiAgICAgICAgICAgICAgZ3JpZC5zZXR1cFRvb2xiYXIoKTtcclxuICAgICAgICAgICAgICBpZiAoZ3JpZC50b29sYmFyIHx8IGdyaWQuaGVhZGVyVG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0QWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy51dWlkICYmIHRoaXMudXVpZCAhPT0gZ3JpZC51dWlkKSB7XHJcbiAgICAgICAgICAgICAgZ3JpZC51dWlkID0gdGhpcy51dWlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5nZXRTbWFydE1hcFFMKCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1NtYXJ0TWFwc1FMIGlzIG5vdCBhdmFpbGFibGUhJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUxpc3QodGhpcy5nZXRTbWFydE1hcFFMKCkhLCAobWFwKSA9PiB7XHJcbiAgICAgICAgICBtYXAudmlld0NvbnRleHRTZXJ2aWNlID0gdGhpcy52aWV3Q29udGV4dDtcclxuICAgICAgICAgIGlmICh0aGlzLnV1aWQgJiYgdGhpcy51dWlkICE9PSBtYXAudXVpZCkge1xyXG4gICAgICAgICAgICBtYXAudXVpZCA9IHRoaXMudXVpZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuZ2V0U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMKCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1NtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHNRTCBub3QgYXZhaWxhYmxlIScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcnlMaXN0KHRoaXMuZ2V0U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMKCkhLCAoZmlsdGVyQ29tcCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGZpbHRlckNvbXApIHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckNvbXAuc2VydmljZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0dXBGaWx0ZXJTZXJ2aWNlcyhmaWx0ZXJDb21wKTtcclxuICAgICAgICAgICAgICBsZXQgc2VydmljZSA9IGZpbHRlckNvbXAuc2VydmljZTtcclxuICAgICAgICAgICAgICBsZXQgaWRlbnRpZmllciA9IHNlcnZpY2UuY29uZmlnLmlkZW50aWZpZXI7XHJcbiAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgJiYgIXRoaXMuZmlsdGVyTW9kZWxDaGFuZ2VTdWJqZWN0cy5oYXMoaWRlbnRpZmllcikpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyTW9kZWxDaGFuZ2VTdWJqZWN0cy5zZXQoaWRlbnRpZmllciwgc2VydmljZS5tb2RlbENoYW5nZWQpO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5tb2RlbENoYW5nZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRBbGxGaWx0ZXJVaUFjdGlvblRvb2xiYXJzKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEFjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXR1cEdyaWRTZXJ2aWNlcyhncmlkOiBTbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgIGlmIChncmlkLnNtYXJ0R3JpZCkge1xyXG4gICAgICBpZiAoIWdyaWQuc21hcnRHcmlkLnVpQWN0aW9uU2VydmljZSkge1xyXG4gICAgICAgIGdyaWQuc21hcnRHcmlkLnVpQWN0aW9uU2VydmljZSA9IHRoaXMudWlBY3Rpb25TZXJ2aWNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZ3JpZC5zbWFydEdyaWQudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSkge1xyXG4gICAgICAgIGdyaWQuc21hcnRHcmlkLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgPSB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFncmlkLnNtYXJ0R3JpZC5zZXJ2aWNlVG9Vc2UpIHtcclxuICAgICAgICBncmlkLnNtYXJ0R3JpZC5zZXJ2aWNlVG9Vc2UgPSB0aGlzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZ3JpZC5zbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlKSB7XHJcbiAgICAgICAgZ3JpZC5zbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlID0gdGhpcy52aWV3Q29udGV4dDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEZpbHRlclNlcnZpY2VzKGZpbHRlckNvbXA6IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudCkge1xyXG4gICAgaWYgKGZpbHRlckNvbXAuc2VydmljZSkge1xyXG4gICAgICBsZXQgc2VydmljZSA9IGZpbHRlckNvbXAuc2VydmljZTtcclxuICAgICAgc2VydmljZS5wYXJlbnRTbWFydENvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgIGlmICh0aGlzLnV1aWQgJiYgdGhpcy51dWlkICE9PSBzZXJ2aWNlLmNvbmZpZy51dWlkKSB7XHJcbiAgICAgICAgc2VydmljZS5jb25maWcudXVpZCA9IHRoaXMudXVpZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGhhbmRsZVF1ZXJ5TGlzdFNpbXBsZTxUPihxbDogUXVlcnlMaXN0PFQ+LCBoYW5kbGVyOiAoKSA9PiB2b2lkKSB7XHJcbiAgICBoYW5kbGVyKCk7XHJcbiAgICBxbC5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IGhhbmRsZXIoKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlUXVlcnlMaXN0PFQ+KHFsOiBRdWVyeUxpc3Q8VD4sIGhhbmRsZXI6IChlbDogVCkgPT4gdm9pZCkge1xyXG4gICAgcWwuZm9yRWFjaCgoZWwpID0+IGhhbmRsZXIoZWwpKTtcclxuICAgIHFsLmNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgobGlzdCkgPT4gKGxpc3QgYXMgUXVlcnlMaXN0PFQ+KS5mb3JFYWNoKChlbCkgPT4gaGFuZGxlcihlbCkpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydEZvcm1zUUwoKTogUXVlcnlMaXN0PFNtYXJ0Zm9ybUNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydEdyaWRzUUwoKTogUXVlcnlMaXN0PFNtYXJ0R3JpZENvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydFRyZWVzUUwoKTogUXVlcnlMaXN0PFNtYXJ0VHJlZUNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRzUUwoKTpcclxuICAgIHwgUXVlcnlMaXN0PFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudD5cclxuICAgIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U21hcnRVaUFjdGlvblRvb2xiYXJzUUwoKTogUXVlcnlMaXN0PFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpOlxyXG4gICAgfCBRdWVyeUxpc3Q8U21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQ+XHJcbiAgICB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0TWFwUUwoKTogUXVlcnlMaXN0PFNtYXJ0TWFwQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0RGlhZ3JhbVFMKCk6IFF1ZXJ5TGlzdDxTbWFydERpYWdyYW1Db21wb25lbnQ+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgZ2V0V2lkZ2V0cygpOiBNYXA8XHJcbiAgICBzdHJpbmcsXHJcbiAgICB8IFNtYXJ0R3JpZENvbXBvbmVudFxyXG4gICAgfCBTbWFydHRyZWVTZXJ2aWNlPGFueT5cclxuICAgIHwgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50XHJcbiAgICB8IFNtYXJ0TWFwQ29tcG9uZW50XHJcbiAgICB8IFNtYXJ0RGlhZ3JhbUNvbXBvbmVudFxyXG4gICAgfCB1bmRlZmluZWRcclxuICA+IHtcclxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgbGV0IHdpZGdldHM6IE1hcDxcclxuICAgICAgICBzdHJpbmcsXHJcbiAgICAgICAgfCBTbWFydEdyaWRDb21wb25lbnRcclxuICAgICAgICB8IFNtYXJ0dHJlZVNlcnZpY2U8YW55PlxyXG4gICAgICAgIHwgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50XHJcbiAgICAgICAgfCBTbWFydE1hcENvbXBvbmVudFxyXG4gICAgICAgIHwgU21hcnREaWFncmFtQ29tcG9uZW50XHJcbiAgICAgICAgfCB1bmRlZmluZWRcclxuICAgICAgPiA9IG5ldyBNYXAoKTtcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydEdyaWRDb21wb25lbnRzKClcclxuICAgICAgICAuZmlsdGVyKChncmlkKSA9PiAoZ3JpZD8uc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciA/IHRydWUgOiBmYWxzZSkpXHJcbiAgICAgICAgLmZvckVhY2goKGdyaWQpID0+IHdpZGdldHMuc2V0KGdyaWQuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllciwgZ3JpZCkpO1xyXG4gICAgICAvLyBLZXkgdHJlZXMgYnkgdGhlaXIgdHJlZUlkIChzZXQgaW4gdGhlIHNlcnZpY2UgY29uc3RydWN0b3IpLCBOT1QgYnlcclxuICAgICAgLy8gc21hcnRUcmVlTW9kZWwuaWRlbnRpZmllciAob25seSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgc3luY1RyZWUpLiBBIHRyZWVcclxuICAgICAgLy8gdGhhdCBleGlzdHMgYnV0IGhhcyBub3QgZmluaXNoZWQgaXRzIGluaXRpYWwgZG93bmxvYWQgd291bGQgb3RoZXJ3aXNlIGJlIGFic2VudFxyXG4gICAgICAvLyBmcm9tIHRoZSB3aWRnZXQgbWFwLCBzbyBhIHB1c2ggdXBkYXRlIGNvdWxkIG5vdCByZXNvbHZlIGl0XHJcbiAgICAgIC8vIChcIlByb3ZpZGVkIHJlZmVyZW5jZSBmb3IgPHRyZWVJZD4gaXMgdW5kZWZpbmVkXCIpLiB0cmVlSWQgZXF1YWxzIHRoZSBiYWNrZW5kXHJcbiAgICAgIC8vIHdpZGdldCBpZGVudGlmaWVyLCBzbyBwdXNoIHJvdXRpbmcgbWF0Y2hlcyByZWdhcmRsZXNzIG9mIGRvd25sb2FkIHRpbWluZy4gKCMyODM2MSlcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydFRyZWVDb21wb25lbnRzKClcclxuICAgICAgICAuZmlsdGVyKCh0cmVlKSA9PiAhIXRyZWU/LnRyZWVJZClcclxuICAgICAgICAuZm9yRWFjaCgodHJlZSkgPT4gd2lkZ2V0cy5zZXQodHJlZS50cmVlSWQhLCB0cmVlKSk7XHJcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50cygpXHJcbiAgICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiAoZmlsdGVyLnNlcnZpY2UuY29uZmlnLmlkZW50aWZpZXIgPyB0cnVlIDogZmFsc2UpKVxyXG4gICAgICAgIC5mb3JFYWNoKChmaWx0ZXIpID0+IHdpZGdldHMuc2V0KGZpbHRlci5zZXJ2aWNlLmNvbmZpZy5pZGVudGlmaWVyLCBmaWx0ZXIpKTtcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydE1hcENvbXBvbmVudHMoKVxyXG4gICAgICAgIC5maWx0ZXIoKG1hcCkgPT4gISFtYXAuaWRlbnRpZmllcilcclxuICAgICAgICAuZm9yRWFjaCgobWFwKSA9PiB3aWRnZXRzLnNldChtYXAuaWRlbnRpZmllciwgbWFwKSk7XHJcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnREaWFncmFtQ29tcG9uZW50cygpXHJcbiAgICAgICAgLmZpbHRlcigoZGlhZ3JhbSkgPT4gISFkaWFncmFtLmlkZW50aWZpZXIpXHJcbiAgICAgICAgLmZvckVhY2goKGRpYWdyYW0pID0+IHdpZGdldHMuc2V0KGRpYWdyYW0uaWRlbnRpZmllciwgZGlhZ3JhbSkpO1xyXG4gICAgICByZXR1cm4gd2lkZ2V0cztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLndpZGdldHM7XHJcbiAgfVxyXG5cclxuICBpbml0Q29tcG9uZW50QnlNb2RlbCgpOiB2b2lkIHtcclxuICAgIFNtYXJ0U3R5bGVVdGlsaXR5LmFwcGx5U3R5bGUodGhpcy5tb2RlbD8uc3R5bGUsIHRoaXMuZWxlbWVudCwgdGhpcy5yZW5kZXJlcik7XHJcbiAgICBTbWFydFN0eWxlVXRpbGl0eS5hcHBseVN0eWxlKHRoaXMubW9kZWw/LnBhcmVudFN0eWxlLCB0aGlzLmVsZW1lbnQsIHRoaXMucmVuZGVyZXIsIHRydWUpO1xyXG4gICAgdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgaWYgKHRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKT8uZm9yRWFjaCgoZm9ybSkgPT4ge1xyXG4gICAgICAgIGlmIChmb3JtLnNtYXJ0Rm9ybSkge1xyXG4gICAgICAgICAgZm9ybS5zbWFydEZvcm0uY29tcG9uZW50TW9kZWwgPSB0aGlzLm1vZGVsO1xyXG4gICAgICAgICAgLy8gdXNlcyBkYXRhLCB2YWx1ZVNldHMsIGNvbnN0cmFpbnRzXHJcbiAgICAgICAgICBmb3JtLmNvbnN0cnVjdEZvcm0oKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlVXBsb2FkQ2FsbGJhY2soZm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3I/LmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuaW5pdEFjdGlvbnMoKTtcclxuICAgIC8vIFRPRE86IGxheW91dCwgd2lkZ2V0c1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKTogU21hcnRmb3JtQ29tcG9uZW50W10ge1xyXG4gICAgbGV0IGZvcm1zOiBTbWFydGZvcm1Db21wb25lbnRbXSA9IHRoaXMuZ2V0U21hcnRGb3Jtc1FMKCk/LnRvQXJyYXkoKSA/PyBbXTtcclxuICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xyXG4gICAgICBmb3Jtcy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRGb3Jtcyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3JtcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydEdyaWRDb21wb25lbnRzKCk6IFNtYXJ0R3JpZENvbXBvbmVudFtdIHtcclxuICAgIGxldCBncmlkczogU21hcnRHcmlkQ29tcG9uZW50W10gPSB0aGlzLmdldFNtYXJ0R3JpZHNRTCgpPy50b0FycmF5KCkgPz8gW107XHJcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcclxuICAgICAgZ3JpZHMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0R3JpZHMoY29tcCkpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZ3JpZHM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0QWxsU21hcnRNYXBDb21wb25lbnRzKCk6IEFycmF5PFNtYXJ0TWFwQ29tcG9uZW50PiB7XHJcbiAgICBjb25zdCBtYXBzOiBBcnJheTxTbWFydE1hcENvbXBvbmVudD4gPSB0aGlzLmdldFNtYXJ0TWFwUUwoKT8udG9BcnJheSgpID8/IFtdO1xyXG4gICAgdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpPy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIG1hcHMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0TWFwcyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtYXBzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0RGlhZ3JhbUNvbXBvbmVudHMoKTogQXJyYXk8U21hcnREaWFncmFtQ29tcG9uZW50PiB7XHJcbiAgICBjb25zdCBtYXBzOiBBcnJheTxTbWFydERpYWdyYW1Db21wb25lbnQ+ID0gdGhpcy5nZXRTbWFydERpYWdyYW1RTCgpPy50b0FycmF5KCkgPz8gW107XHJcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcclxuICAgICAgbWFwcy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXREaWFncmFtcyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtYXBzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0VHJlZUNvbXBvbmVudHMoKTogU21hcnR0cmVlU2VydmljZTxhbnk+W10ge1xyXG4gICAgbGV0IHRyZWVzOiBTbWFydHRyZWVTZXJ2aWNlPGFueT5bXSA9XHJcbiAgICAgIHRoaXMuZ2V0U21hcnRUcmVlc1FMKClcclxuICAgICAgICA/LnRvQXJyYXkoKVxyXG4gICAgICAgIC5tYXAoKHRyZWUpID0+IHRyZWUudHJlZVNlcnZpY2UpID8/IFtdO1xyXG4gICAgdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpPy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIHRyZWVzLnB1c2goLi4uU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldFRyZWVzKGNvbXApKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRyZWVzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHMoKTogU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50W10ge1xyXG4gICAgbGV0IGZpbHRlcnM6IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudFtdID1cclxuICAgICAgdGhpcy5nZXRTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRzUUwoKT8udG9BcnJheSgpID8/IFtdO1xyXG4gICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0QWxsU21hcnRVaUFjdGlvblRvb2xiYXJzKCk6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdIHtcclxuICAgIGxldCB0b29sYmFyczogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50W10gPSB0aGlzLmdldFNtYXJ0VWlBY3Rpb25Ub29sYmFyc1FMKCk/LnRvQXJyYXkoKSA/PyBbXTtcclxuICAgIHRoaXMuZ2V0QWxsU21hcnRHcmlkQ29tcG9uZW50cygpPy5mb3JFYWNoKChncmlkKSA9PiB7XHJcbiAgICAgIGlmIChncmlkLnRvb2xiYXIpIHtcclxuICAgICAgICB0b29sYmFycy5wdXNoKGdyaWQudG9vbGJhcik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyaWQuaGVhZGVyVG9vbGJhcikge1xyXG4gICAgICAgIHRvb2xiYXJzLnB1c2goZ3JpZC5oZWFkZXJUb29sYmFyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcclxuICAgICAgdG9vbGJhcnMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0VG9vbGJhcnMoY29tcCkpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKVxyXG4gICAgICA/LmZsYXRNYXAoKGZvcm0pID0+IGZvcm0uZ2V0VG9vbGJhcnMoKSlcclxuICAgICAgLmZpbHRlcigodG9vbGJhcikgPT4gdG9vbGJhciAhPT0gdW5kZWZpbmVkIHx8IHRvb2xiYXIgIT09IG51bGwpXHJcbiAgICAgIC5mb3JFYWNoKCh0b29sYmFyKSA9PiB0b29sYmFycy5wdXNoKHRvb2xiYXIgYXMgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50KSk7XHJcblxyXG4gICAgdGhpcy5nZXRBbGxGaWx0ZXJVaUFjdGlvblRvb2xiYXJzKCkuZm9yRWFjaCgodG9vbGJhcikgPT4gdG9vbGJhcnMucHVzaCh0b29sYmFyKSk7XHJcbiAgICByZXR1cm4gdG9vbGJhcnM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0QWxsRmlsdGVyVWlBY3Rpb25Ub29sYmFycygpOiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRzKClcclxuICAgICAgLmZsYXRNYXAoKGZpbHRlcikgPT5cclxuICAgICAgICBmaWx0ZXIuc2ltcGxlRmlsdGVyUmVmPy5pbnN0YW5jZSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICA/IGZpbHRlci5zaW1wbGVGaWx0ZXJSZWY/Lmluc3RhbmNlLmdldFRvb2xiYXJzKClcclxuICAgICAgICAgIDogZmlsdGVyLnNlcnZpY2UuZ2V0Q29tcGxleFRvb2xiYXJzKClcclxuICAgICAgKVxyXG4gICAgICAuZmlsdGVyKCh0b29sYmFyKSA9PiB0b29sYmFyICE9PSB1bmRlZmluZWQgfHwgdG9vbGJhciAhPT0gbnVsbClcclxuICAgICAgLm1hcCgodG9vbGJhcikgPT4gdG9vbGJhciBhcyBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQpO1xyXG4gIH1cclxuXHJcbiAgaW5pdERhdGEoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5tb2RlbD8uZGF0YSkge1xyXG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLm1vZGVsPy5kYXRhIGFzIGFueTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRBY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubW9kZWw/LmFjdGlvbnMpIHtcclxuICAgICAgbGV0IHVpQWN0aW9uTW9kZWxzID0gdGhpcy5tb2RlbD8uYWN0aW9ucy5tYXAoKHVpQWN0aW9uOiBVaUFjdGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMsXHJcbiAgICAgICAgICB1aUFjdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgYWxsVG9vbGJhcnMgPSB0aGlzLmdldEFsbFNtYXJ0VWlBY3Rpb25Ub29sYmFycygpO1xyXG4gICAgICBsZXQgdG9vbGJhcnMgPSBhbGxUb29sYmFycy5maWx0ZXIoKHRvb2xiYXIpID0+IHRvb2xiYXIuaWQpO1xyXG4gICAgICBsZXQgdG9vbGJhcnNXaXRob3V0SWQgPSB0aGlzLmdldEFsbFNtYXJ0VWlBY3Rpb25Ub29sYmFycygpLmZpbHRlcihcclxuICAgICAgICAodG9vbGJhcikgPT4gdG9vbGJhci5pZCA9PT0gdW5kZWZpbmVkIHx8IHRvb2xiYXIuaWQgPT09IG51bGxcclxuICAgICAgKTtcclxuICAgICAgbGV0IHRvb2xiYXJNb2RlbHMgPSBuZXcgTWFwPHN0cmluZywgVWlBY3Rpb25Nb2RlbFtdPigpO1xyXG4gICAgICB0b29sYmFycy5mb3JFYWNoKCh0b29sYmFyKSA9PiB7XHJcbiAgICAgICAgdG9vbGJhck1vZGVscy5zZXQodG9vbGJhci5pZCEsIFtdKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBnbG9iYWxVaUFjdGlvbk1vZGVsczogVWlBY3Rpb25Nb2RlbFtdID0gW107XHJcbiAgICAgIHVpQWN0aW9uTW9kZWxzLmZvckVhY2goKGFjdGlvbikgPT4ge1xyXG4gICAgICAgIGxldCBhY3Rpb25Nb2RlbDogVWlBY3Rpb25Nb2RlbFtdIHwgdW5kZWZpbmVkID0gZ2xvYmFsVWlBY3Rpb25Nb2RlbHM7XHJcbiAgICAgICAgbGV0IHRvb2xiYXJJZCA9IGFjdGlvbi51aUFjdGlvbi50b29sYmFyO1xyXG4gICAgICAgIGlmICh0b29sYmFySWQgJiYgdG9vbGJhck1vZGVscy5oYXModG9vbGJhcklkKSkge1xyXG4gICAgICAgICAgYWN0aW9uTW9kZWwgPSB0b29sYmFyTW9kZWxzLmdldCh0b29sYmFySWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFjdGlvbk1vZGVsKSB7XHJcbiAgICAgICAgICBhY3Rpb25Nb2RlbCA9IGdsb2JhbFVpQWN0aW9uTW9kZWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhY3Rpb25Nb2RlbC5wdXNoKGFjdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnVpQWN0aW9uTW9kZWxzID0gZ2xvYmFsVWlBY3Rpb25Nb2RlbHM7XHJcblxyXG4gICAgICB0aGlzLnNldHVwQWxsVG9vbGJhcnModG9vbGJhcnMsIHRvb2xiYXJzV2l0aG91dElkLCB0b29sYmFyTW9kZWxzKVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3I/LmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBzZXR1cDonLCBlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZXR1cEFsbFRvb2xiYXJzKFxyXG4gICAgdG9vbGJhcnM6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdLFxyXG4gICAgdG9vbGJhcnNXaXRob3V0SWQ6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdLFxyXG4gICAgdG9vbGJhck1vZGVsczogTWFwPHN0cmluZywgVWlBY3Rpb25Nb2RlbFtdPlxyXG4gICkge1xyXG4gICAgY29uc3Qgc2V0dXBQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XHJcblxyXG4gICAgdG9vbGJhcnMuZm9yRWFjaCgodG9vbGJhcikgPT4ge1xyXG4gICAgICB0b29sYmFyLnVpQWN0aW9uTW9kZWxzID0gdG9vbGJhck1vZGVscy5nZXQodG9vbGJhci5pZCEpO1xyXG4gICAgICBzZXR1cFByb21pc2VzLnB1c2godG9vbGJhci5zZXRVcCgpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRvb2xiYXJzV2l0aG91dElkLmZvckVhY2goKHRvb2xiYXIpID0+IHtcclxuICAgICAgc2V0dXBQcm9taXNlcy5wdXNoKHRvb2xiYXIuc2V0VXAoKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChzZXR1cFByb21pc2VzKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLnJ1bkluRmxpZ2h0ICYmIHRoaXMucnVuSW5GbGlnaHQudXVpZCA9PT0gdGhpcy51dWlkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnJ1bkluRmxpZ2h0LnByb21pc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcm9taXNlOiBQcm9taXNlPHZvaWQ+ID0gdGhpcy5kb1J1bigpLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5ydW5JbkZsaWdodD8ucHJvbWlzZSA9PT0gcHJvbWlzZSkge1xyXG4gICAgICAgIHRoaXMucnVuSW5GbGlnaHQgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5ydW5JbkZsaWdodCA9IHsgdXVpZDogdGhpcy51dWlkLCBwcm9taXNlIH07XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZG9SdW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC53aGVuUmVhZHkoKTtcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFZpZXdDb250ZXh0UmVidWlsdEVycm9yKSB7XHJcbiAgICAgICAgLy8gTm9ybWFsIGZsb3c6IHRoZSB2aWV3Y29udGV4dCB3YXMgcmVidWlsdCB3aGlsZSB3ZSB3ZXJlIHF1ZXVlZCBpblxyXG4gICAgICAgIC8vIHdoZW5SZWFkeSgpLiBBIGZyZXNoIHV1aWQgYXJyaXZlcyB2aWEgdXVpZE9mUGFnZUhhc0JlZW5DaGFuZ2VkXHJcbiAgICAgICAgLy8gKE5PUk1BTCB2aWV3cykgb3IgdGhlIGNvbXBvbmVudCBpcyByZWNyZWF0ZWQgYnkgb3BlblZpZXdcclxuICAgICAgICAvLyAoRU1CRURERUQvRElBTE9HKS4gTm90aGluZyB0byBzdXJmYWNlLlxyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1NraXBwaW5nIGxvYWQ6IHZpZXdjb250ZXh0IHdhcyByZWJ1aWx0IHdoaWxlIHdhaXRpbmcuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1NtYXJ0QmFja2VuZEJvb3RzdHJhcFNlcnZpY2UgaXMgbm90IHJlYWR5OyBza2lwcGluZyBsb2FkLicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCA9IGZhbHNlO1xyXG4gICAgLy8gU2xvdC1ob3N0ZWQgdmlld3MgKE5PUk1BTC9FTUJFRERFRCkgZ2V0IHRoZWlyIHV1aWQgaW5qZWN0ZWQgYXQgY3JlYXRpb24uIERJQUxPRyB2aWV3c1xyXG4gICAgLy8gYXJlIE5PVCBzbG90LWhvc3RlZCwgc28gdGhleSBzdGlsbCByZXNvbHZlIHRoZWlyIHV1aWQgdmlhIHRoZSBwYWdlTmFtZSAtPiBnZXRVdWlkT2ZQYWdlXHJcbiAgICAvLyBzaGltIChzZXQgYnkgb3BlblZpZXcncyBESUFMT0cgYnJhbmNoKS4gUGFydCBvZiB0aGUgcmV0YWluZWQgcGFnZS11dWlkIHNoaW0gKCMyODg3MCkuXHJcbiAgICBjb25zdCB1dWlkID1cclxuICAgICAgdGhpcy5fdXVpZCA/PyB0aGlzLnJlYWREaWFsb2dEYXRhVXVpZCgpID8/IHRoaXMudmlld0NvbnRleHQuZ2V0VXVpZE9mUGFnZSh0aGlzLnBhZ2VOYW1lISk7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnW0VtYmVkZGVkXSBsb2FkKCknLCB7XHJcbiAgICAvLyAgIHBhZ2VOYW1lOiB0aGlzLnBhZ2VOYW1lLFxyXG4gICAgLy8gICBfdXVpZDogdGhpcy5fdXVpZCxcclxuICAgIC8vICAgcmVzb2x2ZWRVdWlkOiB1dWlkLFxyXG4gICAgLy8gfSk7XHJcbiAgICAvLyB0aGlzLm1vZGVsID0gYXdhaXQgdGhpcy52aWV3Q29udGV4dC5sb2FkKHRoaXMudXVpZCk7XHJcbiAgICBjb25zdCBjaGFuZ2UgPSBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LmxvYWQyKHV1aWQpO1xyXG4gICAgdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCA9IHRydWU7XHJcbiAgICB0aGlzLnV1aWQgPSB1dWlkO1xyXG4gICAgdGhpcy5tb2RlbCA9IGNoYW5nZSEucmVzdWx0ISBhcyBDb21wb25lbnRNb2RlbDtcclxuICAgIGlmICh0aGlzLm1vZGVsLndpZGdldHMpIHtcclxuICAgICAgLy8gZ3JpZHMgYXJlIGFscmVhZHkgbG9hZGVkIGluIHNldFV1aWQoKVxyXG4gICAgICB0aGlzLmhhbmRsZUNoYW5nZVdpZGdldHModGhpcy5tb2RlbC53aWRnZXRzLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGV4ZWN1dGVVaUFjdGlvbih1aUFjdGlvbjogVWlBY3Rpb24sIG9wdGlvbnM/OiBFeGVjdXRlVWlBY3Rpb25PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB1aUFjdGlvbk1vZGVsID0ge1xyXG4gICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMsXHJcbiAgICAgIHVpQWN0aW9uOiB1aUFjdGlvbixcclxuICAgIH07XHJcbiAgICBhd2FpdCB0aGlzLnVpQWN0aW9uU2VydmljZS5leGVjdXRlKHVpQWN0aW9uLCB1aUFjdGlvbk1vZGVsLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGFkZERhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKGtleTogc3RyaW5nLCB2YWx1ZUNoYW5nZU1vZGU6IFZhbHVlQ2hhbmdlTW9kZSkge1xyXG4gICAgY29uc3QgY2hhbmdlS2V5cyA9IHRoaXMuZ2V0Q2hhbmdlS2V5cyh2YWx1ZUNoYW5nZU1vZGUpO1xyXG4gICAgaWYgKCFjaGFuZ2VLZXlzLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgY2hhbmdlS2V5cy5wdXNoKGtleSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0Q2hhbmdlS2V5cyh2YWx1ZUNoYW5nZU1vZGU6IFZhbHVlQ2hhbmdlTW9kZSkge1xyXG4gICAgcmV0dXJuIHZhbHVlQ2hhbmdlTW9kZSA9PT0gVmFsdWVDaGFuZ2VNb2RlLklNTUVESUFURV9BQ1RJT05cclxuICAgICAgPyB0aGlzLmlubWVkaWF0ZURhdGFDaGFuZ2VLZXlzXHJcbiAgICAgIDogdGhpcy5ibHVyRGF0YUNoYW5nZUtleXM7XHJcbiAgfVxyXG5cclxuICByZW1vdmVEYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcihrZXk6IHN0cmluZykge1xyXG4gICAgbGV0IGlubWVkaWF0ZUlkeCA9IHRoaXMuaW5tZWRpYXRlRGF0YUNoYW5nZUtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgaWYgKGlubWVkaWF0ZUlkeCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuaW5tZWRpYXRlRGF0YUNoYW5nZUtleXMuc3BsaWNlKGlubWVkaWF0ZUlkeCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJsdXJJZHggPSB0aGlzLmJsdXJEYXRhQ2hhbmdlS2V5cy5pbmRleE9mKGtleSk7XHJcbiAgICBpZiAoYmx1cklkeCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuaW5tZWRpYXRlRGF0YUNoYW5nZUtleXMuc3BsaWNlKGJsdXJJZHgsIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKFxyXG4gICAgZXZlbnQ6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSxcclxuICAgIHZhbHVlQ2hhbmdlTW9kZTogVmFsdWVDaGFuZ2VNb2RlXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjaGFuZ2VLZXlzID0gdGhpcy5nZXRDaGFuZ2VLZXlzKHZhbHVlQ2hhbmdlTW9kZSk7XHJcbiAgICBpZiAoY2hhbmdlS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XHJcbiAgICAgIHRoaXMuZXhlY3V0ZVVpQWN0aW9uKHtcclxuICAgICAgICBjb2RlOiBldmVudC5rZXksXHJcbiAgICAgICAgbW9kZWw6IHRydWUsXHJcbiAgICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgICBpdGVtOiBldmVudC52YWx1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVMYXlvdXRVcGxvYWRDYWxsYmFjayhjb21wOiBTbWFydENvbXBvbmVudExheW91dENvbXBvbmVudCkge1xyXG4gICAgU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldEZvcm1zKGNvbXApLmZvckVhY2goKGZvcm0pID0+IHtcclxuICAgICAgdGhpcy5oYW5kbGVVcGxvYWRDYWxsYmFjayhmb3JtKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGhhbmRsZVVwbG9hZENhbGxiYWNrKGZvcm06IFNtYXJ0Zm9ybUNvbXBvbmVudCkge1xyXG4gICAgZm9ybS5zbWFydFdpZGdldHNRTD8uZm9yRWFjaCgod2lkZ2V0KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB3aWRnZXQud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYgfHxcclxuICAgICAgICB3aWRnZXQud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSIHx8XHJcbiAgICAgICAgd2lkZ2V0LndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiB8fFxyXG4gICAgICAgIHdpZGdldC53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJFQ09SRElOR19VUExPQURFUlxyXG4gICAgICApIHtcclxuICAgICAgICB3aWRnZXQuc21hcnRDb21wb25lbnQgPSB0aGlzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVGb3JtU3Vic2NyaXB0aW9ucyhmb3JtOiBTbWFydGZvcm1Db21wb25lbnQpIHtcclxuICAgIGZvcm0uc21hcnRGb3JtPy53aWRnZXRzLmZvckVhY2goKHdpZGdldCkgPT4ge1xyXG4gICAgICBpZiAod2lkZ2V0LmtleSkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHdpZGdldC52YWx1ZUNoYW5nZU1vZGUgPT09IFZhbHVlQ2hhbmdlTW9kZS5JTU1FRElBVEVfQUNUSU9OIHx8XHJcbiAgICAgICAgICB3aWRnZXQudmFsdWVDaGFuZ2VNb2RlID09PSBWYWx1ZUNoYW5nZU1vZGUuQkxVUlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5hZGREYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcih3aWRnZXQua2V5LCB3aWRnZXQudmFsdWVDaGFuZ2VNb2RlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVEYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcih3aWRnZXQua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKCF0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycy5oYXMoZm9ybSkpIHtcclxuICAgICAgbGV0IGlubWVkaWF0ZVZhbHVlQ2hhbmdlU3ViID0gZm9ybS5zb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKGV2ZW50LCBWYWx1ZUNoYW5nZU1vZGUuSU1NRURJQVRFX0FDVElPTik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIGxldCBibHVyVmFsdWVDaGFuZ2VTdWIgPSBmb3JtLmJsdXJTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKGV2ZW50LCBWYWx1ZUNoYW5nZU1vZGUuQkxVUikpO1xyXG4gICAgICB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycy5zZXQoZm9ybSwgW2lubWVkaWF0ZVZhbHVlQ2hhbmdlU3ViLCBibHVyVmFsdWVDaGFuZ2VTdWJdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVEYXRhQ2hhbmdlU3Vic2NyaXB0aW9ucyhmb3JtQ29tcG9uZW50PzogU21hcnRmb3JtQ29tcG9uZW50KSB7XHJcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIGxldCBmb3JtcyA9ICEhZm9ybUNvbXBvbmVudCA/IFtmb3JtQ29tcG9uZW50XSA6IHRoaXMuZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpO1xyXG4gICAgICBmb3Jtcy5mb3JFYWNoKChmb3JtKSA9PiB0aGlzLmhhbmRsZUZvcm1TdWJzY3JpcHRpb25zKGZvcm0pKTtcclxuXHJcbiAgICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gcmVtb3ZlZCBmb3Jtc1xyXG4gICAgICBpZiAoIWZvcm1Db21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycy5mb3JFYWNoKChzdWJzLCBmb3JtKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWZvcm1zLmZpbmQoKGMpID0+IGMgPT09IGZvcm0pKSB7XHJcbiAgICAgICAgICAgIHN1YnMuZm9yRWFjaCgoc3ViKSA9PiBzdWIudW5zdWJzY3JpYmUoKSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXJzLmRlbGV0ZShmb3JtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0SW52YWxpZEZpZWxkcygpOiBTbWFydEZvcm1JbnZhbGlkRmllbGRzIHtcclxuICAgIGxldCBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkczogU21hcnRGb3JtSW52YWxpZEZpZWxkcyA9IHtcclxuICAgICAgaW52YWxpZEZpZWxkS2V5czogW10sXHJcbiAgICAgIGludmFsaWRGaWVsZE5hbWVzOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKT8uZm9yRWFjaCgoZm9ybSkgPT5cclxuICAgICAgICB0aGlzLnZhbGlkYXRlRm9ybShmb3JtLCBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkcylcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybVdpZGdldHM/LmZvckVhY2goKGZvcm0pID0+IHRoaXMudmFsaWRhdGVGb3JtKGZvcm0sIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHZhbGlkYXRlRm9ybShcclxuICAgIGZvcm06IFNtYXJ0Zm9ybUNvbXBvbmVudCB8IHVuZGVmaW5lZCxcclxuICAgIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzOiBTbWFydEZvcm1JbnZhbGlkRmllbGRzXHJcbiAgKSB7XHJcbiAgICBsZXQgaW52YWxpZEZpZWxkc09mRm9ybSA9IGZvcm0/LmdldEludmFsaWRGaWVsZHMoKTtcclxuICAgIGlmIChpbnZhbGlkRmllbGRzT2ZGb3JtKSB7XHJcbiAgICAgIGludmFsaWRGaWVsZHNPZkZvcm0uaW52YWxpZEZpZWxkS2V5cy5mb3JFYWNoKChrZXkpID0+XHJcbiAgICAgICAgYWdncmVnYXRlZEludmFsaWRGaWVsZHMuaW52YWxpZEZpZWxkS2V5cy5wdXNoKGtleSlcclxuICAgICAgKTtcclxuICAgICAgaW52YWxpZEZpZWxkc09mRm9ybS5pbnZhbGlkRmllbGROYW1lcy5mb3JFYWNoKChrZXkpID0+XHJcbiAgICAgICAgYWdncmVnYXRlZEludmFsaWRGaWVsZHMuaW52YWxpZEZpZWxkTmFtZXMucHVzaChrZXkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gVXNlVWlBY3Rpb25cclxuICBnZXRBZGRpdGlvbmFsUGFyYW1zKHVpQWN0aW9uOiBVaUFjdGlvbik6IFVpQWN0aW9uQWRkaXRpb25hbFBhcmFtcyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmb3JUZXh0QXJlYTogJycsXHJcbiAgICAgIGZvclRleHRGaWVsZDogJycsXHJcbiAgICB9O1xyXG4gIH1cclxuICBnZXRNb2RlbCgpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRGb3JtKHZhbGlkYXRlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1Ym1pdEZvcm1zKHZhbGlkYXRlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHBlcmZvcm1VaUFjdGlvblJlcXVlc3QoXHJcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdCxcclxuICAgIHdpZGdldElkPzogc3RyaW5nLFxyXG4gICAgbm9kZUlkPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh1aUFjdGlvblJlcXVlc3QucGFyYW1zWydfZmlsZXMnXSkge1xyXG4gICAgICBjb25zdCBwYXJhbSA9IHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ3BhcmFtJ107XHJcbiAgICAgIGNvbnN0IGZpbGVzID0gdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snX2ZpbGVzJ107XHJcbiAgICAgIGNvbnN0IHVwbG9hZERlc2NyaXB0b3IgPSB1aUFjdGlvblJlcXVlc3QucGFyYW1zWydfdXBsb2FkRGVzY3JpcHRvciddO1xyXG4gICAgICBjb25zdCBpc011bHRpcGxlID0gdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snaXNNdWx0aXBsZSddO1xyXG4gICAgICBkZWxldGUgdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1sncGFyYW0nXTtcclxuICAgICAgZGVsZXRlIHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ19maWxlcyddO1xyXG4gICAgICBkZWxldGUgdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snX3VwbG9hZERlc2NyaXB0b3InXTtcclxuICAgICAgZGVsZXRlIHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ2lzTXVsdGlwbGUnXTtcclxuXHJcbiAgICAgIC8vIGF3YWl0IHRoaXMuc2VuZE1vZGVsVG9TZXJ2ZXIoKTtcclxuXHJcbiAgICAgIGlmICghaXNNdWx0aXBsZSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybVVwbG9hZEFjdGlvbih0aGlzLnV1aWQhLCB1aUFjdGlvblJlcXVlc3QsIHBhcmFtLCBmaWxlc1swXSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodXBsb2FkRGVzY3JpcHRvciAhPSBudWxsICYmIHVwbG9hZERlc2NyaXB0b3IgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbGV0IG1heEJhdGNoRmlsZXNTaXplID0gdXBsb2FkRGVzY3JpcHRvci5tYXhTaXplICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgICAgbGV0IG1heEJhdGNoU2l6ZSA9IHVwbG9hZERlc2NyaXB0b3IubWF4QmF0Y2hTaXplO1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudEJhdGNoU2l6ZSA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRCYXRjaDogYW55W10gPSBbXTtcclxuICAgICAgICBjb25zdCBiYXRjaGVzOiBhbnlbXVtdID0gW107XHJcblxyXG4gICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgd291bGRFeGNlZWRTaXplID0gY3VycmVudEJhdGNoU2l6ZSArIGZpbGUuc2l6ZSA+IG1heEJhdGNoRmlsZXNTaXplO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHdvdWxkRXhjZWVkQ291bnQgPVxyXG4gICAgICAgICAgICB0eXBlb2YgbWF4QmF0Y2hTaXplID09PSAnbnVtYmVyJyAmJlxyXG4gICAgICAgICAgICBtYXhCYXRjaFNpemUgPiAwICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRCYXRjaC5sZW5ndGggPj0gbWF4QmF0Y2hTaXplO1xyXG5cclxuICAgICAgICAgIGlmICh3b3VsZEV4Y2VlZFNpemUgfHwgd291bGRFeGNlZWRDb3VudCkge1xyXG4gICAgICAgICAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcclxuICAgICAgICAgICAgY3VycmVudEJhdGNoID0gW107XHJcbiAgICAgICAgICAgIGN1cnJlbnRCYXRjaFNpemUgPSAwO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGN1cnJlbnRCYXRjaC5wdXNoKGZpbGUpO1xyXG4gICAgICAgICAgY3VycmVudEJhdGNoU2l6ZSArPSBmaWxlLnNpemU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRCYXRjaC5sZW5ndGgpIHtcclxuICAgICAgICAgIGJhdGNoZXMucHVzaChjdXJyZW50QmF0Y2gpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYmF0Y2hlcy5mb3JFYWNoKFxyXG4gICAgICAgICAgYXN5bmMgKGJhdGNoKSA9PlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LnBlcmZvcm1VcGxvYWRNdWx0aXBsZUFjdGlvbihcclxuICAgICAgICAgICAgICB0aGlzLnV1aWQhLFxyXG4gICAgICAgICAgICAgIHVpQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICAgICAgICBwYXJhbSxcclxuICAgICAgICAgICAgICBiYXRjaFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LnBlcmZvcm1VcGxvYWRNdWx0aXBsZUFjdGlvbihcclxuICAgICAgICAgIHRoaXMudXVpZCEsXHJcbiAgICAgICAgICB1aUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgICBwYXJhbSxcclxuICAgICAgICAgIGZpbGVzXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh3aWRnZXRJZCAmJiBub2RlSWQpIHtcclxuICAgICAgLy8gYXdhaXQgdGhpcy5zZW5kTW9kZWxUb1NlcnZlcigpO1xyXG4gICAgICB0aGlzLmFkZE1vZGVsVG9XaWRnZXRBY3Rpb24odWlBY3Rpb25SZXF1ZXN0KTtcclxuICAgICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5wZXJmb3JtV2lkZ2V0QWN0aW9uKHRoaXMudXVpZCEsIHdpZGdldElkLCBub2RlSWQsIHVpQWN0aW9uUmVxdWVzdCk7XHJcbiAgICB9IGVsc2UgaWYgKHdpZGdldElkKSB7XHJcbiAgICAgIC8vIGF3YWl0IHRoaXMuc2VuZE1vZGVsVG9TZXJ2ZXIoKTtcclxuICAgICAgdGhpcy5hZGRNb2RlbFRvV2lkZ2V0QWN0aW9uKHVpQWN0aW9uUmVxdWVzdCk7XHJcbiAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybVdpZGdldE1haW5BY3Rpb24odGhpcy51dWlkISwgd2lkZ2V0SWQsIHVpQWN0aW9uUmVxdWVzdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LnBlcmZvcm1BY3Rpb24odGhpcy51dWlkISwgdWlBY3Rpb25SZXF1ZXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhZGRNb2RlbFRvV2lkZ2V0QWN0aW9uKHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0KSB7XHJcbiAgICB0aGlzLmFkZE1vZGVsVG9XaWRnZXRQYXJhbXModWlBY3Rpb25SZXF1ZXN0LnBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkTW9kZWxUb1dpZGdldFBhcmFtcyhwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbmRNb2RlbE9uV2lkZ2V0QWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3VibWl0Rm9ybShmYWxzZSk7XHJcbiAgICAgIC8vIG1pbWljIENvbXBvbmVudE1vZGVsXHJcbiAgICAgIHBhcmFtc1snY2xpZW50UGFnZU1vZGVsJ10gPSB7IGRhdGE6IHRoaXMuZ2V0TW9kZWwoKSB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBhc3luYyBzZW5kTW9kZWxUb1NlcnZlcigpIHtcclxuICAvLyAgIHRoaXMuc3VibWl0Rm9ybXMoZmFsc2UpO1xyXG4gIC8vICAgbGV0IGRhdGFDaGFuZ2UgPSB7XHJcbiAgLy8gICAgIGtpbmQ6IERhdGFDaGFuZ2VLaW5kLldpZGdldCxcclxuICAvLyAgICAgc291cmNlOiAnJyxcclxuICAvLyAgICAgdmFsdWVzOiBbWycnLCB0aGlzLmdldE1vZGVsKCldXSxcclxuICAvLyAgIH07XHJcbiAgLy8gICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LmRhdGFDaGFuZ2VkKHRoaXMudXVpZCEsIGRhdGFDaGFuZ2UpO1xyXG4gIC8vIH1cclxuXHJcbiAgaGFuZGxlU3BlY2lmaWNEZW1hbmRzQXN5bmNocm9ub3VzbHkoXHJcbiAgICB1aUFjdGlvbjogVWlBY3Rpb24sXHJcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdFxyXG4gICk6IFByb21pc2U8VWlBY3Rpb25TcGVjaWZpY0RlbWFuZFJlc3BvbnNlPiB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhbmRsZVNwZWNpZmljRGVtYW5kc0FzeW5jaHJvbm91c2x5IG1ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvKipcclxuICAgKiBTdWJtaXRzIGFsbCB0aGUgcmVnaXN0ZXJlZCBmb3JtcyBpbiB0aGUgU21hcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwdWJsaWMgc3VibWl0Rm9ybXModmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydEZvcm1Db21wb25lbnRzKCk/LmZvckVhY2goKGZvcm0pID0+IHtcclxuICAgICAgICBmb3JtPy5zdWJtaXRGb3JtKHZhbGlkYXRlKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm1XaWRnZXRzPy5mb3JFYWNoKChmb3JtKSA9PiB7XHJcbiAgICAgICAgZm9ybT8uc3VibWl0Rm9ybSh2YWxpZGF0ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZEdyaWQoXHJcbiAgICBzbWFydEdyaWQ6IFNtYXJ0R3JpZCxcclxuICAgIG9wdGlvbnM6IEdyaWRPcHRpb25zLFxyXG4gICAgdXNlQXNEZWZhdWx0R3JpZD86IGJvb2xlYW4sXHJcbiAgICBjb21wb25lbnRSZWZlcmVuY2U/OiBTbWFydEdyaWRDb21wb25lbnRcclxuICApOiBTbWFydEdyaWQge1xyXG4gICAgc21hcnRHcmlkLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgc21hcnRHcmlkLnVpQWN0aW9uU2VydmljZSA9IHRoaXMudWlBY3Rpb25TZXJ2aWNlO1xyXG4gICAgc21hcnRHcmlkLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgPSB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2U7XHJcbiAgICBzbWFydEdyaWQuc2VydmljZVRvVXNlID0gdGhpcztcclxuICAgIHNtYXJ0R3JpZC52aWV3Q29udGV4dFNlcnZpY2UgPSB0aGlzLnZpZXdDb250ZXh0O1xyXG5cclxuICAgIGlmICghdGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0cy5zZXQoc21hcnRHcmlkLmdyaWRJZGVudGlmaWVyLCBjb21wb25lbnRSZWZlcmVuY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKGBBZGRlZCBzbWFydEdyaWQgd2hlbiB1c2VRdWVyeUxpc3RzID09PSB0cnVlICgke3NtYXJ0R3JpZC5ncmlkSWRlbnRpZmllcn0pYCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHVzZUFzRGVmYXVsdEdyaWQpIHtcclxuICAgICAgdGhpcy5zbWFydEdyaWQgPSBzbWFydEdyaWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLnNtYXJ0R3JpZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc21hcnRHcmlkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZEZvcm0oXHJcbiAgICBzbWFydEZvcm1JZDogc3RyaW5nLFxyXG4gICAgc21hcnRGb3JtOiBTbWFydEZvcm0sXHJcbiAgICBjb21wb25lbnRSZWZlcmVuY2U/OiBTbWFydGZvcm1Db21wb25lbnRcclxuICApOiBTbWFydEZvcm0ge1xyXG4gICAgaWYgKCF0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgdGhpcy5mb3JtV2lkZ2V0cy5zZXQoc21hcnRGb3JtSWQsIGNvbXBvbmVudFJlZmVyZW5jZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oYEFkZGVkIHNtYXJ0Rm9ybSB3aGVuIHVzZVF1ZXJ5TGlzdHMgPT09IHRydWUgKCR7c21hcnRGb3JtSWR9KWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmICh0aGlzLnNlbmREYXRhQ2hhbmdlcyAmJiBjb21wb25lbnRSZWZlcmVuY2UpIHtcclxuICAgIC8vICAgc21hcnRGb3JtLnVzZU9uVmFsdWVDaGFuZ2VFdmVudCA9IHRydWU7XHJcblxyXG4gICAgLy8gICBjb21wb25lbnRSZWZlcmVuY2Uuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXHJcbiAgICAvLyAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgIC8vICAgICAuc3Vic2NyaWJlKCh2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlKSA9PiB7XHJcbiAgICAvLyAgICAgICB0aGlzLmhhbmRsZVZhbHVlQ2hhbmdlcyh2YWx1ZUNoYW5nZSk7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcmV0dXJuIHNtYXJ0Rm9ybTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRVcERlZmF1bHRUcmVlKHRyZWVJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNtYXJ0VHJlZVNlcnZpY2UgPSB0aGlzLmNyZWF0ZVRyZWVTZXJ2aWNlKHRyZWVJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlVHJlZVNlcnZpY2UodHJlZUlkOiBzdHJpbmcpOiBTbWFydHRyZWVHZW5lcmljU2VydmljZSB7XHJcbiAgICBjb25zdCB0cmVlU2VydmljZSA9IG5ldyBTbWFydHRyZWVHZW5lcmljU2VydmljZSh0aGlzLmluamVjdCwgdGhpcy5wYWdlTmFtZSEsIHRyZWVJZCk7XHJcbiAgICAvLyBJbiB0aGUgdXNlUXVlcnlMaXN0cyBtb2RlbCB0aGUgdHJlZSBpcyByb3V0ZWQgdmlhIHRoZSBTbWFydFRyZWVDb21wb25lbnRcclxuICAgIC8vIFF1ZXJ5TGlzdCArIHRyZWVJZCAoc2VlIGdldFdpZGdldHMpLCBzbyBubyBtYW51YWwgd2lkZ2V0cy5zZXQgaXMgbmVlZGVkOyB0aGVcclxuICAgIC8vIGxlZ2FjeSBub24tUXVlcnlMaXN0IHBhdGggc3RpbGwgcmVnaXN0ZXJzIGl0IGV4cGxpY2l0bHkuXHJcbiAgICBpZiAoIXRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLndpZGdldHMuc2V0KHRyZWVJZCwgdHJlZVNlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cmVlU2VydmljZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGRGaWxlVXBsb2FkZXIoXHJcbiAgICB1aUFjdGlvbkNvZGU6IHN0cmluZyxcclxuICAgIGZpbGVGb3JtYXRzPzogc3RyaW5nW10sXHJcbiAgICBtYXhTaXplTWI/OiBudW1iZXIsXHJcbiAgICBpc011bHRpcGxlPzogYm9vbGVhblxyXG4gICk6IFNtYXJ0Q29tcG9uZW50RmlsZVVwbG9hZGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpQWN0aW9uQ29kZSxcclxuICAgICAgc21hcnRDb21wb25lbnQ6IHRoaXMsXHJcbiAgICAgIGZpbGVGb3JtYXRzLFxyXG4gICAgICBpc011bHRpcGxlLFxyXG4gICAgICBtYXhTaXplTWIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIGRpYWxvZy1ob3N0ZWQgZGVmYXVsdCBjb21wb25lbnRzLCB0aGUgdmlldyB1dWlkIGlzIHBhc3NlZCB0aHJvdWdoIHRoZVxyXG4gICAqIGRpYWxvZyBkYXRhIChNQVRfRElBTE9HX0RBVEEgZm9yIE1hdGVyaWFsLCBEeW5hbWljRGlhbG9nQ29uZmlnLmRhdGEgZm9yXHJcbiAgICogUHJpbWVORykuIFJldHVybnMgdW5kZWZpbmVkIGZvciBzbG90LWhvc3RlZCBjb21wb25lbnRzIChubyBkaWFsb2cgZGF0YSkuICgjMjg4NzApXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkRGlhbG9nRGF0YVV1aWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIGNvbnN0IG1hdERhdGEgPSB0aGlzLmluamVjdC5nZXQ8YW55PihNQVRfRElBTE9HX0RBVEEsIG51bGwpO1xyXG4gICAgaWYgKG1hdERhdGE/LnV1aWQpIHtcclxuICAgICAgcmV0dXJuIG1hdERhdGEudXVpZDtcclxuICAgIH1cclxuICAgIGNvbnN0IHByaW1lQ29uZmlnID0gdGhpcy5pbmplY3QuZ2V0PER5bmFtaWNEaWFsb2dDb25maWcgfCBudWxsPihEeW5hbWljRGlhbG9nQ29uZmlnLCBudWxsKTtcclxuICAgIHJldHVybiBwcmltZUNvbmZpZz8uZGF0YT8udXVpZDtcclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gaGFuZGxlIGNoYW5nZXNcclxuICBwcml2YXRlIGhhbmRsZVZhbHVlQ2hhbmdlcyh2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlKTogdm9pZCB7XHJcbiAgICBsZXQgZGF0YUNoYW5nZTogRGF0YUNoYW5nZTtcclxuICAgIGlmICh2YWx1ZUNoYW5nZS5rZXkuaW5jbHVkZXMoJy4nKSkge1xyXG4gICAgICBjb25zdCBzb3VyY2UgPSB2YWx1ZUNoYW5nZS5rZXkuc3BsaXQoJy4nKVswXTtcclxuICAgICAgY29uc3QgdmFsdWVLZXkgPSB2YWx1ZUNoYW5nZS5rZXkuc3BsaXQoJy4nKVsxXTtcclxuICAgICAgZGF0YUNoYW5nZSA9IHtcclxuICAgICAgICBraW5kOiB2YWx1ZUNoYW5nZS5raW5kID09PSAnYmFzaWMnID8gRGF0YUNoYW5nZUtpbmQuV0lER0VUIDogRGF0YUNoYW5nZUtpbmQuU0VMRUNUSU9OLFxyXG4gICAgICAgIHNvdXJjZSxcclxuICAgICAgICB2YWx1ZXM6IFtbdmFsdWVLZXksIHZhbHVlQ2hhbmdlLnZhbHVlXV0sXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkYXRhQ2hhbmdlID0ge1xyXG4gICAgICAgIGtpbmQ6IHZhbHVlQ2hhbmdlLmtpbmQgPT09ICdiYXNpYycgPyBEYXRhQ2hhbmdlS2luZC5XSURHRVQgOiBEYXRhQ2hhbmdlS2luZC5TRUxFQ1RJT04sXHJcbiAgICAgICAgc291cmNlOiB2YWx1ZUNoYW5nZS5rZXksXHJcbiAgICAgICAgdmFsdWVzOiBbW3ZhbHVlQ2hhbmdlLmtleSwgdmFsdWVDaGFuZ2UudmFsdWVdXSxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZpZXdDb250ZXh0LmRhdGFDaGFuZ2VkKHRoaXMudXVpZCEsIGRhdGFDaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGhhbmRsZUNoYW5nZXMoY2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudE1vZGVsTG9hZGVkKSB7XHJcbiAgICAgICAgLy8gaW5pdGlhbCBsb2FkXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaGFuZ2UuY2hhbmdlZFdpZGdldHMpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZVdpZGdldHMoY2hhbmdlLmNoYW5nZWRXaWRnZXRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGRhdGFDaGFuZ2VIYXNCZWVuTmV4dGVkID0gZmFsc2U7XHJcbiAgICAgIGlmIChjaGFuZ2UuY2hhbmdlcykge1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBjaGFuZ2UuY2hhbmdlcztcclxuICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VzKS5tYXAoKGNoYW5nZUtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY2hhbmdlS2V5LnN0YXJ0c1dpdGgoJ2RhdGEuJykpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVEYXRhQ2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUtleS5zdGFydHNXaXRoKCdsYXlvdXRzLicpICYmIHRoaXMubW9kZWw/LmxheW91dHMpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVMYXlvdXRDaGFuZ2UoY2hhbmdlcywgY2hhbmdlS2V5KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlS2V5LnN0YXJ0c1dpdGgoJ2NvbXBvbmVudExheW91dHMuJykgJiYgdGhpcy5tb2RlbD8ubGF5b3V0cykge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNvbXBvbmVudExheW91dENoYW5nZShjaGFuZ2VzLCBjaGFuZ2VLZXkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkuc3RhcnRzV2l0aCgndmFsdWVTZXRzLicpICYmIHRoaXMubW9kZWw/LnZhbHVlU2V0cykge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVZhbHVlU2V0Q2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUtleSA9PT0gJ2FjdGlvbnMnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uQ2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUtleSA9PT0gJ2NvbnN0cmFpbnRzJykge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNvbnN0cmFpbnRDaGFuZ2UoY2hhbmdlcywgY2hhbmdlS2V5KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlS2V5ID09PSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gY2hhbmdlc1snJ10gYXMgQ29tcG9uZW50TW9kZWw7XHJcbiAgICAgICAgICAgIGRhdGFDaGFuZ2VIYXNCZWVuTmV4dGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKCFkYXRhQ2hhbmdlSGFzQmVlbk5leHRlZCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhQ2hhbmdlZC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgdGhpcy5tb2RlbCA9IGNoYW5nZS52YWx1ZSBhcyBDb21wb25lbnRNb2RlbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWNoYW5nZS5jaGFuZ2VkV2lkZ2V0cyAmJiAhY2hhbmdlLmNoYW5nZXMgJiYgY2hhbmdlLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMubW9kZWwgPSBjaGFuZ2UudmFsdWUgYXMgQ29tcG9uZW50TW9kZWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlQ2hhbmdlV2lkZ2V0cyhjaGFuZ2VkV2lkZ2V0czogc3RyaW5nW10sIHNraXBMb2FkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGxldCB3aWRnZXRzID0gdGhpcy5nZXRXaWRnZXRzKCk7XHJcbiAgICBjaGFuZ2VkV2lkZ2V0cy5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCByZWZlcmVuY2UgPSB3aWRnZXRzLmdldChrZXkpO1xyXG5cclxuICAgICAgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNtYXJ0R3JpZENvbXBvbmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0dXBHcmlkU2VydmljZXMocmVmZXJlbmNlKTtcclxuICAgICAgICBpZiAoIXNraXBMb2FkKSB7XHJcbiAgICAgICAgICByZWZlcmVuY2UucmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBTbWFydHRyZWVTZXJ2aWNlKSB7XHJcbiAgICAgICAgaWYgKCFza2lwTG9hZCkge1xyXG4gICAgICAgICAgcmVmZXJlbmNlLmluaXRpYWxpemUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR1cEZpbHRlclNlcnZpY2VzKHJlZmVyZW5jZSk7XHJcbiAgICAgICAgLy9pZiAoIXNraXBMb2FkKSB7IC8vIGZpbHRlciBpcyBub3QgbG9hZGVkIHdoZW4gc2V0dGluZyB1dWlkXHJcbiAgICAgICAgcmVmZXJlbmNlLnNlcnZpY2UubG9hZCgpO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNtYXJ0TWFwQ29tcG9uZW50KSB7XHJcbiAgICAgICAgcmVmZXJlbmNlLmxvYWQoKTtcclxuICAgICAgfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBTbWFydERpYWdyYW1Db21wb25lbnQpIHtcclxuICAgICAgICByZWZlcmVuY2UubG9hZCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKCFza2lwTG9hZCAmJiByZWZlcmVuY2UgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb3ZpZGVkIHJlZmVyZW5jZSBmb3IgJHtrZXl9IGlzIHVuZGVmaW5lZC5gKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFZhbHVlRGVlcGx5KG1vZGVsOiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICBsZXQgc3BsaXR0ZWRLZXlzID0ga2V5LnNwbGl0KCcuJyk7XHJcblxyXG4gICAgbGV0IGRlZXBNb2RlbDogYW55W10gPSBbbW9kZWxdO1xyXG4gICAgbGV0IHRlbXBNb2RlbDogYW55O1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzcGxpdHRlZEtleXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIHRlbXBNb2RlbCA9IGRlZXBNb2RlbFtpbmRleF07XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ3N0cmluZycgJiZcclxuICAgICAgICB0eXBlb2YgdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dICE9PSAnYm9vbGVhbicgJiZcclxuICAgICAgICB0eXBlb2YgdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dICE9PSAnbnVtYmVyJyAmJlxyXG4gICAgICAgIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICkge1xyXG4gICAgICAgIGRlZXBNb2RlbC5wdXNoKHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpbmRleCA9PT0gc3BsaXR0ZWRLZXlzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBsZXQgb2xkVmFsdWUgPSB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV07XHJcbiAgICAgICAgLy8gaWYgKHZhbHVlID09PSAnJyAmJiAob2xkVmFsdWUgPT09IG51bGwgfHwgb2xkVmFsdWUgPT09IHVuZGVmaW5lZCkgdGhlbiBkb24ndCBjaGFuZ2UgdmFsdWUuXHJcbiAgICAgICAgaWYgKHZhbHVlICE9PSAnJyB8fCAob2xkVmFsdWUgIT09IG51bGwgJiYgb2xkVmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVEYXRhQ2hhbmdlKGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGNoYW5nZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFZhbHVlRGVlcGx5KHRoaXMubW9kZWwsIGNoYW5nZUtleSwgY2hhbmdlc1tjaGFuZ2VLZXldKTtcclxuXHJcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpPy5mb3JFYWNoKChmb3JtKSA9PiB7XHJcbiAgICAgICAgZm9ybS5yZWZyZXNoKCk7XHJcbiAgICAgICAgZm9ybS5tYXJrQWxsV2lkZ2V0c0ZvckNoYW5nZURldGVjdGlvbigpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZm9ybVdpZGdldHMuZm9yRWFjaCgoZm9ybUNvbXBvbmVudDogU21hcnRmb3JtQ29tcG9uZW50IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChmb3JtQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb3ZpZGVkIGZvcm0gcmVmZXJlbmNlIGZvciAke2tleX0gaXMgdW5kZWZpbmVkLmApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmb3JtQ29tcG9uZW50LnJlZnJlc2goKTtcclxuICAgICAgICAgIGZvcm1Db21wb25lbnQubWFya0FsbFdpZGdldHNGb3JDaGFuZ2VEZXRlY3Rpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvciEuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVMYXlvdXRDaGFuZ2UoY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgY2hhbmdlS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBsYXlvdXRLZXkgPSBjaGFuZ2VLZXkuc3BsaXQoJy4nKVsxXTtcclxuICAgIHRoaXMubW9kZWwhLmxheW91dHNbbGF5b3V0S2V5XSA9IGNoYW5nZXNbY2hhbmdlS2V5XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQ29tcG9uZW50TGF5b3V0Q2hhbmdlKGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGNoYW5nZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbGF5b3V0S2V5ID0gY2hhbmdlS2V5LnNwbGl0KCcuJylbMV07XHJcbiAgICBsZXQgY29tcG9uZW50TGF5b3V0czogeyBba2V5OiBzdHJpbmddOiBPYmplY3QgfSA9IHRoaXMubW9kZWwhLmNvbXBvbmVudExheW91dHMgYXMge1xyXG4gICAgICBba2V5OiBzdHJpbmddOiBPYmplY3Q7XHJcbiAgICB9O1xyXG4gICAgY29tcG9uZW50TGF5b3V0c1tsYXlvdXRLZXldID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVWYWx1ZVNldENoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHZhbHVlU2V0S2V5ID0gY2hhbmdlS2V5LnNwbGl0KCcuJylbMV07XHJcbiAgICB0aGlzLm1vZGVsIS52YWx1ZVNldHMhW3ZhbHVlU2V0S2V5XSA9IGNoYW5nZXNbY2hhbmdlS2V5XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQWN0aW9uQ2hhbmdlKGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGNoYW5nZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vZGVsIS5hY3Rpb25zID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xyXG4gICAgdGhpcy5pbml0QWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVDb25zdHJhaW50Q2hhbmdlKGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGNoYW5nZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vZGVsIS5jb25zdHJhaW50cyA9IGNoYW5nZXNbY2hhbmdlS2V5XTtcclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb25cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTbWFydENvbXBvbmVudEZpbGVVcGxvYWRlciB7XHJcbiAgdWlBY3Rpb25Db2RlOiBzdHJpbmc7XHJcbiAgbWF4U2l6ZU1iPzogbnVtYmVyO1xyXG4gIGZpbGVGb3JtYXRzPzogc3RyaW5nW107XHJcbiAgaXNNdWx0aXBsZT86IGJvb2xlYW47XHJcbiAgc21hcnRDb21wb25lbnQ6IFNtYXJ0Q29tcG9uZW50QXBpQ2xpZW50PGFueT47XHJcbn1cclxuIl19
950
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY29tcG9uZW50LWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1jbGllbnQvc21hcnQtY29tcG9uZW50LWFwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUE4QyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFFTCwyQkFBMkIsR0FDNUIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwwRkFBMEYsQ0FBQztBQUM3SSxPQUFPLEVBR0wsbUJBQW1CLEVBR25CLGVBQWUsR0FDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQTBCLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBQ2pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUlMLGNBQWMsRUFHZCx1QkFBdUIsRUFHdkIseUJBQXlCLEVBR3pCLGVBQWUsR0FJaEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFP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Q0FBQyxPQUErQixFQUFFLFNBQWlCO1FBQzNFLElBQUksQ0FBQyxLQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQStCLEVBQUUsU0FBaUI7UUFDL0UsSUFBSSxDQUFDLEtBQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmLCBJbmplY3RvciwgUXVlcnlMaXN0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ0NvbmZpZyB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XHJcbmltcG9ydCB7XHJcbiAgU21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQsXHJcbiAgU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LFxyXG59IGZyb20gJy4uL3NtYXJ0LWNvbXBvbmVudC1sYXlvdXQvcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBTbWFydERpYWdyYW1Db21wb25lbnQgfSBmcm9tICcuLi9zbWFydC1kaWFncmFtL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtZmlsdGVyLWVkaXRvci9zbWFydC1maWx0ZXItZWRpdG9yLWNvbnRlbnQvc21hcnQtZmlsdGVyLWVkaXRvci1jb250ZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgU21hcnRGb3JtLFxyXG4gIFNtYXJ0Rm9ybUludmFsaWRGaWVsZHMsXHJcbiAgU21hcnRGb3JtV2lkZ2V0VHlwZSxcclxuICBTbWFydGZvcm1Db21wb25lbnQsXHJcbiAgU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLFxyXG4gIFZhbHVlQ2hhbmdlTW9kZSxcclxufSBmcm9tICcuLi9zbWFydC1mb3JtL3Byb2plY3RzJztcclxuaW1wb3J0IHsgR3JpZE9wdGlvbnMsIFNtYXJ0R3JpZCwgU21hcnRHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtZ3JpZC9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IFNtYXJ0TWFwQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtbWFwL3NtYXJ0LW1hcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTbWFydFN1YmplY3QgfSBmcm9tICcuLi9zbWFydC1zdWJqZWN0L3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBTbWFydFRyZWVDb21wb25lbnQsXHJcbiAgU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UsXHJcbiAgU21hcnR0cmVlU2VydmljZSxcclxufSBmcm9tICcuLi9zbWFydC10cmVlL3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRNb2RlbCxcclxuICBDb21wb25lbnRNb2RlbENoYW5nZSxcclxuICBEYXRhQ2hhbmdlLFxyXG4gIERhdGFDaGFuZ2VLaW5kLFxyXG4gIEV4ZWN1dGVVaUFjdGlvbk9wdGlvbnMsXHJcbiAgU21hcnRUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gIFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlLFxyXG4gIFVpQWN0aW9uLFxyXG4gIFVpQWN0aW9uQWRkaXRpb25hbFBhcmFtcyxcclxuICBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLFxyXG4gIFVpQWN0aW9uTW9kZWwsXHJcbiAgVWlBY3Rpb25SZXF1ZXN0LFxyXG4gIFVpQWN0aW9uU2VydmljZSxcclxuICBVaUFjdGlvblNwZWNpZmljRGVtYW5kUmVzcG9uc2UsXHJcbiAgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50LFxyXG4gIFVzZVVpQWN0aW9uMixcclxufSBmcm9tICcuLi92aWV3LWNvbnRleHQvcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBTbWFydFN0eWxlVXRpbGl0eSB9IGZyb20gJy4uL3ZpZXctY29udGV4dC91dGlsaXR5L3NtYXJ0LXN0eWxlLXV0aWxpdHknO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0QmFja2VuZEJvb3RzdHJhcFNlcnZpY2UsXHJcbiAgVmlld0NvbnRleHRSZWJ1aWx0RXJyb3IsXHJcbn0gZnJvbSAnLi4vc2Vzc2lvbi9zbWFydC1iYWNrZW5kLWJvb3RzdHJhcC5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTbWFydENvbXBvbmVudEFwaUNsaWVudDxUPiBpbXBsZW1lbnRzIFVzZVVpQWN0aW9uMiB7XHJcbiAgcHJvdGVjdGVkIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBpbi1mbGlnaHQge0BsaW5rIHJ1bn0sIHNvIHRoZSB0d28gcnVuKCkgY2FsbHMgb2YgYSBtb3VudCBzaGFyZSBvbmUgbG9hZC5cclxuICAgKiBLZXllZCBieSB1dWlkOiB2aWV3IHJldXNlIHNldHMgYSBuZXcgdXVpZCwgYW5kIG11c3Qgbm90IGpvaW4gdGhlIHN0YWxlIHJ1bi5cclxuICAgKi9cclxuICBwcml2YXRlIHJ1bkluRmxpZ2h0OiB7IHV1aWQ6IHN0cmluZyB8IHVuZGVmaW5lZDsgcHJvbWlzZTogUHJvbWlzZTx2b2lkPiB9IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcml2YXRlIGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PENvbXBvbmVudE1vZGVsQ2hhbmdlPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xyXG5cclxuICBwcml2YXRlIF91dWlkPzogc3RyaW5nO1xyXG5cclxuICBwcm90ZWN0ZWQgY29tcG9uZW50TW9kZWxMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgZ2V0IHV1aWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl91dWlkO1xyXG4gIH1cclxuICBzZXQgdXVpZCh1dWlkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl91dWlkID09PSB1dWlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBmaXJzdFV1aWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMudXVpZCkge1xyXG4gICAgICB0aGlzLnZpZXdDb250ZXh0LnVuZm9sbG93KHRoaXMudXVpZCk7XHJcbiAgICAgIGZpcnN0VXVpZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdXVpZCA9IHV1aWQ7XHJcbiAgICBpZiAodGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpKSB7XHJcbiAgICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xyXG4gICAgICAgIFNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5zZXRVdWlkKGNvbXAsIHV1aWQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuZ2V0V2lkZ2V0cygpLmZvckVhY2goKHJlZiwga2V5KSA9PiB7XHJcbiAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBTbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgICAgICByZWYudXVpZCA9IHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPyB1dWlkIDogdW5kZWZpbmVkO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudCkge1xyXG4gICAgICAgIHJlZi5zZXJ2aWNlLmNvbmZpZy51dWlkID0gdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCA/IHV1aWQgOiB1bmRlZmluZWQ7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVmIGluc3RhbmNlb2YgU21hcnREaWFncmFtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgcmVmLnV1aWQgPSB0aGlzLmNvbXBvbmVudE1vZGVsTG9hZGVkID8gdXVpZCA6IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyB9IGVsc2UgaWYgKHJlZiBpbnN0YW5jZW9mIFNtYXJ0TWFwQ29tcG9uZW50KSB7XHJcbiAgICAgICAgLy8gICByZWYudXVpZCA9IHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPyB1dWlkIDogdW5kZWZpbmVkO1xyXG4gICAgICB9IGVsc2UgaWYgKCFyZWYgJiYgIWZpcnN0VXVpZCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb3ZpZGVkIHJlZmVyZW5jZSBmb3IgJHtrZXl9IGlzIHVuZGVmaW5lZCBvbiB1dWlkIGNoYW5nZS5gKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodXVpZCkge1xyXG4gICAgICB0aGlzLnZpZXdDb250ZXh0LmZvbGxvdyh0aGlzLl91dWlkISwgdGhpcy5kZXRlY3RDaGFuZ2UpO1xyXG4gICAgICB0aGlzLm9uVXVpZFJlc29sdmVkKHV1aWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbW9kZWw6IENvbXBvbmVudE1vZGVsIHwgdW5kZWZpbmVkO1xyXG5cclxuICBnZXQgbW9kZWwoKTogQ29tcG9uZW50TW9kZWwgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xyXG4gIH1cclxuICBzZXQgbW9kZWwobW9kZWw6IENvbXBvbmVudE1vZGVsIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xyXG5cclxuICAgIHRoaXMuaW5pdENvbXBvbmVudEJ5TW9kZWwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RhdGE/OiBUO1xyXG5cclxuICBnZXQgZGF0YSgpOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuICBzZXQgZGF0YShtb2RlbDogVCB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZGF0YSA9IG1vZGVsO1xyXG4gICAgdGhpcy5kYXRhQ2hhbmdlZC5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdWlBY3Rpb25Nb2RlbHM6IFVpQWN0aW9uTW9kZWxbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgZGF0YUNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcclxuXHJcbiAgLy8gR3JpZFxyXG4gIHNtYXJ0R3JpZD86IFNtYXJ0R3JpZDtcclxuXHJcbiAgLy8gU2VydmljZXNcclxuICBwcm90ZWN0ZWQgdmlld0NvbnRleHQ6IFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBib290c3RyYXA6IFNtYXJ0QmFja2VuZEJvb3RzdHJhcFNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHVpQWN0aW9uU2VydmljZTogVWlBY3Rpb25TZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCB1aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlOiBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCB0cmFuc2xhdGU/OiBTbWFydFRyYW5zbGF0ZVNlcnZpY2U7XHJcblxyXG4gIC8vIFRyZWVcclxuICBwcml2YXRlIF9zbWFydFRyZWVTZXJ2aWNlPzogU21hcnR0cmVlR2VuZXJpY1NlcnZpY2U7XHJcblxyXG4gIHB1YmxpYyBnZXQgc21hcnRUcmVlU2VydmljZSgpOiBTbWFydHRyZWVHZW5lcmljU2VydmljZSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc21hcnRUcmVlU2VydmljZTtcclxuICB9XHJcbiAgcHVibGljIHNldCBzbWFydFRyZWVTZXJ2aWNlKHNtYXJ0VHJlZVNlcnZpY2U6IFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5fc21hcnRUcmVlU2VydmljZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdUaGUgZGVmYXVsdCB0cmVlIGhhcyBhbHJlYWR5IHNldCB1cCEnKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NtYXJ0VHJlZVNlcnZpY2UgPSBzbWFydFRyZWVTZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29udGFpbmVkIFdpZGdldHNcclxuICB3aWRnZXRzOiBNYXA8XHJcbiAgICBzdHJpbmcsXHJcbiAgICBTbWFydEdyaWRDb21wb25lbnQgfCBTbWFydHRyZWVHZW5lcmljU2VydmljZSB8IFNtYXJ0TWFwQ29tcG9uZW50IHwgdW5kZWZpbmVkXHJcbiAgPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgZm9ybVdpZGdldHM6IE1hcDxzdHJpbmcsIFNtYXJ0Zm9ybUNvbXBvbmVudCB8IHVuZGVmaW5lZD4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByaXZhdGUgX3VzZVF1ZXJ5TGlzdHM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBnZXQgdXNlUXVlcnlMaXN0cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl91c2VRdWVyeUxpc3RzO1xyXG4gIH1cclxuXHJcbiAgc2V0IHVzZVF1ZXJ5TGlzdHModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gdHJ1ZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCd1c2VRdWVyeUxpc3RzIGNhbm5vdCBiZSBzZXQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdXNlUXVlcnlMaXN0cyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZW5kTW9kZWxPbldpZGdldEFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpbm1lZGlhdGVEYXRhQ2hhbmdlS2V5czogc3RyaW5nW10gPSBbXTtcclxuICBibHVyRGF0YUNoYW5nZUtleXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByb3RlY3RlZCBkYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcnMgPSBuZXcgTWFwPFNtYXJ0Zm9ybUNvbXBvbmVudCwgQXJyYXk8U3Vic2NyaXB0aW9uPj4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlck1vZGVsQ2hhbmdlU3ViamVjdHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDx2b2lkPj4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yPzogQ2hhbmdlRGV0ZWN0b3JSZWY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGluamVjdDogSW5qZWN0b3IsXHJcbiAgICBwcm90ZWN0ZWQgcGFnZU5hbWU/OiBzdHJpbmcsXHJcbiAgICBwcm90ZWN0ZWQgX2NvbXBvbmVudE5hbWU/OiBzdHJpbmcsXHJcbiAgICBwcm90ZWN0ZWQgZWxlbWVudD86IEVsZW1lbnRSZWYsXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI/OiBSZW5kZXJlcjJcclxuICApIHtcclxuICAgIC8vIGNoZWNrIGFuZCBjYWxjdWxhdGUgcGFnZU5hbWVcclxuICAgIGlmICghdGhpcy5wYWdlTmFtZSAmJiAhdGhpcy5fY29tcG9uZW50TmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZ2VOYW1lIG9yIGNvbXBvbmVudE5hbWUgbXVzdCBiZSBzcGVjaWZpZWQhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aWV3Q29udGV4dCA9IGluamVjdC5nZXQoU21hcnRWaWV3Q29udGV4dFNlcnZpY2UpO1xyXG4gICAgdGhpcy5ib290c3RyYXAgPSBpbmplY3QuZ2V0KFNtYXJ0QmFja2VuZEJvb3RzdHJhcFNlcnZpY2UpO1xyXG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudE5hbWUpIHtcclxuICAgICAgbGV0IHBhZ2VOYW1lRm9yQ29tcG9uZW50ID0gdGhpcy52aWV3Q29udGV4dC5nZXRQYWdlTmFtZU9mQ29tcG9uZW50KHRoaXMuX2NvbXBvbmVudE5hbWUpO1xyXG4gICAgICBpZiAoIXRoaXMucGFnZU5hbWUpIHtcclxuICAgICAgICB0aGlzLnBhZ2VOYW1lID0gcGFnZU5hbWVGb3JDb21wb25lbnQ7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYWdlTmFtZSAhPT0gcGFnZU5hbWVGb3JDb21wb25lbnQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBgcGFnZU5hbWUgKCR7cGFnZU5hbWV9KSBhbmQgY29tcG9uZW50TmFtZSAoJHtfY29tcG9uZW50TmFtZX0pIGRvZXNuJ3QgbWF0Y2ghYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGZyb20gdGhpcyBwb2ludCB3ZSBoYXZlIHRoaXMucGFnZU5hbWVcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlLnN1YnNjcmliZSgoY2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSkgPT4ge1xyXG4gICAgICB0aGlzLmhhbmRsZUNoYW5nZXMoY2hhbmdlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudWlBY3Rpb25TZXJ2aWNlID0gaW5qZWN0LmdldChVaUFjdGlvblNlcnZpY2UpO1xyXG4gICAgdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlID0gaW5qZWN0LmdldChVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIF9uZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucnVuKCk7XHJcbiAgfVxyXG4gIF9uZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0NvbnRleHQudW5mb2xsb3codGhpcy51dWlkISk7XHJcbiAgICB0aGlzLndpZGdldHMuY2xlYXIoKTtcclxuICAgIHRoaXMuZm9ybVdpZGdldHMuY2xlYXIoKTtcclxuICAgIHRoaXMuZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXJzLmNsZWFyKCk7XHJcbiAgICB0aGlzLmZpbHRlck1vZGVsQ2hhbmdlU3ViamVjdHMuY2xlYXIoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhpcyBjb21wb25lbnQncyB1dWlkIGlzIHNldCB0byBhIG5vbi1udWxsIHZhbHVlIChpdCBtYXlcclxuICAgKiBmaXJlIG1vcmUgdGhhbiBvbmNlIGlmIHRoZSB1dWlkIGNoYW5nZXMpLiBEZWZhdWx0OiBuby1vcC5cclxuICAgKiBDb25zdW1lcnMgdGhhdCByZXNvbHZlZCB0aGVpciB1dWlkIGluIHRoZSBjb25zdHJ1Y3RvciAoZS5nLiBmaWx0ZXIgY29uZmlnKVxyXG4gICAqIG92ZXJyaWRlIHRoaXMgdG8gZGVmZXIgdGhhdCB3aXJpbmcgdW50aWwgdGhlIHV1aWQgaXMgaW5qZWN0ZWQg4oCUIHJlcXVpcmVkIGZvclxyXG4gICAqIGR5bmFtaWMgZGVmYXVsdCBjb21wb25lbnRzIHdob3NlIHV1aWQgaXMgbm90IGtub3duIGF0IGNvbnN0cnVjdGlvbi4gKCMyODg3MClcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgb25VdWlkUmVzb2x2ZWQodXVpZDogc3RyaW5nKTogdm9pZCB7fVxyXG5cclxuICBfbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IHRoaXMuaW5qZWN0LmdldChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIGlmICghdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdTbWFydENvbXBvbmVudExheW91dHNRTCBub3QgYXZhaWxhYmxlIScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcnlMaXN0KHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKSEsIChjb21wKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy51dWlkICYmIHRoaXMudXVpZCAhPT0gY29tcC51dWlkKSB7XHJcbiAgICAgICAgICAgIGNvbXAudXBkYXRlVXVpZCh0aGlzLnV1aWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldEdyaWRzKGNvbXApLmZvckVhY2goKGdyaWQpID0+XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBHcmlkU2VydmljZXMoZ3JpZClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoY29tcC5zbWFydENvbXBvbmVudExheW91dCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRBY3Rpb25zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0VXBsb2FkQ2FsbGJhY2soY29tcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gZm9yIGhhbmRsaW5nIGVtYmVkZGVkIGZvcm1zXHJcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUxpc3QodGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpISwgKGZvcm0pID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRGF0YUNoYW5nZVN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0VXBsb2FkQ2FsbGJhY2soZm9ybSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmdldFNtYXJ0Rm9ybXNRTCgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdnZXRTbWFydEZvcm1zUUwgbm90IGF2YWlsYWJsZSEnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0Rm9ybXNRTCgpISwgKGZvcm0pID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlRGF0YUNoYW5nZVN1YnNjcmlwdGlvbnMoKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlVXBsb2FkQ2FsbGJhY2soZm9ybSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmdldFNtYXJ0R3JpZHNRTCgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdTbWFydEdyaWRzUUwgbm90IGF2YWlsYWJsZSEnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0R3JpZHNRTCgpISwgKGdyaWQpID0+IHtcclxuICAgICAgICAgIGlmIChncmlkKSB7XHJcbiAgICAgICAgICAgIGlmIChncmlkLnNtYXJ0R3JpZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0dXBHcmlkU2VydmljZXMoZ3JpZCk7XHJcbiAgICAgICAgICAgICAgZ3JpZC5zZXR1cFRvb2xiYXIoKTtcclxuICAgICAgICAgICAgICBpZiAoZ3JpZC50b29sYmFyIHx8IGdyaWQuaGVhZGVyVG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0QWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy51dWlkICYmIHRoaXMudXVpZCAhPT0gZ3JpZC51dWlkKSB7XHJcbiAgICAgICAgICAgICAgZ3JpZC51dWlkID0gdGhpcy51dWlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5nZXRTbWFydE1hcFFMKCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1NtYXJ0TWFwc1FMIGlzIG5vdCBhdmFpbGFibGUhJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUxpc3QodGhpcy5nZXRTbWFydE1hcFFMKCkhLCAobWFwKSA9PiB7XHJcbiAgICAgICAgICBtYXAudmlld0NvbnRleHRTZXJ2aWNlID0gdGhpcy52aWV3Q29udGV4dDtcclxuICAgICAgICAgIGlmICh0aGlzLnV1aWQgJiYgdGhpcy51dWlkICE9PSBtYXAudXVpZCkge1xyXG4gICAgICAgICAgICBtYXAudXVpZCA9IHRoaXMudXVpZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuZ2V0U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMKCkpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1NtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHNRTCBub3QgYXZhaWxhYmxlIScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcnlMaXN0KHRoaXMuZ2V0U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMKCkhLCAoZmlsdGVyQ29tcCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGZpbHRlckNvbXApIHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlckNvbXAuc2VydmljZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0dXBGaWx0ZXJTZXJ2aWNlcyhmaWx0ZXJDb21wKTtcclxuICAgICAgICAgICAgICBsZXQgc2VydmljZSA9IGZpbHRlckNvbXAuc2VydmljZTtcclxuICAgICAgICAgICAgICBsZXQgaWRlbnRpZmllciA9IHNlcnZpY2UuY29uZmlnLmlkZW50aWZpZXI7XHJcbiAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgJiYgIXRoaXMuZmlsdGVyTW9kZWxDaGFuZ2VTdWJqZWN0cy5oYXMoaWRlbnRpZmllcikpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyTW9kZWxDaGFuZ2VTdWJqZWN0cy5zZXQoaWRlbnRpZmllciwgc2VydmljZS5tb2RlbENoYW5nZWQpO1xyXG4gICAgICAgICAgICAgICAgc2VydmljZS5tb2RlbENoYW5nZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRBbGxGaWx0ZXJVaUFjdGlvblRvb2xiYXJzKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEFjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXR1cEdyaWRTZXJ2aWNlcyhncmlkOiBTbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgIGlmIChncmlkLnNtYXJ0R3JpZCkge1xyXG4gICAgICBpZiAoIWdyaWQuc21hcnRHcmlkLnVpQWN0aW9uU2VydmljZSkge1xyXG4gICAgICAgIGdyaWQuc21hcnRHcmlkLnVpQWN0aW9uU2VydmljZSA9IHRoaXMudWlBY3Rpb25TZXJ2aWNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZ3JpZC5zbWFydEdyaWQudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSkge1xyXG4gICAgICAgIGdyaWQuc21hcnRHcmlkLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgPSB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFncmlkLnNtYXJ0R3JpZC5zZXJ2aWNlVG9Vc2UpIHtcclxuICAgICAgICBncmlkLnNtYXJ0R3JpZC5zZXJ2aWNlVG9Vc2UgPSB0aGlzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZ3JpZC5zbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlKSB7XHJcbiAgICAgICAgZ3JpZC5zbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlID0gdGhpcy52aWV3Q29udGV4dDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEZpbHRlclNlcnZpY2VzKGZpbHRlckNvbXA6IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudCkge1xyXG4gICAgaWYgKGZpbHRlckNvbXAuc2VydmljZSkge1xyXG4gICAgICBsZXQgc2VydmljZSA9IGZpbHRlckNvbXAuc2VydmljZTtcclxuICAgICAgc2VydmljZS5wYXJlbnRTbWFydENvbXBvbmVudCA9IHRoaXM7XHJcbiAgICAgIGlmICh0aGlzLnV1aWQgJiYgdGhpcy51dWlkICE9PSBzZXJ2aWNlLmNvbmZpZy51dWlkKSB7XHJcbiAgICAgICAgc2VydmljZS5jb25maWcudXVpZCA9IHRoaXMudXVpZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGhhbmRsZVF1ZXJ5TGlzdFNpbXBsZTxUPihxbDogUXVlcnlMaXN0PFQ+LCBoYW5kbGVyOiAoKSA9PiB2b2lkKSB7XHJcbiAgICBoYW5kbGVyKCk7XHJcbiAgICBxbC5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IGhhbmRsZXIoKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlUXVlcnlMaXN0PFQ+KHFsOiBRdWVyeUxpc3Q8VD4sIGhhbmRsZXI6IChlbDogVCkgPT4gdm9pZCkge1xyXG4gICAgcWwuZm9yRWFjaCgoZWwpID0+IGhhbmRsZXIoZWwpKTtcclxuICAgIHFsLmNoYW5nZXNcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgobGlzdCkgPT4gKGxpc3QgYXMgUXVlcnlMaXN0PFQ+KS5mb3JFYWNoKChlbCkgPT4gaGFuZGxlcihlbCkpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydEZvcm1zUUwoKTogUXVlcnlMaXN0PFNtYXJ0Zm9ybUNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydEdyaWRzUUwoKTogUXVlcnlMaXN0PFNtYXJ0R3JpZENvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydFRyZWVzUUwoKTogUXVlcnlMaXN0PFNtYXJ0VHJlZUNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRzUUwoKTpcclxuICAgIHwgUXVlcnlMaXN0PFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudD5cclxuICAgIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U21hcnRVaUFjdGlvblRvb2xiYXJzUUwoKTogUXVlcnlMaXN0PFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpOlxyXG4gICAgfCBRdWVyeUxpc3Q8U21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQ+XHJcbiAgICB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0TWFwUUwoKTogUXVlcnlMaXN0PFNtYXJ0TWFwQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0RGlhZ3JhbVFMKCk6IFF1ZXJ5TGlzdDxTbWFydERpYWdyYW1Db21wb25lbnQ+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgZ2V0V2lkZ2V0cygpOiBNYXA8XHJcbiAgICBzdHJpbmcsXHJcbiAgICB8IFNtYXJ0R3JpZENvbXBvbmVudFxyXG4gICAgfCBTbWFydHRyZWVTZXJ2aWNlPGFueT5cclxuICAgIHwgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50XHJcbiAgICB8IFNtYXJ0TWFwQ29tcG9uZW50XHJcbiAgICB8IFNtYXJ0RGlhZ3JhbUNvbXBvbmVudFxyXG4gICAgfCB1bmRlZmluZWRcclxuICA+IHtcclxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgbGV0IHdpZGdldHM6IE1hcDxcclxuICAgICAgICBzdHJpbmcsXHJcbiAgICAgICAgfCBTbWFydEdyaWRDb21wb25lbnRcclxuICAgICAgICB8IFNtYXJ0dHJlZVNlcnZpY2U8YW55PlxyXG4gICAgICAgIHwgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50XHJcbiAgICAgICAgfCBTbWFydE1hcENvbXBvbmVudFxyXG4gICAgICAgIHwgU21hcnREaWFncmFtQ29tcG9uZW50XHJcbiAgICAgICAgfCB1bmRlZmluZWRcclxuICAgICAgPiA9IG5ldyBNYXAoKTtcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydEdyaWRDb21wb25lbnRzKClcclxuICAgICAgICAuZmlsdGVyKChncmlkKSA9PiAoZ3JpZD8uc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciA/IHRydWUgOiBmYWxzZSkpXHJcbiAgICAgICAgLmZvckVhY2goKGdyaWQpID0+IHdpZGdldHMuc2V0KGdyaWQuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllciwgZ3JpZCkpO1xyXG4gICAgICAvLyBLZXkgdHJlZXMgYnkgdGhlaXIgdHJlZUlkIChzZXQgaW4gdGhlIHNlcnZpY2UgY29uc3RydWN0b3IpLCBOT1QgYnlcclxuICAgICAgLy8gc21hcnRUcmVlTW9kZWwuaWRlbnRpZmllciAob25seSBzZXQgYWZ0ZXIgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgc3luY1RyZWUpLiBBIHRyZWVcclxuICAgICAgLy8gdGhhdCBleGlzdHMgYnV0IGhhcyBub3QgZmluaXNoZWQgaXRzIGluaXRpYWwgZG93bmxvYWQgd291bGQgb3RoZXJ3aXNlIGJlIGFic2VudFxyXG4gICAgICAvLyBmcm9tIHRoZSB3aWRnZXQgbWFwLCBzbyBhIHB1c2ggdXBkYXRlIGNvdWxkIG5vdCByZXNvbHZlIGl0XHJcbiAgICAgIC8vIChcIlByb3ZpZGVkIHJlZmVyZW5jZSBmb3IgPHRyZWVJZD4gaXMgdW5kZWZpbmVkXCIpLiB0cmVlSWQgZXF1YWxzIHRoZSBiYWNrZW5kXHJcbiAgICAgIC8vIHdpZGdldCBpZGVudGlmaWVyLCBzbyBwdXNoIHJvdXRpbmcgbWF0Y2hlcyByZWdhcmRsZXNzIG9mIGRvd25sb2FkIHRpbWluZy4gKCMyODM2MSlcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydFRyZWVDb21wb25lbnRzKClcclxuICAgICAgICAuZmlsdGVyKCh0cmVlKSA9PiAhIXRyZWU/LnRyZWVJZClcclxuICAgICAgICAuZm9yRWFjaCgodHJlZSkgPT4gd2lkZ2V0cy5zZXQodHJlZS50cmVlSWQhLCB0cmVlKSk7XHJcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50cygpXHJcbiAgICAgICAgLmZpbHRlcigoZmlsdGVyKSA9PiAoZmlsdGVyLnNlcnZpY2UuY29uZmlnLmlkZW50aWZpZXIgPyB0cnVlIDogZmFsc2UpKVxyXG4gICAgICAgIC5mb3JFYWNoKChmaWx0ZXIpID0+IHdpZGdldHMuc2V0KGZpbHRlci5zZXJ2aWNlLmNvbmZpZy5pZGVudGlmaWVyLCBmaWx0ZXIpKTtcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydE1hcENvbXBvbmVudHMoKVxyXG4gICAgICAgIC5maWx0ZXIoKG1hcCkgPT4gISFtYXAuaWRlbnRpZmllcilcclxuICAgICAgICAuZm9yRWFjaCgobWFwKSA9PiB3aWRnZXRzLnNldChtYXAuaWRlbnRpZmllciwgbWFwKSk7XHJcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnREaWFncmFtQ29tcG9uZW50cygpXHJcbiAgICAgICAgLmZpbHRlcigoZGlhZ3JhbSkgPT4gISFkaWFncmFtLmlkZW50aWZpZXIpXHJcbiAgICAgICAgLmZvckVhY2goKGRpYWdyYW0pID0+IHdpZGdldHMuc2V0KGRpYWdyYW0uaWRlbnRpZmllciwgZGlhZ3JhbSkpO1xyXG4gICAgICByZXR1cm4gd2lkZ2V0cztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLndpZGdldHM7XHJcbiAgfVxyXG5cclxuICBpbml0Q29tcG9uZW50QnlNb2RlbCgpOiB2b2lkIHtcclxuICAgIFNtYXJ0U3R5bGVVdGlsaXR5LmFwcGx5U3R5bGUodGhpcy5tb2RlbD8uc3R5bGUsIHRoaXMuZWxlbWVudCwgdGhpcy5yZW5kZXJlcik7XHJcbiAgICBTbWFydFN0eWxlVXRpbGl0eS5hcHBseVN0eWxlKHRoaXMubW9kZWw/LnBhcmVudFN0eWxlLCB0aGlzLmVsZW1lbnQsIHRoaXMucmVuZGVyZXIsIHRydWUpO1xyXG4gICAgdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgaWYgKHRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKT8uZm9yRWFjaCgoZm9ybSkgPT4ge1xyXG4gICAgICAgIGlmIChmb3JtLnNtYXJ0Rm9ybSkge1xyXG4gICAgICAgICAgZm9ybS5zbWFydEZvcm0uY29tcG9uZW50TW9kZWwgPSB0aGlzLm1vZGVsO1xyXG4gICAgICAgICAgLy8gdXNlcyBkYXRhLCB2YWx1ZVNldHMsIGNvbnN0cmFpbnRzXHJcbiAgICAgICAgICBmb3JtLmNvbnN0cnVjdEZvcm0oKTtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlVXBsb2FkQ2FsbGJhY2soZm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3I/LmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuaW5pdEFjdGlvbnMoKTtcclxuICAgIC8vIFRPRE86IGxheW91dCwgd2lkZ2V0c1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKTogU21hcnRmb3JtQ29tcG9uZW50W10ge1xyXG4gICAgbGV0IGZvcm1zOiBTbWFydGZvcm1Db21wb25lbnRbXSA9IHRoaXMuZ2V0U21hcnRGb3Jtc1FMKCk/LnRvQXJyYXkoKSA/PyBbXTtcclxuICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xyXG4gICAgICBmb3Jtcy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRGb3Jtcyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3JtcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydEdyaWRDb21wb25lbnRzKCk6IFNtYXJ0R3JpZENvbXBvbmVudFtdIHtcclxuICAgIGxldCBncmlkczogU21hcnRHcmlkQ29tcG9uZW50W10gPSB0aGlzLmdldFNtYXJ0R3JpZHNRTCgpPy50b0FycmF5KCkgPz8gW107XHJcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcclxuICAgICAgZ3JpZHMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0R3JpZHMoY29tcCkpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZ3JpZHM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0QWxsU21hcnRNYXBDb21wb25lbnRzKCk6IEFycmF5PFNtYXJ0TWFwQ29tcG9uZW50PiB7XHJcbiAgICBjb25zdCBtYXBzOiBBcnJheTxTbWFydE1hcENvbXBvbmVudD4gPSB0aGlzLmdldFNtYXJ0TWFwUUwoKT8udG9BcnJheSgpID8/IFtdO1xyXG4gICAgdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpPy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIG1hcHMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0TWFwcyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtYXBzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0RGlhZ3JhbUNvbXBvbmVudHMoKTogQXJyYXk8U21hcnREaWFncmFtQ29tcG9uZW50PiB7XHJcbiAgICBjb25zdCBtYXBzOiBBcnJheTxTbWFydERpYWdyYW1Db21wb25lbnQ+ID0gdGhpcy5nZXRTbWFydERpYWdyYW1RTCgpPy50b0FycmF5KCkgPz8gW107XHJcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcclxuICAgICAgbWFwcy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXREaWFncmFtcyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBtYXBzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0VHJlZUNvbXBvbmVudHMoKTogU21hcnR0cmVlU2VydmljZTxhbnk+W10ge1xyXG4gICAgbGV0IHRyZWVzOiBTbWFydHRyZWVTZXJ2aWNlPGFueT5bXSA9XHJcbiAgICAgIHRoaXMuZ2V0U21hcnRUcmVlc1FMKClcclxuICAgICAgICA/LnRvQXJyYXkoKVxyXG4gICAgICAgIC5tYXAoKHRyZWUpID0+IHRyZWUudHJlZVNlcnZpY2UpID8/IFtdO1xyXG4gICAgdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpPy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIHRyZWVzLnB1c2goLi4uU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldFRyZWVzKGNvbXApKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRyZWVzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHMoKTogU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50W10ge1xyXG4gICAgbGV0IGZpbHRlcnM6IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudFtdID1cclxuICAgICAgdGhpcy5nZXRTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRzUUwoKT8udG9BcnJheSgpID8/IFtdO1xyXG4gICAgdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpPy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIGZpbHRlcnMucHVzaCguLi5TbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0RmlsdGVycyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmaWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0VWlBY3Rpb25Ub29sYmFycygpOiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnRbXSB7XHJcbiAgICBsZXQgdG9vbGJhcnM6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdID0gdGhpcy5nZXRTbWFydFVpQWN0aW9uVG9vbGJhcnNRTCgpPy50b0FycmF5KCkgPz8gW107XHJcbiAgICB0aGlzLmdldEFsbFNtYXJ0R3JpZENvbXBvbmVudHMoKT8uZm9yRWFjaCgoZ3JpZCkgPT4ge1xyXG4gICAgICBpZiAoZ3JpZC50b29sYmFyKSB7XHJcbiAgICAgICAgdG9vbGJhcnMucHVzaChncmlkLnRvb2xiYXIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmlkLmhlYWRlclRvb2xiYXIpIHtcclxuICAgICAgICB0b29sYmFycy5wdXNoKGdyaWQuaGVhZGVyVG9vbGJhcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpPy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIHRvb2xiYXJzLnB1c2goLi4uU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldFRvb2xiYXJzKGNvbXApKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5nZXRBbGxTbWFydEZvcm1Db21wb25lbnRzKClcclxuICAgICAgPy5mbGF0TWFwKChmb3JtKSA9PiBmb3JtLmdldFRvb2xiYXJzKCkpXHJcbiAgICAgIC5maWx0ZXIoKHRvb2xiYXIpID0+IHRvb2xiYXIgIT09IHVuZGVmaW5lZCB8fCB0b29sYmFyICE9PSBudWxsKVxyXG4gICAgICAuZm9yRWFjaCgodG9vbGJhcikgPT4gdG9vbGJhcnMucHVzaCh0b29sYmFyIGFzIFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCkpO1xyXG5cclxuICAgIHRoaXMuZ2V0QWxsRmlsdGVyVWlBY3Rpb25Ub29sYmFycygpLmZvckVhY2goKHRvb2xiYXIpID0+IHRvb2xiYXJzLnB1c2godG9vbGJhcikpO1xyXG4gICAgcmV0dXJuIHRvb2xiYXJzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbEZpbHRlclVpQWN0aW9uVG9vbGJhcnMoKTogVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50cygpXHJcbiAgICAgIC5mbGF0TWFwKChmaWx0ZXIpID0+XHJcbiAgICAgICAgZmlsdGVyLnNpbXBsZUZpbHRlclJlZj8uaW5zdGFuY2UgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgPyBmaWx0ZXIuc2ltcGxlRmlsdGVyUmVmPy5pbnN0YW5jZS5nZXRUb29sYmFycygpXHJcbiAgICAgICAgICA6IGZpbHRlci5zZXJ2aWNlLmdldENvbXBsZXhUb29sYmFycygpXHJcbiAgICAgIClcclxuICAgICAgLmZpbHRlcigodG9vbGJhcikgPT4gdG9vbGJhciAhPT0gdW5kZWZpbmVkIHx8IHRvb2xiYXIgIT09IG51bGwpXHJcbiAgICAgIC5tYXAoKHRvb2xiYXIpID0+IHRvb2xiYXIgYXMgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50KTtcclxuICB9XHJcblxyXG4gIGluaXREYXRhKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubW9kZWw/LmRhdGEpIHtcclxuICAgICAgdGhpcy5kYXRhID0gdGhpcy5tb2RlbD8uZGF0YSBhcyBhbnk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0QWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vZGVsPy5hY3Rpb25zKSB7XHJcbiAgICAgIGxldCB1aUFjdGlvbk1vZGVscyA9IHRoaXMubW9kZWw/LmFjdGlvbnMubWFwKCh1aUFjdGlvbjogVWlBY3Rpb24pID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgc2VydmljZVRvVXNlOiB0aGlzLFxyXG4gICAgICAgICAgdWlBY3Rpb24sXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGFsbFRvb2xiYXJzID0gdGhpcy5nZXRBbGxTbWFydFVpQWN0aW9uVG9vbGJhcnMoKTtcclxuICAgICAgbGV0IHRvb2xiYXJzID0gYWxsVG9vbGJhcnMuZmlsdGVyKCh0b29sYmFyKSA9PiB0b29sYmFyLmlkKTtcclxuICAgICAgbGV0IHRvb2xiYXJzV2l0aG91dElkID0gdGhpcy5nZXRBbGxTbWFydFVpQWN0aW9uVG9vbGJhcnMoKS5maWx0ZXIoXHJcbiAgICAgICAgKHRvb2xiYXIpID0+IHRvb2xiYXIuaWQgPT09IHVuZGVmaW5lZCB8fCB0b29sYmFyLmlkID09PSBudWxsXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCB0b29sYmFyTW9kZWxzID0gbmV3IE1hcDxzdHJpbmcsIFVpQWN0aW9uTW9kZWxbXT4oKTtcclxuICAgICAgdG9vbGJhcnMuZm9yRWFjaCgodG9vbGJhcikgPT4ge1xyXG4gICAgICAgIHRvb2xiYXJNb2RlbHMuc2V0KHRvb2xiYXIuaWQhLCBbXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgZ2xvYmFsVWlBY3Rpb25Nb2RlbHM6IFVpQWN0aW9uTW9kZWxbXSA9IFtdO1xyXG4gICAgICB1aUFjdGlvbk1vZGVscy5mb3JFYWNoKChhY3Rpb24pID0+IHtcclxuICAgICAgICBsZXQgYWN0aW9uTW9kZWw6IFVpQWN0aW9uTW9kZWxbXSB8IHVuZGVmaW5lZCA9IGdsb2JhbFVpQWN0aW9uTW9kZWxzO1xyXG4gICAgICAgIGxldCB0b29sYmFySWQgPSBhY3Rpb24udWlBY3Rpb24udG9vbGJhcjtcclxuICAgICAgICBpZiAodG9vbGJhcklkICYmIHRvb2xiYXJNb2RlbHMuaGFzKHRvb2xiYXJJZCkpIHtcclxuICAgICAgICAgIGFjdGlvbk1vZGVsID0gdG9vbGJhck1vZGVscy5nZXQodG9vbGJhcklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFhY3Rpb25Nb2RlbCkge1xyXG4gICAgICAgICAgYWN0aW9uTW9kZWwgPSBnbG9iYWxVaUFjdGlvbk1vZGVscztcclxuICAgICAgICB9XHJcbiAgICAgICAgYWN0aW9uTW9kZWwucHVzaChhY3Rpb24pO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy51aUFjdGlvbk1vZGVscyA9IGdsb2JhbFVpQWN0aW9uTW9kZWxzO1xyXG5cclxuICAgICAgdGhpcy5zZXR1cEFsbFRvb2xiYXJzKHRvb2xiYXJzLCB0b29sYmFyc1dpdGhvdXRJZCwgdG9vbGJhck1vZGVscylcclxuICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yPy5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgc2V0dXA6JywgZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2V0dXBBbGxUb29sYmFycyhcclxuICAgIHRvb2xiYXJzOiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnRbXSxcclxuICAgIHRvb2xiYXJzV2l0aG91dElkOiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnRbXSxcclxuICAgIHRvb2xiYXJNb2RlbHM6IE1hcDxzdHJpbmcsIFVpQWN0aW9uTW9kZWxbXT5cclxuICApIHtcclxuICAgIGNvbnN0IHNldHVwUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xyXG5cclxuICAgIHRvb2xiYXJzLmZvckVhY2goKHRvb2xiYXIpID0+IHtcclxuICAgICAgdG9vbGJhci51aUFjdGlvbk1vZGVscyA9IHRvb2xiYXJNb2RlbHMuZ2V0KHRvb2xiYXIuaWQhKTtcclxuICAgICAgc2V0dXBQcm9taXNlcy5wdXNoKHRvb2xiYXIuc2V0VXAoKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0b29sYmFyc1dpdGhvdXRJZC5mb3JFYWNoKCh0b29sYmFyKSA9PiB7XHJcbiAgICAgIHNldHVwUHJvbWlzZXMucHVzaCh0b29sYmFyLnNldFVwKCkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoc2V0dXBQcm9taXNlcyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5ydW5JbkZsaWdodCAmJiB0aGlzLnJ1bkluRmxpZ2h0LnV1aWQgPT09IHRoaXMudXVpZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5ydW5JbkZsaWdodC5wcm9taXNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcHJvbWlzZTogUHJvbWlzZTx2b2lkPiA9IHRoaXMuZG9SdW4oKS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMucnVuSW5GbGlnaHQ/LnByb21pc2UgPT09IHByb21pc2UpIHtcclxuICAgICAgICB0aGlzLnJ1bkluRmxpZ2h0ID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMucnVuSW5GbGlnaHQgPSB7IHV1aWQ6IHRoaXMudXVpZCwgcHJvbWlzZSB9O1xyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvUnVuKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5ib290c3RyYXAud2hlblJlYWR5KCk7XHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZCgpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBWaWV3Q29udGV4dFJlYnVpbHRFcnJvcikge1xyXG4gICAgICAgIC8vIE5vcm1hbCBmbG93OiB0aGUgdmlld2NvbnRleHQgd2FzIHJlYnVpbHQgd2hpbGUgd2Ugd2VyZSBxdWV1ZWQgaW5cclxuICAgICAgICAvLyB3aGVuUmVhZHkoKS4gQSBmcmVzaCB1dWlkIGFycml2ZXMgdmlhIHV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZFxyXG4gICAgICAgIC8vIChOT1JNQUwgdmlld3MpIG9yIHRoZSBjb21wb25lbnQgaXMgcmVjcmVhdGVkIGJ5IG9wZW5WaWV3XHJcbiAgICAgICAgLy8gKEVNQkVEREVEL0RJQUxPRykuIE5vdGhpbmcgdG8gc3VyZmFjZS5cclxuICAgICAgICBjb25zb2xlLmRlYnVnKCdTa2lwcGluZyBsb2FkOiB2aWV3Y29udGV4dCB3YXMgcmVidWlsdCB3aGlsZSB3YWl0aW5nLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmVycm9yKCdTbWFydEJhY2tlbmRCb290c3RyYXBTZXJ2aWNlIGlzIG5vdCByZWFkeTsgc2tpcHBpbmcgbG9hZC4nLCBlcnIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPSBmYWxzZTtcclxuICAgIC8vIFNsb3QtaG9zdGVkIHZpZXdzIChOT1JNQUwvRU1CRURERUQpIGdldCB0aGVpciB1dWlkIGluamVjdGVkIGF0IGNyZWF0aW9uLiBESUFMT0cgdmlld3NcclxuICAgIC8vIGFyZSBOT1Qgc2xvdC1ob3N0ZWQsIHNvIHRoZXkgc3RpbGwgcmVzb2x2ZSB0aGVpciB1dWlkIHZpYSB0aGUgcGFnZU5hbWUgLT4gZ2V0VXVpZE9mUGFnZVxyXG4gICAgLy8gc2hpbSAoc2V0IGJ5IG9wZW5WaWV3J3MgRElBTE9HIGJyYW5jaCkuIFBhcnQgb2YgdGhlIHJldGFpbmVkIHBhZ2UtdXVpZCBzaGltICgjMjg4NzApLlxyXG4gICAgY29uc3QgdXVpZCA9XHJcbiAgICAgIHRoaXMuX3V1aWQgPz8gdGhpcy5yZWFkRGlhbG9nRGF0YVV1aWQoKSA/PyB0aGlzLnZpZXdDb250ZXh0LmdldFV1aWRPZlBhZ2UodGhpcy5wYWdlTmFtZSEpO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1tFbWJlZGRlZF0gbG9hZCgpJywge1xyXG4gICAgLy8gICBwYWdlTmFtZTogdGhpcy5wYWdlTmFtZSxcclxuICAgIC8vICAgX3V1aWQ6IHRoaXMuX3V1aWQsXHJcbiAgICAvLyAgIHJlc29sdmVkVXVpZDogdXVpZCxcclxuICAgIC8vIH0pO1xyXG4gICAgLy8gdGhpcy5tb2RlbCA9IGF3YWl0IHRoaXMudmlld0NvbnRleHQubG9hZCh0aGlzLnV1aWQpO1xyXG4gICAgY29uc3QgY2hhbmdlID0gYXdhaXQgdGhpcy52aWV3Q29udGV4dC5sb2FkMih1dWlkKTtcclxuICAgIHRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQgPSB0cnVlO1xyXG4gICAgdGhpcy51dWlkID0gdXVpZDtcclxuICAgIHRoaXMubW9kZWwgPSBjaGFuZ2UhLnJlc3VsdCEgYXMgQ29tcG9uZW50TW9kZWw7XHJcbiAgICBpZiAodGhpcy5tb2RlbC53aWRnZXRzKSB7XHJcbiAgICAgIC8vIGdyaWRzIGFyZSBhbHJlYWR5IGxvYWRlZCBpbiBzZXRVdWlkKClcclxuICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VXaWRnZXRzKHRoaXMubW9kZWwud2lkZ2V0cywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBleGVjdXRlVWlBY3Rpb24odWlBY3Rpb246IFVpQWN0aW9uLCBvcHRpb25zPzogRXhlY3V0ZVVpQWN0aW9uT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgdWlBY3Rpb25Nb2RlbCA9IHtcclxuICAgICAgc2VydmljZVRvVXNlOiB0aGlzLFxyXG4gICAgICB1aUFjdGlvbjogdWlBY3Rpb24sXHJcbiAgICB9O1xyXG4gICAgYXdhaXQgdGhpcy51aUFjdGlvblNlcnZpY2UuZXhlY3V0ZSh1aUFjdGlvbiwgdWlBY3Rpb25Nb2RlbCwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBhZGREYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcihrZXk6IHN0cmluZywgdmFsdWVDaGFuZ2VNb2RlOiBWYWx1ZUNoYW5nZU1vZGUpIHtcclxuICAgIGNvbnN0IGNoYW5nZUtleXMgPSB0aGlzLmdldENoYW5nZUtleXModmFsdWVDaGFuZ2VNb2RlKTtcclxuICAgIGlmICghY2hhbmdlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XHJcbiAgICAgIGNoYW5nZUtleXMucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldENoYW5nZUtleXModmFsdWVDaGFuZ2VNb2RlOiBWYWx1ZUNoYW5nZU1vZGUpIHtcclxuICAgIHJldHVybiB2YWx1ZUNoYW5nZU1vZGUgPT09IFZhbHVlQ2hhbmdlTW9kZS5JTU1FRElBVEVfQUNUSU9OXHJcbiAgICAgID8gdGhpcy5pbm1lZGlhdGVEYXRhQ2hhbmdlS2V5c1xyXG4gICAgICA6IHRoaXMuYmx1ckRhdGFDaGFuZ2VLZXlzO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRGF0YUNoYW5nZUFjdGlvbkhhbmRsZXIoa2V5OiBzdHJpbmcpIHtcclxuICAgIGxldCBpbm1lZGlhdGVJZHggPSB0aGlzLmlubWVkaWF0ZURhdGFDaGFuZ2VLZXlzLmluZGV4T2Yoa2V5KTtcclxuICAgIGlmIChpbm1lZGlhdGVJZHggPj0gMCkge1xyXG4gICAgICB0aGlzLmlubWVkaWF0ZURhdGFDaGFuZ2VLZXlzLnNwbGljZShpbm1lZGlhdGVJZHgsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBibHVySWR4ID0gdGhpcy5ibHVyRGF0YUNoYW5nZUtleXMuaW5kZXhPZihrZXkpO1xyXG4gICAgaWYgKGJsdXJJZHggPj0gMCkge1xyXG4gICAgICB0aGlzLmlubWVkaWF0ZURhdGFDaGFuZ2VLZXlzLnNwbGljZShibHVySWR4LCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcihcclxuICAgIGV2ZW50OiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UsXHJcbiAgICB2YWx1ZUNoYW5nZU1vZGU6IFZhbHVlQ2hhbmdlTW9kZVxyXG4gICkge1xyXG4gICAgY29uc3QgY2hhbmdlS2V5cyA9IHRoaXMuZ2V0Q2hhbmdlS2V5cyh2YWx1ZUNoYW5nZU1vZGUpO1xyXG4gICAgaWYgKGNoYW5nZUtleXMuaW5jbHVkZXMoZXZlbnQua2V5KSkge1xyXG4gICAgICB0aGlzLmV4ZWN1dGVVaUFjdGlvbih7XHJcbiAgICAgICAgY29kZTogZXZlbnQua2V5LFxyXG4gICAgICAgIG1vZGVsOiB0cnVlLFxyXG4gICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgaXRlbTogZXZlbnQudmFsdWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlTGF5b3V0VXBsb2FkQ2FsbGJhY2soY29tcDogU21hcnRDb21wb25lbnRMYXlvdXRDb21wb25lbnQpIHtcclxuICAgIFNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRGb3Jtcyhjb21wKS5mb3JFYWNoKChmb3JtKSA9PiB7XHJcbiAgICAgIHRoaXMuaGFuZGxlVXBsb2FkQ2FsbGJhY2soZm9ybSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVVcGxvYWRDYWxsYmFjayhmb3JtOiBTbWFydGZvcm1Db21wb25lbnQpIHtcclxuICAgIGZvcm0uc21hcnRXaWRnZXRzUUw/LmZvckVhY2goKHdpZGdldCkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgd2lkZ2V0LndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWIHx8XHJcbiAgICAgICAgd2lkZ2V0LndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiB8fFxyXG4gICAgICAgIHdpZGdldC53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgfHxcclxuICAgICAgICB3aWRnZXQud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SRUNPUkRJTkdfVVBMT0FERVJcclxuICAgICAgKSB7XHJcbiAgICAgICAgd2lkZ2V0LnNtYXJ0Q29tcG9uZW50ID0gdGhpcztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlRm9ybVN1YnNjcmlwdGlvbnMoZm9ybTogU21hcnRmb3JtQ29tcG9uZW50KSB7XHJcbiAgICBmb3JtLnNtYXJ0Rm9ybT8ud2lkZ2V0cy5mb3JFYWNoKCh3aWRnZXQpID0+IHtcclxuICAgICAgaWYgKHdpZGdldC5rZXkpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB3aWRnZXQudmFsdWVDaGFuZ2VNb2RlID09PSBWYWx1ZUNoYW5nZU1vZGUuSU1NRURJQVRFX0FDVElPTiB8fFxyXG4gICAgICAgICAgd2lkZ2V0LnZhbHVlQ2hhbmdlTW9kZSA9PT0gVmFsdWVDaGFuZ2VNb2RlLkJMVVJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuYWRkRGF0YUNoYW5nZUFjdGlvbkhhbmRsZXIod2lkZ2V0LmtleSwgd2lkZ2V0LnZhbHVlQ2hhbmdlTW9kZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRGF0YUNoYW5nZUFjdGlvbkhhbmRsZXIod2lkZ2V0LmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmICghdGhpcy5kYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcnMuaGFzKGZvcm0pKSB7XHJcbiAgICAgIGxldCBpbm1lZGlhdGVWYWx1ZUNoYW5nZVN1YiA9IGZvcm0uc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcihldmVudCwgVmFsdWVDaGFuZ2VNb2RlLklNTUVESUFURV9BQ1RJT04pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICBsZXQgYmx1clZhbHVlQ2hhbmdlU3ViID0gZm9ybS5ibHVyU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5kYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcihldmVudCwgVmFsdWVDaGFuZ2VNb2RlLkJMVVIpKTtcclxuICAgICAgdGhpcy5kYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcnMuc2V0KGZvcm0sIFtpbm1lZGlhdGVWYWx1ZUNoYW5nZVN1YiwgYmx1clZhbHVlQ2hhbmdlU3ViXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRGF0YUNoYW5nZVN1YnNjcmlwdGlvbnMoZm9ybUNvbXBvbmVudD86IFNtYXJ0Zm9ybUNvbXBvbmVudCkge1xyXG4gICAgaWYgKHRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICBsZXQgZm9ybXMgPSAhIWZvcm1Db21wb25lbnQgPyBbZm9ybUNvbXBvbmVudF0gOiB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKTtcclxuICAgICAgZm9ybXMuZm9yRWFjaCgoZm9ybSkgPT4gdGhpcy5oYW5kbGVGb3JtU3Vic2NyaXB0aW9ucyhmb3JtKSk7XHJcblxyXG4gICAgICAvLyB1bnN1YnNjcmliZSBmcm9tIHJlbW92ZWQgZm9ybXNcclxuICAgICAgaWYgKCFmb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcnMuZm9yRWFjaCgoc3VicywgZm9ybSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFmb3Jtcy5maW5kKChjKSA9PiBjID09PSBmb3JtKSkge1xyXG4gICAgICAgICAgICBzdWJzLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycy5kZWxldGUoZm9ybSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEludmFsaWRGaWVsZHMoKTogU21hcnRGb3JtSW52YWxpZEZpZWxkcyB7XHJcbiAgICBsZXQgYWdncmVnYXRlZEludmFsaWRGaWVsZHM6IFNtYXJ0Rm9ybUludmFsaWRGaWVsZHMgPSB7XHJcbiAgICAgIGludmFsaWRGaWVsZEtleXM6IFtdLFxyXG4gICAgICBpbnZhbGlkRmllbGROYW1lczogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydEZvcm1Db21wb25lbnRzKCk/LmZvckVhY2goKGZvcm0pID0+XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZUZvcm0oZm9ybSwgYWdncmVnYXRlZEludmFsaWRGaWVsZHMpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm1XaWRnZXRzPy5mb3JFYWNoKChmb3JtKSA9PiB0aGlzLnZhbGlkYXRlRm9ybShmb3JtLCBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUZvcm0oXHJcbiAgICBmb3JtOiBTbWFydGZvcm1Db21wb25lbnQgfCB1bmRlZmluZWQsXHJcbiAgICBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkczogU21hcnRGb3JtSW52YWxpZEZpZWxkc1xyXG4gICkge1xyXG4gICAgbGV0IGludmFsaWRGaWVsZHNPZkZvcm0gPSBmb3JtPy5nZXRJbnZhbGlkRmllbGRzKCk7XHJcbiAgICBpZiAoaW52YWxpZEZpZWxkc09mRm9ybSkge1xyXG4gICAgICBpbnZhbGlkRmllbGRzT2ZGb3JtLmludmFsaWRGaWVsZEtleXMuZm9yRWFjaCgoa2V5KSA9PlxyXG4gICAgICAgIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzLmludmFsaWRGaWVsZEtleXMucHVzaChrZXkpXHJcbiAgICAgICk7XHJcbiAgICAgIGludmFsaWRGaWVsZHNPZkZvcm0uaW52YWxpZEZpZWxkTmFtZXMuZm9yRWFjaCgoa2V5KSA9PlxyXG4gICAgICAgIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzLmludmFsaWRGaWVsZE5hbWVzLnB1c2goa2V5KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIFVzZVVpQWN0aW9uXHJcbiAgZ2V0QWRkaXRpb25hbFBhcmFtcyh1aUFjdGlvbjogVWlBY3Rpb24pOiBVaUFjdGlvbkFkZGl0aW9uYWxQYXJhbXMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZm9yVGV4dEFyZWE6ICcnLFxyXG4gICAgICBmb3JUZXh0RmllbGQ6ICcnLFxyXG4gICAgfTtcclxuICB9XHJcbiAgZ2V0TW9kZWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0Rm9ybSh2YWxpZGF0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJtaXRGb3Jtcyh2YWxpZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwZXJmb3JtVWlBY3Rpb25SZXF1ZXN0KFxyXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICB3aWRnZXRJZD86IHN0cmluZyxcclxuICAgIG5vZGVJZD86IHN0cmluZ1xyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snX2ZpbGVzJ10pIHtcclxuICAgICAgY29uc3QgcGFyYW0gPSB1aUFjdGlvblJlcXVlc3QucGFyYW1zWydwYXJhbSddO1xyXG4gICAgICBjb25zdCBmaWxlcyA9IHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ19maWxlcyddO1xyXG4gICAgICBjb25zdCB1cGxvYWREZXNjcmlwdG9yID0gdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snX3VwbG9hZERlc2NyaXB0b3InXTtcclxuICAgICAgY29uc3QgaXNNdWx0aXBsZSA9IHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ2lzTXVsdGlwbGUnXTtcclxuICAgICAgZGVsZXRlIHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ3BhcmFtJ107XHJcbiAgICAgIGRlbGV0ZSB1aUFjdGlvblJlcXVlc3QucGFyYW1zWydfZmlsZXMnXTtcclxuICAgICAgZGVsZXRlIHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ191cGxvYWREZXNjcmlwdG9yJ107XHJcbiAgICAgIGRlbGV0ZSB1aUFjdGlvblJlcXVlc3QucGFyYW1zWydpc011bHRpcGxlJ107XHJcblxyXG4gICAgICAvLyBhd2FpdCB0aGlzLnNlbmRNb2RlbFRvU2VydmVyKCk7XHJcblxyXG4gICAgICBpZiAoIWlzTXVsdGlwbGUpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LnBlcmZvcm1VcGxvYWRBY3Rpb24odGhpcy51dWlkISwgdWlBY3Rpb25SZXF1ZXN0LCBwYXJhbSwgZmlsZXNbMF0pO1xyXG4gICAgICB9IGVsc2UgaWYgKHVwbG9hZERlc2NyaXB0b3IgIT0gbnVsbCAmJiB1cGxvYWREZXNjcmlwdG9yICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGxldCBtYXhCYXRjaEZpbGVzU2l6ZSA9IHVwbG9hZERlc2NyaXB0b3IubWF4U2l6ZSAqIDEwMjQgKiAxMDI0O1xyXG4gICAgICAgIGxldCBtYXhCYXRjaFNpemUgPSB1cGxvYWREZXNjcmlwdG9yLm1heEJhdGNoU2l6ZTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRCYXRjaFNpemUgPSAwO1xyXG4gICAgICAgIGxldCBjdXJyZW50QmF0Y2g6IGFueVtdID0gW107XHJcbiAgICAgICAgY29uc3QgYmF0Y2hlczogYW55W11bXSA9IFtdO1xyXG5cclxuICAgICAgICBmaWxlcy5mb3JFYWNoKChmaWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHdvdWxkRXhjZWVkU2l6ZSA9IGN1cnJlbnRCYXRjaFNpemUgKyBmaWxlLnNpemUgPiBtYXhCYXRjaEZpbGVzU2l6ZTtcclxuXHJcbiAgICAgICAgICBjb25zdCB3b3VsZEV4Y2VlZENvdW50ID1cclxuICAgICAgICAgICAgdHlwZW9mIG1heEJhdGNoU2l6ZSA9PT0gJ251bWJlcicgJiZcclxuICAgICAgICAgICAgbWF4QmF0Y2hTaXplID4gMCAmJlxyXG4gICAgICAgICAgICBjdXJyZW50QmF0Y2gubGVuZ3RoID49IG1heEJhdGNoU2l6ZTtcclxuXHJcbiAgICAgICAgICBpZiAod291bGRFeGNlZWRTaXplIHx8IHdvdWxkRXhjZWVkQ291bnQpIHtcclxuICAgICAgICAgICAgYmF0Y2hlcy5wdXNoKGN1cnJlbnRCYXRjaCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRCYXRjaCA9IFtdO1xyXG4gICAgICAgICAgICBjdXJyZW50QmF0Y2hTaXplID0gMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjdXJyZW50QmF0Y2gucHVzaChmaWxlKTtcclxuICAgICAgICAgIGN1cnJlbnRCYXRjaFNpemUgKz0gZmlsZS5zaXplO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChjdXJyZW50QmF0Y2gubGVuZ3RoKSB7XHJcbiAgICAgICAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJhdGNoZXMuZm9yRWFjaChcclxuICAgICAgICAgIGFzeW5jIChiYXRjaCkgPT5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5wZXJmb3JtVXBsb2FkTXVsdGlwbGVBY3Rpb24oXHJcbiAgICAgICAgICAgICAgdGhpcy51dWlkISxcclxuICAgICAgICAgICAgICB1aUFjdGlvblJlcXVlc3QsXHJcbiAgICAgICAgICAgICAgcGFyYW0sXHJcbiAgICAgICAgICAgICAgYmF0Y2hcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5wZXJmb3JtVXBsb2FkTXVsdGlwbGVBY3Rpb24oXHJcbiAgICAgICAgICB0aGlzLnV1aWQhLFxyXG4gICAgICAgICAgdWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgICAgICAgcGFyYW0sXHJcbiAgICAgICAgICBmaWxlc1xyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAod2lkZ2V0SWQgJiYgbm9kZUlkKSB7XHJcbiAgICAgIC8vIGF3YWl0IHRoaXMuc2VuZE1vZGVsVG9TZXJ2ZXIoKTtcclxuICAgICAgdGhpcy5hZGRNb2RlbFRvV2lkZ2V0QWN0aW9uKHVpQWN0aW9uUmVxdWVzdCk7XHJcbiAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybVdpZGdldEFjdGlvbih0aGlzLnV1aWQhLCB3aWRnZXRJZCwgbm9kZUlkLCB1aUFjdGlvblJlcXVlc3QpO1xyXG4gICAgfSBlbHNlIGlmICh3aWRnZXRJZCkge1xyXG4gICAgICAvLyBhd2FpdCB0aGlzLnNlbmRNb2RlbFRvU2VydmVyKCk7XHJcbiAgICAgIHRoaXMuYWRkTW9kZWxUb1dpZGdldEFjdGlvbih1aUFjdGlvblJlcXVlc3QpO1xyXG4gICAgICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LnBlcmZvcm1XaWRnZXRNYWluQWN0aW9uKHRoaXMudXVpZCEsIHdpZGdldElkLCB1aUFjdGlvblJlcXVlc3QpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5wZXJmb3JtQWN0aW9uKHRoaXMudXVpZCEsIHVpQWN0aW9uUmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYWRkTW9kZWxUb1dpZGdldEFjdGlvbih1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdCkge1xyXG4gICAgdGhpcy5hZGRNb2RlbFRvV2lkZ2V0UGFyYW1zKHVpQWN0aW9uUmVxdWVzdC5wYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZE1vZGVsVG9XaWRnZXRQYXJhbXMocGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZW5kTW9kZWxPbldpZGdldEFjdGlvbikge1xyXG4gICAgICB0aGlzLnN1Ym1pdEZvcm0oZmFsc2UpO1xyXG4gICAgICAvLyBtaW1pYyBDb21wb25lbnRNb2RlbFxyXG4gICAgICBwYXJhbXNbJ2NsaWVudFBhZ2VNb2RlbCddID0geyBkYXRhOiB0aGlzLmdldE1vZGVsKCkgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgYXN5bmMgc2VuZE1vZGVsVG9TZXJ2ZXIoKSB7XHJcbiAgLy8gICB0aGlzLnN1Ym1pdEZvcm1zKGZhbHNlKTtcclxuICAvLyAgIGxldCBkYXRhQ2hhbmdlID0ge1xyXG4gIC8vICAgICBraW5kOiBEYXRhQ2hhbmdlS2luZC5XaWRnZXQsXHJcbiAgLy8gICAgIHNvdXJjZTogJycsXHJcbiAgLy8gICAgIHZhbHVlczogW1snJywgdGhpcy5nZXRNb2RlbCgpXV0sXHJcbiAgLy8gICB9O1xyXG4gIC8vICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5kYXRhQ2hhbmdlZCh0aGlzLnV1aWQhLCBkYXRhQ2hhbmdlKTtcclxuICAvLyB9XHJcblxyXG4gIGhhbmRsZVNwZWNpZmljRGVtYW5kc0FzeW5jaHJvbm91c2x5KFxyXG4gICAgdWlBY3Rpb246IFVpQWN0aW9uLFxyXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3RcclxuICApOiBQcm9taXNlPFVpQWN0aW9uU3BlY2lmaWNEZW1hbmRSZXNwb25zZT4ge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdoYW5kbGVTcGVjaWZpY0RlbWFuZHNBc3luY2hyb25vdXNseSBtZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0cyBhbGwgdGhlIHJlZ2lzdGVyZWQgZm9ybXMgaW4gdGhlIFNtYXJ0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHVibGljIHN1Ym1pdEZvcm1zKHZhbGlkYXRlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpPy5mb3JFYWNoKChmb3JtKSA9PiB7XHJcbiAgICAgICAgZm9ybT8uc3VibWl0Rm9ybSh2YWxpZGF0ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtV2lkZ2V0cz8uZm9yRWFjaCgoZm9ybSkgPT4ge1xyXG4gICAgICAgIGZvcm0/LnN1Ym1pdEZvcm0odmFsaWRhdGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGRHcmlkKFxyXG4gICAgc21hcnRHcmlkOiBTbWFydEdyaWQsXHJcbiAgICBvcHRpb25zOiBHcmlkT3B0aW9ucyxcclxuICAgIHVzZUFzRGVmYXVsdEdyaWQ/OiBib29sZWFuLFxyXG4gICAgY29tcG9uZW50UmVmZXJlbmNlPzogU21hcnRHcmlkQ29tcG9uZW50XHJcbiAgKTogU21hcnRHcmlkIHtcclxuICAgIHNtYXJ0R3JpZC5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHNtYXJ0R3JpZC51aUFjdGlvblNlcnZpY2UgPSB0aGlzLnVpQWN0aW9uU2VydmljZTtcclxuICAgIHNtYXJ0R3JpZC51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlID0gdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlO1xyXG4gICAgc21hcnRHcmlkLnNlcnZpY2VUb1VzZSA9IHRoaXM7XHJcbiAgICBzbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlID0gdGhpcy52aWV3Q29udGV4dDtcclxuXHJcbiAgICBpZiAoIXRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLndpZGdldHMuc2V0KHNtYXJ0R3JpZC5ncmlkSWRlbnRpZmllciwgY29tcG9uZW50UmVmZXJlbmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihgQWRkZWQgc21hcnRHcmlkIHdoZW4gdXNlUXVlcnlMaXN0cyA9PT0gdHJ1ZSAoJHtzbWFydEdyaWQuZ3JpZElkZW50aWZpZXJ9KWApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1c2VBc0RlZmF1bHRHcmlkKSB7XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkID0gc21hcnRHcmlkO1xyXG4gICAgICByZXR1cm4gdGhpcy5zbWFydEdyaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNtYXJ0R3JpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGRGb3JtKFxyXG4gICAgc21hcnRGb3JtSWQ6IHN0cmluZyxcclxuICAgIHNtYXJ0Rm9ybTogU21hcnRGb3JtLFxyXG4gICAgY29tcG9uZW50UmVmZXJlbmNlPzogU21hcnRmb3JtQ29tcG9uZW50XHJcbiAgKTogU21hcnRGb3JtIHtcclxuICAgIGlmICghdGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIHRoaXMuZm9ybVdpZGdldHMuc2V0KHNtYXJ0Rm9ybUlkLCBjb21wb25lbnRSZWZlcmVuY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKGBBZGRlZCBzbWFydEZvcm0gd2hlbiB1c2VRdWVyeUxpc3RzID09PSB0cnVlICgke3NtYXJ0Rm9ybUlkfSlgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy5zZW5kRGF0YUNoYW5nZXMgJiYgY29tcG9uZW50UmVmZXJlbmNlKSB7XHJcbiAgICAvLyAgIHNtYXJ0Rm9ybS51c2VPblZhbHVlQ2hhbmdlRXZlbnQgPSB0cnVlO1xyXG5cclxuICAgIC8vICAgY29tcG9uZW50UmVmZXJlbmNlLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZVxyXG4gICAgLy8gICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAvLyAgICAgLnN1YnNjcmliZSgodmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSkgPT4ge1xyXG4gICAgLy8gICAgICAgdGhpcy5oYW5kbGVWYWx1ZUNoYW5nZXModmFsdWVDaGFuZ2UpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJldHVybiBzbWFydEZvcm07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VXBEZWZhdWx0VHJlZSh0cmVlSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zbWFydFRyZWVTZXJ2aWNlID0gdGhpcy5jcmVhdGVUcmVlU2VydmljZSh0cmVlSWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZVRyZWVTZXJ2aWNlKHRyZWVJZDogc3RyaW5nKTogU21hcnR0cmVlR2VuZXJpY1NlcnZpY2Uge1xyXG4gICAgY29uc3QgdHJlZVNlcnZpY2UgPSBuZXcgU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UodGhpcy5pbmplY3QsIHRoaXMucGFnZU5hbWUhLCB0cmVlSWQpO1xyXG4gICAgLy8gSW4gdGhlIHVzZVF1ZXJ5TGlzdHMgbW9kZWwgdGhlIHRyZWUgaXMgcm91dGVkIHZpYSB0aGUgU21hcnRUcmVlQ29tcG9uZW50XHJcbiAgICAvLyBRdWVyeUxpc3QgKyB0cmVlSWQgKHNlZSBnZXRXaWRnZXRzKSwgc28gbm8gbWFudWFsIHdpZGdldHMuc2V0IGlzIG5lZWRlZDsgdGhlXHJcbiAgICAvLyBsZWdhY3kgbm9uLVF1ZXJ5TGlzdCBwYXRoIHN0aWxsIHJlZ2lzdGVycyBpdCBleHBsaWNpdGx5LlxyXG4gICAgaWYgKCF0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgdGhpcy53aWRnZXRzLnNldCh0cmVlSWQsIHRyZWVTZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJlZVNlcnZpY2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkRmlsZVVwbG9hZGVyKFxyXG4gICAgdWlBY3Rpb25Db2RlOiBzdHJpbmcsXHJcbiAgICBmaWxlRm9ybWF0cz86IHN0cmluZ1tdLFxyXG4gICAgbWF4U2l6ZU1iPzogbnVtYmVyLFxyXG4gICAgaXNNdWx0aXBsZT86IGJvb2xlYW5cclxuICApOiBTbWFydENvbXBvbmVudEZpbGVVcGxvYWRlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1aUFjdGlvbkNvZGUsXHJcbiAgICAgIHNtYXJ0Q29tcG9uZW50OiB0aGlzLFxyXG4gICAgICBmaWxlRm9ybWF0cyxcclxuICAgICAgaXNNdWx0aXBsZSxcclxuICAgICAgbWF4U2l6ZU1iLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvciBkaWFsb2ctaG9zdGVkIGRlZmF1bHQgY29tcG9uZW50cywgdGhlIHZpZXcgdXVpZCBpcyBwYXNzZWQgdGhyb3VnaCB0aGVcclxuICAgKiBkaWFsb2cgZGF0YSAoTUFUX0RJQUxPR19EQVRBIGZvciBNYXRlcmlhbCwgRHluYW1pY0RpYWxvZ0NvbmZpZy5kYXRhIGZvclxyXG4gICAqIFByaW1lTkcpLiBSZXR1cm5zIHVuZGVmaW5lZCBmb3Igc2xvdC1ob3N0ZWQgY29tcG9uZW50cyAobm8gZGlhbG9nIGRhdGEpLiAoIzI4ODcwKVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZERpYWxvZ0RhdGFVdWlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBtYXREYXRhID0gdGhpcy5pbmplY3QuZ2V0PGFueT4oTUFUX0RJQUxPR19EQVRBLCBudWxsKTtcclxuICAgIGlmIChtYXREYXRhPy51dWlkKSB7XHJcbiAgICAgIHJldHVybiBtYXREYXRhLnV1aWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcmltZUNvbmZpZyA9IHRoaXMuaW5qZWN0LmdldDxEeW5hbWljRGlhbG9nQ29uZmlnIHwgbnVsbD4oRHluYW1pY0RpYWxvZ0NvbmZpZywgbnVsbCk7XHJcbiAgICByZXR1cm4gcHJpbWVDb25maWc/LmRhdGE/LnV1aWQ7XHJcbiAgfVxyXG5cclxuICAvLyAjcmVnaW9uIGhhbmRsZSBjaGFuZ2VzXHJcbiAgcHJpdmF0ZSBoYW5kbGVWYWx1ZUNoYW5nZXModmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGFDaGFuZ2U6IERhdGFDaGFuZ2U7XHJcbiAgICBpZiAodmFsdWVDaGFuZ2Uua2V5LmluY2x1ZGVzKCcuJykpIHtcclxuICAgICAgY29uc3Qgc291cmNlID0gdmFsdWVDaGFuZ2Uua2V5LnNwbGl0KCcuJylbMF07XHJcbiAgICAgIGNvbnN0IHZhbHVlS2V5ID0gdmFsdWVDaGFuZ2Uua2V5LnNwbGl0KCcuJylbMV07XHJcbiAgICAgIGRhdGFDaGFuZ2UgPSB7XHJcbiAgICAgICAga2luZDogdmFsdWVDaGFuZ2Uua2luZCA9PT0gJ2Jhc2ljJyA/IERhdGFDaGFuZ2VLaW5kLldJREdFVCA6IERhdGFDaGFuZ2VLaW5kLlNFTEVDVElPTixcclxuICAgICAgICBzb3VyY2UsXHJcbiAgICAgICAgdmFsdWVzOiBbW3ZhbHVlS2V5LCB2YWx1ZUNoYW5nZS52YWx1ZV1dLFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGF0YUNoYW5nZSA9IHtcclxuICAgICAgICBraW5kOiB2YWx1ZUNoYW5nZS5raW5kID09PSAnYmFzaWMnID8gRGF0YUNoYW5nZUtpbmQuV0lER0VUIDogRGF0YUNoYW5nZUtpbmQuU0VMRUNUSU9OLFxyXG4gICAgICAgIHNvdXJjZTogdmFsdWVDaGFuZ2Uua2V5LFxyXG4gICAgICAgIHZhbHVlczogW1t2YWx1ZUNoYW5nZS5rZXksIHZhbHVlQ2hhbmdlLnZhbHVlXV0sXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aWV3Q29udGV4dC5kYXRhQ2hhbmdlZCh0aGlzLnV1aWQhLCBkYXRhQ2hhbmdlKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVDaGFuZ2VzKGNoYW5nZTogQ29tcG9uZW50TW9kZWxDaGFuZ2UpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICghdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCkge1xyXG4gICAgICAgIC8vIGluaXRpYWwgbG9hZFxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2hhbmdlLmNoYW5nZWRXaWRnZXRzKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VXaWRnZXRzKGNoYW5nZS5jaGFuZ2VkV2lkZ2V0cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBkYXRhQ2hhbmdlSGFzQmVlbk5leHRlZCA9IGZhbHNlO1xyXG4gICAgICBpZiAoY2hhbmdlLmNoYW5nZXMpIHtcclxuICAgICAgICBjb25zdCBjaGFuZ2VzID0gY2hhbmdlLmNoYW5nZXM7XHJcbiAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcykubWFwKChjaGFuZ2VLZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKGNoYW5nZUtleS5zdGFydHNXaXRoKCdkYXRhLicpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGF0YUNoYW5nZShjaGFuZ2VzLCBjaGFuZ2VLZXkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkuc3RhcnRzV2l0aCgnbGF5b3V0cy4nKSAmJiB0aGlzLm1vZGVsPy5sYXlvdXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0Q2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUtleS5zdGFydHNXaXRoKCdjb21wb25lbnRMYXlvdXRzLicpICYmIHRoaXMubW9kZWw/LmxheW91dHMpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDb21wb25lbnRMYXlvdXRDaGFuZ2UoY2hhbmdlcywgY2hhbmdlS2V5KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlS2V5LnN0YXJ0c1dpdGgoJ3ZhbHVlU2V0cy4nKSAmJiB0aGlzLm1vZGVsPy52YWx1ZVNldHMpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVWYWx1ZVNldENoYW5nZShjaGFuZ2VzLCBjaGFuZ2VLZXkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkgPT09ICdhY3Rpb25zJykge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFjdGlvbkNoYW5nZShjaGFuZ2VzLCBjaGFuZ2VLZXkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkgPT09ICdjb25zdHJhaW50cycpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDb25zdHJhaW50Q2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUtleSA9PT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbCA9IGNoYW5nZXNbJyddIGFzIENvbXBvbmVudE1vZGVsO1xyXG4gICAgICAgICAgICBkYXRhQ2hhbmdlSGFzQmVlbk5leHRlZCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICghZGF0YUNoYW5nZUhhc0JlZW5OZXh0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YUNoYW5nZWQubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgIHRoaXMubW9kZWwgPSBjaGFuZ2UudmFsdWUgYXMgQ29tcG9uZW50TW9kZWw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjaGFuZ2UuY2hhbmdlZFdpZGdldHMgJiYgIWNoYW5nZS5jaGFuZ2VzICYmIGNoYW5nZS52YWx1ZSkge1xyXG4gICAgICB0aGlzLm1vZGVsID0gY2hhbmdlLnZhbHVlIGFzIENvbXBvbmVudE1vZGVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGhhbmRsZUNoYW5nZVdpZGdldHMoY2hhbmdlZFdpZGdldHM6IHN0cmluZ1tdLCBza2lwTG9hZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICBsZXQgd2lkZ2V0cyA9IHRoaXMuZ2V0V2lkZ2V0cygpO1xyXG4gICAgY2hhbmdlZFdpZGdldHMuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgcmVmZXJlbmNlID0gd2lkZ2V0cy5nZXQoa2V5KTtcclxuXHJcbiAgICAgIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBTbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgICAgICB0aGlzLnNldHVwR3JpZFNlcnZpY2VzKHJlZmVyZW5jZSk7XHJcbiAgICAgICAgaWYgKCFza2lwTG9hZCkge1xyXG4gICAgICAgICAgcmVmZXJlbmNlLnJlZnJlc2goKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgU21hcnR0cmVlU2VydmljZSkge1xyXG4gICAgICAgIGlmICghc2tpcExvYWQpIHtcclxuICAgICAgICAgIHJlZmVyZW5jZS5pbml0aWFsaXplKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0dXBGaWx0ZXJTZXJ2aWNlcyhyZWZlcmVuY2UpO1xyXG4gICAgICAgIC8vaWYgKCFza2lwTG9hZCkgeyAvLyBmaWx0ZXIgaXMgbm90IGxvYWRlZCB3aGVuIHNldHRpbmcgdXVpZFxyXG4gICAgICAgIHJlZmVyZW5jZS5zZXJ2aWNlLmxvYWQoKTtcclxuICAgICAgICAvL31cclxuICAgICAgfSBlbHNlIGlmIChyZWZlcmVuY2UgaW5zdGFuY2VvZiBTbWFydE1hcENvbXBvbmVudCkge1xyXG4gICAgICAgIHJlZmVyZW5jZS5sb2FkKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgU21hcnREaWFncmFtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgcmVmZXJlbmNlLmxvYWQoKTtcclxuICAgICAgfSBlbHNlIGlmICghc2tpcExvYWQgJiYgcmVmZXJlbmNlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBQcm92aWRlZCByZWZlcmVuY2UgZm9yICR7a2V5fSBpcyB1bmRlZmluZWQuYCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZURlZXBseShtb2RlbDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgbGV0IHNwbGl0dGVkS2V5cyA9IGtleS5zcGxpdCgnLicpO1xyXG5cclxuICAgIGxldCBkZWVwTW9kZWw6IGFueVtdID0gW21vZGVsXTtcclxuICAgIGxldCB0ZW1wTW9kZWw6IGFueTtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3BsaXR0ZWRLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICB0ZW1wTW9kZWwgPSBkZWVwTW9kZWxbaW5kZXhdO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ2Jvb2xlYW4nICYmXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ251bWJlcicgJiZcclxuICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09IHVuZGVmaW5lZFxyXG4gICAgICApIHtcclxuICAgICAgICBkZWVwTW9kZWwucHVzaCh0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW5kZXggPT09IHNwbGl0dGVkS2V5cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgbGV0IG9sZFZhbHVlID0gdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dO1xyXG4gICAgICAgIC8vIGlmICh2YWx1ZSA9PT0gJycgJiYgKG9sZFZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHRoZW4gZG9uJ3QgY2hhbmdlIHZhbHVlLlxyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gJycgfHwgKG9sZFZhbHVlICE9PSBudWxsICYmIG9sZFZhbHVlICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRGF0YUNoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRWYWx1ZURlZXBseSh0aGlzLm1vZGVsLCBjaGFuZ2VLZXksIGNoYW5nZXNbY2hhbmdlS2V5XSk7XHJcblxyXG4gICAgaWYgKHRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKT8uZm9yRWFjaCgoZm9ybSkgPT4ge1xyXG4gICAgICAgIGZvcm0ucmVmcmVzaCgpO1xyXG4gICAgICAgIGZvcm0ubWFya0FsbFdpZGdldHNGb3JDaGFuZ2VEZXRlY3Rpb24oKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm1XaWRnZXRzLmZvckVhY2goKGZvcm1Db21wb25lbnQ6IFNtYXJ0Zm9ybUNvbXBvbmVudCB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoZm9ybUNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcm92aWRlZCBmb3JtIHJlZmVyZW5jZSBmb3IgJHtrZXl9IGlzIHVuZGVmaW5lZC5gKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZm9ybUNvbXBvbmVudC5yZWZyZXNoKCk7XHJcbiAgICAgICAgICBmb3JtQ29tcG9uZW50Lm1hcmtBbGxXaWRnZXRzRm9yQ2hhbmdlRGV0ZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IhLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlTGF5b3V0Q2hhbmdlKGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGNoYW5nZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgbGF5b3V0S2V5ID0gY2hhbmdlS2V5LnNwbGl0KCcuJylbMV07XHJcbiAgICB0aGlzLm1vZGVsIS5sYXlvdXRzW2xheW91dEtleV0gPSBjaGFuZ2VzW2NoYW5nZUtleV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUNvbXBvbmVudExheW91dENoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGxheW91dEtleSA9IGNoYW5nZUtleS5zcGxpdCgnLicpWzFdO1xyXG4gICAgbGV0IGNvbXBvbmVudExheW91dHM6IHsgW2tleTogc3RyaW5nXTogT2JqZWN0IH0gPSB0aGlzLm1vZGVsIS5jb21wb25lbnRMYXlvdXRzIGFzIHtcclxuICAgICAgW2tleTogc3RyaW5nXTogT2JqZWN0O1xyXG4gICAgfTtcclxuICAgIGNvbXBvbmVudExheW91dHNbbGF5b3V0S2V5XSA9IGNoYW5nZXNbY2hhbmdlS2V5XTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlVmFsdWVTZXRDaGFuZ2UoY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgY2hhbmdlS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCB2YWx1ZVNldEtleSA9IGNoYW5nZUtleS5zcGxpdCgnLicpWzFdO1xyXG4gICAgdGhpcy5tb2RlbCEudmFsdWVTZXRzIVt2YWx1ZVNldEtleV0gPSBjaGFuZ2VzW2NoYW5nZUtleV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUFjdGlvbkNoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbCEuYWN0aW9ucyA9IGNoYW5nZXNbY2hhbmdlS2V5XTtcclxuICAgIHRoaXMuaW5pdEFjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQ29uc3RyYWludENoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbCEuY29uc3RyYWludHMgPSBjaGFuZ2VzW2NoYW5nZUtleV07XHJcbiAgfVxyXG5cclxuICAvLyAjZW5kcmVnaW9uXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU21hcnRDb21wb25lbnRGaWxlVXBsb2FkZXIge1xyXG4gIHVpQWN0aW9uQ29kZTogc3RyaW5nO1xyXG4gIG1heFNpemVNYj86IG51bWJlcjtcclxuICBmaWxlRm9ybWF0cz86IHN0cmluZ1tdO1xyXG4gIGlzTXVsdGlwbGU/OiBib29sZWFuO1xyXG4gIHNtYXJ0Q29tcG9uZW50OiBTbWFydENvbXBvbmVudEFwaUNsaWVudDxhbnk+O1xyXG59XHJcbiJdfQ==