@bnsights/bbsf-controls 1.0.191 → 1.0.193

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.
@@ -11,8 +11,9 @@ import * as i3 from "@angular/router";
11
11
  import * as i4 from "@angular/common";
12
12
  import * as i5 from "../../Shared/services/OnPagingFiltersChange.service";
13
13
  import * as i6 from "ngx-infinite-scroll";
14
- import * as i7 from "@angular/forms";
15
- import * as i8 from "./JwPagination.component";
14
+ import * as i7 from "@ng-bootstrap/ng-bootstrap";
15
+ import * as i8 from "@angular/forms";
16
+ import * as i9 from "./JwPagination.component";
16
17
  export class PagingComponent {
17
18
  constructor(utilityService, http, router, route, location, onChangeService, requestHandlerService, cdr) {
18
19
  this.utilityService = utilityService;
@@ -584,11 +585,11 @@ export class PagingComponent {
584
585
  return filters;
585
586
  }
586
587
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PagingComponent, deps: [{ token: i1.UtilityService }, { token: i2.HttpClient }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.Location }, { token: i5.OnPagingFiltersChangeService }, { token: i1.RequestHandlerService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
587
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PagingComponent, selector: "BBSF-Paging", inputs: { options: "options", group: "group" }, outputs: { Items: "Items", pageStateRestored: "pageStateRestored" }, host: { listeners: { "window:popstate": "onPopState($event)" } }, ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-paging\" *ngIf=\"(result.length > 0)\">\r\n <!--paging container-->\r\n <div class=\"bbsf-paging-container\" *ngIf=\"!options.isLoadMoreControl\">\r\n <!--items-->\r\n <div class=\"bbsf-pagination\">\r\n <jw-pagination [items]=\"items\" *ngIf=\"!((Pages==1)&&options.hidePaginationWhenPageSizeEqualOne)\"\r\n (changePage)=\"onChangePage($event)\" [pageSize]=\"options.pageSize\" [ShowFirstAndLast]=\"options.showFirstAndLast\"\r\n [initialPage]=\"currentPage\" [maxPages]=\"10\"></jw-pagination>\r\n </div>\r\n <!--page count-->\r\n <div class=\"bbsf-pages\" *ngIf=\"!((Pages==1)&&options.hidePaginationWhenPageSizeEqualOne)\">\r\n <select (change)=\"changePageSize($event)\" *ngIf=\"options.showPageSizeOption\">\r\n <option>10</option>\r\n <option>20</option>\r\n <option>50</option>\r\n <option>100</option>\r\n <option>200</option>\r\n </select>\r\n <div class=\"bssf-items\">\r\n <strong>{{totalRow}}</strong> {{itemsText}} {{utilityService.getResourceValue(\"In\")}} <strong>\r\n {{Pages}}</strong> {{pagesText}}\r\n </div>\r\n </div>\r\n </div>\r\n <!--load more-->\r\n <div class=\"bbsf-loadmore\" *ngIf=\"options.isLoadMoreControl\">\r\n <div class=\"search-results\" infinite-scroll [infiniteScrollDistance]=\"scrollDistance\"\r\n [infiniteScrollUpDistance]=\"scrollUpDistance\" [infiniteScrollThrottle]=\"throttle\"\r\n (scrolled)=\"options.isInfiniteScroll==true?onScrollDown():null\" [scrollWindow]=\"options.scrollWindow\"\r\n [infiniteScrollContainer]=\"options.infiniteScrollContainer\">\r\n </div>\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"onScrollDown()\"\r\n *ngIf=\"!(result.length==totalRow)\">{{utilityService.getResourceValue(\"LoadMore\")}}</button>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i8.JwPaginationComponent, selector: "jw-pagination", inputs: ["items", "initialPage", "pageSize", "maxPages", "ShowFirstAndLast"], outputs: ["changePage"] }] }); }
588
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PagingComponent, selector: "BBSF-Paging", inputs: { options: "options", group: "group" }, outputs: { Items: "Items", pageStateRestored: "pageStateRestored" }, host: { listeners: { "window:popstate": "onPopState($event)" } }, ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-paging\" *ngIf=\"(result.length > 0)\" role=\"navigation\" [attr.aria-label]=\"utilityService.getResourceValue('Pagination')\">\r\n <!--paging container-->\r\n <div class=\"bbsf-paging-container\" *ngIf=\"!options.isLoadMoreControl\">\r\n <!--items-->\r\n <div class=\"bbsf-pagination\">\r\n <jw-pagination [items]=\"items\" *ngIf=\"!((Pages==1)&&options.hidePaginationWhenPageSizeEqualOne)\"\r\n (changePage)=\"onChangePage($event)\" [pageSize]=\"options.pageSize\" [ShowFirstAndLast]=\"options.showFirstAndLast\"\r\n [initialPage]=\"currentPage\" [maxPages]=\"10\"></jw-pagination>\r\n </div>\r\n <!--page count-->\r\n <div class=\"bbsf-pages\" *ngIf=\"!((Pages==1)&&options.hidePaginationWhenPageSizeEqualOne)\">\r\n <select (change)=\"changePageSize($event)\" *ngIf=\"options.showPageSizeOption\" \r\n [attr.aria-label]=\"utilityService.getResourceValue('SelectPageSize')\" \r\n [ngbTooltip]=\"utilityService.getResourceValue('SelectPageSize')\">\r\n <option>10</option>\r\n <option>20</option>\r\n <option>50</option>\r\n <option>100</option>\r\n <option>200</option>\r\n </select>\r\n <div class=\"bssf-items\" [attr.aria-label]=\"utilityService.getResourceValue('PageInfo')\">\r\n <strong>{{totalRow}}</strong> {{itemsText}} {{utilityService.getResourceValue(\"In\")}} <strong>\r\n {{Pages}}</strong> {{pagesText}}\r\n </div>\r\n </div>\r\n </div>\r\n <!--load more-->\r\n <div class=\"bbsf-loadmore\" *ngIf=\"options.isLoadMoreControl\">\r\n <div class=\"search-results\" infinite-scroll [infiniteScrollDistance]=\"scrollDistance\"\r\n [infiniteScrollUpDistance]=\"scrollUpDistance\" [infiniteScrollThrottle]=\"throttle\"\r\n (scrolled)=\"options.isInfiniteScroll==true?onScrollDown():null\" [scrollWindow]=\"options.scrollWindow\"\r\n [infiniteScrollContainer]=\"options.infiniteScrollContainer\">\r\n </div>\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"onScrollDown()\"\r\n *ngIf=\"!(result.length==totalRow)\"\r\n [attr.aria-label]=\"utilityService.getResourceValue('LoadMore')\"\r\n [ngbTooltip]=\"utilityService.getResourceValue('LoadMore')\">{{utilityService.getResourceValue(\"LoadMore\")}}</button>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "directive", type: i7.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: i9.JwPaginationComponent, selector: "jw-pagination", inputs: ["items", "initialPage", "pageSize", "maxPages", "ShowFirstAndLast"], outputs: ["changePage"] }] }); }
588
589
  }
589
590
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PagingComponent, decorators: [{
590
591
  type: Component,
591
- args: [{ selector: 'BBSF-Paging', template: "<div class=\"form-group bbsf-control bbsf-paging\" *ngIf=\"(result.length > 0)\">\r\n <!--paging container-->\r\n <div class=\"bbsf-paging-container\" *ngIf=\"!options.isLoadMoreControl\">\r\n <!--items-->\r\n <div class=\"bbsf-pagination\">\r\n <jw-pagination [items]=\"items\" *ngIf=\"!((Pages==1)&&options.hidePaginationWhenPageSizeEqualOne)\"\r\n (changePage)=\"onChangePage($event)\" [pageSize]=\"options.pageSize\" [ShowFirstAndLast]=\"options.showFirstAndLast\"\r\n [initialPage]=\"currentPage\" [maxPages]=\"10\"></jw-pagination>\r\n </div>\r\n <!--page count-->\r\n <div class=\"bbsf-pages\" *ngIf=\"!((Pages==1)&&options.hidePaginationWhenPageSizeEqualOne)\">\r\n <select (change)=\"changePageSize($event)\" *ngIf=\"options.showPageSizeOption\">\r\n <option>10</option>\r\n <option>20</option>\r\n <option>50</option>\r\n <option>100</option>\r\n <option>200</option>\r\n </select>\r\n <div class=\"bssf-items\">\r\n <strong>{{totalRow}}</strong> {{itemsText}} {{utilityService.getResourceValue(\"In\")}} <strong>\r\n {{Pages}}</strong> {{pagesText}}\r\n </div>\r\n </div>\r\n </div>\r\n <!--load more-->\r\n <div class=\"bbsf-loadmore\" *ngIf=\"options.isLoadMoreControl\">\r\n <div class=\"search-results\" infinite-scroll [infiniteScrollDistance]=\"scrollDistance\"\r\n [infiniteScrollUpDistance]=\"scrollUpDistance\" [infiniteScrollThrottle]=\"throttle\"\r\n (scrolled)=\"options.isInfiniteScroll==true?onScrollDown():null\" [scrollWindow]=\"options.scrollWindow\"\r\n [infiniteScrollContainer]=\"options.infiniteScrollContainer\">\r\n </div>\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"onScrollDown()\"\r\n *ngIf=\"!(result.length==totalRow)\">{{utilityService.getResourceValue(\"LoadMore\")}}</button>\r\n </div>\r\n</div>" }]
592
+ args: [{ selector: 'BBSF-Paging', template: "<div class=\"form-group bbsf-control bbsf-paging\" *ngIf=\"(result.length > 0)\" role=\"navigation\" [attr.aria-label]=\"utilityService.getResourceValue('Pagination')\">\r\n <!--paging container-->\r\n <div class=\"bbsf-paging-container\" *ngIf=\"!options.isLoadMoreControl\">\r\n <!--items-->\r\n <div class=\"bbsf-pagination\">\r\n <jw-pagination [items]=\"items\" *ngIf=\"!((Pages==1)&&options.hidePaginationWhenPageSizeEqualOne)\"\r\n (changePage)=\"onChangePage($event)\" [pageSize]=\"options.pageSize\" [ShowFirstAndLast]=\"options.showFirstAndLast\"\r\n [initialPage]=\"currentPage\" [maxPages]=\"10\"></jw-pagination>\r\n </div>\r\n <!--page count-->\r\n <div class=\"bbsf-pages\" *ngIf=\"!((Pages==1)&&options.hidePaginationWhenPageSizeEqualOne)\">\r\n <select (change)=\"changePageSize($event)\" *ngIf=\"options.showPageSizeOption\" \r\n [attr.aria-label]=\"utilityService.getResourceValue('SelectPageSize')\" \r\n [ngbTooltip]=\"utilityService.getResourceValue('SelectPageSize')\">\r\n <option>10</option>\r\n <option>20</option>\r\n <option>50</option>\r\n <option>100</option>\r\n <option>200</option>\r\n </select>\r\n <div class=\"bssf-items\" [attr.aria-label]=\"utilityService.getResourceValue('PageInfo')\">\r\n <strong>{{totalRow}}</strong> {{itemsText}} {{utilityService.getResourceValue(\"In\")}} <strong>\r\n {{Pages}}</strong> {{pagesText}}\r\n </div>\r\n </div>\r\n </div>\r\n <!--load more-->\r\n <div class=\"bbsf-loadmore\" *ngIf=\"options.isLoadMoreControl\">\r\n <div class=\"search-results\" infinite-scroll [infiniteScrollDistance]=\"scrollDistance\"\r\n [infiniteScrollUpDistance]=\"scrollUpDistance\" [infiniteScrollThrottle]=\"throttle\"\r\n (scrolled)=\"options.isInfiniteScroll==true?onScrollDown():null\" [scrollWindow]=\"options.scrollWindow\"\r\n [infiniteScrollContainer]=\"options.infiniteScrollContainer\">\r\n </div>\r\n <button class=\"btn btn-sm btn-primary\" (click)=\"onScrollDown()\"\r\n *ngIf=\"!(result.length==totalRow)\"\r\n [attr.aria-label]=\"utilityService.getResourceValue('LoadMore')\"\r\n [ngbTooltip]=\"utilityService.getResourceValue('LoadMore')\">{{utilityService.getResourceValue(\"LoadMore\")}}</button>\r\n </div>\r\n</div>" }]
592
593
  }], ctorParameters: () => [{ type: i1.UtilityService }, { type: i2.HttpClient }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.Location }, { type: i5.OnPagingFiltersChangeService }, { type: i1.RequestHandlerService }, { type: i0.ChangeDetectorRef }], propDecorators: { Items: [{
593
594
  type: Output
594
595
  }], pageStateRestored: [{
@@ -601,4 +602,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
601
602
  type: HostListener,
602
603
  args: ['window:popstate', ['$event']]
603
604
  }] } });
604
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFnaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9QYWdpbmcvUGFnaW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9QYWdpbmcvUGFnaW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUczSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUF5QixtQkFBbUIsRUFBa0IsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7QUFRakQsTUFBTSxPQUFPLGVBQWU7SUFtQzFCLFlBQ1MsY0FBOEIsRUFDN0IsSUFBZ0IsRUFDaEIsTUFBYyxFQUNkLEtBQXFCLEVBQ3JCLFFBQWtCLEVBQ2xCLGVBQTZDLEVBQzdDLHFCQUE0QyxFQUM1QyxHQUFzQjtRQVB2QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDN0IsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixvQkFBZSxHQUFmLGVBQWUsQ0FBOEI7UUFDN0MsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxRQUFH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YTtvU0EwQmIsS0FBSztzQkFBZCxNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQTBJTixVQUFVO3NCQURULFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIEhvc3RMaXN0ZW5lciwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgUGFnaW5nRFRPIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9QYWdpbmdEVE8nO1xyXG5pbXBvcnQgeyBQYWdpbmdPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9QYWdpbmdPcHRpb25zJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT25QYWdpbmdGaWx0ZXJzQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9PblBhZ2luZ0ZpbHRlcnNDaGFuZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbHRlclR5cGUgfSBmcm9tICcuLi8uLi9TaGFyZWQvRW51bXMvRmlsdGVyVHlwZSc7XHJcbmltcG9ydCB7IFJlcXVlc3RIYW5kbGVyU2VydmljZSwgUmVxdWVzdE9wdGlvbnNNb2RlbCwgVXRpbGl0eVNlcnZpY2UgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5pbXBvcnQgeyBwbGFpblRvQ2xhc3MgfSBmcm9tICdjbGFzcy10cmFuc2Zvcm1lcic7XHJcbmltcG9ydCB7IFBhZ2luZ1BheWxvYWQgfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL1BhZ2luZ1BheWxvYWQnO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ0JCU0YtUGFnaW5nJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vUGFnaW5nLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFnaW5nQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBpdGVtcyA9IFtdO1xyXG4gIHBhZ2VPZkl0ZW1zOiBBcnJheTxhbnk+O1xyXG4gIHJlc3VsdDogVFtdID0gW107XHJcbiAgcGFnZXJDb25maWc6IGFueSA9IG51bGw7XHJcbiAgdG90YWxSb3c6IGFueSA9IDA7XHJcbiAgcGFnZVNpemU6IGFueSA9IDEwO1xyXG4gIFBhZ2VzOiBhbnkgPSAwO1xyXG4gIHBhZ2VzVGV4dDogc3RyaW5nO1xyXG4gIGl0ZW1zVGV4dDogc3RyaW5nO1xyXG4gIGN1cnJlbnRQYWdlOiBhbnkgPSAxO1xyXG4gIHNob3dQYWdlU2l6ZU9wdGlvbiA9IHRydWU7XHJcbiAgc2hvd0ZpcnN0QW5kTGFzdCA9IHRydWU7XHJcbiAgaGlkZVBhZ2luYXRpb25XaGVuUGFnZVNpemVFcXVhbE9uZSA9IHRydWU7XHJcbiAgc3VtID0gMDtcclxuICB0aHJvdHRsZSA9IDMwMDtcclxuICBzY3JvbGxEaXN0YW5jZSA9IDE7XHJcbiAgc2Nyb2xsVXBEaXN0YW5jZSA9IDI7XHJcbiAgZGlyZWN0aW9uID0gJyc7XHJcbiAgaGVhZGVyczogSHR0cEhlYWRlcnM7XHJcbiAgaXNGaXJzdENhbGw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByZXZpb3VzRmlsdGVyczogYW55ID0ge307XHJcbiAgQE91dHB1dCgpIEl0ZW1zOiBFdmVudEVtaXR0ZXI8VFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xyXG4gIEBPdXRwdXQoKSBwYWdlU3RhdGVSZXN0b3JlZDogRXZlbnRFbWl0dGVyPHsgcGFnZTogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyOyB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYWdlOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXI7IH0+KCk7XHJcbiAgQElucHV0KCkgb3B0aW9uczogUGFnaW5nT3B0aW9ucztcclxuICBASW5wdXQoKSBncm91cDogRm9ybUdyb3VwO1xyXG4gIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIC8vIEJyb3dzZXIgbmF2aWdhdGlvbiBzdXBwb3J0XHJcbiAgcHJpdmF0ZSBpc05hdmlnYXRpbmdCYWNrID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpc1Jlc3RvcmluZ0ZpbHRlcnMgPSBmYWxzZTtcclxuICBwcml2YXRlIHBhZ2VIaXN0b3J5OiBBcnJheTx7IHBhZ2U6IG51bWJlciwgcGFnZVNpemU6IG51bWJlciwgZmlsdGVyczogYW55OyB9PiA9IFtdO1xyXG4gIHByaXZhdGUgY3VycmVudEhpc3RvcnlJbmRleCA9IC0xO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyB1dGlsaXR5U2VydmljZTogVXRpbGl0eVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIHByaXZhdGUgb25DaGFuZ2VTZXJ2aWNlOiBPblBhZ2luZ0ZpbHRlcnNDaGFuZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXF1ZXN0SGFuZGxlclNlcnZpY2U6IFJlcXVlc3RIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBicm93c2VyIG5hdmlnYXRpb24gc3VwcG9ydCBpZiBlbmFibGVkXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUJyb3dzZXJOYXZpZ2F0aW9uKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUJyb3dzZXJOYXZpZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc0xvYWRNb3JlQ29udHJvbClcclxuICAgICAgdGhpcy5zdW0gPSB0aGlzLm9wdGlvbnMucGFnZVNpemU7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kcm9wZG93bkZpbHRlcnNDb250cm9sTmFtZXMgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuZHJvcGRvd25GaWx0ZXJzQ29udHJvbE5hbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgRHJvcGRvd25GaWx0ZXJzQ29udHJvbE5hbWVzID0gdGhpcy5vcHRpb25zLmRyb3Bkb3duRmlsdGVyc0NvbnRyb2xOYW1lcztcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlU2VydmljZS5HZXRWYWx1ZSgpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm9wdGlvbnMuZHJvcGRvd25GaWx0ZXJzQ29udHJvbE5hbWVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSA9PSB2YWx1ZSk7XHJcbiAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5pc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmJvb3RzdHJhcERhdGVQaWNrZXJzRmlsdGVyc0NvbnRyb2xOYW1lcyAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5ib290c3RyYXBEYXRlUGlja2Vyc0ZpbHRlcnNDb250cm9sTmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBCb290c3RyYXBEYXRlUGlja2Vyc0ZpbHRlcnNDb250cm9sTmFtZXMgPSB0aGlzLm9wdGlvbnMuYm9vdHN0cmFwRGF0ZVBpY2tlcnNGaWx0ZXJzQ29udHJvbE5hbWVzO1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMub25DaGFuZ2VTZXJ2aWNlLkdldFZhbHVlKCkuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm9wdGlvbnMuYm9vdHN0cmFwRGF0ZVBpY2tlcnNGaWx0ZXJzQ29udHJvbE5hbWVzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSA9PSB2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmlzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVIaXN0b3J5U3RhdGUoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5jdXJyZW50UGFnZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSBicm93c2VyIG5hdmlnYXRpb24gc3VwcG9ydFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUJyb3dzZXJOYXZpZ2F0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gVHJ5IHRvIHJlc3RvcmUgc3RhdGUgZnJvbSBicm93c2VyIGhpc3Rvcnkgb24gaW5pdGlhbCBsb2FkXHJcbiAgICB0aGlzLnJlc3RvcmVTdGF0ZUZyb21Ccm93c2VySGlzdG9yeSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdG9yZSBzdGF0ZSBmcm9tIGJyb3dzZXIgaGlzdG9yeSBvbiBpbml0aWFsIGxvYWRcclxuICAgKi9cclxuICBwcml2YXRlIHJlc3RvcmVTdGF0ZUZyb21Ccm93c2VySGlzdG9yeSgpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIEdldCB0aGUgY3VycmVudCBoaXN0b3J5IHN0YXRlXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGhpc3Rvcnkuc3RhdGU7XHJcblxyXG4gICAgICBpZiAoY3VycmVudFN0YXRlICYmIGN1cnJlbnRTdGF0ZS5wYWdpbmdTdGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHNhdmVkU3RhdGUgPSBjdXJyZW50U3RhdGUucGFnaW5nU3RhdGU7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzYXZlZCBzdGF0ZSBoYXMgdmFsaWQgZGF0YVxyXG4gICAgICAgIGlmIChzYXZlZFN0YXRlLnBhZ2UgJiYgc2F2ZWRTdGF0ZS5wYWdlU2l6ZSAmJiBzYXZlZFN0YXRlLmZpbHRlcnMpIHtcclxuICAgICAgICAgIC8vIFJlc3RvcmUgZmlsdGVyIHZhbHVlcyB0byBmb3JtIGNvbnRyb2xzXHJcbiAgICAgICAgICB0aGlzLnJlc3RvcmVGaWx0ZXJWYWx1ZXMoc2F2ZWRTdGF0ZS5maWx0ZXJzKTtcclxuXHJcbiAgICAgICAgICAvLyBHZXQgY3VycmVudCBmaWx0ZXJzIGFmdGVyIHJlc3RvcmF0aW9uXHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVyc1ZhbHVlKCk7XHJcblxyXG4gICAgICAgICAgLy8gT25seSByZXN0b3JlIGlmIGZpbHRlcnMgbWF0Y2ggKHNhbWUgc2VhcmNoIGNvbnRleHQpXHJcbiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2F2ZWRTdGF0ZS5maWx0ZXJzKSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycmVudEZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgIGxldCBwYWdlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgcGFnZVNpemVDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2F2ZWRTdGF0ZS5wYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHNhdmVkU3RhdGUucGFnZTtcclxuICAgICAgICAgICAgICBwYWdlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzYXZlZFN0YXRlLnBhZ2VTaXplICE9PSB0aGlzLm9wdGlvbnMucGFnZVNpemUpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGFnZVNpemUgPSBzYXZlZFN0YXRlLnBhZ2VTaXplO1xyXG4gICAgICAgICAgICAgIHBhZ2VTaXplQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIElmIHBhZ2Ugb3IgcGFnZSBzaXplIGNoYW5nZWQsIHJlbG9hZCBkYXRhXHJcbiAgICAgICAgICAgIGlmIChwYWdlQ2hhbmdlZCB8fCBwYWdlU2l6ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHBhZ2VTaXplQ2hhbmdlZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzdG9yZWQgc3RhdGUgdG8gb3VyIGxvY2FsIGhpc3RvcnlcclxuICAgICAgICAgICAgdGhpcy5wYWdlSGlzdG9yeS5wdXNoKHNhdmVkU3RhdGUpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXggPSB0aGlzLnBhZ2VIaXN0b3J5Lmxlbmd0aCAtIDE7XHJcblxyXG4gICAgICAgICAgICAvLyBFbWl0IGV2ZW50IHRvIG5vdGlmeSB0aGF0IHBhZ2Ugc3RhdGUgd2FzIHJlc3RvcmVkXHJcbiAgICAgICAgICAgIHRoaXMucGFnZVN0YXRlUmVzdG9yZWQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgcGFnZTogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5vcHRpb25zLnBhZ2VTaXplXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIFVJXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBJbml0aWFsIHBhZ2Ugc3RhdGUgcmVzdG9yZWQ6IFBhZ2UgJHt0aGlzLmN1cnJlbnRQYWdlfSwgUGFnZVNpemUgJHt0aGlzLm9wdGlvbnMucGFnZVNpemV9LCBGaWx0ZXJzIHJlc3RvcmVkYCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZXN0b3JlIGJyb3dzZXIgaGlzdG9yeSBzdGF0ZTonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0ZW4gdG8gYnJvd3NlciBiYWNrL2ZvcndhcmQgbmF2aWdhdGlvblxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb3BzdGF0ZScsIFsnJGV2ZW50J10pXHJcbiAgb25Qb3BTdGF0ZShldmVudDogUG9wU3RhdGVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlQnJvd3Nlck5hdmlnYXRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKCdCcm93c2VyIGJhY2svZm9yd2FyZCBuYXZpZ2F0aW9uIGRldGVjdGVkJyk7XHJcbiAgICB0aGlzLmlzTmF2aWdhdGluZ0JhY2sgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXN0b3JlUGFnZVN0YXRlRnJvbUhpc3RvcnkoKTtcclxuICAgIHRoaXMuaXNOYXZpZ2F0aW5nQmFjayA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdG9yZSBwYWdlIHN0YXRlIGZyb20gYnJvd3NlciBoaXN0b3J5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXN0b3JlUGFnZVN0YXRlRnJvbUhpc3RvcnkoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgaGlzdG9yeSBzdGF0ZSBmcm9tIGJyb3dzZXJcclxuICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gaGlzdG9yeS5zdGF0ZTtcclxuXHJcbiAgICAgIGlmIChjdXJyZW50U3RhdGUgJiYgY3VycmVudFN0YXRlLnBhZ2luZ1N0YXRlKSB7XHJcbiAgICAgICAgY29uc3Qgc2F2ZWRTdGF0ZSA9IGN1cnJlbnRTdGF0ZS5wYWdpbmdTdGF0ZTtcclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNhdmVkIHN0YXRlIGhhcyB2YWxpZCBkYXRhXHJcbiAgICAgICAgaWYgKHNhdmVkU3RhdGUucGFnZSAmJiBzYXZlZFN0YXRlLnBhZ2VTaXplICYmIHNhdmVkU3RhdGUuZmlsdGVycykge1xyXG4gICAgICAgICAgLy8gUmVzdG9yZSBmaWx0ZXIgdmFsdWVzIHRvIGZvcm0gY29udHJvbHNcclxuICAgICAgICAgIHRoaXMucmVzdG9yZUZpbHRlclZhbHVlcyhzYXZlZFN0YXRlLmZpbHRlcnMpO1xyXG5cclxuICAgICAgICAgIC8vIEdldCBjdXJyZW50IGZpbHRlcnMgYWZ0ZXIgcmVzdG9yYXRpb25cclxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXJzID0gdGhpcy5nZXRGaWx0ZXJzVmFsdWUoKTtcclxuXHJcbiAgICAgICAgICAvLyBPbmx5IHJlc3RvcmUgaWYgZmlsdGVycyBtYXRjaCAoc2FtZSBzZWFyY2ggY29udGV4dClcclxuICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShzYXZlZFN0YXRlLmZpbHRlcnMpID09PSBKU09OLnN0cmluZ2lmeShjdXJyZW50RmlsdGVycykpIHtcclxuICAgICAgICAgICAgbGV0IHBhZ2VDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBwYWdlU2l6ZUNoYW5nZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzYXZlZFN0YXRlLnBhZ2UgIT09IHRoaXMuY3VycmVudFBhZ2UpIHtcclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gc2F2ZWRTdGF0ZS5wYWdlO1xyXG4gICAgICAgICAgICAgIHBhZ2VDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNhdmVkU3RhdGUucGFnZVNpemUgIT09IHRoaXMub3B0aW9ucy5wYWdlU2l6ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWdlU2l6ZSA9IHNhdmVkU3RhdGUucGFnZVNpemU7XHJcbiAgICAgICAgICAgICAgcGFnZVNpemVDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgcGFnZSBvciBwYWdlIHNpemUgY2hhbmdlZCwgcmVsb2FkIGRhdGFcclxuICAgICAgICAgICAgaWYgKHBhZ2VDaGFuZ2VkIHx8IHBhZ2VTaXplQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5jdXJyZW50UGFnZSwgcGFnZVNpemVDaGFuZ2VkKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIG91ciBsb2NhbCBoaXN0b3J5IGluZGV4IHRvIG1hdGNoIHRoZSBicm93c2VyIHN0YXRlXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9jYWxIaXN0b3J5SW5kZXgoc2F2ZWRTdGF0ZSk7XHJcblxyXG4gICAgICAgICAgICAvLyBFbWl0IGV2ZW50IHRvIG5vdGlmeSB0aGF0IHBhZ2Ugc3RhdGUgd2FzIHJlc3RvcmVkXHJcbiAgICAgICAgICAgIHRoaXMucGFnZVN0YXRlUmVzdG9yZWQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgcGFnZTogdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5vcHRpb25zLnBhZ2VTaXplXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIFVJXHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBQYWdlIHN0YXRlIHJlc3RvcmVkIGZyb20gYnJvd3NlciBuYXZpZ2F0aW9uOiBQYWdlICR7dGhpcy5jdXJyZW50UGFnZX0sIFBhZ2VTaXplICR7dGhpcy5vcHRpb25zLnBhZ2VTaXplfSwgRmlsdGVycyByZXN0b3JlZGApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVzdG9yZSBwYWdlIHN0YXRlIGZyb20gaGlzdG9yeTonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbG9jYWwgaGlzdG9yeSBpbmRleCB0byBtYXRjaCBicm93c2VyIHN0YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVMb2NhbEhpc3RvcnlJbmRleChzYXZlZFN0YXRlOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIEZpbmQgdGhlIG1hdGNoaW5nIHN0YXRlIGluIG91ciBsb2NhbCBoaXN0b3J5XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucGFnZUhpc3RvcnkuZmluZEluZGV4KHN0YXRlID0+XHJcbiAgICAgIHN0YXRlLnBhZ2UgPT09IHNhdmVkU3RhdGUucGFnZSAmJlxyXG4gICAgICBzdGF0ZS5wYWdlU2l6ZSA9PT0gc2F2ZWRTdGF0ZS5wYWdlU2l6ZSAmJlxyXG4gICAgICBKU09OLnN0cmluZ2lmeShzdGF0ZS5maWx0ZXJzKSA9PT0gSlNPTi5zdHJpbmdpZnkoc2F2ZWRTdGF0ZS5maWx0ZXJzKVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlJbmRleCA9IGluZGV4O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm90IGZvdW5kLCBhZGQgaXQgdG8gb3VyIGhpc3RvcnlcclxuICAgICAgdGhpcy5wYWdlSGlzdG9yeS5wdXNoKHNhdmVkU3RhdGUpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXggPSB0aGlzLnBhZ2VIaXN0b3J5Lmxlbmd0aCAtIDE7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgYnJvd3NlciBoaXN0b3J5IHN0YXRlIHdpdGggY3VycmVudCBwYWdlIGFuZCBwYWdlIHNpemVcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUhpc3RvcnlTdGF0ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmVuYWJsZUJyb3dzZXJOYXZpZ2F0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVyc1ZhbHVlKCk7XHJcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB7XHJcbiAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXHJcbiAgICAgIHBhZ2VTaXplOiB0aGlzLm9wdGlvbnMucGFnZVNpemUsXHJcbiAgICAgIGZpbHRlcnM6IGN1cnJlbnRGaWx0ZXJzXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIE9ubHkgdXBkYXRlIGhpc3RvcnkgaWYgd2UncmUgbm90IGFscmVhZHkgbmF2aWdhdGluZyBiYWNrXHJcbiAgICBpZiAoIXRoaXMuaXNOYXZpZ2F0aW5nQmFjaykge1xyXG4gICAgICAvLyBBZGQgY3VycmVudCBzdGF0ZSB0byBsb2NhbCBoaXN0b3J5XHJcbiAgICAgIHRoaXMucGFnZUhpc3RvcnkucHVzaChjdXJyZW50U3RhdGUpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXggPSB0aGlzLnBhZ2VIaXN0b3J5Lmxlbmd0aCAtIDE7XHJcblxyXG4gICAgICAvLyBMaW1pdCBoaXN0b3J5IHNpemUgdG8gcHJldmVudCBtZW1vcnkgaXNzdWVzXHJcbiAgICAgIGlmICh0aGlzLnBhZ2VIaXN0b3J5Lmxlbmd0aCA+IDUwKSB7XHJcbiAgICAgICAgdGhpcy5wYWdlSGlzdG9yeS5zaGlmdCgpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEhpc3RvcnlJbmRleC0tO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBVcGRhdGUgYnJvd3NlciBoaXN0b3J5IHN0YXRlXHJcbiAgICAgIGNvbnN0IGhpc3RvcnlTdGF0ZSA9IHtcclxuICAgICAgICBwYWdpbmdTdGF0ZTogY3VycmVudFN0YXRlLFxyXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICAvLyBVc2UgaGlzdG9yeS5wdXNoU3RhdGUgdG8gYWRkIGEgbmV3IGhpc3RvcnkgZW50cnlcclxuICAgICAgICAvLyBUaGlzIGFsbG93cyBwcm9wZXIgYmFjay9mb3J3YXJkIG5hdmlnYXRpb25cclxuICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShoaXN0b3J5U3RhdGUsICcnLCB0aGlzLmxvY2F0aW9uLnBhdGgoKSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gdXBkYXRlIGJyb3dzZXIgaGlzdG9yeSBzdGF0ZTonLCBlcnJvcik7XHJcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gcmVwbGFjZVN0YXRlIGlmIHB1c2hTdGF0ZSBmYWlsc1xyXG4gICAgICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZVN0YXRlKHRoaXMubG9jYXRpb24ucGF0aCgpLCAnJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeVN0YXRlKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWVzICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLm9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgT25DbGlja0ZpbHRlcnNDb250cm9sTmFtZXMgPSB0aGlzLm9wdGlvbnMub25DbGlja0ZpbHRlcnNDb250cm9sTmFtZXM7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBPbkNsaWNrRmlsdGVyc0NvbnRyb2xOYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBPbkNsaWNrRmlsdGVyc0NvbnRyb2xOYW1lID0gT25DbGlja0ZpbHRlcnNDb250cm9sTmFtZXNbaW5kZXhdO1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKE9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWUpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgICAgICAgIHRoaXMuaXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVIaXN0b3J5U3RhdGUoKTtcclxuICAgICAgICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5jdXJyZW50UGFnZSwgdHJ1ZSk7XHJcbiAgICAgICAgfSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLm9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLm9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXMgPSB0aGlzLm9wdGlvbnMub25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXM7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBPbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBPbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lID0gT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXNbaW5kZXhdO1xyXG4gICAgICAgIGxldCBlbGVtZW50ID0gKDxhbnk+dGhpcy5ncm91cC5nZXQoT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZSkpLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmtleSA9PSBcIkVudGVyXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuaXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9BZGQgY2xpY2sgZXZlbnQgb24gUmVzZXQgRmlsdGVyIGJ1dHRvblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXNldEZpbHRlckJ1dHRvbk5hbWUgIT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSh0aGlzLm9wdGlvbnMucmVzZXRGaWx0ZXJCdXR0b25OYW1lKVswXTtcclxuICAgICAgaWYgKGJ1dHRvbiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBsZXQgZWxlbWVudCA9IGJ1dHRvbiBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jbGVhckZpbHRlcnMoKTtcclxuICAgICAgICB9LCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMudHlwZWFoZWFkU2VhcmNoQ29udHJvbE5hbWVzICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLnR5cGVhaGVhZFNlYXJjaENvbnRyb2xOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IFR5cGVhaGVhZFNlYXJjaENvbnRyb2xOYW1lcyA9IHRoaXMub3B0aW9ucy50eXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZXM7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBUeXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVHlwZWFoZWFkU2VhcmNoQ29udHJvbE5hbWUgPSBUeXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZXNbaW5kZXhdO1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFR5cGVhaGVhZFNlYXJjaENvbnRyb2xOYW1lKS5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgKGUpID0+IHtcclxuICAgICAgICAgIGlmIChlLmtleSA9PSBcIkVudGVyXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuaXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBvbkRyb3BEb3duQ2hhbmdlKHJlc3VsdCkge1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgICAgdGhpcy5pc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICAgIHRoaXMudXBkYXRlSGlzdG9yeVN0YXRlKCk7XHJcbiAgICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5jdXJyZW50UGFnZSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVBhZ2UoUGFnZSkge1xyXG4gICAgaWYgKFBhZ2UgPT0gMClcclxuICAgICAgcmV0dXJuO1xyXG4gICAgaWYgKFBhZ2UgPiAwKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzRmlyc3RDYWxsKSB7XHJcbiAgICAgICAgdGhpcy5pc0ZpcnN0Q2FsbCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gUGFnZTtcclxuICAgICAgdGhpcy51cGRhdGVIaXN0b3J5U3RhdGUoKTtcclxuICAgICAgdGhpcy5nZXRJdGVtTGlzdChQYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoYW5nZVBhZ2VTaXplKGUpIHtcclxuICAgIHRoaXMub3B0aW9ucy5wYWdlU2l6ZSA9IGUudGFyZ2V0LnZhbHVlO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLmlzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgIHRoaXMudXBkYXRlSGlzdG9yeVN0YXRlKCk7XHJcbiAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgb25TY3JvbGxEb3duKCkge1xyXG4gICAgdGhpcy5zdW0gKz0gdGhpcy5vcHRpb25zLnBhZ2VTaXplO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLmlzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgIHRoaXMuZGlyZWN0aW9uID0gJ2Rvd24nO1xyXG4gICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIGdldEl0ZW1MaXN0KHBhZ2UsIElzRmlsdGVyVXBkYXRlZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnN0YXJ0UGFnaW5nQ2FsbGJhY2spXHJcbiAgICAgIHRoaXMub3B0aW9ucy5zdGFydFBhZ2luZ0NhbGxiYWNrLmNhbGwobnVsbCk7XHJcblxyXG4gICAgbGV0IGZpbHRlcnMgPSB7fTtcclxuICAgIGZpbHRlcnMgPSB0aGlzLmdldEZpbHRlcnNWYWx1ZSgpO1xyXG5cclxuICAgIC8vIFNraXAgZmlsdGVyIGNoYW5nZSBkZXRlY3Rpb24gaWYgd2UncmUgcmVzdG9yaW5nIGZpbHRlcnMgZnJvbSBicm93c2VyIGhpc3RvcnlcclxuICAgIGlmICghdGhpcy5pc1Jlc3RvcmluZ0ZpbHRlcnMgJiYgIUlzRmlsdGVyVXBkYXRlZCAmJiBPYmplY3Qua2V5cyh0aGlzLnByZXZpb3VzRmlsdGVycykubGVuZ3RoICE9IDAgJiYgSlNPTi5zdHJpbmdpZnkodGhpcy5wcmV2aW91c0ZpbHRlcnMpICE9IEpTT04uc3RyaW5naWZ5KGZpbHRlcnMpKSB7XHJcbiAgICAgIC8vUmVpbml0aWFsaXplIGlmIGZpbHRlcnMgY2hhbmdlZFxyXG4gICAgICBwYWdlID0gMTtcclxuICAgICAgSXNGaWx0ZXJVcGRhdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMucHJldmlvdXNGaWx0ZXJzID0gZmlsdGVycztcclxuICAgIGxldCBwYWdpbmdEVE8gPSBuZXcgUGFnaW5nRFRPKCk7XHJcbiAgICBsZXQgc2l6ZSA9IE51bWJlci5wYXJzZUludCh0aGlzLm9wdGlvbnMucGFnZVNpemUudG9TdHJpbmcoKSk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmlzTG9hZE1vcmVDb250cm9sKVxyXG4gICAgICBwYWdpbmdEVE8uUGFnZUNvdW50ID0gdGhpcy5zdW07XHJcbiAgICBlbHNlXHJcbiAgICAgIHBhZ2luZ0RUTy5QYWdlQ291bnQgPSBzaXplO1xyXG5cclxuICAgIHBhZ2luZ0RUTy5DdXJyZW50UGFnZU51bWJlciA9IHBhZ2U7XHJcbiAgICBwYWdpbmdEVE8uVG90YWxDb3VudCA9IHRoaXMudG90YWxSb3c7XHJcbiAgICBwYWdpbmdEVE8uSXNGaWx0ZXJVcGRhdGVkID0gSXNGaWx0ZXJVcGRhdGVkO1xyXG5cclxuICAgIC8vU2V0IEZpbHRlcnMgb2JqZWN0IHRoYXQgc2VudCB0byBhY3Rpb24gVVJMXHJcbiAgICBsZXQgZmlsdGVyc0RUTzogUGFnaW5nUGF5bG9hZCA9IHtcclxuICAgICAgUGFnaW5nRFRPOiBwYWdpbmdEVE8sXHJcbiAgICAgIEZpbHRlcnM6IGZpbHRlcnNcclxuICAgIH07XHJcblxyXG4gICAgbGV0IHJlcXVlc3RPcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zTW9kZWwoKTtcclxuICAgIHJlcXVlc3RPcHRpb25zLmRpc2FibGVCbG9ja1VJID0gdGhpcy5vcHRpb25zLmRpc2FibGVCbG9ja1VJO1xyXG4gICAgdGhpcy5yZXF1ZXN0SGFuZGxlclNlcnZpY2UucG9zdCh0aGlzLm9wdGlvbnMuYWN0aW9uUG9zdFVSTCwgdGhpcy5vcHRpb25zLmZpbHRlcnMgJiYgdGhpcy5vcHRpb25zLmZpbHRlcnMubGVuZ3RoID4gMCA/IGZpbHRlcnNEVE8gOiBwYWdpbmdEVE8sIG51bGwsIG51bGwsIHJlcXVlc3RPcHRpb25zKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZURhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy50b3RhbENvdW50ID0gcmVzcG9uc2VEYXRhLnRvdGFsQ291bnQ7XHJcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXNwb25zZURhdGEuaXRlbXM7IC8vdGhpcy5jYXN0SXRlbXMocmVzcG9uc2VEYXRhLml0ZW1zKTtcclxuICAgICAgICBsZXQgY2FzdGVkUmVzdWx0ID0gcGxhaW5Ub0NsYXNzKHRoaXMub3B0aW9ucy5UeXBlT2ZSZXNwb25zZSwgdGhpcy5yZXN1bHQsIHsgZXhjbHVkZUV4dHJhbmVvdXNWYWx1ZXM6IHRydWUgfSk7XHJcbiAgICAgICAgdGhpcy5JdGVtcy5lbWl0KGNhc3RlZFJlc3VsdCk7XHJcbiAgICAgICAgdGhpcy50b3RhbFJvdyA9IHJlc3BvbnNlRGF0YS50b3RhbENvdW50O1xyXG5cclxuICAgICAgICBpZiAoSXNGaWx0ZXJVcGRhdGVkKSB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zID0gW107XHJcbiAgICAgICAgICB0aGlzLlBhZ2VzID0gTWF0aC5jZWlsKCh0aGlzLnRvdGFsUm93IC8gdGhpcy5vcHRpb25zLnBhZ2VTaXplKSk7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zID0gQXJyYXkodGhpcy50b3RhbFJvdyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXRUZXh0KHRoaXMuUGFnZXMsIHRoaXMudG90YWxSb3cpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0sIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMSlcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcIi9BZG1pbi9hY2NvdW50L2xvZ2luXCJdKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWluaXRpYWxpemVQYWdpbmcgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5jbGVhckhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgdGhpcy5nZXRJdGVtTGlzdCgxLCB0cnVlKTtcclxuICB9O1xyXG5cclxuICB1cGRhdGVQYWdpbmcgPSAoKSA9PiB7XHJcbiAgICAvL3RoaXMuSXNGaXJzdENhbGw9dHJ1ZTtcclxuICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5jdXJyZW50UGFnZSk7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogRm9yY2UgdXBkYXRlIHRoZSBjdXJyZW50IHBhZ2UgKHVzZWZ1bCBmb3IgZXh0ZXJuYWwgY29tcG9uZW50cylcclxuICAgKi9cclxuICBzZXRDdXJyZW50UGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChwYWdlID4gMCAmJiBwYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgICB0aGlzLmdldEl0ZW1MaXN0KHBhZ2UpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcGFnZSBudW1iZXJcclxuICAgKi9cclxuICBnZXRDdXJyZW50UGFnZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXN0b3JlIGZpbHRlciB2YWx1ZXMgdG8gZm9ybSBjb250cm9sc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzdG9yZUZpbHRlclZhbHVlcyhzYXZlZEZpbHRlcnM6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZmlsdGVycyB8fCAhdGhpcy5ncm91cCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1Jlc3RvcmluZ0ZpbHRlcnMgPSB0cnVlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuZmlsdGVycy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF07XHJcblxyXG4gICAgICAgIGlmIChmaWx0ZXIuZm9ybUNvbnRyb2xOYW1lICYmIGZpbHRlci5mb3JtQ29udHJvbE5hbWUgIT09IFwiXCIpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sTmFtZSA9IGZpbHRlci5mb3JtQ29udHJvbE5hbWU7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25QYXJhbWV0ZXJOYW1lID0gZmlsdGVyLmFjdGlvblBhcmFtZXRlck5hbWU7XHJcblxyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHNhdmVkIHZhbHVlIGZvciB0aGlzIGZpbHRlclxyXG4gICAgICAgICAgaWYgKHNhdmVkRmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhY3Rpb25QYXJhbWV0ZXJOYW1lKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzYXZlZFZhbHVlID0gc2F2ZWRGaWx0ZXJzW2FjdGlvblBhcmFtZXRlck5hbWVdO1xyXG5cclxuICAgICAgICAgICAgLy8gT25seSByZXN0b3JlIGlmIHRoZSB2YWx1ZSBpcyBub3QgbnVsbC91bmRlZmluZWQvZW1wdHlcclxuICAgICAgICAgICAgaWYgKHNhdmVkVmFsdWUgIT09IG51bGwgJiYgc2F2ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHNhdmVkVmFsdWUgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICAvLyBTZXQgdGhlIHZhbHVlIHRvIHRoZSBmb3JtIGNvbnRyb2xcclxuICAgICAgICAgICAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0uc2V0VmFsdWUoc2F2ZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlc3RvcmVkIGZpbHRlciAke2Zvcm1Db250cm9sTmFtZX0gd2l0aCB2YWx1ZTpgLCBzYXZlZFZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLmpRdWVyeVNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAvLyBIYW5kbGUgalF1ZXJ5IHNlbGVjdG9yIGJhc2VkIGZpbHRlcnNcclxuICAgICAgICAgIGNvbnN0IGFjdGlvblBhcmFtZXRlck5hbWUgPSBmaWx0ZXIuYWN0aW9uUGFyYW1ldGVyTmFtZTtcclxuXHJcbiAgICAgICAgICBpZiAoc2F2ZWRGaWx0ZXJzLmhhc093blByb3BlcnR5KGFjdGlvblBhcmFtZXRlck5hbWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNhdmVkVmFsdWUgPSBzYXZlZEZpbHRlcnNbYWN0aW9uUGFyYW1ldGVyTmFtZV07XHJcblxyXG4gICAgICAgICAgICBpZiAoc2F2ZWRWYWx1ZSAhPT0gbnVsbCAmJiBzYXZlZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgc2F2ZWRWYWx1ZSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGZpbHRlci5qUXVlcnlTZWxlY3RvcikgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHNhdmVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVzdG9yZWQgalF1ZXJ5IGZpbHRlciAke2ZpbHRlci5qUXVlcnlTZWxlY3Rvcn0gd2l0aCB2YWx1ZTpgLCBzYXZlZFZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlc3RvcmUgZmlsdGVyIHZhbHVlczonLCBlcnJvcik7XHJcbiAgICB9IGZpbmFsbHkge1xyXG4gICAgICAvLyBSZXNldCB0aGUgZmxhZyBhZnRlciBhIHNob3J0IGRlbGF5IHRvIGFsbG93IGZvcm0gY29udHJvbHMgdG8gdXBkYXRlXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNSZXN0b3JpbmdGaWx0ZXJzID0gZmFsc2U7XHJcbiAgICAgIH0sIDEwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXN0SXRlbXMob2JqZWN0QXJyOiBhbnlbXSk6IFRbXSB7XHJcbiAgICBsZXQgb3JpZ2luYWxBcnJheTogVFtdID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqZWN0QXJyLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gb2JqZWN0QXJyW2luZGV4XTtcclxuICAgICAgbGV0IGtleSwga2V5cyA9IE9iamVjdC5rZXlzKGVsZW1lbnQpO1xyXG4gICAgICBsZXQgbiA9IGtleXMubGVuZ3RoO1xyXG4gICAgICBsZXQgbmV3T2JqZWN0ID0ge307XHJcbiAgICAgIHdoaWxlIChuLS0pIHtcclxuICAgICAgICBrZXkgPSBrZXlzW25dO1xyXG4gICAgICAgIGxldCBPa2V5ID0ga2V5O1xyXG4gICAgICAgIG5ld09iamVjdFtrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBPa2V5LnNsaWNlKDEpXSA9IGVsZW1lbnRba2V5XTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZmluYWxPYmplY3QgPSBuZXdPYmplY3QgYXMgVDtcclxuICAgICAgb3JpZ2luYWxBcnJheS5wdXNoKGZpbmFsT2JqZWN0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3JpZ2luYWxBcnJheTtcclxuICB9XHJcblxyXG4gIHNldFRleHQocGFnZXNOdW1iZXI6IG51bWJlciwgaXRlbXNOdW1iZXI6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMudXRpbGl0eVNlcnZpY2UuaXNDdXJyZW50TGFuZ3VhZ2VBcmFiaWMoKSkge1xyXG4gICAgICAvL1NldCBwYWdlcyB0ZXh0XHJcbiAgICAgIGlmIChwYWdlc051bWJlciA8IDMgfHwgcGFnZXNOdW1iZXIgPiAxMClcclxuICAgICAgICB0aGlzLnBhZ2VzVGV4dCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlBhZ2VcIik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnBhZ2VzVGV4dCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlBhZ2VzXCIpO1xyXG4gICAgICAvL1NldCBpdGVtcyB0ZXh0XHJcbiAgICAgIGlmIChpdGVtc051bWJlciA8IDMgfHwgaXRlbXNOdW1iZXIgPiAxMClcclxuICAgICAgICB0aGlzLml0ZW1zVGV4dCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkl0ZW1cIik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLml0ZW1zVGV4dCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkl0ZW1zXCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vU2V0IHBhZ2VzIHRleHRcclxuICAgICAgaWYgKHBhZ2VzTnVtYmVyID4gMSlcclxuICAgICAgICB0aGlzLnBhZ2VzVGV4dCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlBhZ2VzXCIpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5wYWdlc1RleHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJQYWdlXCIpO1xyXG4gICAgICAvL1NldCBpdGVtcyB0ZXh0XHJcbiAgICAgIGlmIChpdGVtc051bWJlciA+IDEpXHJcbiAgICAgICAgdGhpcy5pdGVtc1RleHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJJdGVtc1wiKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuaXRlbXNUZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSXRlbVwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyRmlsdGVycygpIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsdGVycyAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuZmlsdGVycy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmZvcm1Db250cm9sTmFtZSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5mb3JtQ29udHJvbE5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgY29uc3QgRm9ybUNvbnRyb2xOYW1lID0gdGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmZvcm1Db250cm9sTmFtZTtcclxuICAgICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbRm9ybUNvbnRyb2xOYW1lXS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ2xlYXIgaGlzdG9yeSBzdGF0ZSB3aGVuIGZpbHRlcnMgYXJlIHJlc2V0XHJcbiAgICAgIHRoaXMuY2xlYXJIaXN0b3J5U3RhdGUoKTtcclxuICAgICAgdGhpcy5yZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHBhZ2UgaGlzdG9yeSBzdGF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xlYXJIaXN0b3J5U3RhdGUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVCcm93c2VyTmF2aWdhdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIHBhZ2UgaGlzdG9yeVxyXG4gICAgdGhpcy5wYWdlSGlzdG9yeSA9IFtdO1xyXG4gICAgdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4ID0gLTE7XHJcbiAgfVxyXG5cclxuICBnZXRGaWx0ZXJzVmFsdWUoKSB7XHJcbiAgICBsZXQgZmlsdGVycyA9IHt9O1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5maWx0ZXJzICE9IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMub3B0aW9ucy5maWx0ZXJzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uZm9ybUNvbnRyb2xOYW1lICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmZvcm1Db250cm9sTmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICBjb25zdCBGb3JtQ29udHJvbE5hbWUgPSB0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uZm9ybUNvbnRyb2xOYW1lO1xyXG4gICAgICAgICAgbGV0IENvbnRyb2xWYWx1ZSA9IHRoaXMuZ3JvdXAuY29udHJvbHNbRm9ybUNvbnRyb2xOYW1lXS52YWx1ZTtcclxuICAgICAgICAgIGlmIChDb250cm9sVmFsdWUgIT0gdW5kZWZpbmVkICYmIENvbnRyb2xWYWx1ZSAhPSBudWxsICYmIENvbnRyb2xWYWx1ZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uZmlsdGVyVHlwZSA9PSBGaWx0ZXJUeXBlLkRhdGVQaWNrZXIpIHtcclxuICAgICAgICAgICAgICAvL2lmIChBcnJheS5pc0FycmF5KENvbnRyb2xWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAvLyAgZm9yIChsZXQgZWxlbWVudCA9IDA7IGVsZW1lbnQgPCBDb250cm9sVmFsdWUubGVuZ3RoOyBlbGVtZW50KyspIHtcclxuICAgICAgICAgICAgICAvLyAgICBjb25zdCB2YWx1ZSA9IENvbnRyb2xWYWx1ZVtlbGVtZW50XTtcclxuICAgICAgICAgICAgICAvLyAgICBmaWx0ZXJzW3RoaXMub3B0aW9ucy5GaWx0ZXJzW2luZGV4XS5BY3Rpb25QYXJhbWV0ZXJOYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIC8vICB9XHJcbiAgICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgICAgLy9lbHNlIHtcclxuICAgICAgICAgICAgICBmaWx0ZXJzW3RoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5hY3Rpb25QYXJhbWV0ZXJOYW1lXSA9IENvbnRyb2xWYWx1ZTtcclxuICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmZpbHRlclR5cGUgPT0gRmlsdGVyVHlwZS5BdXRvY29tcGxldGVUZXh0Qm94KVxyXG4gICAgICAgICAgICAgICAgQ29udHJvbFZhbHVlID0gQ29udHJvbFZhbHVlO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uZmlsdGVyVHlwZSA9PSBGaWx0ZXJUeXBlLlRhZ0lucHV0KVxyXG4gICAgICAgICAgICAgICAgQ29udHJvbFZhbHVlID0gQ29udHJvbFZhbHVlO1xyXG5cclxuICAgICAgICAgICAgICBmaWx0ZXJzW3RoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5hY3Rpb25QYXJhbWV0ZXJOYW1lXSA9IENvbnRyb2xWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZpbHRlcnNbdGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmFjdGlvblBhcmFtZXRlck5hbWVdID0gbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBFbGVtZW50alF1ZXJ5U2VsZWN0b3IgPSB0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0ualF1ZXJ5U2VsZWN0b3I7XHJcbiAgICAgICAgICBsZXQgRWxlbWVudFZhbHVlID0gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoRWxlbWVudGpRdWVyeVNlbGVjdG9yKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcclxuICAgICAgICAgIGlmIChFbGVtZW50VmFsdWUgIT0gdW5kZWZpbmVkICYmIEVsZW1lbnRWYWx1ZSAhPSBudWxsKVxyXG4gICAgICAgICAgICBmaWx0ZXJzW3RoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5hY3Rpb25QYXJhbWV0ZXJOYW1lXSA9IEVsZW1lbnRWYWx1ZTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uYWN0aW9uUGFyYW1ldGVyTmFtZV0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGJic2YtY29udHJvbCBiYnNmLXBhZ2luZ1wiICpuZ0lmPVwiKHJlc3VsdC5sZW5ndGggPiAwKVwiPlxyXG4gIDwhLS1wYWdpbmcgY29udGFpbmVyLS0+XHJcbiAgPGRpdiBjbGFzcz1cImJic2YtcGFnaW5nLWNvbnRhaW5lclwiICpuZ0lmPVwiIW9wdGlvbnMuaXNMb2FkTW9yZUNvbnRyb2xcIj5cclxuICAgIDwhLS1pdGVtcy0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtcGFnaW5hdGlvblwiPlxyXG4gICAgICA8anctcGFnaW5hdGlvbiBbaXRlbXNdPVwiaXRlbXNcIiAqbmdJZj1cIiEoKFBhZ2VzPT0xKSYmb3B0aW9ucy5oaWRlUGFnaW5hdGlvbldoZW5QYWdlU2l6ZUVxdWFsT25lKVwiXHJcbiAgICAgICAgKGNoYW5nZVBhZ2UpPVwib25DaGFuZ2VQYWdlKCRldmVudClcIiBbcGFnZVNpemVdPVwib3B0aW9ucy5wYWdlU2l6ZVwiIFtTaG93Rmlyc3RBbmRMYXN0XT1cIm9wdGlvbnMuc2hvd0ZpcnN0QW5kTGFzdFwiXHJcbiAgICAgICAgW2luaXRpYWxQYWdlXT1cImN1cnJlbnRQYWdlXCIgW21heFBhZ2VzXT1cIjEwXCI+PC9qdy1wYWdpbmF0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tcGFnZSBjb3VudC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtcGFnZXNcIiAqbmdJZj1cIiEoKFBhZ2VzPT0xKSYmb3B0aW9ucy5oaWRlUGFnaW5hdGlvbldoZW5QYWdlU2l6ZUVxdWFsT25lKVwiPlxyXG4gICAgICA8c2VsZWN0IChjaGFuZ2UpPVwiY2hhbmdlUGFnZVNpemUoJGV2ZW50KVwiICpuZ0lmPVwib3B0aW9ucy5zaG93UGFnZVNpemVPcHRpb25cIj5cclxuICAgICAgICA8b3B0aW9uPjEwPC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbj4yMDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24+NTA8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uPjEwMDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24+MjAwPC9vcHRpb24+XHJcbiAgICAgIDwvc2VsZWN0PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYnNzZi1pdGVtc1wiPlxyXG4gICAgICAgIDxzdHJvbmc+e3t0b3RhbFJvd319PC9zdHJvbmc+IHt7aXRlbXNUZXh0fX0ge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSW5cIil9fSA8c3Ryb25nPlxyXG4gICAgICAgICAge3tQYWdlc319PC9zdHJvbmc+IHt7cGFnZXNUZXh0fX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8IS0tbG9hZCBtb3JlLS0+XHJcbiAgPGRpdiBjbGFzcz1cImJic2YtbG9hZG1vcmVcIiAqbmdJZj1cIm9wdGlvbnMuaXNMb2FkTW9yZUNvbnRyb2xcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtcmVzdWx0c1wiIGluZmluaXRlLXNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCJzY3JvbGxEaXN0YW5jZVwiXHJcbiAgICAgIFtpbmZpbml0ZVNjcm9sbFVwRGlzdGFuY2VdPVwic2Nyb2xsVXBEaXN0YW5jZVwiIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cInRocm90dGxlXCJcclxuICAgICAgKHNjcm9sbGVkKT1cIm9wdGlvbnMuaXNJbmZpbml0ZVNjcm9sbD09dHJ1ZT9vblNjcm9sbERvd24oKTpudWxsXCIgW3Njcm9sbFdpbmRvd109XCJvcHRpb25zLnNjcm9sbFdpbmRvd1wiXHJcbiAgICAgIFtpbmZpbml0ZVNjcm9sbENvbnRhaW5lcl09XCJvcHRpb25zLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyXCI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uU2Nyb2xsRG93bigpXCJcclxuICAgICAgKm5nSWY9XCIhKHJlc3VsdC5sZW5ndGg9PXRvdGFsUm93KVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkxvYWRNb3JlXCIpfX08L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
605
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFnaW5nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9QYWdpbmcvUGFnaW5nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9QYWdpbmcvUGFnaW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUczSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUF5QixtQkFBbUIsRUFBa0IsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7O0FBUWpELE1BQU0sT0FBTyxlQUFlO0lBbUMxQixZQUNTLGNBQThCLEVBQzdCLElBQWdCLEVBQ2hCLE1BQWMsRUFDZCxLQUFxQixFQUNyQixRQUFrQixFQUNsQixlQUE2QyxFQUM3QyxxQkFBNEMsRUFDNUMsR0FBc0I7UUFQdkIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzdCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsb0JBQWUsR0FBZixlQUFlLENBQThCO1FBQzdDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsUUFB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QWE7b1NBMEJiLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0UsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkEwSU4sVUFBVTtzQkFEVCxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBIb3N0TGlzdGVuZXIsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IFBhZ2luZ0RUTyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvUGFnaW5nRFRPJztcclxuaW1wb3J0IHsgUGFnaW5nT3B0aW9ucyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvUGFnaW5nT3B0aW9ucyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9uUGFnaW5nRmlsdGVyc0NoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvT25QYWdpbmdGaWx0ZXJzQ2hhbmdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vU2hhcmVkL0VudW1zL0ZpbHRlclR5cGUnO1xyXG5pbXBvcnQgeyBSZXF1ZXN0SGFuZGxlclNlcnZpY2UsIFJlcXVlc3RPcHRpb25zTW9kZWwsIFV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgcGxhaW5Ub0NsYXNzIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xyXG5pbXBvcnQgeyBQYWdpbmdQYXlsb2FkIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9QYWdpbmdQYXlsb2FkJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdCQlNGLVBhZ2luZycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL1BhZ2luZy5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2luZ0NvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgaXRlbXMgPSBbXTtcclxuICBwYWdlT2ZJdGVtczogQXJyYXk8YW55PjtcclxuICByZXN1bHQ6IFRbXSA9IFtdO1xyXG4gIHBhZ2VyQ29uZmlnOiBhbnkgPSBudWxsO1xyXG4gIHRvdGFsUm93OiBhbnkgPSAwO1xyXG4gIHBhZ2VTaXplOiBhbnkgPSAxMDtcclxuICBQYWdlczogYW55ID0gMDtcclxuICBwYWdlc1RleHQ6IHN0cmluZztcclxuICBpdGVtc1RleHQ6IHN0cmluZztcclxuICBjdXJyZW50UGFnZTogYW55ID0gMTtcclxuICBzaG93UGFnZVNpemVPcHRpb24gPSB0cnVlO1xyXG4gIHNob3dGaXJzdEFuZExhc3QgPSB0cnVlO1xyXG4gIGhpZGVQYWdpbmF0aW9uV2hlblBhZ2VTaXplRXF1YWxPbmUgPSB0cnVlO1xyXG4gIHN1bSA9IDA7XHJcbiAgdGhyb3R0bGUgPSAzMDA7XHJcbiAgc2Nyb2xsRGlzdGFuY2UgPSAxO1xyXG4gIHNjcm9sbFVwRGlzdGFuY2UgPSAyO1xyXG4gIGRpcmVjdGlvbiA9ICcnO1xyXG4gIGhlYWRlcnM6IEh0dHBIZWFkZXJzO1xyXG4gIGlzRmlyc3RDYWxsOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcmV2aW91c0ZpbHRlcnM6IGFueSA9IHt9O1xyXG4gIEBPdXRwdXQoKSBJdGVtczogRXZlbnRFbWl0dGVyPFRbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcclxuICBAT3V0cHV0KCkgcGFnZVN0YXRlUmVzdG9yZWQ6IEV2ZW50RW1pdHRlcjx7IHBhZ2U6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcjsgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGFnZTogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyOyB9PigpO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IFBhZ2luZ09wdGlvbnM7XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAvLyBCcm93c2VyIG5hdmlnYXRpb24gc3VwcG9ydFxyXG4gIHByaXZhdGUgaXNOYXZpZ2F0aW5nQmFjayA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNSZXN0b3JpbmdGaWx0ZXJzID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBwYWdlSGlzdG9yeTogQXJyYXk8eyBwYWdlOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIsIGZpbHRlcnM6IGFueTsgfT4gPSBbXTtcclxuICBwcml2YXRlIGN1cnJlbnRIaXN0b3J5SW5kZXggPSAtMTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgdXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICBwcml2YXRlIG9uQ2hhbmdlU2VydmljZTogT25QYWdpbmdGaWx0ZXJzQ2hhbmdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVxdWVzdEhhbmRsZXJTZXJ2aWNlOiBSZXF1ZXN0SGFuZGxlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIEluaXRpYWxpemUgYnJvd3NlciBuYXZpZ2F0aW9uIHN1cHBvcnQgaWYgZW5hYmxlZFxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVCcm93c2VyTmF2aWdhdGlvbikge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVCcm93c2VyTmF2aWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuaXNMb2FkTW9yZUNvbnRyb2wpXHJcbiAgICAgIHRoaXMuc3VtID0gdGhpcy5vcHRpb25zLnBhZ2VTaXplO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZHJvcGRvd25GaWx0ZXJzQ29udHJvbE5hbWVzICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLmRyb3Bkb3duRmlsdGVyc0NvbnRyb2xOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IERyb3Bkb3duRmlsdGVyc0NvbnRyb2xOYW1lcyA9IHRoaXMub3B0aW9ucy5kcm9wZG93bkZpbHRlcnNDb250cm9sTmFtZXM7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZVNlcnZpY2UuR2V0VmFsdWUoKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5vcHRpb25zLmRyb3Bkb3duRmlsdGVyc0NvbnRyb2xOYW1lcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gPT0gdmFsdWUpO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVIaXN0b3J5U3RhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ib290c3RyYXBEYXRlUGlja2Vyc0ZpbHRlcnNDb250cm9sTmFtZXMgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuYm9vdHN0cmFwRGF0ZVBpY2tlcnNGaWx0ZXJzQ29udHJvbE5hbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgQm9vdHN0cmFwRGF0ZVBpY2tlcnNGaWx0ZXJzQ29udHJvbE5hbWVzID0gdGhpcy5vcHRpb25zLmJvb3RzdHJhcERhdGVQaWNrZXJzRmlsdGVyc0NvbnRyb2xOYW1lcztcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLm9uQ2hhbmdlU2VydmljZS5HZXRWYWx1ZSgpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5vcHRpb25zLmJvb3RzdHJhcERhdGVQaWNrZXJzRmlsdGVyc0NvbnRyb2xOYW1lcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gPT0gdmFsdWUpO1xyXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5pc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlSGlzdG9yeVN0YXRlKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgYnJvd3NlciBuYXZpZ2F0aW9uIHN1cHBvcnRcclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxpemVCcm93c2VyTmF2aWdhdGlvbigpOiB2b2lkIHtcclxuICAgIC8vIFRyeSB0byByZXN0b3JlIHN0YXRlIGZyb20gYnJvd3NlciBoaXN0b3J5IG9uIGluaXRpYWwgbG9hZFxyXG4gICAgdGhpcy5yZXN0b3JlU3RhdGVGcm9tQnJvd3Nlckhpc3RvcnkoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3RvcmUgc3RhdGUgZnJvbSBicm93c2VyIGhpc3Rvcnkgb24gaW5pdGlhbCBsb2FkXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXN0b3JlU3RhdGVGcm9tQnJvd3Nlckhpc3RvcnkoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgaGlzdG9yeSBzdGF0ZVxyXG4gICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBoaXN0b3J5LnN0YXRlO1xyXG5cclxuICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAmJiBjdXJyZW50U3RhdGUucGFnaW5nU3RhdGUpIHtcclxuICAgICAgICBjb25zdCBzYXZlZFN0YXRlID0gY3VycmVudFN0YXRlLnBhZ2luZ1N0YXRlO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2F2ZWQgc3RhdGUgaGFzIHZhbGlkIGRhdGFcclxuICAgICAgICBpZiAoc2F2ZWRTdGF0ZS5wYWdlICYmIHNhdmVkU3RhdGUucGFnZVNpemUgJiYgc2F2ZWRTdGF0ZS5maWx0ZXJzKSB7XHJcbiAgICAgICAgICAvLyBSZXN0b3JlIGZpbHRlciB2YWx1ZXMgdG8gZm9ybSBjb250cm9sc1xyXG4gICAgICAgICAgdGhpcy5yZXN0b3JlRmlsdGVyVmFsdWVzKHNhdmVkU3RhdGUuZmlsdGVycyk7XHJcblxyXG4gICAgICAgICAgLy8gR2V0IGN1cnJlbnQgZmlsdGVycyBhZnRlciByZXN0b3JhdGlvblxyXG4gICAgICAgICAgY29uc3QgY3VycmVudEZpbHRlcnMgPSB0aGlzLmdldEZpbHRlcnNWYWx1ZSgpO1xyXG5cclxuICAgICAgICAgIC8vIE9ubHkgcmVzdG9yZSBpZiBmaWx0ZXJzIG1hdGNoIChzYW1lIHNlYXJjaCBjb250ZXh0KVxyXG4gICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHNhdmVkU3RhdGUuZmlsdGVycykgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRGaWx0ZXJzKSkge1xyXG4gICAgICAgICAgICBsZXQgcGFnZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBhZ2VTaXplQ2hhbmdlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNhdmVkU3RhdGUucGFnZSAhPT0gdGhpcy5jdXJyZW50UGFnZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBzYXZlZFN0YXRlLnBhZ2U7XHJcbiAgICAgICAgICAgICAgcGFnZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2F2ZWRTdGF0ZS5wYWdlU2l6ZSAhPT0gdGhpcy5vcHRpb25zLnBhZ2VTaXplKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhZ2VTaXplID0gc2F2ZWRTdGF0ZS5wYWdlU2l6ZTtcclxuICAgICAgICAgICAgICBwYWdlU2l6ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBwYWdlIG9yIHBhZ2Ugc2l6ZSBjaGFuZ2VkLCByZWxvYWQgZGF0YVxyXG4gICAgICAgICAgICBpZiAocGFnZUNoYW5nZWQgfHwgcGFnZVNpemVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLmN1cnJlbnRQYWdlLCBwYWdlU2l6ZUNoYW5nZWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBZGQgdGhlIHJlc3RvcmVkIHN0YXRlIHRvIG91ciBsb2NhbCBoaXN0b3J5XHJcbiAgICAgICAgICAgIHRoaXMucGFnZUhpc3RvcnkucHVzaChzYXZlZFN0YXRlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4ID0gdGhpcy5wYWdlSGlzdG9yeS5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBub3RpZnkgdGhhdCBwYWdlIHN0YXRlIHdhcyByZXN0b3JlZFxyXG4gICAgICAgICAgICB0aGlzLnBhZ2VTdGF0ZVJlc3RvcmVkLmVtaXQoe1xyXG4gICAgICAgICAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXHJcbiAgICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMub3B0aW9ucy5wYWdlU2l6ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEZvcmNlIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIHRoZSBVSVxyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgSW5pdGlhbCBwYWdlIHN0YXRlIHJlc3RvcmVkOiBQYWdlICR7dGhpcy5jdXJyZW50UGFnZX0sIFBhZ2VTaXplICR7dGhpcy5vcHRpb25zLnBhZ2VTaXplfSwgRmlsdGVycyByZXN0b3JlZGApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVzdG9yZSBicm93c2VyIGhpc3Rvcnkgc3RhdGU6JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGlzdGVuIHRvIGJyb3dzZXIgYmFjay9mb3J3YXJkIG5hdmlnYXRpb25cclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cG9wc3RhdGUnLCBbJyRldmVudCddKVxyXG4gIG9uUG9wU3RhdGUoZXZlbnQ6IFBvcFN0YXRlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmVuYWJsZUJyb3dzZXJOYXZpZ2F0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZygnQnJvd3NlciBiYWNrL2ZvcndhcmQgbmF2aWdhdGlvbiBkZXRlY3RlZCcpO1xyXG4gICAgdGhpcy5pc05hdmlnYXRpbmdCYWNrID0gdHJ1ZTtcclxuICAgIHRoaXMucmVzdG9yZVBhZ2VTdGF0ZUZyb21IaXN0b3J5KCk7XHJcbiAgICB0aGlzLmlzTmF2aWdhdGluZ0JhY2sgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc3RvcmUgcGFnZSBzdGF0ZSBmcm9tIGJyb3dzZXIgaGlzdG9yeVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzdG9yZVBhZ2VTdGF0ZUZyb21IaXN0b3J5KCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGhpc3Rvcnkgc3RhdGUgZnJvbSBicm93c2VyXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGhpc3Rvcnkuc3RhdGU7XHJcblxyXG4gICAgICBpZiAoY3VycmVudFN0YXRlICYmIGN1cnJlbnRTdGF0ZS5wYWdpbmdTdGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHNhdmVkU3RhdGUgPSBjdXJyZW50U3RhdGUucGFnaW5nU3RhdGU7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzYXZlZCBzdGF0ZSBoYXMgdmFsaWQgZGF0YVxyXG4gICAgICAgIGlmIChzYXZlZFN0YXRlLnBhZ2UgJiYgc2F2ZWRTdGF0ZS5wYWdlU2l6ZSAmJiBzYXZlZFN0YXRlLmZpbHRlcnMpIHtcclxuICAgICAgICAgIC8vIFJlc3RvcmUgZmlsdGVyIHZhbHVlcyB0byBmb3JtIGNvbnRyb2xzXHJcbiAgICAgICAgICB0aGlzLnJlc3RvcmVGaWx0ZXJWYWx1ZXMoc2F2ZWRTdGF0ZS5maWx0ZXJzKTtcclxuXHJcbiAgICAgICAgICAvLyBHZXQgY3VycmVudCBmaWx0ZXJzIGFmdGVyIHJlc3RvcmF0aW9uXHJcbiAgICAgICAgICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVyc1ZhbHVlKCk7XHJcblxyXG4gICAgICAgICAgLy8gT25seSByZXN0b3JlIGlmIGZpbHRlcnMgbWF0Y2ggKHNhbWUgc2VhcmNoIGNvbnRleHQpXHJcbiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2F2ZWRTdGF0ZS5maWx0ZXJzKSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycmVudEZpbHRlcnMpKSB7XHJcbiAgICAgICAgICAgIGxldCBwYWdlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgcGFnZVNpemVDaGFuZ2VkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2F2ZWRTdGF0ZS5wYWdlICE9PSB0aGlzLmN1cnJlbnRQYWdlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHNhdmVkU3RhdGUucGFnZTtcclxuICAgICAgICAgICAgICBwYWdlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzYXZlZFN0YXRlLnBhZ2VTaXplICE9PSB0aGlzLm9wdGlvbnMucGFnZVNpemUpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGFnZVNpemUgPSBzYXZlZFN0YXRlLnBhZ2VTaXplO1xyXG4gICAgICAgICAgICAgIHBhZ2VTaXplQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIElmIHBhZ2Ugb3IgcGFnZSBzaXplIGNoYW5nZWQsIHJlbG9hZCBkYXRhXHJcbiAgICAgICAgICAgIGlmIChwYWdlQ2hhbmdlZCB8fCBwYWdlU2l6ZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHBhZ2VTaXplQ2hhbmdlZCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBvdXIgbG9jYWwgaGlzdG9yeSBpbmRleCB0byBtYXRjaCB0aGUgYnJvd3NlciBzdGF0ZVxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsSGlzdG9yeUluZGV4KHNhdmVkU3RhdGUpO1xyXG5cclxuICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBub3RpZnkgdGhhdCBwYWdlIHN0YXRlIHdhcyByZXN0b3JlZFxyXG4gICAgICAgICAgICB0aGlzLnBhZ2VTdGF0ZVJlc3RvcmVkLmVtaXQoe1xyXG4gICAgICAgICAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXHJcbiAgICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMub3B0aW9ucy5wYWdlU2l6ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEZvcmNlIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIHRoZSBVSVxyXG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUGFnZSBzdGF0ZSByZXN0b3JlZCBmcm9tIGJyb3dzZXIgbmF2aWdhdGlvbjogUGFnZSAke3RoaXMuY3VycmVudFBhZ2V9LCBQYWdlU2l6ZSAke3RoaXMub3B0aW9ucy5wYWdlU2l6ZX0sIEZpbHRlcnMgcmVzdG9yZWRgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHJlc3RvcmUgcGFnZSBzdGF0ZSBmcm9tIGhpc3Rvcnk6JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGxvY2FsIGhpc3RvcnkgaW5kZXggdG8gbWF0Y2ggYnJvd3NlciBzdGF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTG9jYWxIaXN0b3J5SW5kZXgoc2F2ZWRTdGF0ZTogYW55KTogdm9pZCB7XHJcbiAgICAvLyBGaW5kIHRoZSBtYXRjaGluZyBzdGF0ZSBpbiBvdXIgbG9jYWwgaGlzdG9yeVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnBhZ2VIaXN0b3J5LmZpbmRJbmRleChzdGF0ZSA9PlxyXG4gICAgICBzdGF0ZS5wYWdlID09PSBzYXZlZFN0YXRlLnBhZ2UgJiZcclxuICAgICAgc3RhdGUucGFnZVNpemUgPT09IHNhdmVkU3RhdGUucGFnZVNpemUgJiZcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoc3RhdGUuZmlsdGVycykgPT09IEpTT04uc3RyaW5naWZ5KHNhdmVkU3RhdGUuZmlsdGVycylcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXggPSBpbmRleDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIElmIG5vdCBmb3VuZCwgYWRkIGl0IHRvIG91ciBoaXN0b3J5XHJcbiAgICAgIHRoaXMucGFnZUhpc3RvcnkucHVzaChzYXZlZFN0YXRlKTtcclxuICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4ID0gdGhpcy5wYWdlSGlzdG9yeS5sZW5ndGggLSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIGJyb3dzZXIgaGlzdG9yeSBzdGF0ZSB3aXRoIGN1cnJlbnQgcGFnZSBhbmQgcGFnZSBzaXplXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVIaXN0b3J5U3RhdGUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVCcm93c2VyTmF2aWdhdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3VycmVudEZpbHRlcnMgPSB0aGlzLmdldEZpbHRlcnNWYWx1ZSgpO1xyXG4gICAgY29uc3QgY3VycmVudFN0YXRlID0ge1xyXG4gICAgICBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5vcHRpb25zLnBhZ2VTaXplLFxyXG4gICAgICBmaWx0ZXJzOiBjdXJyZW50RmlsdGVyc1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBPbmx5IHVwZGF0ZSBoaXN0b3J5IGlmIHdlJ3JlIG5vdCBhbHJlYWR5IG5hdmlnYXRpbmcgYmFja1xyXG4gICAgaWYgKCF0aGlzLmlzTmF2aWdhdGluZ0JhY2spIHtcclxuICAgICAgLy8gQWRkIGN1cnJlbnQgc3RhdGUgdG8gbG9jYWwgaGlzdG9yeVxyXG4gICAgICB0aGlzLnBhZ2VIaXN0b3J5LnB1c2goY3VycmVudFN0YXRlKTtcclxuICAgICAgdGhpcy5jdXJyZW50SGlzdG9yeUluZGV4ID0gdGhpcy5wYWdlSGlzdG9yeS5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgLy8gTGltaXQgaGlzdG9yeSBzaXplIHRvIHByZXZlbnQgbWVtb3J5IGlzc3Vlc1xyXG4gICAgICBpZiAodGhpcy5wYWdlSGlzdG9yeS5sZW5ndGggPiA1MCkge1xyXG4gICAgICAgIHRoaXMucGFnZUhpc3Rvcnkuc2hpZnQoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRIaXN0b3J5SW5kZXgtLTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVXBkYXRlIGJyb3dzZXIgaGlzdG9yeSBzdGF0ZVxyXG4gICAgICBjb25zdCBoaXN0b3J5U3RhdGUgPSB7XHJcbiAgICAgICAgcGFnaW5nU3RhdGU6IGN1cnJlbnRTdGF0ZSxcclxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gVXNlIGhpc3RvcnkucHVzaFN0YXRlIHRvIGFkZCBhIG5ldyBoaXN0b3J5IGVudHJ5XHJcbiAgICAgICAgLy8gVGhpcyBhbGxvd3MgcHJvcGVyIGJhY2svZm9yd2FyZCBuYXZpZ2F0aW9uXHJcbiAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoaGlzdG9yeVN0YXRlLCAnJywgdGhpcy5sb2NhdGlvbi5wYXRoKCkpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHVwZGF0ZSBicm93c2VyIGhpc3Rvcnkgc3RhdGU6JywgZXJyb3IpO1xyXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIHJlcGxhY2VTdGF0ZSBpZiBwdXNoU3RhdGUgZmFpbHNcclxuICAgICAgICB0aGlzLmxvY2F0aW9uLnJlcGxhY2VTdGF0ZSh0aGlzLmxvY2F0aW9uLnBhdGgoKSwgJycsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlTdGF0ZSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vbkNsaWNrRmlsdGVyc0NvbnRyb2xOYW1lcyAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5vbkNsaWNrRmlsdGVyc0NvbnRyb2xOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IE9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWVzID0gdGhpcy5vcHRpb25zLm9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWVzO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgT25DbGlja0ZpbHRlcnNDb250cm9sTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgT25DbGlja0ZpbHRlcnNDb250cm9sTmFtZSA9IE9uQ2xpY2tGaWx0ZXJzQ29udHJvbE5hbWVzW2luZGV4XTtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChPbkNsaWNrRmlsdGVyc0NvbnRyb2xOYW1lKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgICAgICB0aGlzLmlzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlSGlzdG9yeVN0YXRlKCk7XHJcbiAgICAgICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG4gICAgICAgIH0sIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lcyAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5vbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IE9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzID0gdGhpcy5vcHRpb25zLm9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZSA9IE9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzW2luZGV4XTtcclxuICAgICAgICBsZXQgZWxlbWVudCA9ICg8YW55PnRoaXMuZ3JvdXAuZ2V0KE9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWUpKS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5rZXkgPT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVIaXN0b3J5U3RhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vQWRkIGNsaWNrIGV2ZW50IG9uIFJlc2V0IEZpbHRlciBidXR0b25cclxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVzZXRGaWx0ZXJCdXR0b25OYW1lICE9IG51bGwpIHtcclxuICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUodGhpcy5vcHRpb25zLnJlc2V0RmlsdGVyQnV0dG9uTmFtZSlbMF07XHJcbiAgICAgIGlmIChidXR0b24gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSBidXR0b24gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2xlYXJGaWx0ZXJzKCk7XHJcbiAgICAgICAgfSwgZmFsc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnR5cGVhaGVhZFNlYXJjaENvbnRyb2xOYW1lcyAhPSBudWxsICYmIHRoaXMub3B0aW9ucy50eXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBUeXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZXMgPSB0aGlzLm9wdGlvbnMudHlwZWFoZWFkU2VhcmNoQ29udHJvbE5hbWVzO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVHlwZWFoZWFkU2VhcmNoQ29udHJvbE5hbWVzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IFR5cGVhaGVhZFNlYXJjaENvbnRyb2xOYW1lID0gVHlwZWFoZWFkU2VhcmNoQ29udHJvbE5hbWVzW2luZGV4XTtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChUeXBlYWhlYWRTZWFyY2hDb250cm9sTmFtZSkuYWRkRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZS5rZXkgPT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlyc3RDYWxsID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVIaXN0b3J5U3RhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCBmYWxzZSk7XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgb25Ecm9wRG93bkNoYW5nZShyZXN1bHQpIHtcclxuICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHRoaXMuaXNGaXJzdENhbGwgPSB0cnVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VQYWdlKFBhZ2UpIHtcclxuICAgIGlmIChQYWdlID09IDApXHJcbiAgICAgIHJldHVybjtcclxuICAgIGlmIChQYWdlID4gMCkge1xyXG4gICAgICBpZiAodGhpcy5pc0ZpcnN0Q2FsbCkge1xyXG4gICAgICAgIHRoaXMuaXNGaXJzdENhbGwgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IFBhZ2U7XHJcbiAgICAgIHRoaXMudXBkYXRlSGlzdG9yeVN0YXRlKCk7XHJcbiAgICAgIHRoaXMuZ2V0SXRlbUxpc3QoUGFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VQYWdlU2l6ZShlKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMucGFnZVNpemUgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5pc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB0aGlzLnVwZGF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgdGhpcy5nZXRJdGVtTGlzdCh0aGlzLmN1cnJlbnRQYWdlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIG9uU2Nyb2xsRG93bigpIHtcclxuICAgIHRoaXMuc3VtICs9IHRoaXMub3B0aW9ucy5wYWdlU2l6ZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5pc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB0aGlzLmRpcmVjdGlvbiA9ICdkb3duJztcclxuICAgIHRoaXMuZ2V0SXRlbUxpc3QodGhpcy5jdXJyZW50UGFnZSwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRJdGVtTGlzdChwYWdlLCBJc0ZpbHRlclVwZGF0ZWQgPSBmYWxzZSkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdGFydFBhZ2luZ0NhbGxiYWNrKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuc3RhcnRQYWdpbmdDYWxsYmFjay5jYWxsKG51bGwpO1xyXG5cclxuICAgIGxldCBmaWx0ZXJzID0ge307XHJcbiAgICBmaWx0ZXJzID0gdGhpcy5nZXRGaWx0ZXJzVmFsdWUoKTtcclxuXHJcbiAgICAvLyBTa2lwIGZpbHRlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIHdlJ3JlIHJlc3RvcmluZyBmaWx0ZXJzIGZyb20gYnJvd3NlciBoaXN0b3J5XHJcbiAgICBpZiAoIXRoaXMuaXNSZXN0b3JpbmdGaWx0ZXJzICYmICFJc0ZpbHRlclVwZGF0ZWQgJiYgT2JqZWN0LmtleXModGhpcy5wcmV2aW91c0ZpbHRlcnMpLmxlbmd0aCAhPSAwICYmIEpTT04uc3RyaW5naWZ5KHRoaXMucHJldmlvdXNGaWx0ZXJzKSAhPSBKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSkge1xyXG4gICAgICAvL1JlaW5pdGlhbGl6ZSBpZiBmaWx0ZXJzIGNoYW5nZWRcclxuICAgICAgcGFnZSA9IDE7XHJcbiAgICAgIElzRmlsdGVyVXBkYXRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLnByZXZpb3VzRmlsdGVycyA9IGZpbHRlcnM7XHJcbiAgICBsZXQgcGFnaW5nRFRPID0gbmV3IFBhZ2luZ0RUTygpO1xyXG4gICAgbGV0IHNpemUgPSBOdW1iZXIucGFyc2VJbnQodGhpcy5vcHRpb25zLnBhZ2VTaXplLnRvU3RyaW5nKCkpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5pc0xvYWRNb3JlQ29udHJvbClcclxuICAgICAgcGFnaW5nRFRPLlBhZ2VDb3VudCA9IHRoaXMuc3VtO1xyXG4gICAgZWxzZVxyXG4gICAgICBwYWdpbmdEVE8uUGFnZUNvdW50ID0gc2l6ZTtcclxuXHJcbiAgICBwYWdpbmdEVE8uQ3VycmVudFBhZ2VOdW1iZXIgPSBwYWdlO1xyXG4gICAgcGFnaW5nRFRPLlRvdGFsQ291bnQgPSB0aGlzLnRvdGFsUm93O1xyXG4gICAgcGFnaW5nRFRPLklzRmlsdGVyVXBkYXRlZCA9IElzRmlsdGVyVXBkYXRlZDtcclxuXHJcbiAgICAvL1NldCBGaWx0ZXJzIG9iamVjdCB0aGF0IHNlbnQgdG8gYWN0aW9uIFVSTFxyXG4gICAgbGV0IGZpbHRlcnNEVE86IFBhZ2luZ1BheWxvYWQgPSB7XHJcbiAgICAgIFBhZ2luZ0RUTzogcGFnaW5nRFRPLFxyXG4gICAgICBGaWx0ZXJzOiBmaWx0ZXJzXHJcbiAgICB9O1xyXG5cclxuICAgIGxldCByZXF1ZXN0T3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9uc01vZGVsKCk7XHJcbiAgICByZXF1ZXN0T3B0aW9ucy5kaXNhYmxlQmxvY2tVSSA9IHRoaXMub3B0aW9ucy5kaXNhYmxlQmxvY2tVSTtcclxuICAgIHRoaXMucmVxdWVzdEhhbmRsZXJTZXJ2aWNlLnBvc3QodGhpcy5vcHRpb25zLmFjdGlvblBvc3RVUkwsIHRoaXMub3B0aW9ucy5maWx0ZXJzICYmIHRoaXMub3B0aW9ucy5maWx0ZXJzLmxlbmd0aCA+IDAgPyBmaWx0ZXJzRFRPIDogcGFnaW5nRFRPLCBudWxsLCBudWxsLCByZXF1ZXN0T3B0aW9ucylcclxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2VEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMudG90YWxDb3VudCA9IHJlc3BvbnNlRGF0YS50b3RhbENvdW50O1xyXG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzcG9uc2VEYXRhLml0ZW1zOyAvL3RoaXMuY2FzdEl0ZW1zKHJlc3BvbnNlRGF0YS5pdGVtcyk7XHJcbiAgICAgICAgbGV0IGNhc3RlZFJlc3VsdCA9IHBsYWluVG9DbGFzcyh0aGlzLm9wdGlvbnMuVHlwZU9mUmVzcG9uc2UsIHRoaXMucmVzdWx0LCB7IGV4Y2x1ZGVFeHRyYW5lb3VzVmFsdWVzOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuSXRlbXMuZW1pdChjYXN0ZWRSZXN1bHQpO1xyXG4gICAgICAgIHRoaXMudG90YWxSb3cgPSByZXNwb25zZURhdGEudG90YWxDb3VudDtcclxuXHJcbiAgICAgICAgaWYgKElzRmlsdGVyVXBkYXRlZCkge1xyXG4gICAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5QYWdlcyA9IE1hdGguY2VpbCgodGhpcy50b3RhbFJvdyAvIHRoaXMub3B0aW9ucy5wYWdlU2l6ZSkpO1xyXG4gICAgICAgICAgdGhpcy5pdGVtcyA9IEFycmF5KHRoaXMudG90YWxSb3cpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2V0VGV4dCh0aGlzLlBhZ2VzLCB0aGlzLnRvdGFsUm93KTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDEpXHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCIvQWRtaW4vYWNjb3VudC9sb2dpblwiXSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVpbml0aWFsaXplUGFnaW5nID0gKCkgPT4ge1xyXG4gICAgdGhpcy5pc0ZpcnN0Q2FsbCA9IHRydWU7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMuY2xlYXJIaXN0b3J5U3RhdGUoKTtcclxuICAgIHRoaXMuZ2V0SXRlbUxpc3QoMSwgdHJ1ZSk7XHJcbiAgfTtcclxuXHJcbiAgdXBkYXRlUGFnaW5nID0gKCkgPT4ge1xyXG4gICAgLy90aGlzLklzRmlyc3RDYWxsPXRydWU7XHJcbiAgICB0aGlzLmdldEl0ZW1MaXN0KHRoaXMuY3VycmVudFBhZ2UpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcmNlIHVwZGF0ZSB0aGUgY3VycmVudCBwYWdlICh1c2VmdWwgZm9yIGV4dGVybmFsIGNvbXBvbmVudHMpXHJcbiAgICovXHJcbiAgc2V0Q3VycmVudFBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAocGFnZSA+IDAgJiYgcGFnZSAhPT0gdGhpcy5jdXJyZW50UGFnZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcclxuICAgICAgdGhpcy51cGRhdGVIaXN0b3J5U3RhdGUoKTtcclxuICAgICAgdGhpcy5nZXRJdGVtTGlzdChwYWdlKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IHBhZ2UgbnVtYmVyXHJcbiAgICovXHJcbiAgZ2V0Q3VycmVudFBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdG9yZSBmaWx0ZXIgdmFsdWVzIHRvIGZvcm0gY29udHJvbHNcclxuICAgKi9cclxuICBwcml2YXRlIHJlc3RvcmVGaWx0ZXJWYWx1ZXMoc2F2ZWRGaWx0ZXJzOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vcHRpb25zLmZpbHRlcnMgfHwgIXRoaXMuZ3JvdXApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNSZXN0b3JpbmdGaWx0ZXJzID0gdHJ1ZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLmZpbHRlcnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdO1xyXG5cclxuICAgICAgICBpZiAoZmlsdGVyLmZvcm1Db250cm9sTmFtZSAmJiBmaWx0ZXIuZm9ybUNvbnRyb2xOYW1lICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbE5hbWUgPSBmaWx0ZXIuZm9ybUNvbnRyb2xOYW1lO1xyXG4gICAgICAgICAgY29uc3QgYWN0aW9uUGFyYW1ldGVyTmFtZSA9IGZpbHRlci5hY3Rpb25QYXJhbWV0ZXJOYW1lO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBzYXZlZCB2YWx1ZSBmb3IgdGhpcyBmaWx0ZXJcclxuICAgICAgICAgIGlmIChzYXZlZEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYWN0aW9uUGFyYW1ldGVyTmFtZSkpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2F2ZWRWYWx1ZSA9IHNhdmVkRmlsdGVyc1thY3Rpb25QYXJhbWV0ZXJOYW1lXTtcclxuXHJcbiAgICAgICAgICAgIC8vIE9ubHkgcmVzdG9yZSBpZiB0aGUgdmFsdWUgaXMgbm90IG51bGwvdW5kZWZpbmVkL2VtcHR5XHJcbiAgICAgICAgICAgIGlmIChzYXZlZFZhbHVlICE9PSBudWxsICYmIHNhdmVkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBzYXZlZFZhbHVlICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgLy8gU2V0IHRoZSB2YWx1ZSB0byB0aGUgZm9ybSBjb250cm9sXHJcbiAgICAgICAgICAgICAgdGhpcy5ncm91cC5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnNldFZhbHVlKHNhdmVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSZXN0b3JlZCBmaWx0ZXIgJHtmb3JtQ29udHJvbE5hbWV9IHdpdGggdmFsdWU6YCwgc2F2ZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5qUXVlcnlTZWxlY3Rvcikge1xyXG4gICAgICAgICAgLy8gSGFuZGxlIGpRdWVyeSBzZWxlY3RvciBiYXNlZCBmaWx0ZXJzXHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25QYXJhbWV0ZXJOYW1lID0gZmlsdGVyLmFjdGlvblBhcmFtZXRlck5hbWU7XHJcblxyXG4gICAgICAgICAgaWYgKHNhdmVkRmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhY3Rpb25QYXJhbWV0ZXJOYW1lKSkge1xyXG4gICAgICAgICAgICBjb25zdCBzYXZlZFZhbHVlID0gc2F2ZWRGaWx0ZXJzW2FjdGlvblBhcmFtZXRlck5hbWVdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNhdmVkVmFsdWUgIT09IG51bGwgJiYgc2F2ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHNhdmVkVmFsdWUgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihmaWx0ZXIualF1ZXJ5U2VsZWN0b3IpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBzYXZlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlc3RvcmVkIGpRdWVyeSBmaWx0ZXIgJHtmaWx0ZXIualF1ZXJ5U2VsZWN0b3J9IHdpdGggdmFsdWU6YCwgc2F2ZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZXN0b3JlIGZpbHRlciB2YWx1ZXM6JywgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgLy8gUmVzZXQgdGhlIGZsYWcgYWZ0ZXIgYSBzaG9ydCBkZWxheSB0byBhbGxvdyBmb3JtIGNvbnRyb2xzIHRvIHVwZGF0ZVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmlzUmVzdG9yaW5nRmlsdGVycyA9IGZhbHNlO1xyXG4gICAgICB9LCAxMDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FzdEl0ZW1zKG9iamVjdEFycjogYW55W10pOiBUW10ge1xyXG4gICAgbGV0IG9yaWdpbmFsQXJyYXk6IFRbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9iamVjdEFyci5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IG9iamVjdEFycltpbmRleF07XHJcbiAgICAgIGxldCBrZXksIGtleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50KTtcclxuICAgICAgbGV0IG4gPSBrZXlzLmxlbmd0aDtcclxuICAgICAgbGV0IG5ld09iamVjdCA9IHt9O1xyXG4gICAgICB3aGlsZSAobi0tKSB7XHJcbiAgICAgICAga2V5ID0ga2V5c1tuXTtcclxuICAgICAgICBsZXQgT2tleSA9IGtleTtcclxuICAgICAgICBuZXdPYmplY3Rba2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgT2tleS5zbGljZSgxKV0gPSBlbGVtZW50W2tleV07XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGZpbmFsT2JqZWN0ID0gbmV3T2JqZWN0IGFzIFQ7XHJcbiAgICAgIG9yaWdpbmFsQXJyYXkucHVzaChmaW5hbE9iamVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9yaWdpbmFsQXJyYXk7XHJcbiAgfVxyXG5cclxuICBzZXRUZXh0KHBhZ2VzTnVtYmVyOiBudW1iZXIsIGl0ZW1zTnVtYmVyOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLnV0aWxpdHlTZXJ2aWNlLmlzQ3VycmVudExhbmd1YWdlQXJhYmljKCkpIHtcclxuICAgICAgLy9TZXQgcGFnZXMgdGV4dFxyXG4gICAgICBpZiAocGFnZXNOdW1iZXIgPCAzIHx8IHBhZ2VzTnVtYmVyID4gMTApXHJcbiAgICAgICAgdGhpcy5wYWdlc1RleHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJQYWdlXCIpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5wYWdlc1RleHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJQYWdlc1wiKTtcclxuICAgICAgLy9TZXQgaXRlbXMgdGV4dFxyXG4gICAgICBpZiAoaXRlbXNOdW1iZXIgPCAzIHx8IGl0ZW1zTnVtYmVyID4gMTApXHJcbiAgICAgICAgdGhpcy5pdGVtc1RleHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJJdGVtXCIpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5pdGVtc1RleHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJJdGVtc1wiKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvL1NldCBwYWdlcyB0ZXh0XHJcbiAgICAgIGlmIChwYWdlc051bWJlciA+IDEpXHJcbiAgICAgICAgdGhpcy5wYWdlc1RleHQgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJQYWdlc1wiKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMucGFnZXNUZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUGFnZVwiKTtcclxuICAgICAgLy9TZXQgaXRlbXMgdGV4dFxyXG4gICAgICBpZiAoaXRlbXNOdW1iZXIgPiAxKVxyXG4gICAgICAgIHRoaXMuaXRlbXNUZXh0ID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSXRlbXNcIik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLml0ZW1zVGV4dCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkl0ZW1cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlcnMoKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmZpbHRlcnMgIT0gbnVsbCkge1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLmZpbHRlcnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5mb3JtQ29udHJvbE5hbWUgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uZm9ybUNvbnRyb2xOYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgIGNvbnN0IEZvcm1Db250cm9sTmFtZSA9IHRoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5mb3JtQ29udHJvbE5hbWU7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW0Zvcm1Db250cm9sTmFtZV0uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIENsZWFyIGhpc3Rvcnkgc3RhdGUgd2hlbiBmaWx0ZXJzIGFyZSByZXNldFxyXG4gICAgICB0aGlzLmNsZWFySGlzdG9yeVN0YXRlKCk7XHJcbiAgICAgIHRoaXMucmVpbml0aWFsaXplUGFnaW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBwYWdlIGhpc3Rvcnkgc3RhdGVcclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFySGlzdG9yeVN0YXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlQnJvd3Nlck5hdmlnYXRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIHRoZSBwYWdlIGhpc3RvcnlcclxuICAgIHRoaXMucGFnZUhpc3RvcnkgPSBbXTtcclxuICAgIHRoaXMuY3VycmVudEhpc3RvcnlJbmRleCA9IC0xO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyc1ZhbHVlKCkge1xyXG4gICAgbGV0IGZpbHRlcnMgPSB7fTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsdGVycyAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuZmlsdGVycy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmZvcm1Db250cm9sTmFtZSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5mb3JtQ29udHJvbE5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgY29uc3QgRm9ybUNvbnRyb2xOYW1lID0gdGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmZvcm1Db250cm9sTmFtZTtcclxuICAgICAgICAgIGxldCBDb250cm9sVmFsdWUgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW0Zvcm1Db250cm9sTmFtZV0udmFsdWU7XHJcbiAgICAgICAgICBpZiAoQ29udHJvbFZhbHVlICE9IHVuZGVmaW5lZCAmJiBDb250cm9sVmFsdWUgIT0gbnVsbCAmJiBDb250cm9sVmFsdWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmZpbHRlclR5cGUgPT0gRmlsdGVyVHlwZS5EYXRlUGlja2VyKSB7XHJcbiAgICAgICAgICAgICAgLy9pZiAoQXJyYXkuaXNBcnJheShDb250cm9sVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgLy8gIGZvciAobGV0IGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgQ29udHJvbFZhbHVlLmxlbmd0aDsgZWxlbWVudCsrKSB7XHJcbiAgICAgICAgICAgICAgLy8gICAgY29uc3QgdmFsdWUgPSBDb250cm9sVmFsdWVbZWxlbWVudF07XHJcbiAgICAgICAgICAgICAgLy8gICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuRmlsdGVyc1tpbmRleF0uQWN0aW9uUGFyYW1ldGVyTmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAvLyAgfVxyXG4gICAgICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgICAgIC8vZWxzZSB7XHJcbiAgICAgICAgICAgICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uYWN0aW9uUGFyYW1ldGVyTmFtZV0gPSBDb250cm9sVmFsdWU7XHJcbiAgICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5maWx0ZXJUeXBlID09IEZpbHRlclR5cGUuQXV0b2NvbXBsZXRlVGV4dEJveClcclxuICAgICAgICAgICAgICAgIENvbnRyb2xWYWx1ZSA9IENvbnRyb2xWYWx1ZTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmZpbHRlclR5cGUgPT0gRmlsdGVyVHlwZS5UYWdJbnB1dClcclxuICAgICAgICAgICAgICAgIENvbnRyb2xWYWx1ZSA9IENvbnRyb2xWYWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uYWN0aW9uUGFyYW1ldGVyTmFtZV0gPSBDb250cm9sVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBmaWx0ZXJzW3RoaXMub3B0aW9ucy5maWx0ZXJzW2luZGV4XS5hY3Rpb25QYXJhbWV0ZXJOYW1lXSA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgRWxlbWVudGpRdWVyeVNlbGVjdG9yID0gdGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmpRdWVyeVNlbGVjdG9yO1xyXG4gICAgICAgICAgbGV0IEVsZW1lbnRWYWx1ZSA9IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKEVsZW1lbnRqUXVlcnlTZWxlY3RvcikgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICAgICAgICBpZiAoRWxlbWVudFZhbHVlICE9IHVuZGVmaW5lZCAmJiBFbGVtZW50VmFsdWUgIT0gbnVsbClcclxuICAgICAgICAgICAgZmlsdGVyc1t0aGlzLm9wdGlvbnMuZmlsdGVyc1tpbmRleF0uYWN0aW9uUGFyYW1ldGVyTmFtZV0gPSBFbGVtZW50VmFsdWU7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGZpbHRlcnNbdGhpcy5vcHRpb25zLmZpbHRlcnNbaW5kZXhdLmFjdGlvblBhcmFtZXRlck5hbWVdID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmaWx0ZXJzO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBiYnNmLWNvbnRyb2wgYmJzZi1wYWdpbmdcIiAqbmdJZj1cIihyZXN1bHQubGVuZ3RoID4gMClcIiByb2xlPVwibmF2aWdhdGlvblwiIFthdHRyLmFyaWEtbGFiZWxdPVwidXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnUGFnaW5hdGlvbicpXCI+XHJcbiAgPCEtLXBhZ2luZyBjb250YWluZXItLT5cclxuICA8ZGl2IGNsYXNzPVwiYmJzZi1wYWdpbmctY29udGFpbmVyXCIgKm5nSWY9XCIhb3B0aW9ucy5pc0xvYWRNb3JlQ29udHJvbFwiPlxyXG4gICAgPCEtLWl0ZW1zLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi1wYWdpbmF0aW9uXCI+XHJcbiAgICAgIDxqdy1wYWdpbmF0aW9uIFtpdGVtc109XCJpdGVtc1wiICpuZ0lmPVwiISgoUGFnZXM9PTEpJiZvcHRpb25zLmhpZGVQYWdpbmF0aW9uV2hlblBhZ2VTaXplRXF1YWxPbmUpXCJcclxuICAgICAgICAoY2hhbmdlUGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiIFtwYWdlU2l6ZV09XCJvcHRpb25zLnBhZ2VTaXplXCIgW1Nob3dGaXJzdEFuZExhc3RdPVwib3B0aW9ucy5zaG93Rmlyc3RBbmRMYXN0XCJcclxuICAgICAgICBbaW5pdGlhbFBhZ2VdPVwiY3VycmVudFBhZ2VcIiBbbWF4UGFnZXNdPVwiMTBcIj48L2p3LXBhZ2luYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1wYWdlIGNvdW50LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi1wYWdlc1wiICpuZ0lmPVwiISgoUGFnZXM9PTEpJiZvcHRpb25zLmhpZGVQYWdpbmF0aW9uV2hlblBhZ2VTaXplRXF1YWxPbmUpXCI+XHJcbiAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJjaGFuZ2VQYWdlU2l6ZSgkZXZlbnQpXCIgKm5nSWY9XCJvcHRpb25zLnNob3dQYWdlU2l6ZU9wdGlvblwiIFxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnU2VsZWN0UGFnZVNpemUnKVwiIFxyXG4gICAgICAgIFtuZ2JUb29sdGlwXT1cInV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ1NlbGVjdFBhZ2VTaXplJylcIj5cclxuICAgICAgICA8b3B0aW9uPjEwPC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbj4yMDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24+NTA8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uPjEwMDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24+MjAwPC9vcHRpb24+XHJcbiAgICAgIDwvc2VsZWN0PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYnNzZi1pdGVtc1wiIFthdHRyLmFyaWEtbGFiZWxdPVwidXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnUGFnZUluZm8nKVwiPlxyXG4gICAgICAgIDxzdHJvbmc+e3t0b3RhbFJvd319PC9zdHJvbmc+IHt7aXRlbXNUZXh0fX0ge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSW5cIil9fSA8c3Ryb25nPlxyXG4gICAgICAgICAge3tQYWdlc319PC9zdHJvbmc+IHt7cGFnZXNUZXh0fX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8IS0tbG9hZCBtb3JlLS0+XHJcbiAgPGRpdiBjbGFzcz1cImJic2YtbG9hZG1vcmVcIiAqbmdJZj1cIm9wdGlvbnMuaXNMb2FkTW9yZUNvbnRyb2xcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtcmVzdWx0c1wiIGluZmluaXRlLXNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCJzY3JvbGxEaXN0YW5jZVwiXHJcbiAgICAgIFtpbmZpbml0ZVNjcm9sbFVwRGlzdGFuY2VdPVwic2Nyb2xsVXBEaXN0YW5jZVwiIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cInRocm90dGxlXCJcclxuICAgICAgKHNjcm9sbGVkKT1cIm9wdGlvbnMuaXNJbmZpbml0ZVNjcm9sbD09dHJ1ZT9vblNjcm9sbERvd24oKTpudWxsXCIgW3Njcm9sbFdpbmRvd109XCJvcHRpb25zLnNjcm9sbFdpbmRvd1wiXHJcbiAgICAgIFtpbmZpbml0ZVNjcm9sbENvbnRhaW5lcl09XCJvcHRpb25zLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyXCI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uU2Nyb2xsRG93bigpXCJcclxuICAgICAgKm5nSWY9XCIhKHJlc3VsdC5sZW5ndGg9PXRvdGFsUm93KVwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTG9hZE1vcmUnKVwiXHJcbiAgICAgIFtuZ2JUb29sdGlwXT1cInV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0xvYWRNb3JlJylcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJMb2FkTW9yZVwiKX19PC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==