@decaf-ts/for-angular 0.0.23 → 0.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/components/component-renderer/component-renderer.component.d.ts +3 -2
  2. package/components/crud-field/crud-field.component.d.ts +4 -2
  3. package/components/fieldset/fieldset.component.d.ts +10 -1
  4. package/components/for-angular-components.module.d.ts +3 -2
  5. package/components/index.d.ts +1 -0
  6. package/components/layout/layout.component.d.ts +1 -24
  7. package/components/model-renderer/model-renderer.component.d.ts +6 -1
  8. package/components/stepped-form/stepped-form.component.d.ts +255 -0
  9. package/engine/NgxBaseComponent.d.ts +2 -2
  10. package/engine/NgxCrudFormField.d.ts +1 -0
  11. package/engine/NgxFormService.d.ts +381 -48
  12. package/engine/NgxRenderingEngine.d.ts +4 -2
  13. package/engine/interfaces.d.ts +1 -1
  14. package/engine/types.d.ts +4 -3
  15. package/esm2022/components/component-renderer/component-renderer.component.mjs +10 -4
  16. package/esm2022/components/crud-field/crud-field.component.mjs +14 -3
  17. package/esm2022/components/crud-form/crud-form.component.mjs +3 -3
  18. package/esm2022/components/empty-state/empty-state.component.mjs +2 -2
  19. package/esm2022/components/fieldset/fieldset.component.mjs +5 -3
  20. package/esm2022/components/for-angular-components.module.mjs +12 -7
  21. package/esm2022/components/index.mjs +2 -1
  22. package/esm2022/components/layout/layout.component.mjs +4 -29
  23. package/esm2022/components/list/list.component.mjs +3 -3
  24. package/esm2022/components/model-renderer/model-renderer.component.mjs +10 -3
  25. package/esm2022/components/stepped-form/stepped-form.component.mjs +306 -0
  26. package/esm2022/engine/NgxBaseComponent.mjs +10 -4
  27. package/esm2022/engine/NgxCrudFormField.mjs +19 -17
  28. package/esm2022/engine/NgxFormService.mjs +438 -57
  29. package/esm2022/engine/NgxRenderingEngine.mjs +21 -10
  30. package/esm2022/engine/ValidatorFactory.mjs +4 -4
  31. package/esm2022/engine/interfaces.mjs +1 -1
  32. package/esm2022/engine/types.mjs +1 -1
  33. package/esm2022/i18n/data/en.json +5 -0
  34. package/fesm2022/decaf-ts-for-angular.mjs +837 -137
  35. package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
  36. package/package.json +1 -1
@@ -452,7 +452,7 @@ let ListComponent = class ListComponent extends NgxBaseComponent {
452
452
  await this.refresh();
453
453
  if (this.operations.includes(OperationKeys.CREATE) && this.route)
454
454
  this.empty.link = `${this.route}/${OperationKeys.CREATE}`;
455
- this.initialize();
455
+ await this.initialize();
456
456
  if (this.model instanceof Model && this._repository)
457
457
  this._repository.observe(this.observer);
458
458
  }
@@ -1148,7 +1148,7 @@ let ListComponent = class ListComponent extends NgxBaseComponent {
1148
1148
  }, []);
1149
1149
  }
1150
1150
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1151
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "ngx-decaf-list", inputs: { type: "type", translatable: "translatable", showSearchbar: "showSearchbar", data: "data", source: "source", start: "start", limit: "limit", loadMoreData: "loadMoreData", lines: "lines", inset: "inset", scrollThreshold: "scrollThreshold", scrollPosition: "scrollPosition", loadingText: "loadingText", showRefresher: "showRefresher", loadingSpinner: "loadingSpinner", enableFilter: "enableFilter", sortDirection: "sortDirection", sortBy: "sortBy", disableSort: "disableSort", emptyIcon: "emptyIcon", empty: "empty" }, outputs: { refreshEvent: "refreshEvent", clickEvent: "clickEvent" }, host: { listeners: { "window:ListItemClickEvent": "handleClick($event)", "window:searchbarEvent": "handleSearch($event)", "window:BackButtonNavigationEndEvent": "refresh($event)" } }, usesInheritance: true, ngImport: i0, template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar && data?.length) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track $index) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll{max-height:50px}ion-infinite-scroll:not(.infinite-scroll-loading) ::ng-deep{max-height:1.5rem}ion-infinite-scroll ::ng-deep ion-spinner{--color: var(--dcf-color-primary);padding-top:1rem}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: PaginationComponent, selector: "ngx-decaf-pagination", inputs: ["totalPages", "current"], outputs: ["clickEvent"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonThumbnail, selector: "ion-thumbnail" }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: SearchbarComponent, selector: "ngx-decaf-searchbar", inputs: ["autocomplete", "autocorrect", "animated", "buttonCancelText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value", "queryKeys", "isVisible", "wrapper", "wrapperColor", "emitEventToWindow"], outputs: ["searchEvent"] }, { kind: "component", type: EmptyStateComponent, selector: "ngx-decaf-empty-state", inputs: ["title", "titleColor", "subtitle", "subtitleColor", "showIcon", "icon", "iconSize", "iconColor", "buttonLink", "buttonText", "buttonFill", "buttonColor", "buttonSize", "searchValue"] }, { kind: "component", type: FilterComponent, selector: "ngx-decaf-filter", inputs: ["indexes", "conditions", "sortBy", "disableSort"], outputs: ["filterEvent", "searchEvent"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }] }); }
1151
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "ngx-decaf-list", inputs: { type: "type", translatable: "translatable", showSearchbar: "showSearchbar", data: "data", source: "source", start: "start", limit: "limit", loadMoreData: "loadMoreData", lines: "lines", inset: "inset", scrollThreshold: "scrollThreshold", scrollPosition: "scrollPosition", loadingText: "loadingText", showRefresher: "showRefresher", loadingSpinner: "loadingSpinner", enableFilter: "enableFilter", sortDirection: "sortDirection", sortBy: "sortBy", disableSort: "disableSort", emptyIcon: "emptyIcon", empty: "empty" }, outputs: { refreshEvent: "refreshEvent", clickEvent: "clickEvent" }, host: { listeners: { "window:ListItemClickEvent": "handleClick($event)", "window:searchbarEvent": "handleSearch($event)", "window:BackButtonNavigationEndEvent": "refresh($event)" } }, usesInheritance: true, ngImport: i0, template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar && data?.length) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track $index) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll{max-height:50px}ion-infinite-scroll:not(.infinite-scroll-loading) ::ng-deep{max-height:1.5rem}ion-infinite-scroll ::ng-deep ion-spinner{--color: var(--dcf-color-primary);padding-top:1rem}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: PaginationComponent, selector: "ngx-decaf-pagination", inputs: ["totalPages", "current"], outputs: ["clickEvent"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonThumbnail, selector: "ion-thumbnail" }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: SearchbarComponent, selector: "ngx-decaf-searchbar", inputs: ["autocomplete", "autocorrect", "animated", "buttonCancelText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value", "queryKeys", "isVisible", "wrapper", "wrapperColor", "emitEventToWindow"], outputs: ["searchEvent"] }, { kind: "component", type: EmptyStateComponent, selector: "ngx-decaf-empty-state", inputs: ["title", "titleColor", "subtitle", "subtitleColor", "showIcon", "icon", "iconSize", "iconColor", "buttonLink", "buttonText", "buttonFill", "buttonColor", "buttonSize", "searchValue"] }, { kind: "component", type: FilterComponent, selector: "ngx-decaf-filter", inputs: ["indexes", "conditions", "sortBy", "disableSort"], outputs: ["filterEvent", "searchEvent"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "children", "model", "parent"], outputs: ["listenEvent"] }] }); }
1152
1152
  };
1153
1153
  ListComponent = __decorate([
1154
1154
  Dynamic(),
@@ -1235,4 +1235,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1235
1235
  type: HostListener,
1236
1236
  args: ['window:BackButtonNavigationEndEvent', ['$event']]
1237
1237
  }] } });
1238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBWSxjQUFjLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBRUwsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFLbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxD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WUFBWTtzQkFEWCxNQUFNO2dCQVlQLFVBQVU7c0JBRFQsTUFBTTtnQkFpUlAsV0FBVztzQkFEVixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQThCL0MsWUFBWTtzQkFEakIsWUFBWTt1QkFBQyx1QkFBdUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFzSTNDLE9BQU87c0JBRFosWUFBWTt1QkFBQyxxQ0FBcUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCwgUmVmcmVzaGVyQ3VzdG9tRXZlbnQsIFNwaW5uZXJUeXBlcyB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7XG4gIElvbkluZmluaXRlU2Nyb2xsLFxuICBJb25JbmZpbml0ZVNjcm9sbENvbnRlbnQsXG4gIElvbkl0ZW0sXG4gIElvbkxhYmVsLFxuICBJb25MaXN0LFxuICBJb25SZWZyZXNoZXIsXG4gIElvblJlZnJlc2hlckNvbnRlbnQsXG4gIElvblNrZWxldG9uVGV4dCxcbiAgSW9uVGV4dCxcbiAgSW9uVGh1bWJuYWlsLFxuICBJb25Mb2FkaW5nXG59IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSAnQGRlY2FmLXRzL2RiLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgTW9kZWwsIFByaW1pdGl2ZXMgfSBmcm9tICdAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb24nO1xuaW1wb3J0IHsgQ29uZGl0aW9uLCBPYnNlcnZlciwgT3JkZXJEaXJlY3Rpb24sIFBhZ2luYXRvciB9IGZyb20gJ0BkZWNhZi10cy9jb3JlJztcbmltcG9ydCB7XG4gIEJhc2VDdXN0b21FdmVudCxcbiAgRHluYW1pYyxcbiAgRXZlbnRDb25zdGFudHMsXG4gIENvbXBvbmVudHNUYWdOYW1lcyxcbiAgUmVuZGVyZXJDdXN0b21FdmVudCxcbiAgU3RyaW5nT3JCb29sZWFuLFxuICBLZXlWYWx1ZSxcbiAgTGlzdEl0ZW1DdXN0b21FdmVudFxufSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgTmd4QmFzZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hCYXNlQ29tcG9uZW50JztcbmltcG9ydCB7XG4gIHN0cmluZ1RvQm9vbGVhbixcbiAgZm9ybWF0RGF0ZSxcbiAgaXNWYWxpZERhdGVcbn0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBTZWFyY2hiYXJDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hiYXIvc2VhcmNoYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGlzdC1pdGVtL2xpc3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtcmVuZGVyZXIvY29tcG9uZW50LXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9wYWdpbmF0aW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGdW5jdGlvbkxpa2UsIElGaWx0ZXJRdWVyeSwgSUZpbHRlclF1ZXJ5SXRlbSwgRGVjYWZSZXBvc2l0b3J5LCBJTGlzdEVtcHR5UmVzdWx0LCBMaXN0Q29tcG9uZW50c1R5cGVzIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSB2ZXJzYXRpbGUgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyB2YXJpb3VzIGRhdGEgZGlzcGxheSBtb2Rlcy5cbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZmxleGlibGUgd2F5IHRvIGRpc3BsYXkgbGlzdHMgb2YgZGF0YSB3aXRoIHN1cHBvcnRcbiAqIGZvciBpbmZpbml0ZSBzY3JvbGxpbmcsIHBhZ2luYXRpb24sIHNlYXJjaGluZywgYW5kIGN1c3RvbSBpdGVtIHJlbmRlcmluZy4gSXQgY2FuIGZldGNoXG4gKiBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzIGluY2x1ZGluZyBtb2RlbHMsIGZ1bmN0aW9ucywgb3IgZGlyZWN0IGRhdGEgaW5wdXQuXG4gKlxuICogVGhlIGNvbXBvbmVudCBzdXBwb3J0cyB0d28gbWFpbiBkaXNwbGF5IHR5cGVzOlxuICogMS4gSW5maW5pdGUgc2Nyb2xsaW5nIC0gTG9hZHMgbW9yZSBkYXRhIGFzIHRoZSB1c2VyIHNjcm9sbHNcbiAqIDIuIFBhZ2luYXRpb24gLSBEaXNwbGF5cyBkYXRhIGluIHBhZ2VzIHdpdGggbmF2aWdhdGlvbiBjb250cm9sc1xuICpcbiAqIEFkZGl0aW9uYWwgZmVhdHVyZXMgaW5jbHVkZTpcbiAqIC0gUHVsbC10by1yZWZyZXNoIGZ1bmN0aW9uYWxpdHlcbiAqIC0gU2VhcmNoIGZpbHRlcmluZ1xuICogLSBFbXB0eSBzdGF0ZSBjdXN0b21pemF0aW9uXG4gKiAtIEN1c3RvbSBpdGVtIHJlbmRlcmluZ1xuICogLSBFdmVudCBlbWlzc2lvbiBmb3IgaW50ZXJhY3Rpb25zXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YSBTb3VyY2VcbiAqICAgcGFydGljaXBhbnQgRSBhcyBFeHRlcm5hbCBDb21wb25lbnRzXG4gKlxuICogICBVLT4+TDogSW5pdGlhbGl6ZSBjb21wb25lbnRcbiAqICAgTC0+Pkw6IG5nT25Jbml0KClcbiAqICAgTC0+PkQ6IFJlcXVlc3QgaW5pdGlhbCBkYXRhXG4gKiAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAqICAgTC0+Pkw6IFByb2Nlc3MgYW5kIGRpc3BsYXkgZGF0YVxuICpcbiAqICAgYWx0IFVzZXIgc2Nyb2xscyAoSW5maW5pdGUgbW9kZSlcbiAqICAgICBVLT4+TDogU2Nyb2xsIHRvIGJvdHRvbVxuICogICAgIEwtPj5EOiBSZXF1ZXN0IG1vcmUgZGF0YVxuICogICAgIEQtLT4+TDogUmV0dXJuIGFkZGl0aW9uYWwgZGF0YVxuICogICAgIEwtPj5MOiBBcHBlbmQgdG8gZXhpc3RpbmcgZGF0YVxuICogICBlbHNlIFVzZXIgY2hhbmdlcyBwYWdlIChQYWdpbmF0ZWQgbW9kZSlcbiAqICAgICBVLT4+TDogQ2xpY2sgcGFnZSBudW1iZXJcbiAqICAgICBMLT4+TDogaGFuZGxlUGFnaW5hdGUoKVxuICogICAgIEwtPj5EOiBSZXF1ZXN0IGRhdGEgZm9yIHBhZ2VcbiAqICAgICBELS0+Pkw6IFJldHVybiBwYWdlIGRhdGFcbiAqICAgICBMLT4+TDogUmVwbGFjZSBkaXNwbGF5ZWQgZGF0YVxuICogICBlbmRcbiAqXG4gKiAgIGFsdCBVc2VyIHNlYXJjaGVzXG4gKiAgICAgVS0+Pkw6IEVudGVyIHNlYXJjaCB0ZXJtXG4gKiAgICAgTC0+Pkw6IGhhbmRsZVNlYXJjaCgpXG4gKiAgICAgTC0+PkQ6IEZpbHRlciBkYXRhIGJ5IHNlYXJjaCB0ZXJtXG4gKiAgICAgRC0tPj5MOiBSZXR1cm4gZmlsdGVyZWQgZGF0YVxuICogICAgIEwtPj5MOiBVcGRhdGUgZGlzcGxheWVkIGRhdGFcbiAqICAgZW5kXG4gKlxuICogICBhbHQgVXNlciBjbGlja3MgaXRlbVxuICogICAgIFUtPj5MOiBDbGljayBsaXN0IGl0ZW1cbiAqICAgICBMLT4+TDogaGFuZGxlQ2xpY2soKVxuICogICAgIEwtPj5FOiBFbWl0IGNsaWNrRXZlbnRcbiAqICAgZW5kXG4gKlxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtbGlzdFxuICogICBbc291cmNlXT1cImRhdGFTb3VyY2VcIlxuICogICBbbGltaXRdPVwiMTBcIlxuICogICBbdHlwZV09XCInaW5maW5pdGUnXCJcbiAqICAgW3Nob3dTZWFyY2hiYXJdPVwidHJ1ZVwiXG4gKiAgIChjbGlja0V2ZW50KT1cImhhbmRsZUl0ZW1DbGljaygkZXZlbnQpXCJcbiAqICAgKHJlZnJlc2hFdmVudCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAqIDwvbmd4LWRlY2FmLWxpc3Q+XG4gKlxuICogQGV4dGVuZHMge05neEJhc2VDb21wb25lbnR9XG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICovXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBJb25SZWZyZXNoZXIsXG4gICAgSW9uTG9hZGluZyxcbiAgICBQYWdpbmF0aW9uQ29tcG9uZW50LFxuICAgIElvbkxpc3QsXG4gICAgSW9uSXRlbSxcbiAgICBJb25UaHVtYm5haWwsXG4gICAgSW9uU2tlbGV0b25UZXh0LFxuICAgIElvbkxhYmVsLFxuICAgIElvblRleHQsXG4gICAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgICBJb25JbmZpbml0ZVNjcm9sbCxcbiAgICBJb25JbmZpbml0ZVNjcm9sbENvbnRlbnQsXG4gICAgSW9uVGh1bWJuYWlsLFxuICAgIElvblNrZWxldG9uVGV4dCxcbiAgICBTZWFyY2hiYXJDb21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbXBvbmVudCxcbiAgICBMaXN0SXRlbUNvbXBvbmVudCxcbiAgICBGaWx0ZXJDb21wb25lbnQsXG4gICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG1vZGUgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgdGhlIGxpc3QgZGF0YSBpcyBsb2FkZWQgYW5kIGRpc3BsYXllZC4gT3B0aW9ucyBpbmNsdWRlOlxuICAgKiAtIElORklOSVRFOiBMb2FkcyBtb3JlIGRhdGEgYXMgdGhlIHVzZXIgc2Nyb2xscyAoaW5maW5pdGUgc2Nyb2xsaW5nKVxuICAgKiAtIFBBR0lOQVRFRDogRGlzcGxheXMgZGF0YSBpbiBwYWdlcyB3aXRoIG5hdmlnYXRpb24gY29udHJvbHNcbiAgICpcbiAgICogQHR5cGUge0xpc3RDb21wb25lbnRzVHlwZXN9XG4gICAqIEBkZWZhdWx0IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHR5cGU6IExpc3RDb21wb25lbnRzVHlwZXMgPSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHVzZXMgdHJhbnNsYXRpb24gc2VydmljZXMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhdHRlbXB0IHRvIHVzZSB0cmFuc2xhdGlvbiBzZXJ2aWNlc1xuICAgKiBmb3IgYW55IHRleHQgY29udGVudC4gVGhpcyBhbGxvd3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIG9mIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNlYXJjaCBiYXIuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGRpc3BsYXlzIGEgc2VhcmNoIGJhciBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IHRoYXQgYWxsb3dzXG4gICAqIHVzZXJzIHRvIGZpbHRlciB0aGUgbGlzdCBpdGVtcy4gVGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IHdvcmtzIGJ5IGZpbHRlcmluZyB0aGVcbiAgICogZXhpc3RpbmcgZGF0YSBvciBieSB0cmlnZ2VyaW5nIGEgbmV3IGRhdGEgZmV0Y2ggd2l0aCBzZWFyY2ggcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd1NlYXJjaGJhcjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERpcmVjdCBkYXRhIGlucHV0IGZvciB0aGUgbGlzdCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgd2F5IHRvIGRpcmVjdGx5IHBhc3MgZGF0YSB0byB0aGUgbGlzdCBjb21wb25lbnQgaW5zdGVhZCBvZlxuICAgKiBmZXRjaGluZyBpdCBmcm9tIGEgc291cmNlLiBXaGVuIGJvdGggZGF0YSBhbmQgc291cmNlIGFyZSBwcm92aWRlZCwgdGhlIGNvbXBvbmVudFxuICAgKiB3aWxsIHVzZSB0aGUgc291cmNlIHRvIGZldGNoIGRhdGEgb25seSBpZiB0aGUgZGF0YSBhcnJheSBpcyBlbXB0eS5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW10gfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGF0YT86IEtleVZhbHVlW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRoZSBsaXN0IHNob3VsZCBmZXRjaCBpdHMgZGF0YSBmcm9tLiBUaGlzIGNhbiBiZSBlaXRoZXI6XG4gICAqIC0gQSBzdHJpbmcgVVJMIG9yIGVuZHBvaW50IGlkZW50aWZpZXJcbiAgICogLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBkYXRhIHdoZW4gY2FsbGVkXG4gICAqIFRoZSBjb21wb25lbnQgd2lsbCBjYWxsIHRoaXMgc291cmNlIHdoZW4gaXQgbmVlZHMgdG8gbG9hZCBvciByZWZyZXNoIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBGdW5jdGlvbkxpa2V9XG4gICAqIEByZXF1aXJlZFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc291cmNlITogc3RyaW5nIHwgRnVuY3Rpb25MaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0YXJ0aW5nIGluZGV4IGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGluZGV4IGZyb20gd2hpY2ggdG8gc3RhcnQgZmV0Y2hpbmcgZGF0YS4gVGhpcyBpcyB1c2VkXG4gICAqIGZvciBwYWdpbmF0aW9uIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcgdG8gZGV0ZXJtaW5lIHdoaWNoIHN1YnNldCBvZiBkYXRhIHRvIGxvYWQuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHN0YXJ0OiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBpdGVtcyB0byBmZXRjaCBwZXIgcGFnZSBvciBsb2FkIG9wZXJhdGlvbi5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgbWFueSBpdGVtcyBhcmUgbG9hZGVkIGF0IG9uY2UgZHVyaW5nIHBhZ2luYXRpb24gb3JcbiAgICogaW5maW5pdGUgc2Nyb2xsaW5nLiBUaGlzIGFmZmVjdHMgdGhlIHNpemUgb2YgZGF0YSBjaHVua3MgcmVxdWVzdGVkIGZyb20gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMTBcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxpbWl0OiBudW1iZXIgPSAxMDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgbW9yZSBkYXRhIGNhbiBiZSBsb2FkZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhbGxvdyBsb2FkaW5nIGFkZGl0aW9uYWwgZGF0YVxuICAgKiB0aHJvdWdoIGluZmluaXRlIHNjcm9sbGluZyBvciBwYWdpbmF0aW9uLiBXaGVuIGZhbHNlLCB0aGUgY29tcG9uZW50IHdpbGwgbm90XG4gICAqIGF0dGVtcHQgdG8gbG9hZCBtb3JlIGRhdGEgYmV5b25kIHdoYXQgaXMgaW5pdGlhbGx5IGRpc3BsYXllZC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZE1vcmVEYXRhOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3R5bGUgb2YgZGl2aWRpbmcgbGluZXMgYmV0d2VlbiBsaXN0IGl0ZW1zLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyBkaXZpZGluZyBsaW5lcyBhcHBlYXIgYmV0d2VlbiBsaXN0IGl0ZW1zLiBPcHRpb25zIGluY2x1ZGU6XG4gICAqIC0gXCJpbnNldFwiOiBMaW5lcyBhcmUgaW5zZXQgZnJvbSB0aGUgZWRnZXNcbiAgICogLSBcImZ1bGxcIjogTGluZXMgZXh0ZW5kIHRoZSBmdWxsIHdpZHRoXG4gICAqIC0gXCJub25lXCI6IE5vIGRpdmlkaW5nIGxpbmVzXG4gICAqXG4gICAqIEB0eXBlIHtcImluc2V0XCIgfCBcImZ1bGxcIiB8IFwibm9uZVwifVxuICAgKiBAZGVmYXVsdCBcImZ1bGxcIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbGluZXM6IFwiaW5zZXRcIiB8IFwiZnVsbFwiIHwgXCJub25lXCIgPSBcImZ1bGxcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpc3QgaGFzIGluc2V0IHN0eWxpbmcuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBsaXN0IHdpbGwgaGF2ZSBpbnNldCBzdHlsaW5nIHdpdGggcm91bmRlZCBjb3JuZXJzXG4gICAqIGFuZCBtYXJnaW4gYXJvdW5kIHRoZSBlZGdlcy4gVGhpcyBjcmVhdGVzIGEgY2FyZC1saWtlIGFwcGVhcmFuY2UgZm9yIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaW5zZXQ6IFN0cmluZ09yQm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRocmVzaG9sZCBmb3IgdHJpZ2dlcmluZyBpbmZpbml0ZSBzY3JvbGwgbG9hZGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBjbG9zZSB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IHRoZSB1c2VyIG11c3Qgc2Nyb2xsXG4gICAqIGJlZm9yZSB0aGUgY29tcG9uZW50IHRyaWdnZXJzIGxvYWRpbmcgb2YgYWRkaXRpb25hbCBkYXRhLiBUaGlzIGlzIGV4cHJlc3NlZFxuICAgKiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGxpc3QgaGVpZ2h0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBcIjE1JVwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzY3JvbGxUaHJlc2hvbGQ6IHN0cmluZyA9IFwiMTUlXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcG9zaXRpb24gd2hlcmUgbmV3IGl0ZW1zIGFyZSBhZGRlZCBkdXJpbmcgaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgbmV3IGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgbGlzdFxuICAgKiB3aGVuIGxvYWRpbmcgbW9yZSBkYXRhIHRocm91Z2ggaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7XCJib3R0b21cIiB8IFwidG9wXCJ9XG4gICAqIEBkZWZhdWx0IFwiYm90dG9tXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNjcm9sbFBvc2l0aW9uOiBcImJvdHRvbVwiIHwgXCJ0b3BcIiA9IFwiYm90dG9tXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gdGV4dCB0byBkaXNwbGF5IGR1cmluZyBsb2FkaW5nIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgdGV4dCBzaG93biBpbiB0aGUgbG9hZGluZyBpbmRpY2F0b3Igd2hlbiB0aGUgY29tcG9uZW50XG4gICAqIGlzIGZldGNoaW5nIGRhdGEuIElmIG5vdCBwcm92aWRlZCwgYSBkZWZhdWx0IGxvYWRpbmcgbWVzc2FnZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2FkaW5nVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBwdWxsLXRvLXJlZnJlc2ggZmVhdHVyZS5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgcHVsbC10by1yZWZyZXNoIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbGxvd3NcbiAgICogdXNlcnMgdG8gcmVmcmVzaCB0aGUgbGlzdCBkYXRhIGJ5IHB1bGxpbmcgZG93biBmcm9tIHRoZSB0b3Agb2YgdGhlIGxpc3QuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dSZWZyZXNoZXI6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiBzcGlubmVyIHRvIGRpc3BsYXkgZHVyaW5nIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIGxvYWRpbmcgc3Bpbm5lciBzaG93biBkdXJpbmcgZGF0YVxuICAgKiBmZXRjaGluZyBvcGVyYXRpb25zLiBVc2VzIElvbmljJ3MgcHJlZGVmaW5lZCBzcGlubmVyIHR5cGVzLlxuICAgKlxuICAgKiBAdHlwZSB7U3Bpbm5lclR5cGVzfVxuICAgKiBAZGVmYXVsdCBcImNpcmN1bGFyXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdTcGlubmVyOiBTcGlubmVyVHlwZXMgPSBcImNpcmN1bGFyXCI7XG5cbiAgLy8gLyoqXG4gIC8vICAqIEBkZXNjcmlwdGlvbiBRdWVyeSBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAvLyAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYWRkaXRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZldGNoaW5nIGRhdGEgZnJvbVxuICAvLyAgKiB0aGUgc291cmNlLiBUaGlzIGNhbiBiZSBwcm92aWRlZCBhcyBhIHN0cmluZyAoSlNPTikgb3IgYSBkaXJlY3Qgb2JqZWN0LlxuICAvLyAgKlxuICAvLyAgKiBAdHlwZSB7c3RyaW5nIHwgS2V5VmFsdWUgfCB1bmRlZmluZWR9XG4gIC8vICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gIC8vICAqL1xuICAvLyBASW5wdXQoKVxuICAvLyBxdWVyeT86IHN0cmluZyB8IEtleVZhbHVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgZmlsdGVyaW5nIGZ1bmN0aW9uYWxpdHkgaXMgZW5hYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgZmlsdGVyIGNvbXBvbmVudCB0aGF0IGFsbG93cyB1c2VycyB0byBjcmVhdGVcbiAgICogY29tcGxleCBzZWFyY2ggY3JpdGVyaWEgd2l0aCBtdWx0aXBsZSBmaWVsZCBmaWx0ZXJzLCBjb25kaXRpb25zLCBhbmQgdmFsdWVzLlxuICAgKiBXaGVuIGZhbHNlLCBkaXNhYmxlcyB0aGUgZmlsdGVyIGludGVyZmFjZSBlbnRpcmVseS5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZW5hYmxlRmlsdGVyOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU29ydGluZyBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IHRoZSBmZXRjaGVkIGRhdGEgc2hvdWxkIGJlIHNvcnRlZC4gVGhpcyBjYW4gYmUgcHJvdmlkZWRcbiAgICogYXMgYSBzdHJpbmcgKGZpZWxkIG5hbWUgd2l0aCBvcHRpb25hbCBkaXJlY3Rpb24pIG9yIGEgZGlyZWN0IG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEtleVZhbHVlIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc29ydERpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5EU0M7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNvcnRpbmcgcGFyYW1ldGVycyBmb3IgZGF0YSBmZXRjaGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyB0aGUgZmV0Y2hlZCBkYXRhIHNob3VsZCBiZSBzb3J0ZWQuIFRoaXMgY2FuIGJlIHByb3ZpZGVkXG4gICAqIGFzIGEgc3RyaW5nIChmaWVsZCBuYW1lIHdpdGggb3B0aW9uYWwgZGlyZWN0aW9uKSBvciBhIGRpcmVjdCBvYmplY3QuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBLZXlWYWx1ZSB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNvcnRCeSE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBzb3J0aW5nIGZ1bmN0aW9uYWxpdHkgaXMgZGlzYWJsZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGRpc2FibGVzIHRoZSBzb3J0IGNvbnRyb2xzIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tXG4gICAqIGNoYW5naW5nIHRoZSBzb3J0IG9yZGVyIG9yIGZpZWxkLiBUaGUgbGlzdCB3aWxsIG1haW50YWluIGl0cyBkZWZhdWx0IG9yXG4gICAqIHByb2dyYW1tYXRpY2FsbHkgc2V0IHNvcnQgY29uZmlndXJhdGlvbiB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBkaXNhYmxlU29ydDogU3RyaW5nT3JCb29sZWFuID0gZmFsc2U7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEljb24gdG8gZGlzcGxheSB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGljb24gc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUuXG4gICAqIFRoaXMgY2FuIGJlIGFueSBpY29uIG5hbWUgc3VwcG9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbidzIGljb24gc3lzdGVtLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAZGVmYXVsdCAndGktZGF0YWJhc2UtZXhjbGFtYXRpb24nXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eUljb24/OiBzdHJpbmcgPSAndGktZGF0YWJhc2UtZXhjbGFtYXRpb24nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGVtcHR5IHN0YXRlIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IEN1c3RvbWl6ZXMgaG93IHRoZSBlbXB0eSBzdGF0ZSBpcyBkaXNwbGF5ZWQgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICogVGhpcyBpbmNsdWRlcyB0aGUgdGl0bGUsIHN1YnRpdGxlLCBidXR0b24gdGV4dCwgaWNvbiwgYW5kIG5hdmlnYXRpb24gbGluay5cbiAgICpcbiAgICogQHR5cGUge1BhcnRpYWw8SUxpc3RFbXB0eVJlc3VsdD59XG4gICAqIEBkZWZhdWx0IHtcbiAgICogICB0aXRsZTogJ2VtcHR5LnRpdGxlJyxcbiAgICogICBzdWJ0aXRsZTogJ2VtcHR5LnN1YnRpdGxlJyxcbiAgICogICBzaG93QnV0dG9uOiBmYWxzZSxcbiAgICogICBpY29uOiAnYWxlcnQtY2lyY2xlLW91dGxpbmUnLFxuICAgKiAgIGJ1dHRvblRleHQ6ICdsb2NhbGUuZW1wdHkuYnV0dG9uJyxcbiAgICogICBsaW5rOiAnJ1xuICAgKiB9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eTogUGFydGlhbDxJTGlzdEVtcHR5UmVzdWx0PiA9IHtcbiAgICB0aXRsZTogJ2VtcHR5LnRpdGxlJyxcbiAgICBzdWJ0aXRsZTogJ2VtcHR5LnN1YnRpdGxlJyxcbiAgICBzaG93QnV0dG9uOiBmYWxzZSxcbiAgICBpY29uOiAnYWxlcnQtY2lyY2xlLW91dGxpbmUnLFxuICAgIGJ1dHRvblRleHQ6ICdsb2NhbGUuZW1wdHkuYnV0dG9uJyxcbiAgICBsaW5rOiAnJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudCBwYWdlIG51bWJlciBpbiBwYWdpbmF0ZWQgbW9kZS5cbiAgICogQHN1bW1hcnkgVHJhY2tzIHdoaWNoIHBhZ2UgaXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZCB3aGVuIHRoZSBjb21wb25lbnRcbiAgICogaXMgaW4gcGFnaW5hdGVkIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgcGFnaW5hdGlvbiBjb250cm9scyBhbmQgZGF0YSBmZXRjaGluZy5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcGFnZTogbnVtYmVyID0gMTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGNhbGN1bGF0ZWQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSBkYXRhIHNpemVcbiAgICogYW5kIGxpbWl0LiBUaGlzIGlzIHVzZWQgZm9yIHBhZ2luYXRpb24gY29udHJvbHMgYW5kIGJvdW5kYXJ5IGNoZWNraW5nLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcGFnZXMhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciBhIHJlZnJlc2ggb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGZldGNoaW5nIG5ldyBkYXRhLiBUaGlzIGlzIHVzZWRcbiAgICogdG8gY29udHJvbCBsb2FkaW5nIGluZGljYXRvcnMgYW5kIHByZXZlbnQgZHVwbGljYXRlIHJlZnJlc2ggb3BlcmF0aW9ucyBmcm9tXG4gICAqIGJlaW5nIHRyaWdnZXJlZCBzaW11bHRhbmVvdXNseS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSB1c2VkIGZvciByZW5kZXJpbmcgc2tlbGV0b24gbG9hZGluZyBwbGFjZWhvbGRlcnMuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHBsYWNlaG9sZGVyIGl0ZW1zIHRoYXQgYXJlIGRpc3BsYXllZCBkdXJpbmcgZGF0YSBsb2FkaW5nLlxuICAgKiBUaGUgbGVuZ3RoIG9mIHRoaXMgYXJyYXkgZGV0ZXJtaW5lcyBob3cgbWFueSBza2VsZXRvbiBpdGVtcyBhcmUgc2hvd24uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICogQGRlZmF1bHQgbmV3IEFycmF5KDIpXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBza2VsZXRvbkRhdGE6IHN0cmluZ1tdID0gbmV3IEFycmF5KDIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHByb2Nlc3NlZCBsaXN0IGl0ZW1zIHJlYWR5IGZvciBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgc2V0IG9mIGl0ZW1zIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBhZnRlclxuICAgKiBwcm9jZXNzaW5nIGZyb20gdGhlIHJhdyBkYXRhIHNvdXJjZS4gVGhpcyBtYXkgYmUgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgZGF0YVxuICAgKiB3aGVuIHVzaW5nIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7S2V5VmFsdWVbXX1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGl0ZW1zITogS2V5VmFsdWVbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IHNlYXJjaCBxdWVyeSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIHNlYXJjaCBiYXIuIFRoaXMgaXMgdXNlZCB0byBmaWx0ZXJcbiAgICogdGhlIGxpc3QgZGF0YSBvciB0byBzZW5kIGFzIGEgc2VhcmNoIHBhcmFtZXRlciB3aGVuIGZldGNoaW5nIG5ldyBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgc2VhcmNoVmFsdWU/OiBzdHJpbmcgfCBJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBIHBhZ2luYXRvciBvYmplY3QgZm9yIGhhbmRsaW5nIHBhZ2luYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBwYWdpbmF0b3Igb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYW5kIG5hdmlnYXRlXG4gICAqIHRocm91Z2ggZGF0YSBpbiBjaHVua3MsIHJlZHVjaW5nIG1lbW9yeSB1c2FnZSBhbmQgaW1wcm92aW5nIHBlcmZvcm1hbmNlLlxuICAgKlxuICAgKiBUaGUgcGFnaW5hdG9yIG9iamVjdCBpcyBpbml0aWFsaXplZCBpbiB0aGUgYG5nT25Jbml0YCBsaWZlY3ljbGUgaG9vayBhbmQgaXNcbiAgICogdXNlZCB0byBmZXRjaCBhbmQgZGlzcGxheSBkYXRhIGluIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC4gSXQgaXMgYW4gaW5zdGFuY2VcbiAgICogb2YgdGhlIGBQYWdpbmF0b3JgIGNsYXNzIGZyb20gdGhlIGBAZGVjYWYtdHMvY29yZWAgcGFja2FnZSwgd2hpY2ggcHJvdmlkZXNcbiAgICogbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIG1hbmlwdWxhdGluZyBwYWdpbmF0ZWQgZGF0YS5cbiAgICpcbiAgICogQHR5cGUge1BhZ2luYXRvcjxNb2RlbD59XG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBwYWdpbmF0b3IhOiBQYWdpbmF0b3I8TW9kZWw+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhc3QgcGFnZSBudW1iZXIgdGhhdCB3YXMgZGlzcGxheWVkLlxuICAgKiBAc3VtbWFyeSBLZWVwcyB0cmFjayBvZiB0aGUgcHJldmlvdXNseSBkaXNwbGF5ZWQgcGFnZSBudW1iZXIsIHdoaWNoIGlzIHVzZWZ1bFxuICAgKiBmb3IgaGFuZGxpbmcgbmF2aWdhdGlvbiBhbmQgc2VhcmNoIG9wZXJhdGlvbnMgaW4gcGFnaW5hdGVkIG1vZGUuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGxhc3RQYWdlOiBudW1iZXIgPSAxXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciByZWZyZXNoIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGxpc3QgZGF0YSBpcyByZWZyZXNoZWQsIGVpdGhlciB0aHJvdWdoIHB1bGwtdG8tcmVmcmVzaFxuICAgKiBvciBwcm9ncmFtbWF0aWMgcmVmcmVzaC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSByZWZyZXNoZWQgZGF0YSBhbmQgY29tcG9uZW50IGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEJhc2VDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVmcmVzaEV2ZW50OiBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgaXRlbSBjbGljayBpbnRlcmFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBsaXN0IGl0ZW0gaXMgY2xpY2tlZC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSBkYXRhXG4gICAqIG9mIHRoZSBjbGlja2VkIGl0ZW0sIGFsbG93aW5nIHBhcmVudCBjb21wb25lbnRzIHRvIHJlc3BvbmQgdG8gdGhlIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEtleVZhbHVlPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBjbGlja0V2ZW50OiAgRXZlbnRFbWl0dGVyPExpc3RJdGVtQ3VzdG9tRXZlbnR8UmVuZGVyZXJDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RJdGVtQ3VzdG9tRXZlbnR8UmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1YmplY3QgZm9yIGRlYm91bmNpbmcgY2xpY2sgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBVc2VzIFJ4SlMgU3ViamVjdCB0byBjb2xsZWN0IGNsaWNrIGV2ZW50cyBhbmQgZW1pdCB0aGVtIGFmdGVyIGEgZGVib3VuY2VcbiAgICogcGVyaW9kLiBUaGlzIHByZXZlbnRzIG11bHRpcGxlIHJhcGlkIGNsaWNrcyBmcm9tIHRyaWdnZXJpbmcgbXVsdGlwbGUgZXZlbnRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY2xpY2tJdGVtU3ViamVjdDogU3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50PiA9IG5ldyBTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+KCk7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1YmplY3QgZm9yIGRlYm91bmNpbmcgcmVwb3NpdG9yeSBvYnNlcnZhdGlvbiBldmVudHMuXG4gICAqIEBzdW1tYXJ5IFJ4SlMgU3ViamVjdCB0aGF0IGNvbGxlY3RzIHJlcG9zaXRvcnkgY2hhbmdlIGV2ZW50cyBhbmQgZW1pdHMgdGhlbSBhZnRlclxuICAgKiBhIGRlYm91bmNlIHBlcmlvZC4gVGhpcyBwcmV2ZW50cyBtdWx0aXBsZSByYXBpZCByZXBvc2l0b3J5IGNoYW5nZXMgZnJvbSB0cmlnZ2VyaW5nXG4gICAqIG11bHRpcGxlIGxpc3QgcmVmcmVzaCBvcGVyYXRpb25zLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYW5kIHVzZXIgZXhwZXJpZW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1N1YmplY3Q8YW55Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgb2JzZXJ2ZXJTdWJqZXQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9ic2VydmVyIG9iamVjdCBmb3IgcmVwb3NpdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgT2JzZXJ2ZXIgaW50ZXJmYWNlIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIHRoZVxuICAgKiB1bmRlcmx5aW5nIGRhdGEgcmVwb3NpdG9yeSBjaGFuZ2VzLiBUaGlzIGVuYWJsZXMgYXV0b21hdGljIGxpc3QgdXBkYXRlcyB3aGVuXG4gICAqIGRhdGEgaXMgY3JlYXRlZCwgdXBkYXRlZCwgb3IgZGVsZXRlZCB0aHJvdWdoIHRoZSByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7T2JzZXJ2ZXJ9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIG9ic2VydmVyOiBPYnNlcnZlciA9IHsgcmVmcmVzaDogYXN5bmMgKC4uLiBhcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMub2JzZXJ2ZVJlcG9zaXRvcnkoLi4uYXJncyl9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIGF2YWlsYWJsZSBpbmRleGVzIGZvciBkYXRhIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbGlzdCBvZiBpbmRleCBuYW1lcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGRhdGEgcXVlcnlpbmcgYW5kIGZpbHRlcmluZ1xuICAgKiBvcGVyYXRpb25zLCBlc3BlY2lhbGx5IGluIHNjZW5hcmlvcyB3aXRoIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBJbmRleGVzIGNhbiBzaWduaWZpY2FudGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIGRhdGEgcmV0cmlldmFsIGJ5IGFsbG93aW5nIHRoZSBkYXRhYmFzZVxuICAgKiB0byBxdWlja2x5IGxvY2F0ZSBhbmQgcmV0cmlldmUgcmVsZXZhbnQgZGF0YSBiYXNlZCBvbiBpbmRleGVkIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaW5kZXhlcyE6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIExpc3RDb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgTGlzdENvbXBvbmVudCBhbmQgc2V0cyB1cCB0aGUgYmFzZSBjb21wb25lbnQgd2l0aCB0aGUgYXBwcm9wcmlhdGVcbiAgICogY29tcG9uZW50IG5hbWUuIFRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdoZW4gQW5ndWxhciBpbnN0YW50aWF0ZXMgdGhlIGNvbXBvbmVudCBhbmRcbiAgICogYmVmb3JlIGFueSBpbnB1dCBwcm9wZXJ0aWVzIGFyZSBzZXQuIEl0IHBhc3NlcyB0aGUgY29tcG9uZW50IG5hbWUgdG8gdGhlIHBhcmVudCBjbGFzc1xuICAgKiBjb25zdHJ1Y3RvciB0byBlbmFibGUgcHJvcGVyIGxvY2FsaXphdGlvbiBhbmQgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uLlxuICAgKlxuICAgKiBUaGUgY29uc3RydWN0b3IgaXMgaW50ZW50aW9uYWxseSBtaW5pbWFsLCB3aXRoIG1vc3QgaW5pdGlhbGl6YXRpb24gbG9naWMgZGVmZXJyZWQgdG9cbiAgICogdGhlIG5nT25Jbml0IGxpZmVjeWNsZSBob29rLiBUaGlzIGZvbGxvd3MgQW5ndWxhciBiZXN0IHByYWN0aWNlcyBieSBrZWVwaW5nIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBmb2N1c2VkIG9uIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCBiYXNpYyBzZXR1cCwgd2hpbGUgY29tcGxleCBpbml0aWFsaXphdGlvbiB0aGF0IGRlcGVuZHNcbiAgICogb24gaW5wdXQgcHJvcGVydGllcyBpcyBoYW5kbGVkIGluIG5nT25Jbml0LlxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJMaXN0Q29tcG9uZW50XCIpO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBzZXRzIHRoZSBpbnB1dCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgaW5pdGlhbGl6aW5nIGV2ZW50IHN1YnNjcmlwdGlvbnMsIHByb2Nlc3NpbmcgYm9vbGVhblxuICAgKiBpbnB1dHMsIGFuZCBsb2FkaW5nIHRoZSBpbml0aWFsIGRhdGEuIFRoaXMgbWV0aG9kIHByZXBhcmVzIHRoZSBjb21wb25lbnQgZm9yIHVzZXJcbiAgICogaW50ZXJhY3Rpb24gYnkgZW5zdXJpbmcgYWxsIHByb3BlcnRpZXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGFuZCBkYXRhIGlzIGxvYWRlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gICAqXG4gICAqICAgQS0+Pkw6IG5nT25Jbml0KClcbiAgICogICBMLT4+TDogU2V0IHVwIGNsaWNrIGV2ZW50IGRlYm91bmNpbmdcbiAgICogICBMLT4+TDogUHJvY2VzcyBib29sZWFuIGlucHV0c1xuICAgKiAgIEwtPj5MOiBDb25maWd1cmUgY29tcG9uZW50IGJhc2VkIG9uIGlucHV0c1xuICAgKiAgIEwtPj5MOiByZWZyZXNoKClcbiAgICogICBMLT4+RDogUmVxdWVzdCBpbml0aWFsIGRhdGFcbiAgICogICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgTC0+Pkw6IFByb2Nlc3MgYW5kIGRpc3BsYXkgZGF0YVxuICAgKiAgIEwtPj5MOiBDb25maWd1cmUgZW1wdHkgc3RhdGUgaWYgbmVlZGVkXG4gICAqICAgTC0+Pkw6IGluaXRpYWxpemUoKVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGlja0l0ZW1TdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLnN1YnNjcmliZShldmVudCA9PiB0aGlzLmNsaWNrRXZlbnRFbWl0KGV2ZW50IGFzIExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50KSk7XG4gICAgdGhpcy5vYnNlcnZlclN1YmpldC5waXBlKGRlYm91bmNlVGltZSgxMDApKS5zdWJzY3JpYmUoYXJncyA9PiB0aGlzLmhhbmRsZU9ic2VydmVFdmVudChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKSk7XG4gICAgdGhpcy5lbmFibGVGaWx0ZXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5lbmFibGVGaWx0ZXIpO1xuICAgIHRoaXMubGltaXQgPSBOdW1iZXIodGhpcy5saW1pdCk7XG4gICAgdGhpcy5zdGFydCA9IE51bWJlcih0aGlzLnN0YXJ0KTtcbiAgICB0aGlzLmluc2V0ID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuaW5zZXQpO1xuICAgIHRoaXMuc2hvd1JlZnJlc2hlciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLnNob3dSZWZyZXNoZXIpO1xuICAgIHRoaXMubG9hZE1vcmVEYXRhID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMubG9hZE1vcmVEYXRhKTtcbiAgICB0aGlzLnNob3dTZWFyY2hiYXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5zaG93U2VhcmNoYmFyKTtcbiAgICB0aGlzLmRpc2FibGVTb3J0ID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuZGlzYWJsZVNvcnQpO1xuICAgIGlmKHR5cGVvZiB0aGlzLml0ZW0/LlsndGFnJ10gPT09ICdib29sZWFuJyAmJiB0aGlzLml0ZW0/LlsndGFnJ10gPT09IHRydWUpXG4gICAgICB0aGlzLml0ZW1bJ3RhZyddID0gQ29tcG9uZW50c1RhZ05hbWVzLkxJU1RfSVRFTSBhcyBzdHJpbmc7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcblxuICAgIGlmKHRoaXMub3BlcmF0aW9ucy5pbmNsdWRlcyhPcGVyYXRpb25LZXlzLkNSRUFURSkgJiYgdGhpcy5yb3V0ZSlcbiAgICAgIHRoaXMuZW1wdHkubGluayA9IGAke3RoaXMucm91dGV9LyR7T3BlcmF0aW9uS2V5cy5DUkVBVEV9YDtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgaWYodGhpcy5tb2RlbCBpbnN0YW5jZW9mIE1vZGVsICYmIHRoaXMuX3JlcG9zaXRvcnkpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5Lm9ic2VydmUodGhpcy5vYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFucyB1cCByZXNvdXJjZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgY2xlYW51cCBvcGVyYXRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAgICogVGhpcyBpbmNsdWRlcyBjbGVhcmluZyByZWZlcmVuY2VzIHRvIG1vZGVscyBhbmQgZGF0YSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZih0aGlzLl9yZXBvc2l0b3J5KVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeS51bk9ic2VydmUodGhpcy5vYnNlcnZlcik7XG4gICAgdGhpcy5kYXRhID0gIHRoaXMubW9kZWwgPSB0aGlzLl9yZXBvc2l0b3J5ID0gdGhpcy5wYWdpbmF0b3IgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcmVwb3NpdG9yeSBvYnNlcnZhdGlvbiBldmVudHMgd2l0aCBkZWJvdW5jaW5nLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgcmVwb3NpdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgcm91dGVzIHRoZW0gYXBwcm9wcmlhdGVseS5cbiAgICogRm9yIENSRUFURSBldmVudHMgd2l0aCBhIFVJRCwgaGFuZGxlcyB0aGVtIGltbWVkaWF0ZWx5LiBGb3Igb3RoZXIgZXZlbnRzLFxuICAgKiBwYXNzZXMgdGhlbSB0byB0aGUgZGVib3VuY2VkIG9ic2VydmVyIHN1YmplY3QgdG8gcHJldmVudCBleGNlc3NpdmUgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBUaGUgcmVwb3NpdG9yeSBldmVudCBhcmd1bWVudHMgaW5jbHVkaW5nIHRhYmxlLCBldmVudCB0eXBlLCBhbmQgVUlEXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgb2JzZXJ2ZVJlcG9zaXRvcnkoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgW3RhYmxlLCBldmVudCwgdWlkXSA9IGFyZ3M7XG4gICAgaWYoZXZlbnQgPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFICYmICEhdWlkKVxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlT2JzZXJ2ZUV2ZW50KHRhYmxlIGFzIHN0cmluZywgZXZlbnQsIHVpZCBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyU3ViamV0Lm5leHQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc3BlY2lmaWMgcmVwb3NpdG9yeSBldmVudHMgYW5kIHVwZGF0ZXMgdGhlIGxpc3QgYWNjb3JkaW5nbHkuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyByZXBvc2l0b3J5IGNoYW5nZSBldmVudHMgKENSRUFURSwgVVBEQVRFLCBERUxFVEUpIGFuZCBwZXJmb3Jtc1xuICAgKiB0aGUgYXBwcm9wcmlhdGUgbGlzdCBvcGVyYXRpb25zLiBUaGlzIGluY2x1ZGVzIGFkZGluZyBuZXcgaXRlbXMsIHVwZGF0aW5nIGV4aXN0aW5nXG4gICAqIG9uZXMsIG9yIHJlbW92aW5nIGRlbGV0ZWQgaXRlbXMgZnJvbSB0aGUgbGlzdCBkaXNwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvbW9kZWwgbmFtZSB0aGF0IGNoYW5nZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiAoQ1JFQVRFLCBVUERBVEUsIERFTEVURSlcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWZmZWN0ZWQgaXRlbVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZU9ic2VydmVFdmVudCh0YWJsZTogc3RyaW5nLCBldmVudDogT3BlcmF0aW9uS2V5cywgdWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUpIHtcbiAgICAgIGlmKHVpZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUNyZWF0ZSh1aWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEUpXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVXBkYXRlKHVpZCk7XG4gICAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5ERUxFVEUpXG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRlKHVpZCk7XG4gICAgICB0aGlzLnJlZnJlc2hFdmVudEVtaXQoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gZm9yIHRyYWNraW5nIGl0ZW1zIGluIHRoZSBsaXN0LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHRyYWNraW5nIGZ1bmN0aW9uIGZvciB0aGUgYCpuZ0ZvcmAgZGlyZWN0aXZlIGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpZGVudGlmeSBhbmQgY29udHJvbCB0aGUgcmVuZGVyaW5nIG9mIGl0ZW1zIGluIHRoZSBsaXN0LFxuICAgKiBwcmV2ZW50aW5nIGR1cGxpY2F0ZSBvciB1bm5lY2Vzc2FyeSByZW5kZXJpbmcuXG4gICAqXG4gICAqIFRoZSBgdHJhY2tJdGVtRm5gIGZ1bmN0aW9uIHRha2VzIHR3byBwYXJhbWV0ZXJzOiBgaW5kZXhgICh0aGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QpXG4gICAqIGFuZCBgaXRlbWAgKHRoZSBhY3R1YWwgaXRlbSBmcm9tIHRoZSBsaXN0KS4gSXQgcmV0dXJucyB0aGUgdHJhY2tpbmcga2V5LCB3aGljaCBpbiB0aGlzIGNhc2VcbiAgICogaXMgdGhlIHVuaW9uIG9mIHRoZSBgdWlkYCBvZiB0aGUgaXRlbSB3aXRoIHRoZSBtb2RlbCBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QuXG5cbiAgICogQHBhcmFtIHtLZXlWYWx1ZSB8IHN0cmluZyB8IG51bWJlcn0gaXRlbSAtIFRoZSBhY3R1YWwgaXRlbSBmcm9tIHRoZSBsaXN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyfSBUaGUgdHJhY2tpbmcga2V5IGZvciB0aGUgaXRlbS5cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIG92ZXJyaWRlIHRyYWNrSXRlbUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IEtleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gYCR7IChpdGVtIGFzIEtleVZhbHVlKT8uWyd1aWQnXSB8fCAoaXRlbSBhcyBLZXlWYWx1ZSk/Llt0aGlzLnBrXX0tJHtpbmRleH1gO1xuICB9XG5cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50IGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gY3JlYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaXRlbSBpcyBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgbGlzdC5cbiAgICovXG4gIGFzeW5jIGhhbmRsZUNyZWF0ZSh1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX3JlcG9zaXRvcnk/LnJlYWQodWlkKTtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5tYXBSZXN1bHRzKFtyZXN1bHQgYXMgS2V5VmFsdWVdKVswXTtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhID0gW2l0ZW0sIC4uLnRoaXMuaXRlbXMgfHwgW11dO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgdGhlIHVwZGF0ZSBldmVudCBmcm9tIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIHRoZSBsaXN0IGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIElEIGJhc2VkIG9uIHRoZSBuZXcgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBoYW5kbGVVcGRhdGUodWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpdGVtOiBLZXlWYWx1ZSA9IHRoaXMuaXRlbU1hcHBlcihhd2FpdCB0aGlzLl9yZXBvc2l0b3J5Py5yZWFkKHVpZCkgfHwge30sIHRoaXMubWFwcGVyKTtcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICBmb3IoY29uc3Qga2V5IGluIHRoaXMuaXRlbXMgYXMgS2V5VmFsdWVbXSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuaXRlbXNba2V5XSBhcyBLZXlWYWx1ZTtcbiAgICAgICAgaWYoY2hpbGRbJ3VpZCddID09PSBpdGVtWyd1aWQnXSkge1xuICAgICAgICAgIHRoaXMuaXRlbXNba2V5XSA9IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkLCBpdGVtKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YSA9IFsgLi4udGhpcy5pdGVtc107XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBsaXN0IGJ5IElELlxuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIG91dCBhbiBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBkYXRhIGFycmF5IGFuZFxuICAgKiByZWZyZXNoZXMgdGhlIGxpc3QgZGlzcGxheS4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBhZnRlciBhIGRlbGV0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIFRoZSBwcmltYXJ5IGtleSBmaWVsZCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlRGVsZXRlKHVpZDogc3RyaW5nIHwgbnVtYmVyLCBwaz86IHN0cmluZyk6IHZvaWQgIHtcbiAgICBpZighcGspXG4gICAgICBwayA9IHRoaXMucGs7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YT8uZmlsdGVyKChpdGVtOiBLZXlWYWx1ZSkgPT4gaXRlbVsndWlkJ10gIT09IHVpZCkgfHwgW107XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjbGljayBldmVudHMgZnJvbSBsaXN0IGl0ZW1zLlxuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBnbG9iYWwgTGlzdEl0ZW1DbGlja0V2ZW50IGV2ZW50cyBhbmQgcGFzc2VzIHRoZW0gdG8gdGhlXG4gICAqIGRlYm91bmNlZCBjbGljayBzdWJqZWN0LiBUaGlzIGFsbG93cyB0aGUgY29tcG9uZW50IHRvIHJlc3BvbmQgdG8gY2xpY2tzIG9uXG4gICAqIGxpc3QgaXRlbXMgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IG9yaWdpbmF0ZSBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0ge0xpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBjbGljayBldmVudFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpMaXN0SXRlbUNsaWNrRXZlbnQnLCBbJyRldmVudCddKVxuICBoYW5kbGVDbGljayhldmVudDogTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrSXRlbVN1YmplY3QubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc2VhcmNoIGV2ZW50cyBmcm9tIHRoZSBzZWFyY2ggYmFyLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgc2VhcmNoIHF1ZXJpZXMgZnJvbSB0aGUgc2VhcmNoIGJhciBjb21wb25lbnQsIHVwZGF0aW5nIHRoZVxuICAgKiBkaXNwbGF5ZWQgZGF0YSBiYXNlZCBvbiB0aGUgc2VhcmNoIHRlcm0uIFRoZSBiZWhhdmlvciBkaWZmZXJzIGJldHdlZW4gaW5maW5pdGVcbiAgICogYW5kIHBhZ2luYXRlZCBtb2RlcyB0byBwcm92aWRlIHRoZSBiZXN0IHVzZXIgZXhwZXJpZW5jZSBmb3IgZWFjaCBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUaGUgc2VhcmNoIHRlcm0gb3IgdW5kZWZpbmVkIHRvIGNsZWFyIHNlYXJjaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogZmxvd2NoYXJ0IFREXG4gICAqICAgQVtTZWFyY2ggRXZlbnRdIC0tPiBCe1R5cGUgaXMgSW5maW5pdGU/fVxuICAgKiAgIEIgLS0+fFllc3wgQ1tEaXNhYmxlIGxvYWRNb3JlRGF0YV1cbiAgICogICBCIC0tPnxOb3wgRFtFbmFibGUgbG9hZE1vcmVEYXRhXVxuICAgKiAgIEMgLS0+IEV7U2VhcmNoIHZhbHVlIHVuZGVmaW5lZD99XG4gICAqICAgRSAtLT58WWVzfCBGW0VuYWJsZSBsb2FkTW9yZURhdGFdXG4gICAqICAgRSAtLT58Tm98IEdbU3RvcmUgc2VhcmNoIHZhbHVlXVxuICAgKiAgIEQgLS0+IEdcbiAgICogICBGIC0tPiBIW1Jlc2V0IHBhZ2UgdG8gMV1cbiAgICogICBHIC0tPiBJW1JlZnJlc2ggZGF0YV1cbiAgICogICBIIC0tPiBJXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2VhcmNoYmFyRXZlbnQnLCBbJyRldmVudCddKVxuICBhc3luYyBoYW5kbGVTZWFyY2godmFsdWU6IHN0cmluZyB8IElGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSkge1xuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IHRydWU7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLmxhc3RQYWdlO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZpbHRlciBldmVudHMgZnJvbSB0aGUgZmlsdGVyIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGZpbHRlciBxdWVyaWVzIGZyb20gdGhlIGZpbHRlciBjb21wb25lbnQgYW5kIGFwcGxpZXMgdGhlbVxuICAgKiB0byB0aGUgbGlzdCBkYXRhLiBUaGlzIG1ldGhvZCBhY3RzIGFzIGEgYnJpZGdlIGJldHdlZW4gdGhlIGZpbHRlciBjb21wb25lbnRcbiAgICogYW5kIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSwgY29udmVydGluZyBmaWx0ZXIgcXVlcmllcyBpbnRvIHNlYXJjaCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0lGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUaGUgZmlsdGVyIHF1ZXJ5IG9iamVjdCBvciB1bmRlZmluZWQgdG8gY2xlYXIgZmlsdGVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZUZpbHRlcih2YWx1ZTogSUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2godmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhcnMgdGhlIGN1cnJlbnQgc2VhcmNoIGFuZCByZXNldHMgdGhlIGxpc3QuXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNsZWFycyB0aGUgc2VhcmNoIGJ5IGNhbGxpbmcgaGFuZGxlU2VhcmNoXG4gICAqIHdpdGggdW5kZWZpbmVkLiBUaGlzIHJlc2V0cyB0aGUgbGlzdCB0byBzaG93IGFsbCBkYXRhIHdpdGhvdXQgZmlsdGVyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGNsZWFyU2VhcmNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VhcmNoKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVtaXRzIGEgcmVmcmVzaCBldmVudCB3aXRoIHRoZSBjdXJyZW50IGRhdGEuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYW5kIGVtaXRzIGEgcmVmcmVzaCBldmVudCBjb250YWluaW5nIHRoZSBjdXJyZW50IGxpc3QgZGF0YS5cbiAgICogVGhpcyBub3RpZmllcyBwYXJlbnQgY29tcG9uZW50cyB0aGF0IHRoZSBsaXN0IGRhdGEgaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVZhbHVlW119IFtkYXRhXSAtIE9wdGlvbmFsIGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoRXZlbnRFbWl0KGRhdGE/OiBLZXlWYWx1ZVtdKTogdm9pZCB7XG4gICAgaWYoIWRhdGEpXG4gICAgICBkYXRhID0gdGhpcy5pdGVtcztcbiAgICB0aGlzLnNrZWxldG9uRGF0YSA9IG5ldyBBcnJheShkYXRhPy5sZW5ndGggfHwgMik7XG4gICAgdGhpcy5yZWZyZXNoRXZlbnQuZW1pdCh7XG4gICAgICBuYW1lOiBFdmVudENvbnN0YW50cy5SRUZSRVNILFxuICAgICAgZGF0YTogZGF0YSB8fCBbXSxcbiAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnROYW1lXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVtaXRzIGEgY2xpY2sgZXZlbnQgZm9yIGEgbGlzdCBpdGVtLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYW5kIGVtaXRzIGEgY2xpY2sgZXZlbnQgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLlxuICAgKiBUaGlzIGV4dHJhY3RzIHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIGV2ZW50IGFuZCBwYXNzZXMgaXQgdG8gcGFyZW50IGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7TGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGNsaWNrIGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja0V2ZW50RW1pdChldmVudDogTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2hlcyB0aGUgbGlzdCBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgc291cmNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbCBkYXRhIGxvYWRpbmcgYW5kIHN1YnNlcXVlbnQgcmVmcmVzaCBvcGVyYXRpb25zLFxuICAgKiBpbmNsdWRpbmcgcHVsbC10by1yZWZyZXNoIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcuIEl0IG1hbmFnZXMgdGhlIGRhdGEgZmV0Y2hpbmcgcHJvY2VzcyxcbiAgICogdXBkYXRlcyB0aGUgY29tcG9uZW50J3Mgc3RhdGUsIGFuZCBoYW5kbGVzIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nIGxvZ2ljIGJhc2VkXG4gICAqIG9uIHRoZSBjb21wb25lbnQncyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAqIDEuIFNldHMgdGhlIHJlZnJlc2hpbmcgZmxhZyB0byBpbmRpY2F0ZSBhIGRhdGEgZmV0Y2ggaXMgaW4gcHJvZ3Jlc3NcbiAgICogMi4gQ2FsY3VsYXRlcyB0aGUgYXBwcm9wcmlhdGUgc3RhcnQgYW5kIGxpbWl0IHZhbHVlcyBiYXNlZCBvbiBwYWdpbmF0aW9uIHNldHRpbmdzXG4gICAqIDMuIEZldGNoZXMgZGF0YSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBzb3VyY2UgKG1vZGVsIG9yIHJlcXVlc3QpXG4gICAqIDQuIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGRhdGEgYW5kIGVtaXRzIGEgcmVmcmVzaCBldmVudFxuICAgKiA1LiBIYW5kbGVzIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nIHN0YXRlIHVwZGF0ZXNcbiAgICogNi4gQ29tcGxldGVzIGFueSBwcm92aWRlZCBldmVudCAobGlrZSBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KVxuICAgKlxuICAgKiBAcGFyYW0ge0luZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBSZWZyZXNoZXJDdXN0b21FdmVudCB8IGJvb2xlYW59IGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSByZWZyZXNoLFxuICAgKiBvciBhIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBmb3JjZWQgcmVmcmVzaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhIFNvdXJjZVxuICAgKiAgIHBhcnRpY2lwYW50IEUgYXMgRXZlbnQgU3lzdGVtXG4gICAqXG4gICAqICAgTC0+Pkw6IHJlZnJlc2goZXZlbnQpXG4gICAqICAgTC0+Pkw6IFNldCByZWZyZXNoaW5nIGZsYWdcbiAgICogICBMLT4+TDogQ2FsY3VsYXRlIHN0YXJ0IGFuZCBsaW1pdFxuICAgKiAgIGFsdCBVc2luZyBtb2RlbFxuICAgKiAgICAgTC0+PkQ6IGdldEZyb21Nb2RlbChmb3JjZSwgc3RhcnQsIGxpbWl0KVxuICAgKiAgICAgRC0tPj5MOiBSZXR1cm4gZGF0YVxuICAgKiAgIGVsc2UgVXNpbmcgcmVxdWVzdFxuICAgKiAgICAgTC0+PkQ6IGdldEZyb21SZXF1ZXN0KGZvcmNlLCBzdGFydCwgbGltaXQpXG4gICAqICAgICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgZW5kXG4gICAqICAgTC0+PkU6IHJlZnJlc2hFdmVudEVtaXQoKVxuICAgKiAgIGFsdCBJbmZpbml0ZSBzY3JvbGxpbmcgbW9kZVxuICAgKiAgICAgTC0+Pkw6IENoZWNrIGlmIHJlYWNoZWQgbGFzdCBwYWdlXG4gICAqICAgICBhbHQgTGFzdCBwYWdlIHJlYWNoZWRcbiAgICogICAgICAgTC0+Pkw6IENvbXBsZXRlIHNjcm9sbCBldmVudFxuICAgKiAgICAgICBMLT4+TDogRGlzYWJsZSBsb2FkTW9yZURhdGFcbiAgICogICAgIGVsc2UgTW9yZSBwYWdlcyBhdmFpbGFibGVcbiAgICogICAgICAgTC0+Pkw6IEluY3JlbWVudCBwYWdlIG51bWJlclxuICAgKiAgICAgICBMLT4+TDogQ29tcGxldGUgc2Nyb2xsIGV2ZW50IGFmdGVyIGRlbGF5XG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIFBhZ2luYXRlZCBtb2RlXG4gICAqICAgICBMLT4+TDogQ2xlYXIgcmVmcmVzaGluZyBmbGFnIGFmdGVyIGRlbGF5XG4gICAqICAgZW5kXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6QmFja0J1dHRvbk5hdmlnYXRpb25FbmRFdmVudCcsIFsnJGV2ZW50J10pXG4gIGFzeW5jIHJlZnJlc2goZXZlbnQ6IEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBSZWZyZXNoZXJDdXN0b21FdmVudCB8IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vICBpZih0eXBlb2YgZm9yY2UgIT09ICdib29sZWFuJyAmJiBmb3JjZS50eXBlID09PSBFdmVudENvbnN0YW50cy5CQUNLX0JVVFRPTl9OQVZJR0FUSU9OKSB7XG4gICAgLy8gICAgY29uc3Qge3JlZnJlc2h9ID0gKGZvcmNlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgLy8gICAgaWYoIXJlZnJlc2gpXG4gICAgLy8gICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gIH1cblxuICAgIHRoaXMucmVmcmVzaGluZyA9IHRydWU7XG4gICAgY29uc3Qgc3RhcnQ6IG51bWJlciA9IHRoaXMucGFnZSA+IDEgPyAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLmxpbWl0IDogdGhpcy5zdGFydDtcbiAgICBjb25zdCBsaW1pdDogbnVtYmVyID0gKHRoaXMucGFnZSAqICh0aGlzLmxpbWl0ID4gMTIgPyAxMiA6IHRoaXMubGltaXQpKTtcblxuICAgIHRoaXMuZGF0YSA9ICF0aGlzLm1vZGVsID9cbiAgICAgIGF3YWl0IHRoaXMuZ2V0RnJvbVJlcXVlc3QoISFldmVudCwgc3RhcnQsIGxpbWl0KVxuICAgICAgOiBhd2FpdCB0aGlzLmdldEZyb21Nb2RlbCghIWV2ZW50KSBhcyBLZXlWYWx1ZVtdO1xuXG4gICAgdGhpcy5yZWZyZXNoRXZlbnRFbWl0KCk7XG5cbiAgICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICAgIGlmKHRoaXMucGFnZSA9PT0gdGhpcy5wYWdlcykge1xuICAgICAgICBpZigoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCk/LnRhcmdldClcbiAgICAgICAgICAoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCkudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhZ2UgKz0gMTtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYoKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpPy50YXJnZXQgJiYgKGV2ZW50IGFzIEN1c3RvbUV2ZW50KT8udHlwZSAhPT0gRXZlbnRDb25zdGFudHMuQkFDS19CVVRUT05fTkFWSUdBVElPTilcbiAgICAgICAgICAgICAgKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpLnRhcmdldC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwYWdpbmF0aW9uIGV2ZW50cyBmcm9tIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC5cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBwYWdpbmF0aW9uIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgY3VycmVudCBwYWdlIG51bWJlciBhbmRcbiAqIHJlZnJlc2hpbmcgdGhlIGxpc3QgZGF0YSB0byBkaXNwbGF5IHRoZSBzZWxlY3RlZCBwYWdlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWRcbiAqIHdoZW4gYSB1c2VyIGludGVyYWN0cyB3aXRoIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzIHRvIG5hdmlnYXRlIGJldHdlZW4gcGFnZXMuXG4gKlxuICogQHBhcmFtIHtQYWdpbmF0aW9uQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2luYXRpb24gZXZlbnQgY29udGFpbmluZyBwYWdlIGluZm9ybWF0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5oYW5kbGVQYWdpbmF0ZShldmVudDogUGFnaW5hdGlvbkN1c3RvbUV2ZW50KTogdm9pZCB7XG4gIGNvbnN0IHsgcGFnZX0gPSBldmVudC5kYXRhO1xuICB0aGlzLnBhZ2UgPSBwYWdlO1xuICB0aGlzLnJlZnJlc2godHJ1ZSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcHVsbC10by1yZWZyZXNoIGV2ZW50cyBmcm9tIHRoZSByZWZyZXNoZXIgY29tcG9uZW50LlxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIHJlZnJlc2ggZXZlbnRzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwdWxsaW5nIGRvd24gb24gdGhlIGxpc3RcbiAqIG9yIGJ5IHByb2dyYW1tYXRpYyByZWZyZXNoIHJlcXVlc3RzLiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGxpc3QgZGF0YSBhbmRcbiAqIGNvbXBsZXRlcyB0aGUgcmVmcmVzaGVyIGFuaW1hdGlvbiB3aGVuIHRoZSBkYXRhIGlzIGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0ge0luZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBDdXN0b21FdmVudH0gW2V2ZW50XSAtIFRoZSByZWZyZXNoIGV2ZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBoYW5kbGVSZWZyZXNoKGV2ZW50PzogSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IEN1c3RvbUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHRoaXMucmVmcmVzaChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHx8IHRydWUpO1xuICBpZihldmVudCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gQW55IGNhbGxzIHRvIGxvYWQgZGF0YSBnbyBoZXJlXG4gICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJb25SZWZyZXNoZXJFbGVtZW50KS5jb21wbGV0ZSgpO1xuICAgIH0sIDQwMCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZpbHRlcnMgZGF0YSBiYXNlZCBvbiBhIHNlYXJjaCBzdHJpbmcuXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgZGF0YSBhcnJheSB0byBmaW5kIGl0ZW1zIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkXG4gKiBzZWFyY2ggc3RyaW5nLiBUaGlzIHVzZXMgdGhlIGFycmF5UXVlcnlCeVN0cmluZyB1dGlsaXR5IHRvIHBlcmZvcm0gdGhlIGZpbHRlcmluZ1xuICogYWNyb3NzIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlW119IHJlc3VsdHMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gc2VhcmNoIHRocm91Z2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2ggLSBUaGUgc2VhcmNoIHN0cmluZyB0byBmaWx0ZXIgYnlcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmlsdGVyZWQgYXJyYXkgb2YgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG4gIHBhcnNlU2VhcmNoUmVzdWx0cyhyZXN1bHRzOiBLZXlWYWx1ZVtdLCBzZWFyY2g6IHN0cmluZyk6IEtleVZhbHVlW10ge1xuICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigoaXRlbTogS2V5VmFsdWUpID0+XG4gICAgICBPYmplY3QudmFsdWVzKGl0ZW0pLnNvbWUodmFsdWUgPT5cbiAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoKHNlYXJjaCBhcyBzdHJpbmcpPy50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGRhdGEgZnJvbSBhIHJlcXVlc3Qgc291cmNlLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBzb3VyY2UgZnVuY3Rpb24gb3IgVVJMLCBwcm9jZXNzZXMgaXQsXG4gKiBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBzdGF0ZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWwgZGF0YSBsb2FkaW5nXG4gKiBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMgd2hlbiB1c2luZyBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZSByYXRoZXIgdGhhbiBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBXaGV0aGVyIHRvIGZvcmNlIGEgcmVmcmVzaCBldmVuIGlmIGRhdGEgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBzdGFydGluZyBpbmRleCBmb3IgcGFnaW5hdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlWYWx1ZVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZldGNoZWQgZGF0YVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGdldEZyb21SZXF1ZXN0KGZvcmNlOiBib29sZWFuID0gZmFsc2UsIHN0YXJ0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgbGV0IHJlcXVlc3Q6IEtleVZhbHVlW10gPSBbXTtcbiAgaWYoIXRoaXMuZGF0YT8ubGVuZ3RoIHx8IGZvcmNlIHx8ICh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCB8fCAhISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICAvLyAoc2VsZi5kYXRhIGFzIExpc3RJdGVtW10pID0gW107XG4gICAgaWYoISh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCAmJiAhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgICAgaWYoIXRoaXMuc291cmNlICYmICF0aGlzLmRhdGE/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdObyBkYXRhIGFuZCBzb3VyY2UgcGFzc2VkIHRvIGluZmluaXRlIGxpc3QnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBpZih0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5zb3VyY2UoKTtcblxuICAgICAgaWYoIUFycmF5LmlzQXJyYXkocmVxdWVzdCkpXG4gICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0Py5bJ3Jlc3BvbnNlJ10/LlsnZGF0YSddIHx8IHJlcXVlc3Q/LlsncmVzdWx0cyddIHx8IFtdO1xuICAgICAgdGhpcy5kYXRhID0gWy4uLiBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KHJlcXVlc3QpXTtcbiAgICAgIGlmKHRoaXMuZGF0YT8ubGVuZ3RoKVxuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFID9cbiAgICAgICAgICAodGhpcy5pdGVtcyB8fCBbXSkuY29uY2F0KFsuLi50aGlzLmRhdGEuc2xpY2Uoc3RhcnQsIGxpbWl0KV0pIDogWy4uLnJlcXVlc3Quc2xpY2Uoc3RhcnQsIGxpbWl0KSBhcyBLZXlWYWx1ZVtdXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5wYXJzZVNlYXJjaFJlc3VsdHModGhpcy5kYXRhIGFzIFtdLCB0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk7XG4gICAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIGlmKHRoaXMubG9hZE1vcmVEYXRhICYmIHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5QQUdJTkFURUQpXG4gICAgdGhpcy5nZXRNb3JlRGF0YSh0aGlzLmRhdGE/Lmxlbmd0aCB8fCAwKTtcbiAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXSBhcyBLZXlWYWx1ZVtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGRhdGEgZnJvbSBhIG1vZGVsIHNvdXJjZS5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgbW9kZWwgdXNpbmcgaXRzIHBhZ2luYXRpb24gb3IgZmluZCBtZXRob2RzLFxuICogcHJvY2Vzc2VzIGl0LCBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBzdGF0ZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWxcbiAqIGRhdGEgbG9hZGluZyBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMgd2hlbiB1c2luZyBhIG1vZGVsIGFzIHRoZSBkYXRhIHNvdXJjZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gV2hldGhlciB0byBmb3JjZSBhIHJlZnJlc2ggZXZlbiBpZiBkYXRhIGFscmVhZHkgZXhpc3RzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIHBhZ2luYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXRyaWV2ZVxuICogQHJldHVybnMge1Byb21pc2U8S2V5VmFsdWVbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmZXRjaGVkIGRhdGFcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBnZXRGcm9tTW9kZWwoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBsZXQgZGF0YSA9IFsgLi4uIHRoaXMuZGF0YSB8fCBbXV07XG4gIGxldCByZXF1ZXN0OiBLZXlWYWx1ZVtdID0gW107XG5cbiAgLy8gZ2V0dGluZyBtb2RlbCByZXBvc2l0b3J5XG4gIGlmKCF0aGlzLl9yZXBvc2l0b3J5KVxuICAgIHRoaXMuX3JlcG9zaXRvcnkgPSB0aGlzLnJlcG9zaXRvcnk7XG4gIGNvbnN0IHJlcG8gPSB0aGlzLl9yZXBvc2l0b3J5IGFzIERlY2FmUmVwb3NpdG9yeTxNb2RlbD47XG4gIGlmKCF0aGlzLmRhdGE/Lmxlbmd0aCB8fCBmb3JjZSB8fCAodGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcpPy5sZW5ndGggfHwgISEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgdHJ5IHtcbiAgICAgaWYoISh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCAmJiAhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgICAgICAodGhpcy5kYXRhIGFzIEtleVZhbHVlW10pID0gW107XG4gICAgICAgIC8vIGNvbnN0IHJhd1F1ZXJ5ID0gdGhpcy5wYXJzZVF1ZXJ5KHNlbGYubW9kZWwgYXMgUmVwb3NpdG9yeTxNb2RlbD4sIHN0YXJ0LCBsaW1pdCk7XG4gICAgICAgIC8vIHJlcXVlc3QgPSB0aGlzLnBhcnNlUmVzdWx0KGF3YWl0ICh0aGlzLm1vZGVsIGFzIGFueSk/LnBhZ2luYXRlKHN0YXJ0LCBsaW1pdCkpO1xuICAgICAgICAgIGlmKCF0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IgPSBhd2FpdCByZXBvXG4gICAgICAgICAgICAgIC5zZWxlY3QoKVxuICAgICAgICAgICAgICAub3JkZXJCeShbdGhpcy5wayBhcyBrZXlvZiBNb2RlbCwgdGhpcy5zb3J0RGlyZWN0aW9uXSlcbiAgICAgICAgICAgICAgLnBhZ2luYXRlKHRoaXMubGltaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdCh0aGlzLnBhZ2luYXRvcik7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmKCF0aGlzLmluZGV4ZXMpXG4gICAgICAgICAgdGhpcy5pbmRleGVzID0gKE9iamVjdC52YWx1ZXModGhpcy5tYXBwZXIpIHx8IFt0aGlzLnBrXSk7XG5cbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5wYXJzZUNvbmRpdGlvbnModGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnkpO1xuICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdChhd2FpdCByZXBvLnF1ZXJ5KGNvbmRpdGlvbiwgKHRoaXMuc29ydEJ5IHx8IHRoaXMucGspIGFzIGtleW9mIE1vZGVsLCB0aGlzLnNvcnREaXJlY3Rpb24pKTtcbiAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgfVxuICAgICAgZGF0YSA9IHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSA/IFsuLi4gKGRhdGEpLmNvbmNhdChyZXF1ZXN0KV0gOiBbLi4ucmVxdWVzdF07XG4gICAgfSBjYXRjaChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBgVW5hYmxlIHRvIGZpbmQgJHt0aGlzLm1vZGVsfSBvbiByZWdpc3RyeS4gUmV0dXJuIGVtcHR5IGFycmF5IGZyb20gY29tcG9uZW50YCk7XG4gICAgfVxuICB9XG5cbiAgaWYoZGF0YT8ubGVuZ3RoKSB7XG4gICAgaWYodGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgdGhpcy5pdGVtcyA9IFsuLi5kYXRhXTtcbiAgICAgIGlmKHRoaXMuaXRlbXM/Lmxlbmd0aCA8PSB0aGlzLmxpbWl0KVxuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLml0ZW1zID0gWy4uLmRhdGFdO1xuICAgIH1cbiAgfVxuICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuUEFHSU5BVEVEICYmIHRoaXMucGFnaW5hdG9yKVxuICAgICAgdGhpcy5nZXRNb3JlRGF0YSh0aGlzLnBhZ2luYXRvci50b3RhbCk7XG4gIHJldHVybiBkYXRhIHx8IFtdIGFzIEtleVZhbHVlW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHNlYXJjaCB2YWx1ZXMgb3IgZmlsdGVyIHF1ZXJpZXMgaW50byBkYXRhYmFzZSBjb25kaXRpb25zLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyBzZWFyY2ggaW5wdXQgb3IgY29tcGxleCBmaWx0ZXIgcXVlcmllcyBpbnRvIENvbmRpdGlvbiBvYmplY3RzXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBkYXRhYmFzZSBxdWVyeWluZy4gSGFuZGxlcyBib3RoIHNpbXBsZSBzdHJpbmcvbnVtYmVyIHNlYXJjaGVzXG4gKiBhY3Jvc3MgaW5kZXhlZCBmaWVsZHMgYW5kIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXMgd2l0aCBtdWx0aXBsZSBjcml0ZXJpYS5cbiAqXG4gKiBGb3Igc2ltcGxlIHNlYXJjaGVzIChzdHJpbmcvbnVtYmVyKTpcbiAqIC0gQ3JlYXRlcyBjb25kaXRpb25zIHRoYXQgc2VhcmNoIGFjcm9zcyBhbGwgaW5kZXhlZCBmaWVsZHNcbiAqIC0gVXNlcyBlcXVhbGl0eSBmb3IgbnVtZXJpYyB2YWx1ZXMgYW5kIHJlZ2V4IGZvciBzdHJpbmcgdmFsdWVzXG4gKiAtIENvbWJpbmVzIGNvbmRpdGlvbnMgd2l0aCBPUiBsb2dpYyB0byBzZWFyY2ggbXVsdGlwbGUgZmllbGRzXG4gKlxuICogRm9yIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXM6XG4gKiAtIFByb2Nlc3NlcyBlYWNoIGZpbHRlciBpdGVtIHdpdGggaXRzIHNwZWNpZmljIGNvbmRpdGlvbiB0eXBlXG4gKiAtIFN1cHBvcnRzIEVxdWFsLCBOb3QgRXF1YWwsIENvbnRhaW5zLCBOb3QgQ29udGFpbnMsIEdyZWF0ZXIgVGhhbiwgTGVzcyBUaGFuXG4gKiAtIFVwZGF0ZXMgc29ydCBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBmaWx0ZXIgcXVlcnlcbiAqIC0gQ29tYmluZXMgbXVsdGlwbGUgZmlsdGVyIGNvbmRpdGlvbnMgd2l0aCBPUiBsb2dpY1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5fSB2YWx1ZSAtIFRoZSBzZWFyY2ggdmFsdWUgb3IgZmlsdGVyIHF1ZXJ5IG9iamVjdFxuICogQHJldHVybnMge0NvbmRpdGlvbjxNb2RlbD59IEEgQ29uZGl0aW9uIG9iamVjdCBmb3IgZGF0YWJhc2UgcXVlcnlpbmdcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbnBhcnNlQ29uZGl0aW9ucyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5KTogQ29uZGl0aW9uPE1vZGVsPiB7XG4gIGxldCBfY29uZGl0aW9uOiBDb25kaXRpb248TW9kZWw+O1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFByaW1pdGl2ZXMuU1RSSU5HIHx8IHR5cGVvZiB2YWx1ZSA9PT0gUHJpbWl0aXZlcy5OVU1CRVIpIHtcbiAgICBfY29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4odGhpcy5wayBhcyBrZXlvZiBNb2RlbCkuZXEoIWlzTmFOKHZhbHVlIGFzIG51bWJlcikgPyBOdW1iZXIodmFsdWUpIDogdmFsdWUpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIGlmKGluZGV4ID09PSB0aGlzLnBrKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgb3JDb25kaXRpb247XG4gICAgICAgIGlmKCFpc05hTih2YWx1ZSBhcyBudW1iZXIpKSB7XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZXEoTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgX2NvbmRpdGlvbiA9IF9jb25kaXRpb24ub3Iob3JDb25kaXRpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7cXVlcnksIHNvcnR9ID0gdmFsdWUgYXMgSUZpbHRlclF1ZXJ5O1xuICAgIF9jb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPih0aGlzLnBrIGFzIGtleW9mIE1vZGVsKS5kaWYoJ251bGwnKTtcblxuICAgIGlmKHF1ZXJ5Py5sZW5ndGgpXG4gICAgICBfY29uZGl0aW9uID0gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgQ29uZGl0aW9uPE1vZGVsPjtcblxuICAgIChxdWVyeSB8fCBbXSkuZm9yRWFjaCgoaXRlbTogSUZpbHRlclF1ZXJ5SXRlbSkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBjb25kaXRpb24sIGluZGV4fSA9IGl0ZW07XG4gICAgICBsZXQgdmFsID0gdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYoaW5kZXggPT09IHRoaXMucGsgfHwgIWlzTmFOKHZhbCBhcyBudW1iZXIpKVxuICAgICAgICB2YWwgPSBOdW1iZXIodmFsKTtcbiAgICAgIGxldCBvckNvbmRpdGlvbjtcbiAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJFcXVhbFwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmVxKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJOb3QgRXF1YWxcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5kaWYodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk5vdCBDb250YWluc1wiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gIUNvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAobmV3IFJlZ0V4cChgXig/IS4qJHt2YWx9KS4qJGApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNvbnRhaW5zXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKHZhbCBhcyBzdHJpbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiR3JlYXRlciBUaGFuXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZ3RlKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMZXNzIFRoYW5cIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5sdGUodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIF9jb25kaXRpb24gPSAoIV9jb25kaXRpb24gP1xuICAgICAgICBvckNvbmRpdGlvbiA6IF9jb25kaXRpb24uYW5kKG9yQ29uZGl0aW9uIGFzIHVua25vd24gYXMgQ29uZGl0aW9uPE1vZGVsPikpIGFzIENvbmRpdGlvbjxNb2RlbD47XG4gICAgfSk7XG5cbiAgICB0aGlzLnNvcnRCeSA9IHNvcnQ/LnZhbHVlIGFzIGtleW9mIE1vZGVsIHx8IHRoaXMucGs7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gc29ydD8uZGlyZWN0aW9uIHx8IHRoaXMuc29ydERpcmVjdGlvbjtcbiAgfVxuICByZXR1cm4gX2NvbmRpdGlvbiBhcyBDb25kaXRpb248TW9kZWw+O1xuXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBxdWVyeSByZXN1bHRzIGludG8gYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LlxuICogQHN1bW1hcnkgSGFuZGxlcyBkaWZmZXJlbnQgcmVzdWx0IGZvcm1hdHMgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcywgZXh0cmFjdGluZ1xuICogcGFnaW5hdGlvbiBpbmZvcm1hdGlvbiB3aGVuIGF2YWlsYWJsZSBhbmQgYXBwbHlpbmcgYW55IGNvbmZpZ3VyZWQgZGF0YSBtYXBwaW5nLlxuICogVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgc291cmNlLlxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXSB8IFBhZ2luYXRvcn0gcmVzdWx0IC0gVGhlIHJhdyBxdWVyeSByZXN1bHRcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBUaGUgcHJvY2Vzc2VkIGFycmF5IG9mIGl0ZW1zXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzdWx0KHJlc3VsdDogS2V5VmFsdWVbXSB8IFBhZ2luYXRvcjxNb2RlbD4pOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgaWYoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiAoJ3BhZ2UnIGluIHJlc3VsdCAmJiAndG90YWwnIGluIHJlc3VsdCkpIHtcbiAgICBjb25zdCBwYWdpbmF0b3IgPSByZXN1bHQgYXMgUGFnaW5hdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UodGhpcy5wYWdlKTtcbiAgICAgIC8vIFRPRE86IENoYWdlIGZvciByZXN1bHQudG90YWw7XG4gICAgICB0aGlzLmdldE1vcmVEYXRhKHBhZ2luYXRvci50b3RhbCk7XG4gICAgfSBjYXRjaChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbygoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8ICdVbmFibGUgdG8gZ2V0IHBhZ2UgZnJvbSBwYWdpbmF0b3IuIFJldHVybiBlbXB0eSBhcnJheSBmcm9tIGNvbXBvbmVudCcpO1xuICAgICAgcmVzdWx0ID0gW107XG4gICAgfVxuXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5nZXRNb3JlRGF0YSgocmVzdWx0IGFzIEtleVZhbHVlW10pPy5sZW5ndGggfHwgMCk7XG4gIH1cbiAgcmV0dXJuIChPYmplY3Qua2V5cyh0aGlzLm1hcHBlciB8fCB7fSkubGVuZ3RoKSA/XG4gICAgdGhpcy5tYXBSZXN1bHRzKHJlc3VsdCkgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgcGFnaW5hdGlvbiBzdGF0ZSBiYXNlZCBvbiBkYXRhIGxlbmd0aC5cbiAqIEBzdW1tYXJ5IENhbGN1bGF0ZXMgd2hldGhlciBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBob3cgbWFueSBwYWdlcyBleGlzdFxuICogYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBhbmQgdGhlIGNvbmZpZ3VyZWQgbGltaXQgcGVyIHBhZ2UuXG4gKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gY29udHJvbCBwYWdpbmF0aW9uIFVJIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcgYmVoYXZpb3IuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5nZXRNb3JlRGF0YShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICBpZih0aGlzLnBhZ2luYXRvcilcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCAqIHRoaXMubGltaXQ7XG4gICAgaWYobGVuZ3RoIDw9IHRoaXMubGltaXQpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZXMgPSBNYXRoLmZsb29yKGxlbmd0aCAvIHRoaXMubGltaXQpO1xuICAgICAgaWYoKHRoaXMucGFnZXMgKiB0aGlzLmxpbWl0KSA8IGxlbmd0aClcbiAgICAgICAgdGhpcy5wYWdlcyArPSAxO1xuICAgICAgaWYodGhpcy5wYWdlcyA9PT0gMSlcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wYWdlcyA9IGxlbmd0aDtcbiAgICBpZih0aGlzLnBhZ2VzID09PSAxKVxuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIGEgc2luZ2xlIGl0ZW0gdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWFwcGVyLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyBhIGRhdGEgaXRlbSBhY2NvcmRpbmcgdG8gdGhlIG1hcHBpbmcgY29uZmlndXJhdGlvbixcbiAqIGV4dHJhY3RpbmcgbmVzdGVkIHByb3BlcnRpZXMgYW5kIGZvcm1hdHRpbmcgdmFsdWVzIGFzIG5lZWRlZC4gVGhpcyBhbGxvd3NcbiAqIHRoZSBjb21wb25lbnQgdG8gZGlzcGxheSBkYXRhIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIGhvdyBpdCdzIHN0b3JlZC5cbiAqXG4gKiBAcHJvdGVjdGVkXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBpdGVtIC0gVGhlIGl0ZW0gdG8gbWFwXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBtYXBwZXIgLSBUaGUgbWFwcGluZyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBbcHJvcHNdIC0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGluY2x1ZGVcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZX0gVGhlIG1hcHBlZCBpdGVtXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGl0ZW1NYXBwZXIoaXRlbTogS2V5VmFsdWUsIG1hcHBlcjogS2V5VmFsdWUsIHByb3BzPzogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjdW06IEtleVZhbHVlLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBhcnJheVZhbHVlID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcnJheVZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB2YWx1ZSA9IGl0ZW0/Llt2YWx1ZV0gPyBpdGVtW3ZhbHVlXSA6IHZhbHVlICE9PSBrZXkgPyB2YWx1ZSA6IFwiXCI7XG4gICAgICAgIGlmKGlzVmFsaWREYXRlKHZhbHVlKSlcbiAgICAgICAgICB2YWx1ZSA9IGAke2Zvcm1hdERhdGUodmFsdWUpfWA7XG4gICAgICAgIGFjY3VtW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWw7XG5cbiAgICAgICAgZm9yIChjb25zdCBfdmFsdWUgb2YgYXJyYXlWYWx1ZSlcbiAgICAgICAgICB2YWwgPSAhdmFsXG4gICAgICAgICAgICA/IGl0ZW1bX3ZhbHVlXVxuICAgICAgICAgICAgOiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHZhbCkgOiB2YWwpW192YWx1ZV07XG5cblxuICAgICAgICBpZiAoaXNWYWxpZERhdGUobmV3IERhdGUodmFsKSkpXG4gICAgICAgICAgdmFsID0gYCR7Zm9ybWF0RGF0ZSh2YWwpfWA7XG5cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIGFjY3VtKTtcbiAgfSwge30pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIGFsbCByZXN1bHQgaXRlbXMgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWFwcGVyLlxuICogQHN1bW1hcnkgQXBwbGllcyB0aGUgaXRlbU1hcHBlciB0byBlYWNoIGl0ZW0gaW4gdGhlIHJlc3VsdCBzZXQsIGFkZGluZ1xuICogY29tbW9uIHByb3BlcnRpZXMgbGlrZSBvcGVyYXRpb25zIGFuZCByb3V0ZSBpbmZvcm1hdGlvbi4gVGhpcyB0cmFuc2Zvcm1zXG4gKiB0aGUgcmF3IGRhdGEgaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBsaXN0IGl0ZW0gY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlW119IGRhdGEgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gbWFwXG4gKiBAcmV0dXJucyB7S2V5VmFsdWVbXX0gVGhlIGFycmF5IG9mIG1hcHBlZCBpdGVtc1xuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbiAgbWFwUmVzdWx0cyhkYXRhOiBLZXlWYWx1ZVtdKTogS2V5VmFsdWVbXSB7XG4gICAgaWYoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIC8vIHBhc3NpbmcgdWlkIGFzIHByb3AgdG8gbWFwcGVyXG4gICAgdGhpcy5tYXBwZXIgPSB7Li4uIHRoaXMubWFwcGVyLCAuLi4ge3VpZDogdGhpcy5wa319O1xuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBvcGVyYXRpb25zOiB0aGlzLm9wZXJhdGlvbnMsXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZSxcbiAgICAgIC4uLiAgT2JqZWN0LmtleXModGhpcy5pdGVtKS5yZWR1Y2UoKGFjYzogS2V5VmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gdGhpcy5pdGVtW2tleV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSksXG4gICAgICAvLyAuLi4gKCF0aGlzLml0ZW0ucmVuZGVyID8ge30gOiAgT2JqZWN0LmtleXModGhpcy5pdGVtKS5yZWR1Y2UoKGFjYzogS2V5VmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAvLyAgIGFjY1trZXldID0gdGhpcy5pdGVtW2tleSBhcyBrZXlvZiBJTGlzdEl0ZW1Qcm9wXTtcbiAgICAgIC8vICAgcmV0dXJuIGFjYztcbiAgICAgIC8vIH0sIHt9KSlcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZVtdLCBjdXJyKSA9PiB7XG4gICAgICAgIGFjY3VtLnB1c2goey4uLiB0aGlzLml0ZW1NYXBwZXIoY3VyciwgdGhpcy5tYXBwZXIgYXMgS2V5VmFsdWUsIHByb3BzKSwgLi4uIHtwazogdGhpcy5wa319KTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxufVxuXG4iLCJcbkBpZihzaG93UmVmcmVzaGVyKSB7XG4gIDxpb24tcmVmcmVzaGVyIHNsb3Q9XCJmaXhlZFwiIFtwdWxsRmFjdG9yXT1cIjFcIiBbcHVsbE1pbl09XCIxMDBcIiBbcHVsbE1heF09XCIyMDBcIiAoaW9uUmVmcmVzaCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAgICA8aW9uLXJlZnJlc2hlci1jb250ZW50IC8+XG4gIDwvaW9uLXJlZnJlc2hlcj5cbn1cblxuQGlmKHNob3dTZWFyY2hiYXIgJiYgZGF0YT8ubGVuZ3RoKSB7XG4gIEBpZihtb2RlbCAmJiBlbmFibGVGaWx0ZXIpIHtcbiAgICA8bmd4LWRlY2FmLWZpbHRlclxuICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgIFtzb3J0RGlyZWN0aW9uXT1cInNvcnREaXJlY3Rpb25cIlxuICAgICAgW2Rpc2FibGVTb3J0XT1cImRpc2FibGVTb3J0XCJcbiAgICAgIChmaWx0ZXJFdmVudCk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXG4gICAgICAoc2VhcmNoRXZlbnQpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIlxuICAgIC8+XG4gIH0gQGVsc2Uge1xuICAgIDxuZ3gtZGVjYWYtc2VhcmNoYmFyIFtlbWl0RXZlbnRUb1dpbmRvd109XCJmYWxzZVwiIFtkZWJvdW5jZV09XCI1MDBcIiAoc2VhcmNoRXZlbnQpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIiAvPlxuICB9XG59XG5cbkBpZihkYXRhPy5sZW5ndGgpIHtcbiAgPGlvbi1saXN0IFtpZF09XCJ1aWRcIiBbaW5zZXRdPVwiaW5zZXRcIiBbbGluZXNdPVwibGluZXNcIiAjY29tcG9uZW50PlxuICAgIEBpZihpdGVtPy50YWcpIHtcbiAgICAgIEBmb3IoY2hpbGQgb2YgaXRlbXM7IHRyYWNrIHRyYWNrSXRlbUZuKCRpbmRleCwgY2hpbGQpKSB7XG4gICAgICAgIDxuZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyXG4gICAgICAgICAgW3RhZ109XCJpdGVtLnRhZ1wiXG4gICAgICAgICAgKGxpc3RlbkV2ZW50KT1cImhhbmRsZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgIFtnbG9iYWxzXT0ne1xuICAgICAgICAgICAgaXRlbTogY2hpbGQsXG4gICAgICAgICAgICBtYXBwZXI6IG1hcHBlcixcbiAgICAgICAgICAgIHJvdXRlOiByb3V0ZVxuICAgICAgICAgIH0nPlxuICAgICAgICAgIDwvbmd4LWRlY2FmLWNvbXBvbmVudC1yZW5kZXJlcj5cbiAgICAgICAgfVxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgPC9pb24tbGlzdD5cblxuICBAaWYobG9hZE1vcmVEYXRhKSB7XG4gICAgQGlmKHBhZ2VzID4gMCAmJiB0eXBlID09PSAncGFnaW5hdGVkJyAmJiAhc2VhcmNoVmFsdWU/Lmxlbmd0aCkge1xuICAgICAgPG5neC1kZWNhZi1wYWdpbmF0aW9uXG4gICAgICAgIFt0b3RhbFBhZ2VzXT1cInBhZ2VzXCJcbiAgICAgICAgW2N1cnJlbnRdPVwicGFnZVwiXG4gICAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZVBhZ2luYXRlKCRldmVudClcIlxuICAgICAgLz5cblxuICAgIH0gQGVsc2Uge1xuICAgICAgPGlvbi1pbmZpbml0ZS1zY3JvbGxcbiAgICAgICAgW2NsYXNzXT1cInNlYXJjaFZhbHVlPy5sZW5ndGggPyAnZGNmLWhpZGRlbicgOiAnJ1wiXG5cbiAgICAgICAgW3Bvc2l0aW9uXT1cInNjcm9sbFBvc2l0aW9uXCJcbiAgICAgICAgW3RocmVzaG9sZF09XCJzY3JvbGxUaHJlc2hvbGRcIlxuICAgICAgICAoaW9uSW5maW5pdGUpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgICAgIDxpb24taW5maW5pdGUtc2Nyb2xsLWNvbnRlbnQgW2xvYWRpbmdTcGlubmVyXT1cImxvYWRpbmdTcGlubmVyXCIgW2xvYWRpbmdUZXh0XT1cImxvYWRpbmdUZXh0XCIgLz5cbiAgICAgIDwvaW9uLWluZmluaXRlLXNjcm9sbD5cbiAgICB9XG4gIH1cbn0gQGVsc2Uge1xuICBAaWYocmVmcmVzaGluZykge1xuICAgIEBmb3Ioc2tsIG9mIHNrZWxldG9uRGF0YTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxpb24tdGh1bWJuYWlsIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgIDwvaW9uLXRodW1ibmFpbD5cbiAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImRhdGVcIiBzdHlsZT1cIndpZHRoOiAyMCU7XCI+PGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD48L2lvbi10ZXh0PlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgfVxuXG4gIH0gQGVsc2Uge1xuICAgIEBpZighc2VhcmNoVmFsdWU/Lmxlbmd0aCkge1xuICAgICAgPG5neC1kZWNhZi1lbXB0eS1zdGF0ZVxuICAgICAgICBbdGl0bGVdPVwiKGxvY2FsZSArICcuJysgZW1wdHkudGl0bGUpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIihsb2NhbGUgKyAnLicrIGVtcHR5LnN1YnRpdGxlKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtidXR0b25UZXh0XT1cImVtcHR5LnNob3dCdXR0b24gPyAobG9jYWxlICsgJy4nKyBlbXB0eS5idXR0b24gfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbYnV0dG9uTGlua109XCJlbXB0eS5zaG93QnV0dG9uID8gZW1wdHkucm91dGUgOiAnJ1wiXG4gICAgICAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5neC1kZWNhZi1lbXB0eS1zdGF0ZVxuICAgICAgICBpY29uPVwic2VhcmNoLW91dGxpbmVcIlxuICAgICAgICBuZ0NsYXNzPVwiZW1wdHktc2VhcmNoXCJcbiAgICAgICAgW3RyYW5zbGF0YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgdGl0bGU9XCJzZWFyY2gudGl0bGVcIlxuICAgICAgICBzdWJ0aXRsZT1cInNlYXJjaC5zdWJ0aXRsZVwiXG4gICAgICAgIFtzZWFyY2hWYWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAvPlxuICAgIH1cbiAgfVxufVxuXG4iXX0=
1238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBWSxjQUFjLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBRUwsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFLbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxD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QThHTixZQUFZO3NCQURYLE1BQU07Z0JBWVAsVUFBVTtzQkFEVCxNQUFNO2dCQWlSUCxXQUFXO3NCQURWLFlBQVk7dUJBQUMsMkJBQTJCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBOEIvQyxZQUFZO3NCQURqQixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXNJM0MsT0FBTztzQkFEWixZQUFZO3VCQUFDLHFDQUFxQyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3kgIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50LCBSZWZyZXNoZXJDdXN0b21FdmVudCwgU3Bpbm5lclR5cGVzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtcbiAgSW9uSW5maW5pdGVTY3JvbGwsXG4gIElvbkluZmluaXRlU2Nyb2xsQ29udGVudCxcbiAgSW9uSXRlbSxcbiAgSW9uTGFiZWwsXG4gIElvbkxpc3QsXG4gIElvblJlZnJlc2hlcixcbiAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgSW9uU2tlbGV0b25UZXh0LFxuICBJb25UZXh0LFxuICBJb25UaHVtYm5haWwsXG4gIElvbkxvYWRpbmdcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBNb2RlbCwgUHJpbWl0aXZlcyB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9ic2VydmVyLCBPcmRlckRpcmVjdGlvbiwgUGFnaW5hdG9yIH0gZnJvbSAnQGRlY2FmLXRzL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZUN1c3RvbUV2ZW50LFxuICBEeW5hbWljLFxuICBFdmVudENvbnN0YW50cyxcbiAgQ29tcG9uZW50c1RhZ05hbWVzLFxuICBSZW5kZXJlckN1c3RvbUV2ZW50LFxuICBTdHJpbmdPckJvb2xlYW4sXG4gIEtleVZhbHVlLFxuICBMaXN0SXRlbUN1c3RvbUV2ZW50XG59IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBOZ3hCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL05neEJhc2VDb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgc3RyaW5nVG9Cb29sZWFuLFxuICBmb3JtYXREYXRlLFxuICBpc1ZhbGlkRGF0ZVxufSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IFNlYXJjaGJhckNvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJhci9zZWFyY2hiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9saXN0LWl0ZW0vbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25DdXN0b21FdmVudCB9IGZyb20gJy4uL3BhZ2luYXRpb24vY29uc3RhbnRzJztcbmltcG9ydCB7IEZ1bmN0aW9uTGlrZSwgSUZpbHRlclF1ZXJ5LCBJRmlsdGVyUXVlcnlJdGVtLCBEZWNhZlJlcG9zaXRvcnksIElMaXN0RW1wdHlSZXN1bHQsIExpc3RDb21wb25lbnRzVHlwZXMgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgRmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsdGVyL2ZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHZlcnNhdGlsZSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHZhcmlvdXMgZGF0YSBkaXNwbGF5IG1vZGVzLlxuICogQHN1bW1hcnkgVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBmbGV4aWJsZSB3YXkgdG8gZGlzcGxheSBsaXN0cyBvZiBkYXRhIHdpdGggc3VwcG9ydFxuICogZm9yIGluZmluaXRlIHNjcm9sbGluZywgcGFnaW5hdGlvbiwgc2VhcmNoaW5nLCBhbmQgY3VzdG9tIGl0ZW0gcmVuZGVyaW5nLiBJdCBjYW4gZmV0Y2hcbiAqIGRhdGEgZnJvbSB2YXJpb3VzIHNvdXJjZXMgaW5jbHVkaW5nIG1vZGVscywgZnVuY3Rpb25zLCBvciBkaXJlY3QgZGF0YSBpbnB1dC5cbiAqXG4gKiBUaGUgY29tcG9uZW50IHN1cHBvcnRzIHR3byBtYWluIGRpc3BsYXkgdHlwZXM6XG4gKiAxLiBJbmZpbml0ZSBzY3JvbGxpbmcgLSBMb2FkcyBtb3JlIGRhdGEgYXMgdGhlIHVzZXIgc2Nyb2xsc1xuICogMi4gUGFnaW5hdGlvbiAtIERpc3BsYXlzIGRhdGEgaW4gcGFnZXMgd2l0aCBuYXZpZ2F0aW9uIGNvbnRyb2xzXG4gKlxuICogQWRkaXRpb25hbCBmZWF0dXJlcyBpbmNsdWRlOlxuICogLSBQdWxsLXRvLXJlZnJlc2ggZnVuY3Rpb25hbGl0eVxuICogLSBTZWFyY2ggZmlsdGVyaW5nXG4gKiAtIEVtcHR5IHN0YXRlIGN1c3RvbWl6YXRpb25cbiAqIC0gQ3VzdG9tIGl0ZW0gcmVuZGVyaW5nXG4gKiAtIEV2ZW50IGVtaXNzaW9uIGZvciBpbnRlcmFjdGlvbnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhIFNvdXJjZVxuICogICBwYXJ0aWNpcGFudCBFIGFzIEV4dGVybmFsIENvbXBvbmVudHNcbiAqXG4gKiAgIFUtPj5MOiBJbml0aWFsaXplIGNvbXBvbmVudFxuICogICBMLT4+TDogbmdPbkluaXQoKVxuICogICBMLT4+RDogUmVxdWVzdCBpbml0aWFsIGRhdGFcbiAqICAgRC0tPj5MOiBSZXR1cm4gZGF0YVxuICogICBMLT4+TDogUHJvY2VzcyBhbmQgZGlzcGxheSBkYXRhXG4gKlxuICogICBhbHQgVXNlciBzY3JvbGxzIChJbmZpbml0ZSBtb2RlKVxuICogICAgIFUtPj5MOiBTY3JvbGwgdG8gYm90dG9tXG4gKiAgICAgTC0+PkQ6IFJlcXVlc3QgbW9yZSBkYXRhXG4gKiAgICAgRC0tPj5MOiBSZXR1cm4gYWRkaXRpb25hbCBkYXRhXG4gKiAgICAgTC0+Pkw6IEFwcGVuZCB0byBleGlzdGluZyBkYXRhXG4gKiAgIGVsc2UgVXNlciBjaGFuZ2VzIHBhZ2UgKFBhZ2luYXRlZCBtb2RlKVxuICogICAgIFUtPj5MOiBDbGljayBwYWdlIG51bWJlclxuICogICAgIEwtPj5MOiBoYW5kbGVQYWdpbmF0ZSgpXG4gKiAgICAgTC0+PkQ6IFJlcXVlc3QgZGF0YSBmb3IgcGFnZVxuICogICAgIEQtLT4+TDogUmV0dXJuIHBhZ2UgZGF0YVxuICogICAgIEwtPj5MOiBSZXBsYWNlIGRpc3BsYXllZCBkYXRhXG4gKiAgIGVuZFxuICpcbiAqICAgYWx0IFVzZXIgc2VhcmNoZXNcbiAqICAgICBVLT4+TDogRW50ZXIgc2VhcmNoIHRlcm1cbiAqICAgICBMLT4+TDogaGFuZGxlU2VhcmNoKClcbiAqICAgICBMLT4+RDogRmlsdGVyIGRhdGEgYnkgc2VhcmNoIHRlcm1cbiAqICAgICBELS0+Pkw6IFJldHVybiBmaWx0ZXJlZCBkYXRhXG4gKiAgICAgTC0+Pkw6IFVwZGF0ZSBkaXNwbGF5ZWQgZGF0YVxuICogICBlbmRcbiAqXG4gKiAgIGFsdCBVc2VyIGNsaWNrcyBpdGVtXG4gKiAgICAgVS0+Pkw6IENsaWNrIGxpc3QgaXRlbVxuICogICAgIEwtPj5MOiBoYW5kbGVDbGljaygpXG4gKiAgICAgTC0+PkU6IEVtaXQgY2xpY2tFdmVudFxuICogICBlbmRcbiAqXG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1saXN0XG4gKiAgIFtzb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gKiAgIFtsaW1pdF09XCIxMFwiXG4gKiAgIFt0eXBlXT1cIidpbmZpbml0ZSdcIlxuICogICBbc2hvd1NlYXJjaGJhcl09XCJ0cnVlXCJcbiAqICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlSXRlbUNsaWNrKCRldmVudClcIlxuICogICAocmVmcmVzaEV2ZW50KT1cImhhbmRsZVJlZnJlc2goJGV2ZW50KVwiPlxuICogPC9uZ3gtZGVjYWYtbGlzdD5cbiAqXG4gKiBAZXh0ZW5kcyB7Tmd4QmFzZUNvbXBvbmVudH1cbiAqIEBpbXBsZW1lbnRzIHtPbkluaXR9XG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kZWNhZi1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBUcmFuc2xhdGVQaXBlLFxuICAgIElvblJlZnJlc2hlcixcbiAgICBJb25Mb2FkaW5nLFxuICAgIFBhZ2luYXRpb25Db21wb25lbnQsXG4gICAgSW9uTGlzdCxcbiAgICBJb25JdGVtLFxuICAgIElvblRodW1ibmFpbCxcbiAgICBJb25Ta2VsZXRvblRleHQsXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uVGV4dCxcbiAgICBJb25SZWZyZXNoZXJDb250ZW50LFxuICAgIElvbkluZmluaXRlU2Nyb2xsLFxuICAgIElvbkluZmluaXRlU2Nyb2xsQ29udGVudCxcbiAgICBJb25UaHVtYm5haWwsXG4gICAgSW9uU2tlbGV0b25UZXh0LFxuICAgIFNlYXJjaGJhckNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIExpc3RJdGVtQ29tcG9uZW50LFxuICAgIEZpbHRlckNvbXBvbmVudCxcbiAgICBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpc3RDb21wb25lbnQgZXh0ZW5kcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGRpc3BsYXkgbW9kZSBmb3IgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyB0aGUgbGlzdCBkYXRhIGlzIGxvYWRlZCBhbmQgZGlzcGxheWVkLiBPcHRpb25zIGluY2x1ZGU6XG4gICAqIC0gSU5GSU5JVEU6IExvYWRzIG1vcmUgZGF0YSBhcyB0aGUgdXNlciBzY3JvbGxzIChpbmZpbml0ZSBzY3JvbGxpbmcpXG4gICAqIC0gUEFHSU5BVEVEOiBEaXNwbGF5cyBkYXRhIGluIHBhZ2VzIHdpdGggbmF2aWdhdGlvbiBjb250cm9sc1xuICAgKlxuICAgKiBAdHlwZSB7TGlzdENvbXBvbmVudHNUeXBlc31cbiAgICogQGRlZmF1bHQgTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdHlwZTogTGlzdENvbXBvbmVudHNUeXBlcyA9IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBjb21wb25lbnQgdXNlcyB0cmFuc2xhdGlvbiBzZXJ2aWNlcy5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGF0dGVtcHQgdG8gdXNlIHRyYW5zbGF0aW9uIHNlcnZpY2VzXG4gICAqIGZvciBhbnkgdGV4dCBjb250ZW50LiBUaGlzIGFsbG93cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gb2YgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSB0cmFuc2xhdGFibGU6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc2VhcmNoIGJhci5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZGlzcGxheXMgYSBzZWFyY2ggYmFyIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QgdGhhdCBhbGxvd3NcbiAgICogdXNlcnMgdG8gZmlsdGVyIHRoZSBsaXN0IGl0ZW1zLiBUaGUgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgd29ya3MgYnkgZmlsdGVyaW5nIHRoZVxuICAgKiBleGlzdGluZyBkYXRhIG9yIGJ5IHRyaWdnZXJpbmcgYSBuZXcgZGF0YSBmZXRjaCB3aXRoIHNlYXJjaCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzaG93U2VhcmNoYmFyOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGlyZWN0IGRhdGEgaW5wdXQgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSB3YXkgdG8gZGlyZWN0bHkgcGFzcyBkYXRhIHRvIHRoZSBsaXN0IGNvbXBvbmVudCBpbnN0ZWFkIG9mXG4gICAqIGZldGNoaW5nIGl0IGZyb20gYSBzb3VyY2UuIFdoZW4gYm90aCBkYXRhIGFuZCBzb3VyY2UgYXJlIHByb3ZpZGVkLCB0aGUgY29tcG9uZW50XG4gICAqIHdpbGwgdXNlIHRoZSBzb3VyY2UgdG8gZmV0Y2ggZGF0YSBvbmx5IGlmIHRoZSBkYXRhIGFycmF5IGlzIGVtcHR5LlxuICAgKlxuICAgKiBAdHlwZSB7S2V5VmFsdWVbXSB8IHVuZGVmaW5lZH1cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBkYXRhPzogS2V5VmFsdWVbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGxpc3QgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdGhlIGxpc3Qgc2hvdWxkIGZldGNoIGl0cyBkYXRhIGZyb20uIFRoaXMgY2FuIGJlIGVpdGhlcjpcbiAgICogLSBBIHN0cmluZyBVUkwgb3IgZW5kcG9pbnQgaWRlbnRpZmllclxuICAgKiAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGRhdGEgd2hlbiBjYWxsZWRcbiAgICogVGhlIGNvbXBvbmVudCB3aWxsIGNhbGwgdGhpcyBzb3VyY2Ugd2hlbiBpdCBuZWVkcyB0byBsb2FkIG9yIHJlZnJlc2ggZGF0YS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEZ1bmN0aW9uTGlrZX1cbiAgICogQHJlcXVpcmVkXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzb3VyY2UhOiBzdHJpbmcgfCBGdW5jdGlvbkxpa2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIGRhdGEgZmV0Y2hpbmcuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgaW5kZXggZnJvbSB3aGljaCB0byBzdGFydCBmZXRjaGluZyBkYXRhLiBUaGlzIGlzIHVzZWRcbiAgICogZm9yIHBhZ2luYXRpb24gYW5kIGluZmluaXRlIHNjcm9sbGluZyB0byBkZXRlcm1pbmUgd2hpY2ggc3Vic2V0IG9mIGRhdGEgdG8gbG9hZC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc3RhcnQ6IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGZldGNoIHBlciBwYWdlIG9yIGxvYWQgb3BlcmF0aW9uLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyBtYW55IGl0ZW1zIGFyZSBsb2FkZWQgYXQgb25jZSBkdXJpbmcgcGFnaW5hdGlvbiBvclxuICAgKiBpbmZpbml0ZSBzY3JvbGxpbmcuIFRoaXMgYWZmZWN0cyB0aGUgc2l6ZSBvZiBkYXRhIGNodW5rcyByZXF1ZXN0ZWQgZnJvbSB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxMFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbGltaXQ6IG51bWJlciA9IDEwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBtb3JlIGRhdGEgY2FuIGJlIGxvYWRlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGNvbXBvbmVudCB3aWxsIGFsbG93IGxvYWRpbmcgYWRkaXRpb25hbCBkYXRhXG4gICAqIHRocm91Z2ggaW5maW5pdGUgc2Nyb2xsaW5nIG9yIHBhZ2luYXRpb24uIFdoZW4gZmFsc2UsIHRoZSBjb21wb25lbnQgd2lsbCBub3RcbiAgICogYXR0ZW1wdCB0byBsb2FkIG1vcmUgZGF0YSBiZXlvbmQgd2hhdCBpcyBpbml0aWFsbHkgZGlzcGxheWVkLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2FkTW9yZURhdGE6IFN0cmluZ09yQm9vbGVhbiA9IHRydWVcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdHlsZSBvZiBkaXZpZGluZyBsaW5lcyBiZXR3ZWVuIGxpc3QgaXRlbXMuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaG93IGRpdmlkaW5nIGxpbmVzIGFwcGVhciBiZXR3ZWVuIGxpc3QgaXRlbXMuIE9wdGlvbnMgaW5jbHVkZTpcbiAgICogLSBcImluc2V0XCI6IExpbmVzIGFyZSBpbnNldCBmcm9tIHRoZSBlZGdlc1xuICAgKiAtIFwiZnVsbFwiOiBMaW5lcyBleHRlbmQgdGhlIGZ1bGwgd2lkdGhcbiAgICogLSBcIm5vbmVcIjogTm8gZGl2aWRpbmcgbGluZXNcbiAgICpcbiAgICogQHR5cGUge1wiaW5zZXRcIiB8IFwiZnVsbFwiIHwgXCJub25lXCJ9XG4gICAqIEBkZWZhdWx0IFwiZnVsbFwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsaW5lczogXCJpbnNldFwiIHwgXCJmdWxsXCIgfCBcIm5vbmVcIiA9IFwiZnVsbFwiO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgbGlzdCBoYXMgaW5zZXQgc3R5bGluZy5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGxpc3Qgd2lsbCBoYXZlIGluc2V0IHN0eWxpbmcgd2l0aCByb3VuZGVkIGNvcm5lcnNcbiAgICogYW5kIG1hcmdpbiBhcm91bmQgdGhlIGVkZ2VzLiBUaGlzIGNyZWF0ZXMgYSBjYXJkLWxpa2UgYXBwZWFyYW5jZSBmb3IgdGhlIGxpc3QuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpbnNldDogU3RyaW5nT3JCb29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdGhyZXNob2xkIGZvciB0cmlnZ2VyaW5nIGluZmluaXRlIHNjcm9sbCBsb2FkaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGNsb3NlIHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QgdGhlIHVzZXIgbXVzdCBzY3JvbGxcbiAgICogYmVmb3JlIHRoZSBjb21wb25lbnQgdHJpZ2dlcnMgbG9hZGluZyBvZiBhZGRpdGlvbmFsIGRhdGEuIFRoaXMgaXMgZXhwcmVzc2VkXG4gICAqIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgbGlzdCBoZWlnaHQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwiMTUlXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNjcm9sbFRocmVzaG9sZDogc3RyaW5nID0gXCIxNSVcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwb3NpdGlvbiB3aGVyZSBuZXcgaXRlbXMgYXJlIGFkZGVkIGR1cmluZyBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hldGhlciBuZXcgaXRlbXMgYXJlIGFkZGVkIHRvIHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBsaXN0XG4gICAqIHdoZW4gbG9hZGluZyBtb3JlIGRhdGEgdGhyb3VnaCBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtcImJvdHRvbVwiIHwgXCJ0b3BcIn1cbiAgICogQGRlZmF1bHQgXCJib3R0b21cIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2Nyb2xsUG9zaXRpb246IFwiYm90dG9tXCIgfCBcInRvcFwiID0gXCJib3R0b21cIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1c3RvbSB0ZXh0IHRvIGRpc3BsYXkgZHVyaW5nIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB0ZXh0IHNob3duIGluIHRoZSBsb2FkaW5nIGluZGljYXRvciB3aGVuIHRoZSBjb21wb25lbnRcbiAgICogaXMgZmV0Y2hpbmcgZGF0YS4gSWYgbm90IHByb3ZpZGVkLCBhIGRlZmF1bHQgbG9hZGluZyBtZXNzYWdlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHB1bGwtdG8tcmVmcmVzaCBmZWF0dXJlLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCBlbmFibGVzIHRoZSBwdWxsLXRvLXJlZnJlc2ggZnVuY3Rpb25hbGl0eSB0aGF0IGFsbG93c1xuICAgKiB1c2VycyB0byByZWZyZXNoIHRoZSBsaXN0IGRhdGEgYnkgcHVsbGluZyBkb3duIGZyb20gdGhlIHRvcCBvZiB0aGUgbGlzdC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd1JlZnJlc2hlcjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0eXBlIG9mIHNwaW5uZXIgdG8gZGlzcGxheSBkdXJpbmcgbG9hZGluZyBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgbG9hZGluZyBzcGlubmVyIHNob3duIGR1cmluZyBkYXRhXG4gICAqIGZldGNoaW5nIG9wZXJhdGlvbnMuIFVzZXMgSW9uaWMncyBwcmVkZWZpbmVkIHNwaW5uZXIgdHlwZXMuXG4gICAqXG4gICAqIEB0eXBlIHtTcGlubmVyVHlwZXN9XG4gICAqIEBkZWZhdWx0IFwiY2lyY3VsYXJcIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZGluZ1NwaW5uZXI6IFNwaW5uZXJUeXBlcyA9IFwiY2lyY3VsYXJcIjtcblxuICAvLyAvKipcbiAgLy8gICogQGRlc2NyaXB0aW9uIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGRhdGEgZmV0Y2hpbmcuXG4gIC8vICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhZGRpdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgZGF0YSBmcm9tXG4gIC8vICAqIHRoZSBzb3VyY2UuIFRoaXMgY2FuIGJlIHByb3ZpZGVkIGFzIGEgc3RyaW5nIChKU09OKSBvciBhIGRpcmVjdCBvYmplY3QuXG4gIC8vICAqXG4gIC8vICAqIEB0eXBlIHtzdHJpbmcgfCBLZXlWYWx1ZSB8IHVuZGVmaW5lZH1cbiAgLy8gICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgLy8gICovXG4gIC8vIEBJbnB1dCgpXG4gIC8vIHF1ZXJ5Pzogc3RyaW5nIHwgS2V5VmFsdWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSBmaWx0ZXJpbmcgZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkLlxuICAgKiBAc3VtbWFyeSBXaGVuIHNldCB0byB0cnVlLCBlbmFibGVzIHRoZSBmaWx0ZXIgY29tcG9uZW50IHRoYXQgYWxsb3dzIHVzZXJzIHRvIGNyZWF0ZVxuICAgKiBjb21wbGV4IHNlYXJjaCBjcml0ZXJpYSB3aXRoIG11bHRpcGxlIGZpZWxkIGZpbHRlcnMsIGNvbmRpdGlvbnMsIGFuZCB2YWx1ZXMuXG4gICAqIFdoZW4gZmFsc2UsIGRpc2FibGVzIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIGVudGlyZWx5LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbmFibGVGaWx0ZXI6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTb3J0aW5nIHBhcmFtZXRlcnMgZm9yIGRhdGEgZmV0Y2hpbmcuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgdGhlIGZldGNoZWQgZGF0YSBzaG91bGQgYmUgc29ydGVkLiBUaGlzIGNhbiBiZSBwcm92aWRlZFxuICAgKiBhcyBhIHN0cmluZyAoZmllbGQgbmFtZSB3aXRoIG9wdGlvbmFsIGRpcmVjdGlvbikgb3IgYSBkaXJlY3Qgb2JqZWN0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgS2V5VmFsdWUgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzb3J0RGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiA9IE9yZGVyRGlyZWN0aW9uLkRTQztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU29ydGluZyBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IHRoZSBmZXRjaGVkIGRhdGEgc2hvdWxkIGJlIHNvcnRlZC4gVGhpcyBjYW4gYmUgcHJvdmlkZWRcbiAgICogYXMgYSBzdHJpbmcgKGZpZWxkIG5hbWUgd2l0aCBvcHRpb25hbCBkaXJlY3Rpb24pIG9yIGEgZGlyZWN0IG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEtleVZhbHVlIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc29ydEJ5ITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHNvcnRpbmcgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgdGhlIHNvcnQgY29udHJvbHMgYW5kIHByZXZlbnRzIHVzZXJzIGZyb21cbiAgICogY2hhbmdpbmcgdGhlIHNvcnQgb3JkZXIgb3IgZmllbGQuIFRoZSBsaXN0IHdpbGwgbWFpbnRhaW4gaXRzIGRlZmF1bHQgb3JcbiAgICogcHJvZ3JhbW1hdGljYWxseSBzZXQgc29ydCBjb25maWd1cmF0aW9uIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGRpc2FibGVTb3J0OiBTdHJpbmdPckJvb2xlYW4gPSBmYWxzZTtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgaWNvbiBzaG93biBpbiB0aGUgZW1wdHkgc3RhdGUgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICogVGhpcyBjYW4gYmUgYW55IGljb24gbmFtZSBzdXBwb3J0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uJ3MgaWNvbiBzeXN0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0ICd0aS1kYXRhYmFzZS1leGNsYW1hdGlvbidcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGVtcHR5SWNvbj86IHN0cmluZyA9ICd0aS1kYXRhYmFzZS1leGNsYW1hdGlvbic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciB0aGUgZW1wdHkgc3RhdGUgZGlzcGxheS5cbiAgICogQHN1bW1hcnkgQ3VzdG9taXplcyBob3cgdGhlIGVtcHR5IHN0YXRlIGlzIGRpc3BsYXllZCB3aGVuIG5vIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgKiBUaGlzIGluY2x1ZGVzIHRoZSB0aXRsZSwgc3VidGl0bGUsIGJ1dHRvbiB0ZXh0LCBpY29uLCBhbmQgbmF2aWdhdGlvbiBsaW5rLlxuICAgKlxuICAgKiBAdHlwZSB7UGFydGlhbDxJTGlzdEVtcHR5UmVzdWx0Pn1cbiAgICogQGRlZmF1bHQge1xuICAgKiAgIHRpdGxlOiAnZW1wdHkudGl0bGUnLFxuICAgKiAgIHN1YnRpdGxlOiAnZW1wdHkuc3VidGl0bGUnLFxuICAgKiAgIHNob3dCdXR0b246IGZhbHNlLFxuICAgKiAgIGljb246ICdhbGVydC1jaXJjbGUtb3V0bGluZScsXG4gICAqICAgYnV0dG9uVGV4dDogJ2xvY2FsZS5lbXB0eS5idXR0b24nLFxuICAgKiAgIGxpbms6ICcnXG4gICAqIH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGVtcHR5OiBQYXJ0aWFsPElMaXN0RW1wdHlSZXN1bHQ+ID0ge1xuICAgIHRpdGxlOiAnZW1wdHkudGl0bGUnLFxuICAgIHN1YnRpdGxlOiAnZW1wdHkuc3VidGl0bGUnLFxuICAgIHNob3dCdXR0b246IGZhbHNlLFxuICAgIGljb246ICdhbGVydC1jaXJjbGUtb3V0bGluZScsXG4gICAgYnV0dG9uVGV4dDogJ2xvY2FsZS5lbXB0eS5idXR0b24nLFxuICAgIGxpbms6ICcnXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGluIHBhZ2luYXRlZCBtb2RlLlxuICAgKiBAc3VtbWFyeSBUcmFja3Mgd2hpY2ggcGFnZSBpcyBjdXJyZW50bHkgYmVpbmcgZGlzcGxheWVkIHdoZW4gdGhlIGNvbXBvbmVudFxuICAgKiBpcyBpbiBwYWdpbmF0ZWQgbW9kZS4gVGhpcyBpcyB1c2VkIGZvciBwYWdpbmF0aW9uIGNvbnRyb2xzIGFuZCBkYXRhIGZldGNoaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwYWdlOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY2FsY3VsYXRlZCB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYmFzZWQgb24gdGhlIGRhdGEgc2l6ZVxuICAgKiBhbmQgbGltaXQuIFRoaXMgaXMgdXNlZCBmb3IgcGFnaW5hdGlvbiBjb250cm9scyBhbmQgYm91bmRhcnkgY2hlY2tpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwYWdlcyE6IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIGEgcmVmcmVzaCBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhlIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgZmV0Y2hpbmcgbmV3IGRhdGEuIFRoaXMgaXMgdXNlZFxuICAgKiB0byBjb250cm9sIGxvYWRpbmcgaW5kaWNhdG9ycyBhbmQgcHJldmVudCBkdXBsaWNhdGUgcmVmcmVzaCBvcGVyYXRpb25zIGZyb21cbiAgICogYmVpbmcgdHJpZ2dlcmVkIHNpbXVsdGFuZW91c2x5LlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHJlZnJlc2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IHVzZWQgZm9yIHJlbmRlcmluZyBza2VsZXRvbiBsb2FkaW5nIHBsYWNlaG9sZGVycy5cbiAgICogQHN1bW1hcnkgQ29udGFpbnMgcGxhY2Vob2xkZXIgaXRlbXMgdGhhdCBhcmUgZGlzcGxheWVkIGR1cmluZyBkYXRhIGxvYWRpbmcuXG4gICAqIFRoZSBsZW5ndGggb2YgdGhpcyBhcnJheSBkZXRlcm1pbmVzIGhvdyBtYW55IHNrZWxldG9uIGl0ZW1zIGFyZSBzaG93bi5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgKiBAZGVmYXVsdCBuZXcgQXJyYXkoMilcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHNrZWxldG9uRGF0YTogc3RyaW5nW10gPSBuZXcgQXJyYXkoMik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcHJvY2Vzc2VkIGxpc3QgaXRlbXMgcmVhZHkgZm9yIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBzZXQgb2YgaXRlbXMgYmVpbmcgZGlzcGxheWVkIGluIHRoZSBsaXN0IGFmdGVyXG4gICAqIHByb2Nlc3NpbmcgZnJvbSB0aGUgcmF3IGRhdGEgc291cmNlLiBUaGlzIG1heSBiZSBhIHN1YnNldCBvZiB0aGUgZnVsbCBkYXRhXG4gICAqIHdoZW4gdXNpbmcgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcuXG4gICAqXG4gICAqIEB0eXBlIHtLZXlWYWx1ZVtdfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaXRlbXMhOiBLZXlWYWx1ZVtdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnQgc2VhcmNoIHF1ZXJ5IHZhbHVlLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHRleHQgZW50ZXJlZCBpbiB0aGUgc2VhcmNoIGJhci4gVGhpcyBpcyB1c2VkIHRvIGZpbHRlclxuICAgKiB0aGUgbGlzdCBkYXRhIG9yIHRvIHNlbmQgYXMgYSBzZWFyY2ggcGFyYW1ldGVyIHdoZW4gZmV0Y2hpbmcgbmV3IGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBzZWFyY2hWYWx1ZT86IHN0cmluZyB8IElGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEEgcGFnaW5hdG9yIG9iamVjdCBmb3IgaGFuZGxpbmcgcGFnaW5hdGlvbiBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHBhZ2luYXRvciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbmQgbmF2aWdhdGVcbiAgICogdGhyb3VnaCBkYXRhIGluIGNodW5rcywgcmVkdWNpbmcgbWVtb3J5IHVzYWdlIGFuZCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UuXG4gICAqXG4gICAqIFRoZSBwYWdpbmF0b3Igb2JqZWN0IGlzIGluaXRpYWxpemVkIGluIHRoZSBgbmdPbkluaXRgIGxpZmVjeWNsZSBob29rIGFuZCBpc1xuICAgKiB1c2VkIHRvIGZldGNoIGFuZCBkaXNwbGF5IGRhdGEgaW4gdGhlIHBhZ2luYXRpb24gY29tcG9uZW50LiBJdCBpcyBhbiBpbnN0YW5jZVxuICAgKiBvZiB0aGUgYFBhZ2luYXRvcmAgY2xhc3MgZnJvbSB0aGUgYEBkZWNhZi10cy9jb3JlYCBwYWNrYWdlLCB3aGljaCBwcm92aWRlc1xuICAgKiBtZXRob2RzIGZvciBxdWVyeWluZyBhbmQgbWFuaXB1bGF0aW5nIHBhZ2luYXRlZCBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7UGFnaW5hdG9yPE1vZGVsPn1cbiAgICogQG1lbWJlck9mIFBhZ2luYXRpb25Db21wb25lbnRcbiAgICovXG4gIHBhZ2luYXRvciE6IFBhZ2luYXRvcjxNb2RlbD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGFzdCBwYWdlIG51bWJlciB0aGF0IHdhcyBkaXNwbGF5ZWQuXG4gICAqIEBzdW1tYXJ5IEtlZXBzIHRyYWNrIG9mIHRoZSBwcmV2aW91c2x5IGRpc3BsYXllZCBwYWdlIG51bWJlciwgd2hpY2ggaXMgdXNlZnVsXG4gICAqIGZvciBoYW5kbGluZyBuYXZpZ2F0aW9uIGFuZCBzZWFyY2ggb3BlcmF0aW9ucyBpbiBwYWdpbmF0ZWQgbW9kZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgbGFzdFBhZ2U6IG51bWJlciA9IDFcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGVtaXR0ZXIgZm9yIHJlZnJlc2ggb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgbGlzdCBkYXRhIGlzIHJlZnJlc2hlZCwgZWl0aGVyIHRocm91Z2ggcHVsbC10by1yZWZyZXNoXG4gICAqIG9yIHByb2dyYW1tYXRpYyByZWZyZXNoLiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIHJlZnJlc2hlZCBkYXRhIGFuZCBjb21wb25lbnQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICByZWZyZXNoRXZlbnQ6IEV2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxCYXNlQ3VzdG9tRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBpdGVtIGNsaWNrIGludGVyYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIGRhdGFcbiAgICogb2YgdGhlIGNsaWNrZWQgaXRlbSwgYWxsb3dpbmcgcGFyZW50IGNvbXBvbmVudHMgdG8gcmVzcG9uZCB0byB0aGUgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8S2V5VmFsdWU+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIGNsaWNrRXZlbnQ6ICBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1DdXN0b21FdmVudHxSZW5kZXJlckN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdEl0ZW1DdXN0b21FdmVudHxSZW5kZXJlckN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ViamVjdCBmb3IgZGVib3VuY2luZyBjbGljayBldmVudHMuXG4gICAqIEBzdW1tYXJ5IFVzZXMgUnhKUyBTdWJqZWN0IHRvIGNvbGxlY3QgY2xpY2sgZXZlbnRzIGFuZCBlbWl0IHRoZW0gYWZ0ZXIgYSBkZWJvdW5jZVxuICAgKiBwZXJpb2QuIFRoaXMgcHJldmVudHMgbXVsdGlwbGUgcmFwaWQgY2xpY2tzIGZyb20gdHJpZ2dlcmluZyBtdWx0aXBsZSBldmVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja0l0ZW1TdWJqZWN0OiBTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Q3VzdG9tRXZlbnQgfCBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3ViamVjdCBmb3IgZGVib3VuY2luZyByZXBvc2l0b3J5IG9ic2VydmF0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgUnhKUyBTdWJqZWN0IHRoYXQgY29sbGVjdHMgcmVwb3NpdG9yeSBjaGFuZ2UgZXZlbnRzIGFuZCBlbWl0cyB0aGVtIGFmdGVyXG4gICAqIGEgZGVib3VuY2UgcGVyaW9kLiBUaGlzIHByZXZlbnRzIG11bHRpcGxlIHJhcGlkIHJlcG9zaXRvcnkgY2hhbmdlcyBmcm9tIHRyaWdnZXJpbmdcbiAgICogbXVsdGlwbGUgbGlzdCByZWZyZXNoIG9wZXJhdGlvbnMsIGltcHJvdmluZyBwZXJmb3JtYW5jZSBhbmQgdXNlciBleHBlcmllbmNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3ViamVjdDxhbnk+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBvYnNlcnZlclN1YmpldDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT2JzZXJ2ZXIgb2JqZWN0IGZvciByZXBvc2l0b3J5IGNoYW5nZSBub3RpZmljYXRpb25zLlxuICAgKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHRoZSBPYnNlcnZlciBpbnRlcmZhY2UgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gdGhlXG4gICAqIHVuZGVybHlpbmcgZGF0YSByZXBvc2l0b3J5IGNoYW5nZXMuIFRoaXMgZW5hYmxlcyBhdXRvbWF0aWMgbGlzdCB1cGRhdGVzIHdoZW5cbiAgICogZGF0YSBpcyBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkIHRocm91Z2ggdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtPYnNlcnZlcn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgb2JzZXJ2ZXI6IE9ic2VydmVyID0geyByZWZyZXNoOiBhc3luYyAoLi4uIGFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dm9pZD4gPT4gdGhpcy5vYnNlcnZlUmVwb3NpdG9yeSguLi5hcmdzKX1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgYXZhaWxhYmxlIGluZGV4ZXMgZm9yIGRhdGEgcXVlcnlpbmcgYW5kIGZpbHRlcmluZy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBsaXN0IG9mIGluZGV4IG5hbWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3B0aW1pemUgZGF0YSBxdWVyeWluZyBhbmQgZmlsdGVyaW5nXG4gICAqIG9wZXJhdGlvbnMsIGVzcGVjaWFsbHkgaW4gc2NlbmFyaW9zIHdpdGggbGFyZ2UgZGF0YXNldHMuXG4gICAqXG4gICAqIEluZGV4ZXMgY2FuIHNpZ25pZmljYW50bHkgaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgZGF0YSByZXRyaWV2YWwgYnkgYWxsb3dpbmcgdGhlIGRhdGFiYXNlXG4gICAqIHRvIHF1aWNrbHkgbG9jYXRlIGFuZCByZXRyaWV2ZSByZWxldmFudCBkYXRhIGJhc2VkIG9uIGluZGV4ZWQgZmllbGRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nW119XG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBpbmRleGVzITogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgTGlzdENvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBMaXN0Q29tcG9uZW50IGFuZCBzZXRzIHVwIHRoZSBiYXNlIGNvbXBvbmVudCB3aXRoIHRoZSBhcHByb3ByaWF0ZVxuICAgKiBjb21wb25lbnQgbmFtZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2hlbiBBbmd1bGFyIGluc3RhbnRpYXRlcyB0aGUgY29tcG9uZW50IGFuZFxuICAgKiBiZWZvcmUgYW55IGlucHV0IHByb3BlcnRpZXMgYXJlIHNldC4gSXQgcGFzc2VzIHRoZSBjb21wb25lbnQgbmFtZSB0byB0aGUgcGFyZW50IGNsYXNzXG4gICAqIGNvbnN0cnVjdG9yIHRvIGVuYWJsZSBwcm9wZXIgbG9jYWxpemF0aW9uIGFuZCBjb21wb25lbnQgaWRlbnRpZmljYXRpb24uXG4gICAqXG4gICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IG1pbmltYWwsIHdpdGggbW9zdCBpbml0aWFsaXphdGlvbiBsb2dpYyBkZWZlcnJlZCB0b1xuICAgKiB0aGUgbmdPbkluaXQgbGlmZWN5Y2xlIGhvb2suIFRoaXMgZm9sbG93cyBBbmd1bGFyIGJlc3QgcHJhY3RpY2VzIGJ5IGtlZXBpbmcgdGhlIGNvbnN0cnVjdG9yXG4gICAqIGZvY3VzZWQgb24gZGVwZW5kZW5jeSBpbmplY3Rpb24gYW5kIGJhc2ljIHNldHVwLCB3aGlsZSBjb21wbGV4IGluaXRpYWxpemF0aW9uIHRoYXQgZGVwZW5kc1xuICAgKiBvbiBpbnB1dCBwcm9wZXJ0aWVzIGlzIGhhbmRsZWQgaW4gbmdPbkluaXQuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIkxpc3RDb21wb25lbnRcIik7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCBhZnRlciBBbmd1bGFyIHNldHMgdGhlIGlucHV0IHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIGNvbXBvbmVudCBieSBpbml0aWFsaXppbmcgZXZlbnQgc3Vic2NyaXB0aW9ucywgcHJvY2Vzc2luZyBib29sZWFuXG4gICAqIGlucHV0cywgYW5kIGxvYWRpbmcgdGhlIGluaXRpYWwgZGF0YS4gVGhpcyBtZXRob2QgcHJlcGFyZXMgdGhlIGNvbXBvbmVudCBmb3IgdXNlclxuICAgKiBpbnRlcmFjdGlvbiBieSBlbnN1cmluZyBhbGwgcHJvcGVydGllcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYW5kIGRhdGEgaXMgbG9hZGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBBbmd1bGFyIExpZmVjeWNsZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTGlzdENvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YSBTb3VyY2VcbiAgICpcbiAgICogICBBLT4+TDogbmdPbkluaXQoKVxuICAgKiAgIEwtPj5MOiBTZXQgdXAgY2xpY2sgZXZlbnQgZGVib3VuY2luZ1xuICAgKiAgIEwtPj5MOiBQcm9jZXNzIGJvb2xlYW4gaW5wdXRzXG4gICAqICAgTC0+Pkw6IENvbmZpZ3VyZSBjb21wb25lbnQgYmFzZWQgb24gaW5wdXRzXG4gICAqICAgTC0+Pkw6IHJlZnJlc2goKVxuICAgKiAgIEwtPj5EOiBSZXF1ZXN0IGluaXRpYWwgZGF0YVxuICAgKiAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAgICogICBMLT4+TDogUHJvY2VzcyBhbmQgZGlzcGxheSBkYXRhXG4gICAqICAgTC0+Pkw6IENvbmZpZ3VyZSBlbXB0eSBzdGF0ZSBpZiBuZWVkZWRcbiAgICogICBMLT4+TDogaW5pdGlhbGl6ZSgpXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsaWNrSXRlbVN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUoMTAwKSkuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMuY2xpY2tFdmVudEVtaXQoZXZlbnQgYXMgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpKTtcbiAgICB0aGlzLm9ic2VydmVyU3ViamV0LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLnN1YnNjcmliZShhcmdzID0+IHRoaXMuaGFuZGxlT2JzZXJ2ZUV2ZW50KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pKTtcbiAgICB0aGlzLmVuYWJsZUZpbHRlciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLmVuYWJsZUZpbHRlcik7XG4gICAgdGhpcy5saW1pdCA9IE51bWJlcih0aGlzLmxpbWl0KTtcbiAgICB0aGlzLnN0YXJ0ID0gTnVtYmVyKHRoaXMuc3RhcnQpO1xuICAgIHRoaXMuaW5zZXQgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5pbnNldCk7XG4gICAgdGhpcy5zaG93UmVmcmVzaGVyID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuc2hvd1JlZnJlc2hlcik7XG4gICAgdGhpcy5sb2FkTW9yZURhdGEgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5sb2FkTW9yZURhdGEpO1xuICAgIHRoaXMuc2hvd1NlYXJjaGJhciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLnNob3dTZWFyY2hiYXIpO1xuICAgIHRoaXMuZGlzYWJsZVNvcnQgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5kaXNhYmxlU29ydCk7XG4gICAgaWYodHlwZW9mIHRoaXMuaXRlbT8uWyd0YWcnXSA9PT0gJ2Jvb2xlYW4nICYmIHRoaXMuaXRlbT8uWyd0YWcnXSA9PT0gdHJ1ZSlcbiAgICAgIHRoaXMuaXRlbVsndGFnJ10gPSBDb21wb25lbnRzVGFnTmFtZXMuTElTVF9JVEVNIGFzIHN0cmluZztcblxuICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuXG4gICAgaWYodGhpcy5vcGVyYXRpb25zLmluY2x1ZGVzKE9wZXJhdGlvbktleXMuQ1JFQVRFKSAmJiB0aGlzLnJvdXRlKVxuICAgICAgdGhpcy5lbXB0eS5saW5rID0gYCR7dGhpcy5yb3V0ZX0vJHtPcGVyYXRpb25LZXlzLkNSRUFURX1gO1xuXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICBpZih0aGlzLm1vZGVsIGluc3RhbmNlb2YgTW9kZWwgJiYgdGhpcy5fcmVwb3NpdG9yeSlcbiAgICAgIHRoaXMuX3JlcG9zaXRvcnkub2JzZXJ2ZSh0aGlzLm9ic2VydmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYW5zIHVwIHJlc291cmNlcyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBjbGVhbnVwIG9wZXJhdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICAgKiBUaGlzIGluY2x1ZGVzIGNsZWFyaW5nIHJlZmVyZW5jZXMgdG8gbW9kZWxzIGFuZCBkYXRhIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmKHRoaXMuX3JlcG9zaXRvcnkpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5LnVuT2JzZXJ2ZSh0aGlzLm9ic2VydmVyKTtcbiAgICB0aGlzLmRhdGEgPSAgdGhpcy5tb2RlbCA9IHRoaXMuX3JlcG9zaXRvcnkgPSB0aGlzLnBhZ2luYXRvciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyByZXBvc2l0b3J5IG9ic2VydmF0aW9uIGV2ZW50cyB3aXRoIGRlYm91bmNpbmcuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyByZXBvc2l0b3J5IGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCByb3V0ZXMgdGhlbSBhcHByb3ByaWF0ZWx5LlxuICAgKiBGb3IgQ1JFQVRFIGV2ZW50cyB3aXRoIGEgVUlELCBoYW5kbGVzIHRoZW0gaW1tZWRpYXRlbHkuIEZvciBvdGhlciBldmVudHMsXG4gICAqIHBhc3NlcyB0aGVtIHRvIHRoZSBkZWJvdW5jZWQgb2JzZXJ2ZXIgc3ViamVjdCB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB1cGRhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLnVua25vd25bXX0gYXJncyAtIFRoZSByZXBvc2l0b3J5IGV2ZW50IGFyZ3VtZW50cyBpbmNsdWRpbmcgdGFibGUsIGV2ZW50IHR5cGUsIGFuZCBVSURcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBvYnNlcnZlUmVwb3NpdG9yeSguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBbdGFibGUsIGV2ZW50LCB1aWRdID0gYXJncztcbiAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUgJiYgISF1aWQpXG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVPYnNlcnZlRXZlbnQodGFibGUgYXMgc3RyaW5nLCBldmVudCwgdWlkIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJTdWJqZXQubmV4dChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzcGVjaWZpYyByZXBvc2l0b3J5IGV2ZW50cyBhbmQgdXBkYXRlcyB0aGUgbGlzdCBhY2NvcmRpbmdseS5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIHJlcG9zaXRvcnkgY2hhbmdlIGV2ZW50cyAoQ1JFQVRFLCBVUERBVEUsIERFTEVURSkgYW5kIHBlcmZvcm1zXG4gICAqIHRoZSBhcHByb3ByaWF0ZSBsaXN0IG9wZXJhdGlvbnMuIFRoaXMgaW5jbHVkZXMgYWRkaW5nIG5ldyBpdGVtcywgdXBkYXRpbmcgZXhpc3RpbmdcbiAgICogb25lcywgb3IgcmVtb3ZpbmcgZGVsZXRlZCBpdGVtcyBmcm9tIHRoZSBsaXN0IGRpc3BsYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSB0YWJsZS9tb2RlbCBuYW1lIHRoYXQgY2hhbmdlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IGV2ZW50IC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIChDUkVBVEUsIFVQREFURSwgREVMRVRFKVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdWlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhZmZlY3RlZCBpdGVtXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlT2JzZXJ2ZUV2ZW50KHRhYmxlOiBzdHJpbmcsIGV2ZW50OiBPcGVyYXRpb25LZXlzLCB1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSkge1xuICAgICAgaWYodWlkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ3JlYXRlKHVpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLlVQREFURSlcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVVcGRhdGUodWlkKTtcbiAgICAgIGlmKGV2ZW50ID09PSBPcGVyYXRpb25LZXlzLkRFTEVURSlcbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGUodWlkKTtcbiAgICAgIHRoaXMucmVmcmVzaEV2ZW50RW1pdCgpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiBmb3IgdHJhY2tpbmcgaXRlbXMgaW4gdGhlIGxpc3QuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgdHJhY2tpbmcgZnVuY3Rpb24gZm9yIHRoZSBgKm5nRm9yYCBkaXJlY3RpdmUgaW4gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZS5cbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZCBjb250cm9sIHRoZSByZW5kZXJpbmcgb2YgaXRlbXMgaW4gdGhlIGxpc3QsXG4gICAqIHByZXZlbnRpbmcgZHVwbGljYXRlIG9yIHVubmVjZXNzYXJ5IHJlbmRlcmluZy5cbiAgICpcbiAgICogVGhlIGB0cmFja0l0ZW1GbmAgZnVuY3Rpb24gdGFrZXMgdHdvIHBhcmFtZXRlcnM6IGBpbmRleGAgKHRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbGlzdClcbiAgICogYW5kIGBpdGVtYCAodGhlIGFjdHVhbCBpdGVtIGZyb20gdGhlIGxpc3QpLiBJdCByZXR1cm5zIHRoZSB0cmFja2luZyBrZXksIHdoaWNoIGluIHRoaXMgY2FzZVxuICAgKiBpcyB0aGUgdW5pb24gb2YgdGhlIGB1aWRgIG9mIHRoZSBpdGVtIHdpdGggdGhlIG1vZGVsIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgbGlzdC5cblxuICAgKiBAcGFyYW0ge0tleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyfSBpdGVtIC0gVGhlIGFjdHVhbCBpdGVtIGZyb20gdGhlIGxpc3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IFRoZSB0cmFja2luZyBrZXkgZm9yIHRoZSBpdGVtLlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgb3ZlcnJpZGUgdHJhY2tJdGVtRm4oaW5kZXg6IG51bWJlciwgaXRlbTogS2V5VmFsdWUgfCBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBgJHsgKGl0ZW0gYXMgS2V5VmFsdWUpPy5bJ3VpZCddIHx8IChpdGVtIGFzIEtleVZhbHVlKT8uW3RoaXMucGtdfS0ke2luZGV4fWA7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQgZnJvbSB0aGUgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byBjcmVhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBpdGVtIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBsaXN0LlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ3JlYXRlKHVpZDogc3RyaW5nIHwgbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcmVwb3NpdG9yeT8ucmVhZCh1aWQpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1hcFJlc3VsdHMoW3Jlc3VsdCBhcyBLZXlWYWx1ZV0pWzBdO1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGEgPSBbaXRlbSwgLi4udGhpcy5pdGVtcyB8fCBbXV07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB0aGUgdXBkYXRlIGV2ZW50IGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgdGhlIGxpc3QgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgYmFzZWQgb24gdGhlIG5ldyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdWlkIC0gVGhlIElEIG9mIHRoZSBpdGVtIHRvIHVwZGF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZVVwZGF0ZSh1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGl0ZW06IEtleVZhbHVlID0gdGhpcy5pdGVtTWFwcGVyKGF3YWl0IHRoaXMuX3JlcG9zaXRvcnk/LnJlYWQodWlkKSB8fCB7fSwgdGhpcy5tYXBwZXIpO1xuICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgIGZvcihjb25zdCBrZXkgaW4gdGhpcy5pdGVtcyBhcyBLZXlWYWx1ZVtdKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5pdGVtc1trZXldIGFzIEtleVZhbHVlO1xuICAgICAgICBpZihjaGlsZFsndWlkJ10gPT09IGl0ZW1bJ3VpZCddKSB7XG4gICAgICAgICAgdGhpcy5pdGVtc1trZXldID0gT2JqZWN0LmFzc2lnbih7fSwgY2hpbGQsIGl0ZW0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhID0gWyAuLi50aGlzLml0ZW1zXTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGxpc3QgYnkgSUQuXG4gICAqIEBzdW1tYXJ5IEZpbHRlcnMgb3V0IGFuIGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIElEIGZyb20gdGhlIGRhdGEgYXJyYXkgYW5kXG4gICAqIHJlZnJlc2hlcyB0aGUgbGlzdCBkaXNwbGF5LiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGFmdGVyIGEgZGVsZXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byBkZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gVGhlIHByaW1hcnkga2V5IGZpZWxkIG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVEZWxldGUodWlkOiBzdHJpbmcgfCBudW1iZXIsIHBrPzogc3RyaW5nKTogdm9pZCAge1xuICAgIGlmKCFwaylcbiAgICAgIHBrID0gdGhpcy5waztcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhPy5maWx0ZXIoKGl0ZW06IEtleVZhbHVlKSA9PiBpdGVtWyd1aWQnXSAhPT0gdWlkKSB8fCBbXTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGNsaWNrIGV2ZW50cyBmcm9tIGxpc3QgaXRlbXMuXG4gICAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGdsb2JhbCBMaXN0SXRlbUNsaWNrRXZlbnQgZXZlbnRzIGFuZCBwYXNzZXMgdGhlbSB0byB0aGVcbiAgICogZGVib3VuY2VkIGNsaWNrIHN1YmplY3QuIFRoaXMgYWxsb3dzIHRoZSBjb21wb25lbnQgdG8gcmVzcG9uZCB0byBjbGlja3Mgb25cbiAgICogbGlzdCBpdGVtcyByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZXkgb3JpZ2luYXRlIGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSB7TGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGNsaWNrIGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93Okxpc3RJdGVtQ2xpY2tFdmVudCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tJdGVtU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBzZWFyY2ggZXZlbnRzIGZyb20gdGhlIHNlYXJjaCBiYXIuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBzZWFyY2ggcXVlcmllcyBmcm9tIHRoZSBzZWFyY2ggYmFyIGNvbXBvbmVudCwgdXBkYXRpbmcgdGhlXG4gICAqIGRpc3BsYXllZCBkYXRhIGJhc2VkIG9uIHRoZSBzZWFyY2ggdGVybS4gVGhlIGJlaGF2aW9yIGRpZmZlcnMgYmV0d2VlbiBpbmZpbml0ZVxuICAgKiBhbmQgcGFnaW5hdGVkIG1vZGVzIHRvIHByb3ZpZGUgdGhlIGJlc3QgdXNlciBleHBlcmllbmNlIGZvciBlYWNoIG1vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRoZSBzZWFyY2ggdGVybSBvciB1bmRlZmluZWQgdG8gY2xlYXIgc2VhcmNoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBmbG93Y2hhcnQgVERcbiAgICogICBBW1NlYXJjaCBFdmVudF0gLS0+IEJ7VHlwZSBpcyBJbmZpbml0ZT99XG4gICAqICAgQiAtLT58WWVzfCBDW0Rpc2FibGUgbG9hZE1vcmVEYXRhXVxuICAgKiAgIEIgLS0+fE5vfCBEW0VuYWJsZSBsb2FkTW9yZURhdGFdXG4gICAqICAgQyAtLT4gRXtTZWFyY2ggdmFsdWUgdW5kZWZpbmVkP31cbiAgICogICBFIC0tPnxZZXN8IEZbRW5hYmxlIGxvYWRNb3JlRGF0YV1cbiAgICogICBFIC0tPnxOb3wgR1tTdG9yZSBzZWFyY2ggdmFsdWVdXG4gICAqICAgRCAtLT4gR1xuICAgKiAgIEYgLS0+IEhbUmVzZXQgcGFnZSB0byAxXVxuICAgKiAgIEcgLS0+IElbUmVmcmVzaCBkYXRhXVxuICAgKiAgIEggLS0+IElcbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzZWFyY2hiYXJFdmVudCcsIFsnJGV2ZW50J10pXG4gIGFzeW5jIGhhbmRsZVNlYXJjaCh2YWx1ZTogc3RyaW5nIHwgSUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYodGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IHRydWU7XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRoaXMucGFnZSA9IHRoaXMubGFzdFBhZ2U7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2godHJ1ZSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZmlsdGVyIGV2ZW50cyBmcm9tIHRoZSBmaWx0ZXIgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZmlsdGVyIHF1ZXJpZXMgZnJvbSB0aGUgZmlsdGVyIGNvbXBvbmVudCBhbmQgYXBwbGllcyB0aGVtXG4gICAqIHRvIHRoZSBsaXN0IGRhdGEuIFRoaXMgbWV0aG9kIGFjdHMgYXMgYSBicmlkZ2UgYmV0d2VlbiB0aGUgZmlsdGVyIGNvbXBvbmVudFxuICAgKiBhbmQgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5LCBjb252ZXJ0aW5nIGZpbHRlciBxdWVyaWVzIGludG8gc2VhcmNoIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7SUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkfSB2YWx1ZSAtIFRoZSBmaWx0ZXIgcXVlcnkgb2JqZWN0IG9yIHVuZGVmaW5lZCB0byBjbGVhciBmaWx0ZXJzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlRmlsdGVyKHZhbHVlOiBJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVNlYXJjaCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFycyB0aGUgY3VycmVudCBzZWFyY2ggYW5kIHJlc2V0cyB0aGUgbGlzdC5cbiAgICogQHN1bW1hcnkgQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY2xlYXJzIHRoZSBzZWFyY2ggYnkgY2FsbGluZyBoYW5kbGVTZWFyY2hcbiAgICogd2l0aCB1bmRlZmluZWQuIFRoaXMgcmVzZXRzIHRoZSBsaXN0IHRvIHNob3cgYWxsIGRhdGEgd2l0aG91dCBmaWx0ZXJpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgY2xlYXJTZWFyY2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2godW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW1pdHMgYSByZWZyZXNoIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgZGF0YS5cbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhbmQgZW1pdHMgYSByZWZyZXNoIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgbGlzdCBkYXRhLlxuICAgKiBUaGlzIG5vdGlmaWVzIHBhcmVudCBjb21wb25lbnRzIHRoYXQgdGhlIGxpc3QgZGF0YSBoYXMgYmVlbiByZWZyZXNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5VmFsdWVbXX0gW2RhdGFdIC0gT3B0aW9uYWwgZGF0YSB0byBpbmNsdWRlIGluIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHJlZnJlc2hFdmVudEVtaXQoZGF0YT86IEtleVZhbHVlW10pOiB2b2lkIHtcbiAgICBpZighZGF0YSlcbiAgICAgIGRhdGEgPSB0aGlzLml0ZW1zO1xuICAgIHRoaXMuc2tlbGV0b25EYXRhID0gbmV3IEFycmF5KGRhdGE/Lmxlbmd0aCB8fCAyKTtcbiAgICB0aGlzLnJlZnJlc2hFdmVudC5lbWl0KHtcbiAgICAgIG5hbWU6IEV2ZW50Q29uc3RhbnRzLlJFRlJFU0gsXG4gICAgICBkYXRhOiBkYXRhIHx8IFtdLFxuICAgICAgY29tcG9uZW50OiB0aGlzLmNvbXBvbmVudE5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW1pdHMgYSBjbGljayBldmVudCBmb3IgYSBsaXN0IGl0ZW0uXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhbmQgZW1pdHMgYSBjbGljayBldmVudCB3aGVuIGEgbGlzdCBpdGVtIGlzIGNsaWNrZWQuXG4gICAqIFRoaXMgZXh0cmFjdHMgdGhlIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgZXZlbnQgYW5kIHBhc3NlcyBpdCB0byBwYXJlbnQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgY2xpY2sgZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGNsaWNrRXZlbnRFbWl0KGV2ZW50OiBMaXN0SXRlbUN1c3RvbUV2ZW50IHwgUmVuZGVyZXJDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmcmVzaGVzIHRoZSBsaXN0IGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBzb3VyY2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCBpbml0aWFsIGRhdGEgbG9hZGluZyBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMsXG4gICAqIGluY2x1ZGluZyBwdWxsLXRvLXJlZnJlc2ggYW5kIGluZmluaXRlIHNjcm9sbGluZy4gSXQgbWFuYWdlcyB0aGUgZGF0YSBmZXRjaGluZyBwcm9jZXNzLFxuICAgKiB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBzdGF0ZSwgYW5kIGhhbmRsZXMgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcgbG9naWMgYmFzZWRcbiAgICogb24gdGhlIGNvbXBvbmVudCdzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFRoZSBtZXRob2QgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICogMS4gU2V0cyB0aGUgcmVmcmVzaGluZyBmbGFnIHRvIGluZGljYXRlIGEgZGF0YSBmZXRjaCBpcyBpbiBwcm9ncmVzc1xuICAgKiAyLiBDYWxjdWxhdGVzIHRoZSBhcHByb3ByaWF0ZSBzdGFydCBhbmQgbGltaXQgdmFsdWVzIGJhc2VkIG9uIHBhZ2luYXRpb24gc2V0dGluZ3NcbiAgICogMy4gRmV0Y2hlcyBkYXRhIGZyb20gdGhlIGFwcHJvcHJpYXRlIHNvdXJjZSAobW9kZWwgb3IgcmVxdWVzdClcbiAgICogNC4gVXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBhbmQgZW1pdHMgYSByZWZyZXNoIGV2ZW50XG4gICAqIDUuIEhhbmRsZXMgcGFnaW5hdGlvbiBvciBpbmZpbml0ZSBzY3JvbGxpbmcgc3RhdGUgdXBkYXRlc1xuICAgKiA2LiBDb21wbGV0ZXMgYW55IHByb3ZpZGVkIGV2ZW50IChsaWtlIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpXG4gICAqXG4gICAqIEBwYXJhbSB7SW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IFJlZnJlc2hlckN1c3RvbUV2ZW50IHwgYm9vbGVhbn0gZXZlbnQgLSBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHJlZnJlc2gsXG4gICAqIG9yIGEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBpcyBhIGZvcmNlZCByZWZyZXNoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gICAqICAgcGFydGljaXBhbnQgRSBhcyBFdmVudCBTeXN0ZW1cbiAgICpcbiAgICogICBMLT4+TDogcmVmcmVzaChldmVudClcbiAgICogICBMLT4+TDogU2V0IHJlZnJlc2hpbmcgZmxhZ1xuICAgKiAgIEwtPj5MOiBDYWxjdWxhdGUgc3RhcnQgYW5kIGxpbWl0XG4gICAqICAgYWx0IFVzaW5nIG1vZGVsXG4gICAqICAgICBMLT4+RDogZ2V0RnJvbU1vZGVsKGZvcmNlLCBzdGFydCwgbGltaXQpXG4gICAqICAgICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgZWxzZSBVc2luZyByZXF1ZXN0XG4gICAqICAgICBMLT4+RDogZ2V0RnJvbVJlcXVlc3QoZm9yY2UsIHN0YXJ0LCBsaW1pdClcbiAgICogICAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAgICogICBlbmRcbiAgICogICBMLT4+RTogcmVmcmVzaEV2ZW50RW1pdCgpXG4gICAqICAgYWx0IEluZmluaXRlIHNjcm9sbGluZyBtb2RlXG4gICAqICAgICBMLT4+TDogQ2hlY2sgaWYgcmVhY2hlZCBsYXN0IHBhZ2VcbiAgICogICAgIGFsdCBMYXN0IHBhZ2UgcmVhY2hlZFxuICAgKiAgICAgICBMLT4+TDogQ29tcGxldGUgc2Nyb2xsIGV2ZW50XG4gICAqICAgICAgIEwtPj5MOiBEaXNhYmxlIGxvYWRNb3JlRGF0YVxuICAgKiAgICAgZWxzZSBNb3JlIHBhZ2VzIGF2YWlsYWJsZVxuICAgKiAgICAgICBMLT4+TDogSW5jcmVtZW50IHBhZ2UgbnVtYmVyXG4gICAqICAgICAgIEwtPj5MOiBDb21wbGV0ZSBzY3JvbGwgZXZlbnQgYWZ0ZXIgZGVsYXlcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgUGFnaW5hdGVkIG1vZGVcbiAgICogICAgIEwtPj5MOiBDbGVhciByZWZyZXNoaW5nIGZsYWcgYWZ0ZXIgZGVsYXlcbiAgICogICBlbmRcbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpCYWNrQnV0dG9uTmF2aWdhdGlvbkVuZEV2ZW50JywgWyckZXZlbnQnXSlcbiAgYXN5bmMgcmVmcmVzaChldmVudDogSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IFJlZnJlc2hlckN1c3RvbUV2ZW50IHwgYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gIGlmKHR5cGVvZiBmb3JjZSAhPT0gJ2Jvb2xlYW4nICYmIGZvcmNlLnR5cGUgPT09IEV2ZW50Q29uc3RhbnRzLkJBQ0tfQlVUVE9OX05BVklHQVRJT04pIHtcbiAgICAvLyAgICBjb25zdCB7cmVmcmVzaH0gPSAoZm9yY2UgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbDtcbiAgICAvLyAgICBpZighcmVmcmVzaClcbiAgICAvLyAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyAgfVxuXG4gICAgdGhpcy5yZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFydDogbnVtYmVyID0gdGhpcy5wYWdlID4gMSA/ICh0aGlzLnBhZ2UgLSAxKSAqIHRoaXMubGltaXQgOiB0aGlzLnN0YXJ0O1xuICAgIGNvbnN0IGxpbWl0OiBudW1iZXIgPSAodGhpcy5wYWdlICogKHRoaXMubGltaXQgPiAxMiA/IDEyIDogdGhpcy5saW1pdCkpO1xuXG4gICAgdGhpcy5kYXRhID0gIXRoaXMubW9kZWwgP1xuICAgICAgYXdhaXQgdGhpcy5nZXRGcm9tUmVxdWVzdCghIWV2ZW50LCBzdGFydCwgbGltaXQpXG4gICAgICA6IGF3YWl0IHRoaXMuZ2V0RnJvbU1vZGVsKCEhZXZlbnQpIGFzIEtleVZhbHVlW107XG5cbiAgICB0aGlzLnJlZnJlc2hFdmVudEVtaXQoKTtcblxuICAgIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSkge1xuICAgICAgaWYodGhpcy5wYWdlID09PSB0aGlzLnBhZ2VzKSB7XG4gICAgICAgIGlmKChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KT8udGFyZ2V0KVxuICAgICAgICAgIChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KS50YXJnZXQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGFnZSArPSAxO1xuICAgICAgICB0aGlzLnJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZigoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCk/LnRhcmdldCAmJiAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQpPy50eXBlICE9PSBFdmVudENvbnN0YW50cy5CQUNLX0JVVFRPTl9OQVZJR0FUSU9OKVxuICAgICAgICAgICAgICAoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCkudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgIH0sIDIwMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBhZ2luYXRpb24gZXZlbnRzIGZyb20gdGhlIHBhZ2luYXRpb24gY29tcG9uZW50LlxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIHBhZ2luYXRpb24gZXZlbnRzIGJ5IHVwZGF0aW5nIHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyIGFuZFxuICogcmVmcmVzaGluZyB0aGUgbGlzdCBkYXRhIHRvIGRpc3BsYXkgdGhlIHNlbGVjdGVkIHBhZ2UuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICogd2hlbiBhIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIHBhZ2luYXRpb24gY29udHJvbHMgdG8gbmF2aWdhdGUgYmV0d2VlbiBwYWdlcy5cbiAqXG4gKiBAcGFyYW0ge1BhZ2luYXRpb25DdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgcGFnaW5hdGlvbiBldmVudCBjb250YWluaW5nIHBhZ2UgaW5mb3JtYXRpb25cbiAqIEByZXR1cm5zIHt2b2lkfVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmhhbmRsZVBhZ2luYXRlKGV2ZW50OiBQYWdpbmF0aW9uQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgY29uc3QgeyBwYWdlfSA9IGV2ZW50LmRhdGE7XG4gIHRoaXMucGFnZSA9IHBhZ2U7XG4gIHRoaXMucmVmcmVzaCh0cnVlKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwdWxsLXRvLXJlZnJlc2ggZXZlbnRzIGZyb20gdGhlIHJlZnJlc2hlciBjb21wb25lbnQuXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgcmVmcmVzaCBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHB1bGxpbmcgZG93biBvbiB0aGUgbGlzdFxuICogb3IgYnkgcHJvZ3JhbW1hdGljIHJlZnJlc2ggcmVxdWVzdHMuIFRoaXMgbWV0aG9kIHJlZnJlc2hlcyB0aGUgbGlzdCBkYXRhIGFuZFxuICogY29tcGxldGVzIHRoZSByZWZyZXNoZXIgYW5pbWF0aW9uIHdoZW4gdGhlIGRhdGEgaXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSB7SW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IEN1c3RvbUV2ZW50fSBbZXZlbnRdIC0gVGhlIHJlZnJlc2ggZXZlbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGhhbmRsZVJlZnJlc2goZXZlbnQ/OiBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHwgQ3VzdG9tRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgdGhpcy5yZWZyZXNoKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfHwgdHJ1ZSk7XG4gIGlmKGV2ZW50IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBBbnkgY2FsbHMgdG8gbG9hZCBkYXRhIGdvIGhlcmVcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTElvblJlZnJlc2hlckVsZW1lbnQpLmNvbXBsZXRlKCk7XG4gICAgfSwgNDAwKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmlsdGVycyBkYXRhIGJhc2VkIG9uIGEgc2VhcmNoIHN0cmluZy5cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyB0aGUgY3VycmVudCBkYXRhIGFycmF5IHRvIGZpbmQgaXRlbXMgdGhhdCBtYXRjaCB0aGUgcHJvdmlkZWRcbiAqIHNlYXJjaCBzdHJpbmcuIFRoaXMgdXNlcyB0aGUgYXJyYXlRdWVyeUJ5U3RyaW5nIHV0aWxpdHkgdG8gcGVyZm9ybSB0aGUgZmlsdGVyaW5nXG4gKiBhY3Jvc3MgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXX0gcmVzdWx0cyAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBzZWFyY2ggdGhyb3VnaFxuICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaCAtIFRoZSBzZWFyY2ggc3RyaW5nIHRvIGZpbHRlciBieVxuICogQHJldHVybnMge0tleVZhbHVlW119IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWx0ZXJlZCBhcnJheSBvZiBpdGVtc1xuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbiAgcGFyc2VTZWFyY2hSZXN1bHRzKHJlc3VsdHM6IEtleVZhbHVlW10sIHNlYXJjaDogc3RyaW5nKTogS2V5VmFsdWVbXSB7XG4gICAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKChpdGVtOiBLZXlWYWx1ZSkgPT5cbiAgICAgIE9iamVjdC52YWx1ZXMoaXRlbSkuc29tZSh2YWx1ZSA9PlxuICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygoc2VhcmNoIGFzIHN0cmluZyk/LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIClcbiAgICApO1xuICB9XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZldGNoZXMgZGF0YSBmcm9tIGEgcmVxdWVzdCBzb3VyY2UuXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgZGF0YSBmcm9tIHRoZSBjb25maWd1cmVkIHNvdXJjZSBmdW5jdGlvbiBvciBVUkwsIHByb2Nlc3NlcyBpdCxcbiAqIGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBkYXRhIHN0YXRlLiBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbCBkYXRhIGxvYWRpbmdcbiAqIGFuZCBzdWJzZXF1ZW50IHJlZnJlc2ggb3BlcmF0aW9ucyB3aGVuIHVzaW5nIGFuIGV4dGVybmFsIGRhdGEgc291cmNlIHJhdGhlciB0aGFuIGEgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIFdoZXRoZXIgdG8gZm9yY2UgYSByZWZyZXNoIGV2ZW4gaWYgZGF0YSBhbHJlYWR5IGV4aXN0c1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGluZGV4IGZvciBwYWdpbmF0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0cmlldmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPEtleVZhbHVlW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmV0Y2hlZCBkYXRhXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuYXN5bmMgZ2V0RnJvbVJlcXVlc3QoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSwgc3RhcnQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBsZXQgcmVxdWVzdDogS2V5VmFsdWVbXSA9IFtdO1xuICBpZighdGhpcy5kYXRhPy5sZW5ndGggfHwgZm9yY2UgfHwgKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoIHx8ICEhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgIC8vIChzZWxmLmRhdGEgYXMgTGlzdEl0ZW1bXSkgPSBbXTtcbiAgICBpZighKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoICYmICEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgICBpZighdGhpcy5zb3VyY2UgJiYgIXRoaXMuZGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ05vIGRhdGEgYW5kIHNvdXJjZSBwYXNzZWQgdG8gaW5maW5pdGUgbGlzdCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGlmKHRoaXMuc291cmNlIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnNvdXJjZSgpO1xuXG4gICAgICBpZighQXJyYXkuaXNBcnJheShyZXF1ZXN0KSlcbiAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3Q/LlsncmVzcG9uc2UnXT8uWydkYXRhJ10gfHwgcmVxdWVzdD8uWydyZXN1bHRzJ10gfHwgW107XG4gICAgICB0aGlzLmRhdGEgPSBbLi4uIGF3YWl0IHRoaXMucGFyc2VSZXN1bHQocmVxdWVzdCldO1xuICAgICAgaWYodGhpcy5kYXRhPy5sZW5ndGgpXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUgP1xuICAgICAgICAgICh0aGlzLml0ZW1zIHx8IFtdKS5jb25jYXQoWy4uLnRoaXMuZGF0YS5zbGljZShzdGFydCwgbGltaXQpXSkgOiBbLi4ucmVxdWVzdC5zbGljZShzdGFydCwgbGltaXQpIGFzIEtleVZhbHVlW11dO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLnBhcnNlU2VhcmNoUmVzdWx0cyh0aGlzLmRhdGEgYXMgW10sIHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgaWYodGhpcy5sb2FkTW9yZURhdGEgJiYgdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLlBBR0lOQVRFRClcbiAgICB0aGlzLmdldE1vcmVEYXRhKHRoaXMuZGF0YT8ubGVuZ3RoIHx8IDApO1xuICByZXR1cm4gdGhpcy5kYXRhIHx8IFtdIGFzIEtleVZhbHVlW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZldGNoZXMgZGF0YSBmcm9tIGEgbW9kZWwgc291cmNlLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBtb2RlbCB1c2luZyBpdHMgcGFnaW5hdGlvbiBvciBmaW5kIG1ldGhvZHMsXG4gKiBwcm9jZXNzZXMgaXQsIGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQncyBkYXRhIHN0YXRlLiBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbFxuICogZGF0YSBsb2FkaW5nIGFuZCBzdWJzZXF1ZW50IHJlZnJlc2ggb3BlcmF0aW9ucyB3aGVuIHVzaW5nIGEgbW9kZWwgYXMgdGhlIGRhdGEgc291cmNlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBXaGV0aGVyIHRvIGZvcmNlIGEgcmVmcmVzaCBldmVuIGlmIGRhdGEgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBzdGFydGluZyBpbmRleCBmb3IgcGFnaW5hdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlWYWx1ZVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZldGNoZWQgZGF0YVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGdldEZyb21Nb2RlbChmb3JjZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxLZXlWYWx1ZVtdPiB7XG4gIGxldCBkYXRhID0gWyAuLi4gdGhpcy5kYXRhIHx8IFtdXTtcbiAgbGV0IHJlcXVlc3Q6IEtleVZhbHVlW10gPSBbXTtcblxuICAvLyBnZXR0aW5nIG1vZGVsIHJlcG9zaXRvcnlcbiAgaWYoIXRoaXMuX3JlcG9zaXRvcnkpXG4gICAgdGhpcy5fcmVwb3NpdG9yeSA9IHRoaXMucmVwb3NpdG9yeTtcbiAgY29uc3QgcmVwbyA9IHRoaXMuX3JlcG9zaXRvcnkgYXMgRGVjYWZSZXBvc2l0b3J5PE1vZGVsPjtcbiAgaWYoIXRoaXMuZGF0YT8ubGVuZ3RoIHx8IGZvcmNlIHx8ICh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCB8fCAhISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICB0cnkge1xuICAgICBpZighKHRoaXMuc2VhcmNoVmFsdWUgYXMgc3RyaW5nKT8ubGVuZ3RoICYmICEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgICAgICh0aGlzLmRhdGEgYXMgS2V5VmFsdWVbXSkgPSBbXTtcbiAgICAgICAgLy8gY29uc3QgcmF3UXVlcnkgPSB0aGlzLnBhcnNlUXVlcnkoc2VsZi5tb2RlbCBhcyBSZXBvc2l0b3J5PE1vZGVsPiwgc3RhcnQsIGxpbWl0KTtcbiAgICAgICAgLy8gcmVxdWVzdCA9IHRoaXMucGFyc2VSZXN1bHQoYXdhaXQgKHRoaXMubW9kZWwgYXMgYW55KT8ucGFnaW5hdGUoc3RhcnQsIGxpbWl0KSk7XG4gICAgICAgICAgaWYoIXRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRvciA9IGF3YWl0IHJlcG9cbiAgICAgICAgICAgICAgLnNlbGVjdCgpXG4gICAgICAgICAgICAgIC5vcmRlckJ5KFt0aGlzLnBrIGFzIGtleW9mIE1vZGVsLCB0aGlzLnNvcnREaXJlY3Rpb25dKVxuICAgICAgICAgICAgICAucGFnaW5hdGUodGhpcy5saW1pdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KHRoaXMucGFnaW5hdG9yKTtcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYoIXRoaXMuaW5kZXhlcylcbiAgICAgICAgICB0aGlzLmluZGV4ZXMgPSAoT2JqZWN0LnZhbHVlcyh0aGlzLm1hcHBlcikgfHwgW3RoaXMucGtdKTtcblxuICAgICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLnBhcnNlQ29uZGl0aW9ucyh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyB8IG51bWJlciB8IElGaWx0ZXJRdWVyeSk7XG4gICAgICAgIHJlcXVlc3QgPSBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KGF3YWl0IHJlcG8ucXVlcnkoY29uZGl0aW9uLCAodGhpcy5zb3J0QnkgfHwgdGhpcy5waykgYXMga2V5b2YgTW9kZWwsIHRoaXMuc29ydERpcmVjdGlvbikpO1xuICAgICAgICBkYXRhID0gW107XG4gICAgICB9XG4gICAgICBkYXRhID0gdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFID8gWy4uLiAoZGF0YSkuY29uY2F0KHJlcXVlc3QpXSA6IFsuLi5yZXF1ZXN0XTtcbiAgICB9IGNhdGNoKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcigoZXJyb3IgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IGBVbmFibGUgdG8gZmluZCAke3RoaXMubW9kZWx9IG9uIHJlZ2lzdHJ5LiBSZXR1cm4gZW1wdHkgYXJyYXkgZnJvbSBjb21wb25lbnRgKTtcbiAgICB9XG4gIH1cblxuICBpZihkYXRhPy5sZW5ndGgpIHtcbiAgICBpZih0aGlzLnNlYXJjaFZhbHVlKSB7XG4gICAgICB0aGlzLml0ZW1zID0gWy4uLmRhdGFdO1xuICAgICAgaWYodGhpcy5pdGVtcz8ubGVuZ3RoIDw9IHRoaXMubGltaXQpXG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXRlbXMgPSBbLi4uZGF0YV07XG4gICAgfVxuICB9XG4gIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5QQUdJTkFURUQgJiYgdGhpcy5wYWdpbmF0b3IpXG4gICAgICB0aGlzLmdldE1vcmVEYXRhKHRoaXMucGFnaW5hdG9yLnRvdGFsKTtcbiAgcmV0dXJuIGRhdGEgfHwgW10gYXMgS2V5VmFsdWVbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgc2VhcmNoIHZhbHVlcyBvciBmaWx0ZXIgcXVlcmllcyBpbnRvIGRhdGFiYXNlIGNvbmRpdGlvbnMuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHNlYXJjaCBpbnB1dCBvciBjb21wbGV4IGZpbHRlciBxdWVyaWVzIGludG8gQ29uZGl0aW9uIG9iamVjdHNcbiAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGRhdGFiYXNlIHF1ZXJ5aW5nLiBIYW5kbGVzIGJvdGggc2ltcGxlIHN0cmluZy9udW1iZXIgc2VhcmNoZXNcbiAqIGFjcm9zcyBpbmRleGVkIGZpZWxkcyBhbmQgY29tcGxleCBmaWx0ZXIgcXVlcmllcyB3aXRoIG11bHRpcGxlIGNyaXRlcmlhLlxuICpcbiAqIEZvciBzaW1wbGUgc2VhcmNoZXMgKHN0cmluZy9udW1iZXIpOlxuICogLSBDcmVhdGVzIGNvbmRpdGlvbnMgdGhhdCBzZWFyY2ggYWNyb3NzIGFsbCBpbmRleGVkIGZpZWxkc1xuICogLSBVc2VzIGVxdWFsaXR5IGZvciBudW1lcmljIHZhbHVlcyBhbmQgcmVnZXggZm9yIHN0cmluZyB2YWx1ZXNcbiAqIC0gQ29tYmluZXMgY29uZGl0aW9ucyB3aXRoIE9SIGxvZ2ljIHRvIHNlYXJjaCBtdWx0aXBsZSBmaWVsZHNcbiAqXG4gKiBGb3IgY29tcGxleCBmaWx0ZXIgcXVlcmllczpcbiAqIC0gUHJvY2Vzc2VzIGVhY2ggZmlsdGVyIGl0ZW0gd2l0aCBpdHMgc3BlY2lmaWMgY29uZGl0aW9uIHR5cGVcbiAqIC0gU3VwcG9ydHMgRXF1YWwsIE5vdCBFcXVhbCwgQ29udGFpbnMsIE5vdCBDb250YWlucywgR3JlYXRlciBUaGFuLCBMZXNzIFRoYW5cbiAqIC0gVXBkYXRlcyBzb3J0IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIGZpbHRlciBxdWVyeVxuICogLSBDb21iaW5lcyBtdWx0aXBsZSBmaWx0ZXIgY29uZGl0aW9ucyB3aXRoIE9SIGxvZ2ljXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnl9IHZhbHVlIC0gVGhlIHNlYXJjaCB2YWx1ZSBvciBmaWx0ZXIgcXVlcnkgb2JqZWN0XG4gKiBAcmV0dXJucyB7Q29uZGl0aW9uPE1vZGVsPn0gQSBDb25kaXRpb24gb2JqZWN0IGZvciBkYXRhYmFzZSBxdWVyeWluZ1xuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucGFyc2VDb25kaXRpb25zKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnkpOiBDb25kaXRpb248TW9kZWw+IHtcbiAgbGV0IF9jb25kaXRpb246IENvbmRpdGlvbjxNb2RlbD47XG4gIGlmKHR5cGVvZiB2YWx1ZSA9PT0gUHJpbWl0aXZlcy5TVFJJTkcgfHwgdHlwZW9mIHZhbHVlID09PSBQcmltaXRpdmVzLk5VTUJFUikge1xuICAgIF9jb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPih0aGlzLnBrIGFzIGtleW9mIE1vZGVsKS5lcSghaXNOYU4odmFsdWUgYXMgbnVtYmVyKSA/IE51bWJlcih2YWx1ZSkgOiB2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgICAgaWYoaW5kZXggPT09IHRoaXMucGspXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxldCBvckNvbmRpdGlvbjtcbiAgICAgICAgaWYoIWlzTmFOKHZhbHVlIGFzIG51bWJlcikpIHtcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5lcShOdW1iZXIodmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAodmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBfY29uZGl0aW9uID0gX2NvbmRpdGlvbi5vcihvckNvbmRpdGlvbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHtxdWVyeSwgc29ydH0gPSB2YWx1ZSBhcyBJRmlsdGVyUXVlcnk7XG4gICAgX2NvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KHRoaXMucGsgYXMga2V5b2YgTW9kZWwpLmRpZignbnVsbCcpO1xuXG4gICAgaWYocXVlcnk/Lmxlbmd0aClcbiAgICAgIF9jb25kaXRpb24gPSB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBDb25kaXRpb248TW9kZWw+O1xuXG4gICAgKHF1ZXJ5IHx8IFtdKS5mb3JFYWNoKChpdGVtOiBJRmlsdGVyUXVlcnlJdGVtKSA9PiB7XG4gICAgICBjb25zdCB7dmFsdWUsIGNvbmRpdGlvbiwgaW5kZXh9ID0gaXRlbTtcbiAgICAgIGxldCB2YWwgPSB2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBpZihpbmRleCA9PT0gdGhpcy5wayB8fCAhaXNOYU4odmFsIGFzIG51bWJlcikpXG4gICAgICAgIHZhbCA9IE51bWJlcih2YWwpO1xuICAgICAgbGV0IG9yQ29uZGl0aW9uO1xuICAgICAgc3dpdGNoIChjb25kaXRpb24pIHtcbiAgICAgICAgY2FzZSBcIkVxdWFsXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZXEodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk5vdCBFcXVhbFwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmRpZih2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTm90IENvbnRhaW5zXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSAhQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLnJlZ2V4cChuZXcgUmVnRXhwKGBeKD8hLioke3ZhbH0pLiokYCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQ29udGFpbnNcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAodmFsIGFzIHN0cmluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJHcmVhdGVyIFRoYW5cIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5ndGUodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkxlc3MgVGhhblwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmx0ZSh2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgX2NvbmRpdGlvbiA9ICghX2NvbmRpdGlvbiA/XG4gICAgICAgIG9yQ29uZGl0aW9uIDogX2NvbmRpdGlvbi5hbmQob3JDb25kaXRpb24gYXMgdW5rbm93biBhcyBDb25kaXRpb248TW9kZWw+KSkgYXMgQ29uZGl0aW9uPE1vZGVsPjtcbiAgICB9KTtcblxuICAgIHRoaXMuc29ydEJ5ID0gc29ydD8udmFsdWUgYXMga2V5b2YgTW9kZWwgfHwgdGhpcy5waztcbiAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSBzb3J0Py5kaXJlY3Rpb24gfHwgdGhpcy5zb3J0RGlyZWN0aW9uO1xuICB9XG4gIHJldHVybiBfY29uZGl0aW9uIGFzIENvbmRpdGlvbjxNb2RlbD47XG5cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIHF1ZXJ5IHJlc3VsdHMgaW50byBhIHN0YW5kYXJkaXplZCBmb3JtYXQuXG4gKiBAc3VtbWFyeSBIYW5kbGVzIGRpZmZlcmVudCByZXN1bHQgZm9ybWF0cyBmcm9tIHZhcmlvdXMgZGF0YSBzb3VyY2VzLCBleHRyYWN0aW5nXG4gKiBwYWdpbmF0aW9uIGluZm9ybWF0aW9uIHdoZW4gYXZhaWxhYmxlIGFuZCBhcHBseWluZyBhbnkgY29uZmlndXJlZCBkYXRhIG1hcHBpbmcuXG4gKiBUaGlzIGVuc3VyZXMgY29uc2lzdGVudCBkYXRhIHN0cnVjdHVyZSByZWdhcmRsZXNzIG9mIHRoZSBzb3VyY2UuXG4gKlxuICogQHByb3RlY3RlZFxuICogQHBhcmFtIHtLZXlWYWx1ZVtdIHwgUGFnaW5hdG9yfSByZXN1bHQgLSBUaGUgcmF3IHF1ZXJ5IHJlc3VsdFxuICogQHJldHVybnMge0tleVZhbHVlW119IFRoZSBwcm9jZXNzZWQgYXJyYXkgb2YgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5wcm90ZWN0ZWQgYXN5bmMgcGFyc2VSZXN1bHQocmVzdWx0OiBLZXlWYWx1ZVtdIHwgUGFnaW5hdG9yPE1vZGVsPik6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBpZighQXJyYXkuaXNBcnJheShyZXN1bHQpICYmICgncGFnZScgaW4gcmVzdWx0ICYmICd0b3RhbCcgaW4gcmVzdWx0KSkge1xuICAgIGNvbnN0IHBhZ2luYXRvciA9IHJlc3VsdCBhcyBQYWdpbmF0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSh0aGlzLnBhZ2UpO1xuICAgICAgLy8gVE9ETzogQ2hhZ2UgZm9yIHJlc3VsdC50b3RhbDtcbiAgICAgIHRoaXMuZ2V0TW9yZURhdGEocGFnaW5hdG9yLnRvdGFsKTtcbiAgICB9IGNhdGNoKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKChlcnJvciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgJ1VuYWJsZSB0byBnZXQgcGFnZSBmcm9tIHBhZ2luYXRvci4gUmV0dXJuIGVtcHR5IGFycmF5IGZyb20gY29tcG9uZW50Jyk7XG4gICAgICByZXN1bHQgPSBbXTtcbiAgICB9XG5cbiAgfSBlbHNlIHtcbiAgICB0aGlzLmdldE1vcmVEYXRhKChyZXN1bHQgYXMgS2V5VmFsdWVbXSk/Lmxlbmd0aCB8fCAwKTtcbiAgfVxuICByZXR1cm4gKE9iamVjdC5rZXlzKHRoaXMubWFwcGVyIHx8IHt9KS5sZW5ndGgpID9cbiAgICB0aGlzLm1hcFJlc3VsdHMocmVzdWx0KSA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBwYWdpbmF0aW9uIHN0YXRlIGJhc2VkIG9uIGRhdGEgbGVuZ3RoLlxuICogQHN1bW1hcnkgQ2FsY3VsYXRlcyB3aGV0aGVyIG1vcmUgZGF0YSBpcyBhdmFpbGFibGUgYW5kIGhvdyBtYW55IHBhZ2VzIGV4aXN0XG4gKiBiYXNlZCBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGFuZCB0aGUgY29uZmlndXJlZCBsaW1pdCBwZXIgcGFnZS5cbiAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBjb250cm9sIHBhZ2luYXRpb24gVUkgYW5kIGluZmluaXRlIHNjcm9sbGluZyBiZWhhdmlvci5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBhdmFpbGFibGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmdldE1vcmVEYXRhKGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSkge1xuICAgIGlmKHRoaXMucGFnaW5hdG9yKVxuICAgICAgbGVuZ3RoID0gbGVuZ3RoICogdGhpcy5saW1pdDtcbiAgICBpZihsZW5ndGggPD0gdGhpcy5saW1pdCkge1xuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWdlcyA9IE1hdGguZmxvb3IobGVuZ3RoIC8gdGhpcy5saW1pdCk7XG4gICAgICBpZigodGhpcy5wYWdlcyAqIHRoaXMubGltaXQpIDwgbGVuZ3RoKVxuICAgICAgICB0aGlzLnBhZ2VzICs9IDE7XG4gICAgICBpZih0aGlzLnBhZ2VzID09PSAxKVxuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLnBhZ2VzID0gbGVuZ3RoO1xuICAgIGlmKHRoaXMucGFnZXMgPT09IDEpXG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHMgYSBzaW5nbGUgaXRlbSB1c2luZyB0aGUgY29uZmlndXJlZCBtYXBwZXIuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIGEgZGF0YSBpdGVtIGFjY29yZGluZyB0byB0aGUgbWFwcGluZyBjb25maWd1cmF0aW9uLFxuICogZXh0cmFjdGluZyBuZXN0ZWQgcHJvcGVydGllcyBhbmQgZm9ybWF0dGluZyB2YWx1ZXMgYXMgbmVlZGVkLiBUaGlzIGFsbG93c1xuICogdGhlIGNvbXBvbmVudCB0byBkaXNwbGF5IGRhdGEgaW4gYSBmb3JtYXQgZGlmZmVyZW50IGZyb20gaG93IGl0J3Mgc3RvcmVkLlxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSB7S2V5VmFsdWV9IGl0ZW0gLSBUaGUgaXRlbSB0byBtYXBcbiAqIEBwYXJhbSB7S2V5VmFsdWV9IG1hcHBlciAtIFRoZSBtYXBwaW5nIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7S2V5VmFsdWV9IFtwcm9wc10gLSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gaW5jbHVkZVxuICogQHJldHVybnMge0tleVZhbHVlfSBUaGUgbWFwcGVkIGl0ZW1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5wcm90ZWN0ZWQgaXRlbU1hcHBlcihpdGVtOiBLZXlWYWx1ZSwgbWFwcGVyOiBLZXlWYWx1ZSwgcHJvcHM/OiBLZXlWYWx1ZSk6IEtleVZhbHVlIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG1hcHBlcikucmVkdWNlKChhY2N1bTogS2V5VmFsdWUsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IGFycmF5VmFsdWUgPSB2YWx1ZS5zcGxpdCgnLicpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGFjY3VtW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFycmF5VmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHZhbHVlID0gaXRlbT8uW3ZhbHVlXSA/IGl0ZW1bdmFsdWVdIDogdmFsdWUgIT09IGtleSA/IHZhbHVlIDogXCJcIjtcbiAgICAgICAgaWYoaXNWYWxpZERhdGUodmFsdWUpKVxuICAgICAgICAgIHZhbHVlID0gYCR7Zm9ybWF0RGF0ZSh2YWx1ZSl9YDtcbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHZhbDtcblxuICAgICAgICBmb3IgKGNvbnN0IF92YWx1ZSBvZiBhcnJheVZhbHVlKVxuICAgICAgICAgIHZhbCA9ICF2YWxcbiAgICAgICAgICAgID8gaXRlbVtfdmFsdWVdXG4gICAgICAgICAgICA6ICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UodmFsKSA6IHZhbClbX3ZhbHVlXTtcblxuXG4gICAgICAgIGlmIChpc1ZhbGlkRGF0ZShuZXcgRGF0ZSh2YWwpKSlcbiAgICAgICAgICB2YWwgPSBgJHtmb3JtYXREYXRlKHZhbCl9YDtcblxuICAgICAgICBhY2N1bVtrZXldID0gdmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB2YWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyB8fCB7fSwgYWNjdW0pO1xuICB9LCB7fSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHMgYWxsIHJlc3VsdCBpdGVtcyB1c2luZyB0aGUgY29uZmlndXJlZCBtYXBwZXIuXG4gKiBAc3VtbWFyeSBBcHBsaWVzIHRoZSBpdGVtTWFwcGVyIHRvIGVhY2ggaXRlbSBpbiB0aGUgcmVzdWx0IHNldCwgYWRkaW5nXG4gKiBjb21tb24gcHJvcGVydGllcyBsaWtlIG9wZXJhdGlvbnMgYW5kIHJvdXRlIGluZm9ybWF0aW9uLiBUaGlzIHRyYW5zZm9ybXNcbiAqIHRoZSByYXcgZGF0YSBpbnRvIHRoZSBmb3JtYXQgZXhwZWN0ZWQgYnkgdGhlIGxpc3QgaXRlbSBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXX0gZGF0YSAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byBtYXBcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBUaGUgYXJyYXkgb2YgbWFwcGVkIGl0ZW1zXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuICBtYXBSZXN1bHRzKGRhdGE6IEtleVZhbHVlW10pOiBLZXlWYWx1ZVtdIHtcbiAgICBpZighZGF0YSB8fCAhZGF0YS5sZW5ndGgpXG4gICAgICByZXR1cm4gW107XG4gICAgLy8gcGFzc2luZyB1aWQgYXMgcHJvcCB0byBtYXBwZXJcbiAgICB0aGlzLm1hcHBlciA9IHsuLi4gdGhpcy5tYXBwZXIsIC4uLiB7dWlkOiB0aGlzLnBrfX07XG4gICAgY29uc3QgcHJvcHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIG9wZXJhdGlvbnM6IHRoaXMub3BlcmF0aW9ucyxcbiAgICAgIHJvdXRlOiB0aGlzLnJvdXRlLFxuICAgICAgLi4uICBPYmplY3Qua2V5cyh0aGlzLml0ZW0pLnJlZHVjZSgoYWNjOiBLZXlWYWx1ZSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSB0aGlzLml0ZW1ba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KSxcbiAgICAgIC8vIC4uLiAoIXRoaXMuaXRlbS5yZW5kZXIgPyB7fSA6ICBPYmplY3Qua2V5cyh0aGlzLml0ZW0pLnJlZHVjZSgoYWNjOiBLZXlWYWx1ZSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vICAgYWNjW2tleV0gPSB0aGlzLml0ZW1ba2V5IGFzIGtleW9mIElMaXN0SXRlbVByb3BdO1xuICAgICAgLy8gICByZXR1cm4gYWNjO1xuICAgICAgLy8gfSwge30pKVxuICAgIH0pO1xuICAgIHJldHVybiBkYXRhLnJlZHVjZSgoYWNjdW06IEtleVZhbHVlW10sIGN1cnIpID0+IHtcbiAgICAgICAgYWNjdW0ucHVzaCh7Li4uIHRoaXMuaXRlbU1hcHBlcihjdXJyLCB0aGlzLm1hcHBlciBhcyBLZXlWYWx1ZSwgcHJvcHMpLCAuLi4ge3BrOiB0aGlzLnBrfX0pO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG59XG5cbiIsIlxuQGlmKHNob3dSZWZyZXNoZXIpIHtcbiAgPGlvbi1yZWZyZXNoZXIgc2xvdD1cImZpeGVkXCIgW3B1bGxGYWN0b3JdPVwiMVwiIFtwdWxsTWluXT1cIjEwMFwiIFtwdWxsTWF4XT1cIjIwMFwiIChpb25SZWZyZXNoKT1cImhhbmRsZVJlZnJlc2goJGV2ZW50KVwiPlxuICAgIDxpb24tcmVmcmVzaGVyLWNvbnRlbnQgLz5cbiAgPC9pb24tcmVmcmVzaGVyPlxufVxuXG5AaWYoc2hvd1NlYXJjaGJhciAmJiBkYXRhPy5sZW5ndGgpIHtcbiAgQGlmKG1vZGVsICYmIGVuYWJsZUZpbHRlcikge1xuICAgIDxuZ3gtZGVjYWYtZmlsdGVyXG4gICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgW3NvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiXG4gICAgICBbZGlzYWJsZVNvcnRdPVwiZGlzYWJsZVNvcnRcIlxuICAgICAgKGZpbHRlckV2ZW50KT1cImhhbmRsZUZpbHRlcigkZXZlbnQpXCJcbiAgICAgIChzZWFyY2hFdmVudCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiXG4gICAgLz5cbiAgfSBAZWxzZSB7XG4gICAgPG5neC1kZWNhZi1zZWFyY2hiYXIgW2VtaXRFdmVudFRvV2luZG93XT1cImZhbHNlXCIgW2RlYm91bmNlXT1cIjUwMFwiIChzZWFyY2hFdmVudCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiIC8+XG4gIH1cbn1cblxuQGlmKGRhdGE/Lmxlbmd0aCkge1xuICA8aW9uLWxpc3QgW2lkXT1cInVpZFwiIFtpbnNldF09XCJpbnNldFwiIFtsaW5lc109XCJsaW5lc1wiICNjb21wb25lbnQ+XG4gICAgQGlmKGl0ZW0/LnRhZykge1xuICAgICAgQGZvcihjaGlsZCBvZiBpdGVtczsgdHJhY2sgdHJhY2tJdGVtRm4oJGluZGV4LCBjaGlsZCkpIHtcbiAgICAgICAgPG5neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXJcbiAgICAgICAgICBbdGFnXT1cIml0ZW0udGFnXCJcbiAgICAgICAgICAobGlzdGVuRXZlbnQpPVwiaGFuZGxlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgW2dsb2JhbHNdPSd7XG4gICAgICAgICAgICBpdGVtOiBjaGlsZCxcbiAgICAgICAgICAgIG1hcHBlcjogbWFwcGVyLFxuICAgICAgICAgICAgcm91dGU6IHJvdXRlXG4gICAgICAgICAgfSc+XG4gICAgICAgICAgPC9uZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyPlxuICAgICAgICB9XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2lvbi1saXN0PlxuXG4gIEBpZihsb2FkTW9yZURhdGEpIHtcbiAgICBAaWYocGFnZXMgPiAwICYmIHR5cGUgPT09ICdwYWdpbmF0ZWQnICYmICFzZWFyY2hWYWx1ZT8ubGVuZ3RoKSB7XG4gICAgICA8bmd4LWRlY2FmLXBhZ2luYXRpb25cbiAgICAgICAgW3RvdGFsUGFnZXNdPVwicGFnZXNcIlxuICAgICAgICBbY3VycmVudF09XCJwYWdlXCJcbiAgICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlUGFnaW5hdGUoJGV2ZW50KVwiXG4gICAgICAvPlxuXG4gICAgfSBAZWxzZSB7XG4gICAgICA8aW9uLWluZmluaXRlLXNjcm9sbFxuICAgICAgICBbY2xhc3NdPVwic2VhcmNoVmFsdWU/Lmxlbmd0aCA/ICdkY2YtaGlkZGVuJyA6ICcnXCJcblxuICAgICAgICBbcG9zaXRpb25dPVwic2Nyb2xsUG9zaXRpb25cIlxuICAgICAgICBbdGhyZXNob2xkXT1cInNjcm9sbFRocmVzaG9sZFwiXG4gICAgICAgIChpb25JbmZpbml0ZSk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAgICAgICAgPGlvbi1pbmZpbml0ZS1zY3JvbGwtY29udGVudCBbbG9hZGluZ1NwaW5uZXJdPVwibG9hZGluZ1NwaW5uZXJcIiBbbG9hZGluZ1RleHRdPVwibG9hZGluZ1RleHRcIiAvPlxuICAgICAgPC9pb24taW5maW5pdGUtc2Nyb2xsPlxuICAgIH1cbiAgfVxufSBAZWxzZSB7XG4gIEBpZihyZWZyZXNoaW5nKSB7XG4gICAgQGZvcihza2wgb2Ygc2tlbGV0b25EYXRhOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgIDxpb24taXRlbT5cbiAgICAgICAgPGlvbi10aHVtYm5haWwgc2xvdD1cInN0YXJ0XCI+XG4gICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgPC9pb24tdGh1bWJuYWlsPlxuICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiZGF0ZVwiIHN0eWxlPVwid2lkdGg6IDIwJTtcIj48aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PjwvaW9uLXRleHQ+XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24taXRlbT5cbiAgICB9XG5cbiAgfSBAZWxzZSB7XG4gICAgQGlmKCFzZWFyY2hWYWx1ZT8ubGVuZ3RoKSB7XG4gICAgICA8bmd4LWRlY2FmLWVtcHR5LXN0YXRlXG4gICAgICAgIFt0aXRsZV09XCIobG9jYWxlICsgJy4nKyBlbXB0eS50aXRsZSkgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbc3VidGl0bGVdPVwiKGxvY2FsZSArICcuJysgZW1wdHkuc3VidGl0bGUpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW2J1dHRvblRleHRdPVwiZW1wdHkuc2hvd0J1dHRvbiA/IChsb2NhbGUgKyAnLicrIGVtcHR5LmJ1dHRvbiB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgIFtidXR0b25MaW5rXT1cImVtcHR5LnNob3dCdXR0b24gPyBlbXB0eS5yb3V0ZSA6ICcnXCJcbiAgICAgIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmd4LWRlY2FmLWVtcHR5LXN0YXRlXG4gICAgICAgIGljb249XCJzZWFyY2gtb3V0bGluZVwiXG4gICAgICAgIG5nQ2xhc3M9XCJlbXB0eS1zZWFyY2hcIlxuICAgICAgICBbdHJhbnNsYXRhYmxlXT1cInRydWVcIlxuICAgICAgICB0aXRsZT1cInNlYXJjaC50aXRsZVwiXG4gICAgICAgIHN1YnRpdGxlPVwic2VhcmNoLnN1YnRpdGxlXCJcbiAgICAgICAgW3NlYXJjaFZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgIC8+XG4gICAgfVxuICB9XG59XG5cbiJdfQ==