igniteui-angular 13.1.0 → 13.1.1
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.
- package/esm2020/lib/directives/for-of/for_of.directive.mjs +3 -2
- package/esm2020/lib/grids/pivot-grid/pivot-grid.component.mjs +3 -3
- package/esm2020/lib/grids/pivot-grid/pivot-row-dimension-content.component.mjs +3 -6
- package/fesm2015/igniteui-angular.mjs +6 -8
- package/fesm2015/igniteui-angular.mjs.map +1 -1
- package/fesm2020/igniteui-angular.mjs +6 -8
- package/fesm2020/igniteui-angular.mjs.map +1 -1
- package/lib/grids/pivot-grid/pivot-row-dimension-content.component.d.ts +0 -1
- package/package.json +1 -1
|
@@ -1700,7 +1700,7 @@ IgxPivotGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
|
|
|
1700
1700
|
IgxPivotColumnResizingService,
|
|
1701
1701
|
IgxForOfSyncService,
|
|
1702
1702
|
IgxForOfScrollSyncService
|
|
1703
|
-
], viewQueries: [{ propertyName: "theadRow", first: true, predicate: IgxPivotHeaderRowComponent, descendants: true, static: true }, { propertyName: "recordTemplate", first: true, predicate: ["record_template"], descendants: true, read: TemplateRef, static: true }, { propertyName: "headerTemplate", first: true, predicate: ["headerTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "resizeLine", first: true, predicate: IgxPivotGridColumnResizerComponent, descendants: true }, { propertyName: "defaultEmptyPivotGridTemplate", first: true, predicate: ["emptyPivotGridTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "excelStyleFilteringComponents", predicate: IgxGridExcelStyleFilteringComponent, descendants: true, read: IgxGridExcelStyleFilteringComponent }, { propertyName: "rowDimensionContentCollection", predicate: IgxPivotRowDimensionContentComponent, descendants: true }, { propertyName: "verticalRowDimScrollContainers", predicate: ["verticalRowDimScrollContainer"], descendants: true, read: IgxGridForOfDirective }], usesInheritance: true, ngImport: i0, template: "<!-- Toolbar area -->\n<ng-content select=\"igx-grid-toolbar\"></ng-content>\n\n<!-- Grid table head row area -->\n<igx-pivot-header-row class=\"igx-grid-thead igx-grid-thead--pivot\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [density]=\"displayDensity\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (scroll)=\"preventHeaderScroll($event)\"\n>\n</igx-pivot-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"rowDimensions.length ? defaultRowDimensionsTemplate : emptyRowDimensionsTemplate; context: this\"></ng-container>\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" [attr.role]=\"dataView.length ? null : 'row'\" (keydown)=\"navigation.handleNavigation($event)\" (focus)=\"navigation.focusTbody($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" (scroll)='preventContainerScroll($event)'\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth || null' #tbody [attr.aria-activedescendant]=\"activeDescendant\">\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | pivotGridFilter:pivotConfiguration:filterStrategy:advancedFilteringExpressionsTree:filteringPipeTrigger:pipeTrigger\n | pivotGridSort:pivotConfiguration:sortStrategy:pipeTrigger\n | pivotGridRow:pivotConfiguration:expansionStates:pipeTrigger:sortingExpressions\n | pivotGridColumn:pivotConfiguration:expansionStates:pipeTrigger:sortingExpressions\n | pivotGridAutoTransform:pivotConfiguration:pipeTrigger\n | pivotGridColumnSort:sortingExpressions:sortStrategy:pipeTrigger\n | pivotGridRowExpansion:pivotConfiguration:expansionStates:defaultExpandState:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"hasColumnLayouts ? rowHeight * multiRowLayoutRowSize + 1 : renderedRowHeight\"\n #verticalScrollContainer>\n <ng-template\n [igxTemplateOutlet]='recordTemplate'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex)'\n (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n </ng-template>\n <ng-template #record_template let-rowIndex=\"index\" let-rowData>\n <igx-pivot-row [style.min-height.px]=\"renderedRowHeight\" [gridID]=\"id\" [index]=\"rowIndex\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-pivot-row>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div #igxBodyOverlayOutlet=\"overlay-outlet\" igxOverlayOutlet></div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='EMPTY_DATA' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" #tfoot>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n </span>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n<igx-pivot-grid-column-resizer [restrictResizerTop]=\"theadRow.nativeElement.clientHeight\" *ngIf=\"colResizingService.showResizer\"></igx-pivot-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n\n<ng-template #headerTemplate let-column>\n <div class=\"igx-grid__tr--header\">\n <igx-icon [attr.draggable]=\"false\"\n (click)=\"toggleColumn(column)\">\n {{getColumnGroupExpandState(column) ? 'chevron_right' : 'expand_more'}}</igx-icon>\n {{column.header}}\n </div>\n</ng-template>\n\n<ng-template #defaultRowDimensionsTemplate>\n <div tabindex=\"0\" [style.height.px]='totalHeight' *ngFor='let dim of rowDimensions; let dimIndex = index;' #rowDimensionContainer role=\"rowgroup\" class='igx-grid__tbody-pivot-dimension' (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\">\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"dataView\n | pivotGridCellMerging:pivotConfiguration:dim:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"renderedRowHeight\"\n [igxForSizePropName]='\"height\"'\n #verticalRowDimScrollContainer>\n <igx-pivot-row-dimension-content role='row' class=\"igx-grid-thead\" [grid]=\"this\"\n [dimension]='rowData.dimensions[dimIndex]'\n [rootDimension]='dim'\n [rowIndex]='rowIndex' [rowData]='rowData'\n [density]=\"displayDensity\" [width]=\"rowDimensionWidthToPixels(dim)\">\n </igx-pivot-row-dimension-content>\n </ng-template>\n </div>\n</ng-template>\n<ng-template #emptyRowDimensionsTemplate>\n <div tabindex=\"0\" *ngIf='columnDimensions.length > 0 || values.length > 0' #rowDimensionContainer role=\"rowgroup\" class='igx-grid__tbody-pivot-dimension' (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\">\n <igx-pivot-row-dimension-content role='row' class=\"igx-grid-thead\" [grid]=\"this\"\n [dimension]='emptyRowDimension'\n [rootDimension]='emptyRowDimension'\n [rowIndex]='0' [rowData]='dataView[0]'\n [density]=\"displayDensity\" [width]=\"rowDimensionWidthToPixels(emptyRowDimension)\">\n </igx-pivot-row-dimension-content>\n </div>\n</ng-template>\n\n<ng-template #emptyPivotGridTemplate>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{resourceStrings.igx_grid_pivot_empty_message}}</span>\n </span>\n</ng-template>\n\n<div [hidden]='true'>\n <igx-grid-excel-style-filtering [maxHeight]='excelStyleFilterMaxHeight' [minHeight]='excelStyleFilterMinHeight'>\n <div igxExcelStyleColumnOperations [hidden]='true'></div>\n <igx-excel-style-filter-operations>\n <igx-excel-style-search></igx-excel-style-search>\n </igx-excel-style-filter-operations>\n </igx-grid-excel-style-filtering>\n</div>\n", components: [{ type: i9.IgxPivotHeaderRowComponent, selector: "igx-pivot-header-row" }, { type: i10.IgxPivotRowComponent, selector: "igx-pivot-row", inputs: ["selected", "data"] }, { type: i11.IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { type: i12.IgxSnackbarComponent, selector: "igx-snackbar", inputs: ["id", "actionText", "positionSettings"], outputs: ["clicked", "animationStarted", "animationDone"] }, { type: i13.IgxPivotGridColumnResizerComponent, selector: "igx-pivot-grid-column-resizer" }, { type: i14.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { type: i15.IgxPivotRowDimensionContentComponent, selector: "igx-pivot-row-dimension-content", inputs: ["rowIndex", "dimension", "rootDimension", "rowData"] }, { type: i16.IgxGridExcelStyleFilteringComponent, selector: "igx-grid-excel-style-filtering", inputs: ["column", "minHeight", "maxHeight"], outputs: ["loadingStart", "loadingEnd", "initialized", "sortingChanged", "columnChange", "listDataLoaded"] }, { type: i17.IgxExcelStyleSearchComponent, selector: "igx-excel-style-search" }], directives: [{ type: i18.IgxGridBodyDirective, selector: "[igxGridBody]" }, { type: i19.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i20.IgxGridDragSelectDirective, selector: "[igxGridDragSelect]", inputs: ["igxGridDragSelect"], outputs: ["dragStop", "dragScroll"] }, { type: i19.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i21.IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { type: i22.IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache"], outputs: ["dataChanging"] }, { type: i23.IgxTemplateOutletDirective, selector: "[igxTemplateOutlet]", inputs: ["igxTemplateOutletContext", "igxTemplateOutlet"], outputs: ["viewCreated", "viewMoved", "cachedViewLoaded", "beforeViewDetach"] }, { type: i19.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i19.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i24.IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { type: i24.IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { type: i19.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i16.IgxExcelStyleColumnOperationsTemplateDirective, selector: "igx-excel-style-column-operations,[igxExcelStyleColumnOperations]" }, { type: i16.IgxExcelStyleFilterOperationsTemplateDirective, selector: "igx-excel-style-filter-operations,[igxExcelStyleFilterOperations]" }], pipes: { "pivotGridRowExpansion": i25.IgxPivotRowExpansionPipe, "pivotGridColumnSort": i25.IgxPivotGridColumnSortingPipe, "pivotGridAutoTransform": i25.IgxPivotAutoTransform, "pivotGridColumn": i25.IgxPivotColumnPipe, "pivotGridRow": i25.IgxPivotRowPipe, "pivotGridSort": i25.IgxPivotGridSortingPipe, "pivotGridFilter": i25.IgxPivotGridFilterPipe, "igxGridRowClasses": i26.IgxGridRowClassesPipe, "igxGridRowStyles": i26.IgxGridRowStylesPipe, "pivotGridCellMerging": i25.IgxPivotCellMergingPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1703
|
+
], viewQueries: [{ propertyName: "theadRow", first: true, predicate: IgxPivotHeaderRowComponent, descendants: true, static: true }, { propertyName: "recordTemplate", first: true, predicate: ["record_template"], descendants: true, read: TemplateRef, static: true }, { propertyName: "headerTemplate", first: true, predicate: ["headerTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "resizeLine", first: true, predicate: IgxPivotGridColumnResizerComponent, descendants: true }, { propertyName: "defaultEmptyPivotGridTemplate", first: true, predicate: ["emptyPivotGridTemplate"], descendants: true, read: TemplateRef, static: true }, { propertyName: "excelStyleFilteringComponents", predicate: IgxGridExcelStyleFilteringComponent, descendants: true, read: IgxGridExcelStyleFilteringComponent }, { propertyName: "rowDimensionContentCollection", predicate: IgxPivotRowDimensionContentComponent, descendants: true }, { propertyName: "verticalRowDimScrollContainers", predicate: ["verticalRowDimScrollContainer"], descendants: true, read: IgxGridForOfDirective }], usesInheritance: true, ngImport: i0, template: "<!-- Toolbar area -->\n<ng-content select=\"igx-grid-toolbar\"></ng-content>\n\n<!-- Grid table head row area -->\n<igx-pivot-header-row class=\"igx-grid-thead igx-grid-thead--pivot\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [density]=\"displayDensity\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (scroll)=\"preventHeaderScroll($event)\"\n>\n</igx-pivot-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"rowDimensions.length ? defaultRowDimensionsTemplate : emptyRowDimensionsTemplate; context: this\"></ng-container>\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" [attr.role]=\"dataView.length ? null : 'row'\" (keydown)=\"navigation.handleNavigation($event)\" (focus)=\"navigation.focusTbody($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" (scroll)='preventContainerScroll($event)'\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth || null' #tbody [attr.aria-activedescendant]=\"activeDescendant\">\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | pivotGridFilter:pivotConfiguration:filterStrategy:advancedFilteringExpressionsTree:filteringPipeTrigger:pipeTrigger\n | pivotGridSort:pivotConfiguration:sortStrategy:pipeTrigger\n | pivotGridRow:pivotConfiguration:expansionStates:pipeTrigger:sortingExpressions\n | pivotGridColumn:pivotConfiguration:expansionStates:pipeTrigger:sortingExpressions\n | pivotGridAutoTransform:pivotConfiguration:pipeTrigger\n | pivotGridColumnSort:sortingExpressions:sortStrategy:pipeTrigger\n | pivotGridRowExpansion:pivotConfiguration:expansionStates:defaultExpandState:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"hasColumnLayouts ? rowHeight * multiRowLayoutRowSize + 1 : renderedRowHeight\"\n #verticalScrollContainer>\n <ng-template\n [igxTemplateOutlet]='recordTemplate'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex)'\n (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n </ng-template>\n <ng-template #record_template let-rowIndex=\"index\" let-rowData>\n <igx-pivot-row [style.height.px]=\"renderedRowHeight\" [gridID]=\"id\" [index]=\"rowIndex\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-pivot-row>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div #igxBodyOverlayOutlet=\"overlay-outlet\" igxOverlayOutlet></div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='EMPTY_DATA' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" #tfoot>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n </span>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n<igx-pivot-grid-column-resizer [restrictResizerTop]=\"theadRow.nativeElement.clientHeight\" *ngIf=\"colResizingService.showResizer\"></igx-pivot-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n\n<ng-template #headerTemplate let-column>\n <div class=\"igx-grid__tr--header\">\n <igx-icon [attr.draggable]=\"false\"\n (click)=\"toggleColumn(column)\">\n {{getColumnGroupExpandState(column) ? 'chevron_right' : 'expand_more'}}</igx-icon>\n {{column.header}}\n </div>\n</ng-template>\n\n<ng-template #defaultRowDimensionsTemplate>\n <div tabindex=\"0\" [style.height.px]='totalHeight' *ngFor='let dim of rowDimensions; let dimIndex = index;' #rowDimensionContainer role=\"rowgroup\" class='igx-grid__tbody-pivot-dimension' (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\">\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"dataView\n | pivotGridCellMerging:pivotConfiguration:dim:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"renderedRowHeight\"\n [igxForSizePropName]='\"height\"'\n #verticalRowDimScrollContainer>\n <igx-pivot-row-dimension-content role='row' class=\"igx-grid-thead\" [grid]=\"this\"\n [dimension]='rowData.dimensions[dimIndex]'\n [rootDimension]='dim'\n [style.height.px]=\"renderedRowHeight * (rowData.rowSpan || 1)\"\n [rowIndex]='rowIndex' [rowData]='rowData'\n [density]=\"displayDensity\" [width]=\"rowDimensionWidthToPixels(dim)\">\n </igx-pivot-row-dimension-content>\n </ng-template>\n </div>\n</ng-template>\n<ng-template #emptyRowDimensionsTemplate>\n <div tabindex=\"0\" *ngIf='columnDimensions.length > 0 || values.length > 0' #rowDimensionContainer role=\"rowgroup\" class='igx-grid__tbody-pivot-dimension' (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\">\n <igx-pivot-row-dimension-content role='row' class=\"igx-grid-thead\" [grid]=\"this\"\n [dimension]='emptyRowDimension'\n [rootDimension]='emptyRowDimension'\n [rowIndex]='0' [rowData]='dataView[0]'\n [density]=\"displayDensity\" [width]=\"rowDimensionWidthToPixels(emptyRowDimension)\">\n </igx-pivot-row-dimension-content>\n </div>\n</ng-template>\n\n<ng-template #emptyPivotGridTemplate>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{resourceStrings.igx_grid_pivot_empty_message}}</span>\n </span>\n</ng-template>\n\n<div [hidden]='true'>\n <igx-grid-excel-style-filtering [maxHeight]='excelStyleFilterMaxHeight' [minHeight]='excelStyleFilterMinHeight'>\n <div igxExcelStyleColumnOperations [hidden]='true'></div>\n <igx-excel-style-filter-operations>\n <igx-excel-style-search></igx-excel-style-search>\n </igx-excel-style-filter-operations>\n </igx-grid-excel-style-filtering>\n</div>\n", components: [{ type: i9.IgxPivotHeaderRowComponent, selector: "igx-pivot-header-row" }, { type: i10.IgxPivotRowComponent, selector: "igx-pivot-row", inputs: ["selected", "data"] }, { type: i11.IgxCircularProgressBarComponent, selector: "igx-circular-bar", inputs: ["id", "isIndeterminate", "textVisibility", "text"] }, { type: i12.IgxSnackbarComponent, selector: "igx-snackbar", inputs: ["id", "actionText", "positionSettings"], outputs: ["clicked", "animationStarted", "animationDone"] }, { type: i13.IgxPivotGridColumnResizerComponent, selector: "igx-pivot-grid-column-resizer" }, { type: i14.IgxIconComponent, selector: "igx-icon", inputs: ["family", "active", "name"] }, { type: i15.IgxPivotRowDimensionContentComponent, selector: "igx-pivot-row-dimension-content", inputs: ["rowIndex", "dimension", "rootDimension", "rowData"] }, { type: i16.IgxGridExcelStyleFilteringComponent, selector: "igx-grid-excel-style-filtering", inputs: ["column", "minHeight", "maxHeight"], outputs: ["loadingStart", "loadingEnd", "initialized", "sortingChanged", "columnChange", "listDataLoaded"] }, { type: i17.IgxExcelStyleSearchComponent, selector: "igx-excel-style-search" }], directives: [{ type: i18.IgxGridBodyDirective, selector: "[igxGridBody]" }, { type: i19.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i20.IgxGridDragSelectDirective, selector: "[igxGridDragSelect]", inputs: ["igxGridDragSelect"], outputs: ["dragStop", "dragScroll"] }, { type: i19.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i21.IgxColumnMovingDropDirective, selector: "[igxColumnMovingDrop]", inputs: ["igxColumnMovingDrop"] }, { type: i22.IgxGridForOfDirective, selector: "[igxGridFor][igxGridForOf]", inputs: ["igxGridForOf", "igxGridForOfUniqueSizeCache"], outputs: ["dataChanging"] }, { type: i23.IgxTemplateOutletDirective, selector: "[igxTemplateOutlet]", inputs: ["igxTemplateOutletContext", "igxTemplateOutlet"], outputs: ["viewCreated", "viewMoved", "cachedViewLoaded", "beforeViewDetach"] }, { type: i19.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i19.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i24.IgxToggleDirective, selector: "[igxToggle]", inputs: ["id"], outputs: ["opened", "opening", "closed", "closing", "appended"], exportAs: ["toggle"] }, { type: i24.IgxOverlayOutletDirective, selector: "[igxOverlayOutlet]", exportAs: ["overlay-outlet"] }, { type: i19.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i16.IgxExcelStyleColumnOperationsTemplateDirective, selector: "igx-excel-style-column-operations,[igxExcelStyleColumnOperations]" }, { type: i16.IgxExcelStyleFilterOperationsTemplateDirective, selector: "igx-excel-style-filter-operations,[igxExcelStyleFilterOperations]" }], pipes: { "pivotGridRowExpansion": i25.IgxPivotRowExpansionPipe, "pivotGridColumnSort": i25.IgxPivotGridColumnSortingPipe, "pivotGridAutoTransform": i25.IgxPivotAutoTransform, "pivotGridColumn": i25.IgxPivotColumnPipe, "pivotGridRow": i25.IgxPivotRowPipe, "pivotGridSort": i25.IgxPivotGridSortingPipe, "pivotGridFilter": i25.IgxPivotGridFilterPipe, "igxGridRowClasses": i26.IgxGridRowClassesPipe, "igxGridRowStyles": i26.IgxGridRowStylesPipe, "pivotGridCellMerging": i25.IgxPivotCellMergingPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1704
1704
|
__decorate([
|
|
1705
1705
|
WatchChanges()
|
|
1706
1706
|
], IgxPivotGridComponent.prototype, "hideRowSelectors", null);
|
|
@@ -1720,7 +1720,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImpor
|
|
|
1720
1720
|
IgxPivotColumnResizingService,
|
|
1721
1721
|
IgxForOfSyncService,
|
|
1722
1722
|
IgxForOfScrollSyncService
|
|
1723
|
-
], template: "<!-- Toolbar area -->\n<ng-content select=\"igx-grid-toolbar\"></ng-content>\n\n<!-- Grid table head row area -->\n<igx-pivot-header-row class=\"igx-grid-thead igx-grid-thead--pivot\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [density]=\"displayDensity\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (scroll)=\"preventHeaderScroll($event)\"\n>\n</igx-pivot-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"rowDimensions.length ? defaultRowDimensionsTemplate : emptyRowDimensionsTemplate; context: this\"></ng-container>\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" [attr.role]=\"dataView.length ? null : 'row'\" (keydown)=\"navigation.handleNavigation($event)\" (focus)=\"navigation.focusTbody($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" (scroll)='preventContainerScroll($event)'\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth || null' #tbody [attr.aria-activedescendant]=\"activeDescendant\">\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | pivotGridFilter:pivotConfiguration:filterStrategy:advancedFilteringExpressionsTree:filteringPipeTrigger:pipeTrigger\n | pivotGridSort:pivotConfiguration:sortStrategy:pipeTrigger\n | pivotGridRow:pivotConfiguration:expansionStates:pipeTrigger:sortingExpressions\n | pivotGridColumn:pivotConfiguration:expansionStates:pipeTrigger:sortingExpressions\n | pivotGridAutoTransform:pivotConfiguration:pipeTrigger\n | pivotGridColumnSort:sortingExpressions:sortStrategy:pipeTrigger\n | pivotGridRowExpansion:pivotConfiguration:expansionStates:defaultExpandState:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"hasColumnLayouts ? rowHeight * multiRowLayoutRowSize + 1 : renderedRowHeight\"\n #verticalScrollContainer>\n <ng-template\n [igxTemplateOutlet]='recordTemplate'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex)'\n (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n </ng-template>\n <ng-template #record_template let-rowIndex=\"index\" let-rowData>\n <igx-pivot-row [style.min-height.px]=\"renderedRowHeight\" [gridID]=\"id\" [index]=\"rowIndex\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-pivot-row>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div #igxBodyOverlayOutlet=\"overlay-outlet\" igxOverlayOutlet></div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='EMPTY_DATA' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" #tfoot>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n </span>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n<igx-pivot-grid-column-resizer [restrictResizerTop]=\"theadRow.nativeElement.clientHeight\" *ngIf=\"colResizingService.showResizer\"></igx-pivot-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n\n<ng-template #headerTemplate let-column>\n <div class=\"igx-grid__tr--header\">\n <igx-icon [attr.draggable]=\"false\"\n (click)=\"toggleColumn(column)\">\n {{getColumnGroupExpandState(column) ? 'chevron_right' : 'expand_more'}}</igx-icon>\n {{column.header}}\n </div>\n</ng-template>\n\n<ng-template #defaultRowDimensionsTemplate>\n <div tabindex=\"0\" [style.height.px]='totalHeight' *ngFor='let dim of rowDimensions; let dimIndex = index;' #rowDimensionContainer role=\"rowgroup\" class='igx-grid__tbody-pivot-dimension' (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\">\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"dataView\n | pivotGridCellMerging:pivotConfiguration:dim:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"renderedRowHeight\"\n [igxForSizePropName]='\"height\"'\n #verticalRowDimScrollContainer>\n <igx-pivot-row-dimension-content role='row' class=\"igx-grid-thead\" [grid]=\"this\"\n [dimension]='rowData.dimensions[dimIndex]'\n [rootDimension]='dim'\n [rowIndex]='rowIndex' [rowData]='rowData'\n [density]=\"displayDensity\" [width]=\"rowDimensionWidthToPixels(dim)\">\n </igx-pivot-row-dimension-content>\n </ng-template>\n </div>\n</ng-template>\n<ng-template #emptyRowDimensionsTemplate>\n <div tabindex=\"0\" *ngIf='columnDimensions.length > 0 || values.length > 0' #rowDimensionContainer role=\"rowgroup\" class='igx-grid__tbody-pivot-dimension' (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\">\n <igx-pivot-row-dimension-content role='row' class=\"igx-grid-thead\" [grid]=\"this\"\n [dimension]='emptyRowDimension'\n [rootDimension]='emptyRowDimension'\n [rowIndex]='0' [rowData]='dataView[0]'\n [density]=\"displayDensity\" [width]=\"rowDimensionWidthToPixels(emptyRowDimension)\">\n </igx-pivot-row-dimension-content>\n </div>\n</ng-template>\n\n<ng-template #emptyPivotGridTemplate>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{resourceStrings.igx_grid_pivot_empty_message}}</span>\n </span>\n</ng-template>\n\n<div [hidden]='true'>\n <igx-grid-excel-style-filtering [maxHeight]='excelStyleFilterMaxHeight' [minHeight]='excelStyleFilterMinHeight'>\n <div igxExcelStyleColumnOperations [hidden]='true'></div>\n <igx-excel-style-filter-operations>\n <igx-excel-style-search></igx-excel-style-search>\n </igx-excel-style-filter-operations>\n </igx-grid-excel-style-filtering>\n</div>\n" }]
|
|
1723
|
+
], template: "<!-- Toolbar area -->\n<ng-content select=\"igx-grid-toolbar\"></ng-content>\n\n<!-- Grid table head row area -->\n<igx-pivot-header-row class=\"igx-grid-thead igx-grid-thead--pivot\" tabindex=\"0\"\n [grid]=\"this\"\n [hasMRL]=\"hasColumnLayouts\"\n [density]=\"displayDensity\"\n [activeDescendant]=\"activeDescendant\"\n [width]=\"calcWidth\"\n [pinnedColumnCollection]=\"pinnedColumns\"\n [unpinnedColumnCollection]=\"unpinnedColumns\"\n (keydown.meta.c)=\"copyHandler($event)\"\n (keydown.control.c)=\"copyHandler($event)\"\n (copy)=\"copyHandler($event)\"\n (keydown)=\"navigation.headerNavigation($event)\"\n (scroll)=\"preventHeaderScroll($event)\"\n>\n</igx-pivot-header-row>\n\n<div igxGridBody (keydown.control.c)=\"copyHandler($event)\" (copy)=\"copyHandler($event)\" class=\"igx-grid__tbody\" role=\"rowgroup\">\n <ng-container *ngTemplateOutlet=\"rowDimensions.length ? defaultRowDimensionsTemplate : emptyRowDimensionsTemplate; context: this\"></ng-container>\n <div class=\"igx-grid__tbody-content\" tabindex=\"0\" [attr.role]=\"dataView.length ? null : 'row'\" (keydown)=\"navigation.handleNavigation($event)\" (focus)=\"navigation.focusTbody($event)\"\n (dragStop)=\"selectionService.dragMode = $event\" (scroll)='preventContainerScroll($event)'\n (dragScroll)=\"dragScroll($event)\" [igxGridDragSelect]=\"selectionService.dragMode\"\n [style.height.px]='totalHeight' [style.width.px]='calcWidth || null' #tbody [attr.aria-activedescendant]=\"activeDescendant\">\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length <= 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-left\"></span>\n <span *ngIf=\"hasMovableColumns && columnInDrag && pinnedColumns.length > 0\"\n [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\" id=\"left\"\n class=\"igx-grid__scroll-on-drag-pinned\" [style.left.px]=\"pinnedWidth\"></span>\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"data\n | pivotGridFilter:pivotConfiguration:filterStrategy:advancedFilteringExpressionsTree:filteringPipeTrigger:pipeTrigger\n | pivotGridSort:pivotConfiguration:sortStrategy:pipeTrigger\n | pivotGridRow:pivotConfiguration:expansionStates:pipeTrigger:sortingExpressions\n | pivotGridColumn:pivotConfiguration:expansionStates:pipeTrigger:sortingExpressions\n | pivotGridAutoTransform:pivotConfiguration:pipeTrigger\n | pivotGridColumnSort:sortingExpressions:sortStrategy:pipeTrigger\n | pivotGridRowExpansion:pivotConfiguration:expansionStates:defaultExpandState:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"hasColumnLayouts ? rowHeight * multiRowLayoutRowSize + 1 : renderedRowHeight\"\n #verticalScrollContainer>\n <ng-template\n [igxTemplateOutlet]='recordTemplate'\n [igxTemplateOutletContext]='getContext(rowData, rowIndex)'\n (cachedViewLoaded)='cachedViewLoaded($event)'>\n </ng-template>\n </ng-template>\n <ng-template #record_template let-rowIndex=\"index\" let-rowData>\n <igx-pivot-row [style.height.px]=\"renderedRowHeight\" [gridID]=\"id\" [index]=\"rowIndex\" [data]=\"rowData\"\n [ngClass]=\"rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger\"\n [ngStyle]=\"rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger\" #row>\n </igx-pivot-row>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n <igc-trial-watermark></igc-trial-watermark>\n </div>\n <div igxToggle #loadingOverlay>\n <igx-circular-bar [indeterminate]=\"true\" *ngIf='shouldOverlayLoading'>\n </igx-circular-bar>\n </div>\n <span *ngIf=\"hasMovableColumns && columnInDrag\" [igxColumnMovingDrop]=\"headerContainer\" [attr.droppable]=\"true\"\n id=\"right\" class=\"igx-grid__scroll-on-drag-right\"></span>\n <div [hidden]='!hasVerticalScroll()' class=\"igx-grid__tbody-scrollbar\" [style.width.px]=\"scrollSize\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__tbody-scrollbar-start\" [style.height.px]=' isRowPinningToTop ? pinnedRowHeight : 0'></div>\n <div class=\"igx-grid__tbody-scrollbar-main\" [style.height.px]='calcHeight'>\n <ng-template igxGridFor [igxGridForOf]='[]' #verticalScrollHolder></ng-template>\n </div>\n <div class=\"igx-grid__tbody-scrollbar-end\" [style.height.px]='!isRowPinningToTop ? pinnedRowHeight : 0'></div>\n </div>\n\n <div class=\"igx-grid__addrow-snackbar\">\n <igx-snackbar #addRowSnackbar [outlet]=\"igxBodyOverlayOutlet\" [actionText]=\"resourceStrings.igx_grid_snackbar_addrow_actiontext\" [displayTime]='snackbarDisplayTime'>{{resourceStrings.igx_grid_snackbar_addrow_label}}</igx-snackbar>\n </div>\n\n <div #igxBodyOverlayOutlet=\"overlay-outlet\" igxOverlayOutlet></div>\n</div>\n\n<div class=\"igx-grid__scroll\" [style.height.px]=\"scrollSize\" #scr [hidden]=\"isHorizontalScrollHidden\" (pointerdown)=\"$event.preventDefault()\">\n <div class=\"igx-grid__scroll-start\" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>\n <div class=\"igx-grid__scroll-main\" [style.width.px]='unpinnedWidth'>\n <ng-template igxGridFor [igxGridForOf]='EMPTY_DATA' #scrollContainer>\n </ng-template>\n </div>\n <div class=\"igx-grid__scroll-end\" [style.float]='\"right\"' [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]=\"pinnedWidth === 0 || isPinningToStart\"></div>\n</div>\n\n<div class=\"igx-grid__tfoot\" role=\"rowgroup\" #tfoot>\n</div>\n\n<div class=\"igx-grid__footer\" #footer>\n <ng-content select=\"igx-grid-footer\"></ng-content>\n</div>\n\n<ng-template #emptyFilteredGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyFilteredGridMessage}}</span>\n </span>\n</ng-template>\n\n<ng-template #defaultEmptyGrid>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{emptyGridMessage}}</span>\n </span>\n</ng-template>\n\n<ng-template #defaultLoadingGrid>\n <div class=\"igx-grid__loading\">\n <igx-circular-bar [indeterminate]=\"true\">\n </igx-circular-bar>\n </div>\n</ng-template>\n<igx-pivot-grid-column-resizer [restrictResizerTop]=\"theadRow.nativeElement.clientHeight\" *ngIf=\"colResizingService.showResizer\"></igx-pivot-grid-column-resizer>\n<div class=\"igx-grid__loading-outlet\" #igxLoadingOverlayOutlet igxOverlayOutlet></div>\n<div class=\"igx-grid__outlet\" #igxFilteringOverlayOutlet igxOverlayOutlet></div>\n\n<ng-template #headerTemplate let-column>\n <div class=\"igx-grid__tr--header\">\n <igx-icon [attr.draggable]=\"false\"\n (click)=\"toggleColumn(column)\">\n {{getColumnGroupExpandState(column) ? 'chevron_right' : 'expand_more'}}</igx-icon>\n {{column.header}}\n </div>\n</ng-template>\n\n<ng-template #defaultRowDimensionsTemplate>\n <div tabindex=\"0\" [style.height.px]='totalHeight' *ngFor='let dim of rowDimensions; let dimIndex = index;' #rowDimensionContainer role=\"rowgroup\" class='igx-grid__tbody-pivot-dimension' (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\">\n <ng-template igxGridFor let-rowData [igxGridForOf]=\"dataView\n | pivotGridCellMerging:pivotConfiguration:dim:pipeTrigger\"\n let-rowIndex=\"index\" [igxForScrollOrientation]=\"'vertical'\" [igxForScrollContainer]='verticalScroll'\n [igxForContainerSize]='calcHeight'\n [igxForItemSize]=\"renderedRowHeight\"\n [igxForSizePropName]='\"height\"'\n #verticalRowDimScrollContainer>\n <igx-pivot-row-dimension-content role='row' class=\"igx-grid-thead\" [grid]=\"this\"\n [dimension]='rowData.dimensions[dimIndex]'\n [rootDimension]='dim'\n [style.height.px]=\"renderedRowHeight * (rowData.rowSpan || 1)\"\n [rowIndex]='rowIndex' [rowData]='rowData'\n [density]=\"displayDensity\" [width]=\"rowDimensionWidthToPixels(dim)\">\n </igx-pivot-row-dimension-content>\n </ng-template>\n </div>\n</ng-template>\n<ng-template #emptyRowDimensionsTemplate>\n <div tabindex=\"0\" *ngIf='columnDimensions.length > 0 || values.length > 0' #rowDimensionContainer role=\"rowgroup\" class='igx-grid__tbody-pivot-dimension' (focus)=\"navigation.focusTbody($event)\" (keydown)=\"navigation.handleNavigation($event)\">\n <igx-pivot-row-dimension-content role='row' class=\"igx-grid-thead\" [grid]=\"this\"\n [dimension]='emptyRowDimension'\n [rootDimension]='emptyRowDimension'\n [rowIndex]='0' [rowData]='dataView[0]'\n [density]=\"displayDensity\" [width]=\"rowDimensionWidthToPixels(emptyRowDimension)\">\n </igx-pivot-row-dimension-content>\n </div>\n</ng-template>\n\n<ng-template #emptyPivotGridTemplate>\n <span class=\"igx-grid__tbody-message\" role=\"cell\">\n <span>{{resourceStrings.igx_grid_pivot_empty_message}}</span>\n </span>\n</ng-template>\n\n<div [hidden]='true'>\n <igx-grid-excel-style-filtering [maxHeight]='excelStyleFilterMaxHeight' [minHeight]='excelStyleFilterMinHeight'>\n <div igxExcelStyleColumnOperations [hidden]='true'></div>\n <igx-excel-style-filter-operations>\n <igx-excel-style-search></igx-excel-style-search>\n </igx-excel-style-filter-operations>\n </igx-grid-excel-style-filtering>\n</div>\n" }]
|
|
1724
1724
|
}], ctorParameters: function () { return [{ type: i1.IgxGridSelectionService }, { type: i2.IgxPivotColumnResizingService }, { type: i3.GridBaseAPIService }, { type: i4.IgxFlatTransactionFactory }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
1725
1725
|
type: Inject,
|
|
1726
1726
|
args: [DOCUMENT]
|
|
@@ -1876,4 +1876,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImpor
|
|
|
1876
1876
|
}], emptyPivotGridTemplate: [{
|
|
1877
1877
|
type: Input
|
|
1878
1878
|
}] } });
|
|
1879
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3QtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvcGl2b3QtZ3JpZC9waXZvdC1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9waXZvdC1ncmlkL3Bpdm90LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFHSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFHWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxTQUFTLEVBR1QsTUFBTSxFQUNOLFFBQVEsRUFFUixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFLZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM3RyxPQUFPLEVBQXdCLGFBQWEsRUFBVyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBdUYsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNySyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUs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O3NCQURmLE1BQU07Z0JBT0EsWUFBWTtzQkFEbEIsTUFBTTtnQkFPQSxVQUFVO3NCQURoQixNQUFNO2dCQU9BLFlBQVk7c0JBRGxCLE1BQU07Z0JBT0EsT0FBTztzQkFEYixNQUFNO2dCQU9BLFdBQVc7c0JBRGpCLE1BQU07Z0JBT0EsV0FBVztzQkFEakIsTUFBTTtnQkFPQSxVQUFVO3NCQURoQixNQUFNO2dCQU9BLFNBQVM7c0JBRGYsTUFBTTtnQkErQ0ksa0JBQWtCO3NCQUQ1QixLQUFLO2dCQWFLLFVBQVU7c0JBRHBCLEtBQUs7Z0JBYUssZ0JBQWdCO3NCQUQxQixLQUFLO2dCQW9ESyxZQUFZO3NCQUR0QixLQUFLO2dCQWFLLHNCQUFzQjtzQkFEaEMsS0FBSztnQkFZSyxVQUFVO3NCQURwQixLQUFLO2dCQVlLLGNBQWM7c0JBRHhCLEtBQUs7Z0JBMEJLLElBQUk7c0JBRGQsS0FBSztnQkFhSyxNQUFNO3NCQURoQixLQUFLO2dCQVlLLE9BQU87c0JBRGpCLEtBQUs7Z0JBK0NLLGdCQUFnQjtzQkFEMUIsS0FBSztnQkF1Q0ssV0FBVztzQkFEckIsS0FBSztnQkFZSyxPQUFPO3NCQURqQixLQUFLO2dCQVdLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBWUssc0JBQXNCO3NCQURoQyxLQUFLO2dCQVlLLHFCQUFxQjtzQkFEL0IsS0FBSztnQkEwQkssWUFBWTtzQkFEdEIsS0FBSztnQkErTkssRUFBRTtzQkFGWixXQUFXO3VCQUFDLFNBQVM7O3NCQUNyQixLQUFLO2dCQWVLLElBQUk7c0JBRGQsS0FBSztnQkFzS0ssWUFBWTtzQkFEdEIsS0FBSztnQkF5NEJDLDZCQUE2QjtzQkFEbkMsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFZakUsc0JBQXNCO3NCQUQ1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIExPQ0FMRV9JRCxcbiAgICBOZ1pvbmUsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBPcHRpb25hbCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEluamVjdG9yLFxuICAgIE5nTW9kdWxlUmVmLFxuICAgIEFwcGxpY2F0aW9uUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hGb3JPZlN5bmNTZXJ2aWNlLCBJZ3hGb3JPZlNjcm9sbFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLnN5bmMuc2VydmljZSc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBHcmlkVHlwZSwgSUdYX0dSSURfQkFTRSwgUm93VHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQ1JVRFNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBERUZBVUxUX1BJVk9UX0tFWVMsIElEaW1lbnNpb25zQ2hhbmdlLCBJUGl2b3RDb25maWd1cmF0aW9uLCBJUGl2b3REaW1lbnNpb24sIElQaXZvdFZhbHVlLCBJVmFsdWVzQ2hhbmdlLCBQaXZvdERpbWVuc2lvblR5cGUgfSBmcm9tICcuL3Bpdm90LWdyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneFBpdm90SGVhZGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi9waXZvdC1oZWFkZXItcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbnMvY29sdW1uLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGl2b3RVdGlsIH0gZnJvbSAnLi9waXZvdC11dGlsJztcbmltcG9ydCB7IEZpbHRlck1vZGUsIEdyaWRQYWdpbmdNb2RlLCBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSwgR3JpZFN1bW1hcnlQb3NpdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9lbnVtcyc7XG5pbXBvcnQgeyBXYXRjaENoYW5nZXMgfSBmcm9tICcuLi93YXRjaC1jaGFuZ2VzJztcbmltcG9ydCB7IE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHtcbiAgICBJQ2VsbFBvc2l0aW9uLFxuICAgIElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3MsIElDb2x1bW5Nb3ZpbmdFdmVudEFyZ3MsIElDb2x1bW5Nb3ZpbmdTdGFydEV2ZW50QXJncyxcbiAgICBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MsIElHcmlkRWRpdERvbmVFdmVudEFyZ3MsIElHcmlkRWRpdEV2ZW50QXJncyxcbiAgICBJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3MsXG4gICAgSVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzLCBJUGluQ29sdW1uRXZlbnRBcmdzLCBJUGluUm93RXZlbnRBcmdzLCBJUm93RGF0YUV2ZW50QXJncywgSVJvd0RyYWdFbmRFdmVudEFyZ3MsIElSb3dEcmFnU3RhcnRFdmVudEFyZ3Ncbn0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBJZ3hHcmlkUm93Q29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC9ncmlkLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcFBvc2l0aW9uIH0gZnJvbSAnLi4vbW92aW5nL21vdmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IERpbWVuc2lvblZhbHVlc0ZpbHRlcmluZ1N0cmF0ZWd5LCBOb29wUGl2b3REaW1lbnNpb25zU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvcGl2b3Qtc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IElneFBpdm90R3JpZE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9waXZvdC1ncmlkLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hQaXZvdENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4uL3Jlc2l6aW5nL3Bpdm90LWdyaWQvcGl2b3QtcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hGbGF0VHJhbnNhY3Rpb25GYWN0b3J5LCBJZ3hPdmVybGF5U2VydmljZSwgU3RhdGUsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5LCBEaXNwbGF5RGVuc2l0eVRva2VuLCBJRGVuc2l0eUNoYW5nZWRFdmVudEFyZ3MsIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IGNsb25lQXJyYXksIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSWd4UGl2b3RGaWx0ZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi9waXZvdC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRhVXRpbCB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJZ3hHcmlkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgR3JpZEJhc2VBUElTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQaXZvdFJvd0RpbWVuc2lvbkNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL3Bpdm90LXJvdy1kaW1lbnNpb24tY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UGl2b3RHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudCB9IGZyb20gJy4uL3Jlc2l6aW5nL3Bpdm90LWdyaWQvcGl2b3QtcmVzaXplci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4QWN0aW9uU3RyaXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hY3Rpb24tc3RyaXAvYWN0aW9uLXN0cmlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUGFnZUV2ZW50QXJncyB9IGZyb20gJy4uLy4uL3BhZ2luYXRvci9wYWdpbmF0b3ItaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJU29ydGluZ0V4cHJlc3Npb24sIFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvc29ydGluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBEZWZhdWx0UGl2b3RTb3J0aW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvcGl2b3Qtc29ydC1zdHJhdGVneSc7XG5pbXBvcnQgeyBQaXZvdFNvcnRVdGlsIH0gZnJvbSAnLi9waXZvdC1zb3J0LXV0aWwnO1xuaW1wb3J0IHsgRmlsdGVyVXRpbCwgSUZpbHRlcmluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1zdHJhdGVneSc7XG5cbmxldCBORVhUX0lEID0gMDtcbmNvbnN0IE1JTklNVU1fQ09MVU1OX1dJRFRIID0gMjAwO1xuY29uc3QgTUlOSU1VTV9DT0xVTU5fV0lEVEhfU1VQRVJfQ09NUEFDVCA9IDEwNDtcblxuLyoqXG4gKiBQaXZvdCBHcmlkIHByb3ZpZGVzIGEgd2F5IHRvIHByZXNlbnQgYW5kIG1hbmlwdWxhdGUgZGF0YSBpbiBhIHBpdm90IHRhYmxlIHZpZXcuXG4gKlxuICogQGlneE1vZHVsZSBJZ3hQaXZvdEdyaWRNb2R1bGVcbiAqIEBpZ3hHcm91cCBHcmlkcyAmIExpc3RzXG4gKiBAaWd4S2V5d29yZHMgcGl2b3QsIGdyaWQsIHRhYmxlXG4gKiBAaWd4VGhlbWUgaWd4LWdyaWQtdGhlbWVcbiAqIEByZW1hcmtzXG4gKiBUaGUgSWduaXRlIFVJIFBpdm90IEdyaWQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYW5kIGFnZ3JlZ2F0aW5nIHNpbXBsZSBmbGF0IGRhdGEgaW50byBhIHBpdm90IHRhYmxlLiAgT25jZSBkYXRhXG4gKiBoYXMgYmVlbiBib3VuZCBhbmQgdGhlIGRpbWVuc2lvbnMgYW5kIHZhbHVlcyBjb25maWd1cmVkIGl0IGNhbiBiZSBtYW5pcHVsYXRlZCB2aWEgc29ydGluZyBhbmQgZmlsdGVyaW5nLlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtcGl2b3QtZ3JpZCBbZGF0YV09XCJkYXRhXCIgW3Bpdm90Q29uZmlndXJhdGlvbl09XCJjb25maWd1cmF0aW9uXCI+XG4gKiA8L2lneC1waXZvdC1ncmlkPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiAnaWd4LXBpdm90LWdyaWQnLFxuICAgIHRlbXBsYXRlVXJsOiAncGl2b3QtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIElneEdyaWRDUlVEU2VydmljZSxcbiAgICAgICAgSWd4R3JpZFN1bW1hcnlTZXJ2aWNlLFxuICAgICAgICBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgR3JpZEJhc2VBUElTZXJ2aWNlLFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9HUklEX0JBU0UsIHVzZUV4aXN0aW5nOiBJZ3hQaXZvdEdyaWRDb21wb25lbnQgfSxcbiAgICAgICAgeyBwcm92aWRlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLCB1c2VDbGFzczogSWd4UGl2b3RGaWx0ZXJpbmdTZXJ2aWNlIH0sXG4gICAgICAgIElneFBpdm90R3JpZE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBJZ3hQaXZvdENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgSWd4Rm9yT2ZTeW5jU2VydmljZSxcbiAgICAgICAgSWd4Rm9yT2ZTY3JvbGxTeW5jU2VydmljZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UGl2b3RHcmlkQ29tcG9uZW50IGV4dGVuZHMgSWd4R3JpZEJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsXG4gICAgR3JpZFR5cGUsIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBkaW1lbnNpb24gY29sbGVjdGlvbiBpcyBjaGFuZ2VkIHZpYSB0aGUgZ3JpZCBjaGlwIGFyZWEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIG5ldyBkaW1lbnNpb24gY29sbGVjdGlvbiBhbmQgaXRzIHR5cGU6XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1waXZvdC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiXG4gICAgICogICAgICAgICAgICAgIChkaW1lbnNpb25zQ2hhbmdlKT1cImRpbWVuc2lvbnNDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRpbWVuc2lvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElEaW1lbnNpb25zQ2hhbmdlPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBkaW1lbnNpb24gaXMgc29ydGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1waXZvdC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiXG4gICAgICogICAgICAgICAgICAgIChkaW1lbnNpb25zU29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlKT1cImRpbWVuc2lvbnNTb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LXBpdm90LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRpbWVuc2lvbnNTb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbltdPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2YWx1ZXMgY29sbGVjdGlvbiBpcyBjaGFuZ2VkIHZpYSB0aGUgZ3JpZCBjaGlwIGFyZWEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIG5ldyBkaW1lbnNpb25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBpdm90LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCJcbiAgICAgKiAgICAgICAgICAgICAgKHZhbHVlc0NoYW5nZSk9XCJ2YWx1ZXNDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJVmFsdWVzQ2hhbmdlPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hQaXZvdEhlYWRlclJvd0NvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdGhlYWRSb3c6IElneFBpdm90SGVhZGVyUm93Q29tcG9uZW50O1xuXG4gICAgQElucHV0KClcbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHBpdm90IGNvbmZpZ3VyYXRpb24gd2l0aCBhbGwgcmVsYXRlZCBkaW1lbnNpb25zIGFuZCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBpdm90LWdyaWQgW3Bpdm90Q29uZmlndXJhdGlvbl09XCJjb25maWdcIj48L2lneC1waXZvdC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgcGl2b3RDb25maWd1cmF0aW9uKHZhbHVlOiBJUGl2b3RDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX3Bpdm90Q29uZmlndXJhdGlvbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwaXZvdENvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waXZvdENvbmZpZ3VyYXRpb24gfHwgeyByb3dzOiBudWxsLCBjb2x1bW5zOiBudWxsLCB2YWx1ZXM6IG51bGwsIGZpbHRlcnM6IG51bGwgfTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcGl2b3QgY29uZmlndXJhdGlvbiB1aSBmb3IgdGhlIHBpdm90IGdyaWQgLSBjaGlwcyBhbmQgdGhlaXJcbiAgICAgKiBjb3JyZXNwb25kaW5nIGNvbnRhaW5lcnMgZm9yIHJvdywgZmlsdGVyLCBjb2x1bW4gZGltZW5zaW9ucyBhbmQgdmFsdWVzXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBpdm90LWdyaWQgW3Nob3dQaXZvdENvbmZpZ3VyYXRpb25VSV09XCJmYWxzZVwiPjwvaWd4LXBpdm90LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNob3dQaXZvdENvbmZpZ3VyYXRpb25VSTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBwdWJsaWMgcm9sZSA9ICdncmlkJztcblxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBhIHN1cGVyIGNvbXBhY3QgdGhlbWUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPdmVycmlkZXMgdGhlIGRpc3BsYXlEZW5zaXR5IG9wdGlvbiBpZiBvbmUgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcGl2b3QtZ3JpZCBbc3VwZXJDb21wYWN0TW9kZV09XCJ0cnVlXCI+PC9pZ3gtcGl2b3QtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkX19waXZvdC0tc3VwZXItY29tcGFjdCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1cGVyQ29tcGFjdE1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlckNvbXBhY3RNb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc3VwZXJDb21wYWN0TW9kZSh2YWx1ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjdXJyZW50IGRldGVjdGlvbiBjeWNsZSB0byBlbmQgYmVmb3JlIHRyaWdnZXJpbmcgYSBuZXcgb25lLlxuICAgICAgICAgICAgdGhpcy5fc3VwZXJDb21wYWN0TW9kZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHRoZW1lIG9mIHRoZSBjb21wb25lbnQuXG4gICAgKiBUaGUgZGVmYXVsdCB0aGVtZSBpcyBgY29tZm9ydGFibGVgLlxuICAgICogQXZhaWxhYmxlIG9wdGlvbnMgYXJlIGBjb21mb3J0YWJsZWAsIGBjb3N5YCwgYGNvbXBhY3RgLlxuICAgICogQHJlbWFya3NcbiAgICAqIElmIHNldCB3aGlsZSBzdXBlckNvbXBhY3RNb2RlIGlzIGVuYWJsZWQgd2lsbCBoYXZlIG5vIGFmZmVjdC5cbiAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAqIGxldCBjb21wb25lbnRUaGVtZSA9IHRoaXMuY29tcG9uZW50LmRpc3BsYXlEZW5zaXR5O1xuICAgICogYGBgXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZGlzcGxheURlbnNpdHkoKTogRGlzcGxheURlbnNpdHkge1xuICAgICAgICBpZiAodGhpcy5zdXBlckNvbXBhY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlzcGxheURlbnNpdHkuY29tcGFjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGxheURlbnNpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTZXRzIHRoZSB0aGVtZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICovXG4gICAgcHVibGljIHNldCBkaXNwbGF5RGVuc2l0eSh2YWw6IERpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5RGVuc2l0eSA9IHRoaXMuX2Rpc3BsYXlEZW5zaXR5O1xuICAgICAgICB0aGlzLl9kaXNwbGF5RGVuc2l0eSA9IHZhbCBhcyBEaXNwbGF5RGVuc2l0eTtcblxuICAgICAgICBpZiAoY3VycmVudERpc3BsYXlEZW5zaXR5ICE9PSB0aGlzLl9kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY29uc3QgZGVuc2l0eUNoYW5nZWRBcmdzOiBJRGVuc2l0eUNoYW5nZWRFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgb2xkRGVuc2l0eTogY3VycmVudERpc3BsYXlEZW5zaXR5LFxuICAgICAgICAgICAgICAgIG5ld0RlbnNpdHk6IHRoaXMuX2Rpc3BsYXlEZW5zaXR5XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLm9uRGVuc2l0eUNoYW5nZWQuZW1pdChkZW5zaXR5Q2hhbmdlZEFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdyZWNvcmRfdGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgcmVjb3JkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneFBpdm90R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQpXG4gICAgcHVibGljIHJlc2l6ZUxpbmU6IElneFBpdm90R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQsIHsgcmVhZDogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4UGl2b3RSb3dEaW1lbnNpb25Db250ZW50Q29tcG9uZW50KVxuICAgIHByb3RlY3RlZCByb3dEaW1lbnNpb25Db250ZW50Q29sbGVjdGlvbjogUXVlcnlMaXN0PElneFBpdm90Um93RGltZW5zaW9uQ29udGVudENvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oJ3ZlcnRpY2FsUm93RGltU2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgdmVydGljYWxSb3dEaW1TY3JvbGxDb250YWluZXJzOiBRdWVyeUxpc3Q8SWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJhbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFkZFJvd0VtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNuYWNrYmFyRGlzcGxheVRpbWUgPSA2MDAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbk1vdmluZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uTW92aW5nU3RhcnRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5QaW4gPSBuZXcgRXZlbnRFbWl0dGVyPElQaW5Db2x1bW5DYW5jZWxsYWJsZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0FkZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RhdGFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEcmFnRW5kRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXRFeGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXREb25lRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93UGlubmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1Bpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIHB1YmxpYyBjb2x1bW5Hcm91cFN0YXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIHB1YmxpYyBkaW1lbnNpb25EYXRhQ29sdW1ucztcbiAgICBwdWJsaWMgZ2V0IHBpdm90S2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnBpdm90S2V5cyB8fCBERUZBVUxUX1BJVk9UX0tFWVM7XG4gICAgfVxuICAgIHB1YmxpYyBpc1Bpdm90ID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRyYWdSb3dJRCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3RTdW1tYXJpZXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcm93RGltZW5zaW9uUmVzaXppbmcgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIF9lbXB0eVJvd0RpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uID0geyBtZW1iZXJOYW1lOiAnJywgZW5hYmxlZDogdHJ1ZSwgbGV2ZWw6IDAgfTtcbiAgICBwdWJsaWMgZ2V0IGVtcHR5Um93RGltZW5zaW9uKCk6IElQaXZvdERpbWVuc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eVJvd0RpbWVuc2lvbjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyU3RyYXRlZ3k6IElGaWx0ZXJpbmdTdHJhdGVneSA9IG5ldyBEaW1lbnNpb25WYWx1ZXNGaWx0ZXJpbmdTdHJhdGVneSgpO1xuICAgIHByaXZhdGUgX2RhdGE7XG4gICAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhO1xuICAgIHByaXZhdGUgX3Bpdm90Q29uZmlndXJhdGlvbjogSVBpdm90Q29uZmlndXJhdGlvbiA9IHsgcm93czogbnVsbCwgY29sdW1uczogbnVsbCwgdmFsdWVzOiBudWxsLCBmaWx0ZXJzOiBudWxsIH07XG4gICAgcHJpdmF0ZSBwX2lkID0gYGlneC1waXZvdC1ncmlkLSR7TkVYVF9JRCsrfWA7XG4gICAgcHJpdmF0ZSBfc3VwZXJDb21wYWN0TW9kZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgKiBHZXRzL1NldHMgdGhlIGRlZmF1bHQgZXhwYW5kIHN0YXRlIGZvciBhbGwgcm93cy5cbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBkZWZhdWx0RXhwYW5kU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkZWZhdWx0RXhwYW5kU3RhdGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdpbmdNb2RlKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmdNb2RlKF92YWw6IEdyaWRQYWdpbmdNb2RlKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGlkZVJvd1NlbGVjdG9ycygpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGlkZVJvd1NlbGVjdG9ycyhfdmFsdWU6IGJvb2xlYW4pIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhdXRvR2VuZXJhdGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWN0aW9uU3RyaXA6IElneEFjdGlvblN0cmlwQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnaW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVBhZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwZXJQYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG91bGRHZW5lcmF0ZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG1vdmluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9vbGJhckV4cG9ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgc2V0IHJvd0RyYWdnYWJsZShfdmFsOiBib29sZWFuKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYWxsb3dBZHZhbmNlZEZpbHRlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dBZHZhbmNlZEZpbHRlcmluZyhfdmFsdWUpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJNb2RlKCkge1xuICAgICAgICByZXR1cm4gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlck1vZGUoX3ZhbHVlOiBGaWx0ZXJNb2RlKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYWxsb3dGaWx0ZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFsbG93RmlsdGVyaW5nKF92YWx1ZSkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdlKF92YWw6IG51bWJlcikge1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFnaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmcoX3ZhbHVlOiBib29sZWFuKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGVyUGFnZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwZXJQYWdlKF92YWw6IG51bWJlcikge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnVucGlubmVkQ29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkRGF0YVZpZXcoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gc3VwZXIudW5waW5uZWREYXRhVmlldztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci51bnBpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnBpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlSb3dIZWlnaHQoX3ZhbHVlOiBudW1iZXIpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2FjdGlvbnMoKTogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25zO1xuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZShfdmFsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJvd0VkaXRhYmxlKF92YWw6IGJvb2xlYW4pIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwaW5uaW5nKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcGlubmluZyhfdmFsdWUpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlQb3NpdGlvbihfdmFsdWU6IEdyaWRTdW1tYXJ5UG9zaXRpb24pIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUoX3ZhbHVlOiBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVyYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzaG93U3VtbWFyeU9uQ29sbGFwc2UoX3ZhbHVlOiBib29sZWFuKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhpZGRlbkNvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYmF0Y2hFZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBiYXRjaEVkaXRpbmcoX3ZhbDogYm9vbGVhbikge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRSb3dzKCk6IGFueVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRSb3dzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZFJvd0lkcyA9IFtdO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LmZvckVhY2gocmVjb3JkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGltIG9mIHRoaXMucm93RGltZW5zaW9ucykge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyRGltID0gZGltO1xuICAgICAgICAgICAgICAgIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gUGl2b3RVdGlsLmdldFJlY29yZEtleShyZWNvcmQsIGN1cnJEaW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzUGl2b3RSb3dTZWxlY3RlZChrZXkpICYmICFzZWxlY3RlZFJvd0lkcy5maW5kKHggPT4geCA9PT0gcmVjb3JkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3dJZHMucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyckRpbSA9IGN1cnJEaW0uY2hpbGRMZXZlbDtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJyRGltKTtcbiAgICAgICAgICAgICAgICBwcmV2LnB1c2goZGltKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQnJlYWspIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd0lkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dIZWlnaCA9IHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5zdXBlckNvbXBhY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmRlZmF1bHRSb3dIZWlnaHQ7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4UGl2b3RDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPixcbiAgICAgICAgcHJvdGVjdGVkIHRyYW5zYWN0aW9uRmFjdG9yeTogSWd4RmxhdFRyYW5zYWN0aW9uRmFjdG9yeSxcbiAgICAgICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50LFxuICAgICAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBkaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgICAgIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIG1vZHVsZVJlZjogTmdNb2R1bGVSZWY8YW55PixcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBuYXZpZ2F0aW9uOiBJZ3hQaXZvdEdyaWROYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgZmlsdGVyaW5nU2VydmljZTogSWd4RmlsdGVyaW5nU2VydmljZSxcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJvdGVjdGVkIG92ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICAgICAgcHVibGljIHN1bW1hcnlTZXJ2aWNlOiBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBsb2NhbGVJZDogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtVXRpbCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJZ3hHcmlkVHJhbnNhY3Rpb24pIHByb3RlY3RlZCBfZGlUcmFuc2FjdGlvbnM/OiBUcmFuc2FjdGlvblNlcnZpY2U8VHJhbnNhY3Rpb24sIFN0YXRlPikge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIHNlbGVjdGlvblNlcnZpY2UsXG4gICAgICAgICAgICBjb2xSZXNpemluZ1NlcnZpY2UsXG4gICAgICAgICAgICBncmlkQVBJLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25GYWN0b3J5LFxuICAgICAgICAgICAgZWxlbWVudFJlZixcbiAgICAgICAgICAgIHpvbmUsXG4gICAgICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgICAgIGNkcixcbiAgICAgICAgICAgIHJlc29sdmVyLFxuICAgICAgICAgICAgZGlmZmVycyxcbiAgICAgICAgICAgIHZpZXdSZWYsXG4gICAgICAgICAgICBhcHBSZWYsXG4gICAgICAgICAgICBtb2R1bGVSZWYsXG4gICAgICAgICAgICBpbmplY3RvcixcbiAgICAgICAgICAgIG5hdmlnYXRpb24sXG4gICAgICAgICAgICBmaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICAgICAgb3ZlcmxheVNlcnZpY2UsXG4gICAgICAgICAgICBzdW1tYXJ5U2VydmljZSxcbiAgICAgICAgICAgIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgICAgICBsb2NhbGVJZCxcbiAgICAgICAgICAgIHBsYXRmb3JtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICAvLyBwaXZvdCBncmlkIGFsd2F5cyBnZW5lcmF0ZXMgY29sdW1ucyBhdXRvbWF0aWNhbGx5LlxuICAgICAgICB0aGlzLmF1dG9HZW5lcmF0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMudW5pcXVlQ29sdW1uVmFsdWVzU3RyYXRlZ3kgPSB0aGlzLnVuaXF1ZUNvbHVtblZhbHVlc1N0cmF0ZWd5IHx8IHRoaXMudW5pcXVlRGltZW5zaW9uVmFsdWVzU3RyYXRlZ3k7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMucGl2b3RDb25maWd1cmF0aW9uO1xuICAgICAgICB0aGlzLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IFBpdm90VXRpbC5idWlsZEV4cHJlc3Npb25UcmVlKGNvbmZpZyk7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIC8vIGlnbm9yZSBhbnkgdXNlciBkZWZpbmVkIGNvbHVtbnMgYW5kIGF1dG8tZ2VuZXJhdGUgYmFzZWQgb24gcGl2b3QgY29uZmlnLlxuICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVzZXQoW10pO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgZm9yIGRpbWVuc2lvbiBjaGFuZ2UuXG4gICAgICovXG4gICAgcHVibGljIG5vdGlmeURpbWVuc2lvbkNoYW5nZShyZWdlbmVyYXRlQ29sdW1ucyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChyZWdlbmVyYXRlQ29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5pcXVlRGltZW5zaW9uVmFsdWVzU3RyYXRlZ3koY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIGV4cHJUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBkb25lOiAodW5pcXVlVmFsdWVzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICBjb25zdCBlbmFibGVkRGltZW5zaW9ucyA9IHRoaXMuYWxsRGltZW5zaW9ucy5maWx0ZXIoeCA9PiB4ICYmIHguZW5hYmxlZCk7XG4gICAgICAgIGNvbnN0IGRpbSA9IFBpdm90VXRpbC5mbGF0dGVuKGVuYWJsZWREaW1lbnNpb25zKS5maW5kKHggPT4geC5tZW1iZXJOYW1lID09PSBjb2x1bW4uZmllbGQpO1xuICAgICAgICBpZiAoZGltKSB7XG4gICAgICAgICAgICB0aGlzLmdldERpbWVuc2lvbkRhdGEoZGltLCBleHByVHJlZSwgdW5pcXVlVmFsdWVzID0+IGRvbmUodW5pcXVlVmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmdWxsIGxpc3Qgb2YgZGltZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmdyaWQuYWxsRGltZW5zaW9ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFsbERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMucGl2b3RDb25maWd1cmF0aW9uO1xuICAgICAgICByZXR1cm4gKGNvbmZpZy5yb3dzIHx8IFtdKS5jb25jYXQoKGNvbmZpZy5jb2x1bW5zIHx8IFtdKSkuY29uY2F0KGNvbmZpZy5maWx0ZXJzIHx8IFtdKS5maWx0ZXIoeCA9PiB4ICE9PSBudWxsICYmIHggIT09IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGltZW5zaW9uRGF0YShkaW06IElQaXZvdERpbWVuc2lvbixcbiAgICAgICAgZGltRXhwclRyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGRvbmU6IChjb2xWYWxzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICBsZXQgY29sdW1uVmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0X2RhdGEoKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc1RyZWU6IGRpbUV4cHJUcmVlLFxuICAgICAgICAgICAgc3RyYXRlZ3k6IHRoaXMuZmlsdGVyU3RyYXRlZ3kgfHwgbmV3IERpbWVuc2lvblZhbHVlc0ZpbHRlcmluZ1N0cmF0ZWd5KCksXG4gICAgICAgICAgICBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogdGhpcy5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IEZpbHRlclV0aWwuZmlsdGVyKGRhdGEsIHN0YXRlLCB0aGlzKTtcbiAgICAgICAgY29uc3QgYWxsVmFsdWVzSGllcmFyY2h5ID0gUGl2b3RVdGlsLmdldEZpZWxkc0hpZXJhcmNoeShcbiAgICAgICAgICAgIGZpbHRlcmVkLFxuICAgICAgICAgICAgW2RpbV0sXG4gICAgICAgICAgICBQaXZvdERpbWVuc2lvblR5cGUuQ29sdW1uLFxuICAgICAgICAgICAgdGhpcy5waXZvdEtleXNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZmxhdERhdGEgPSBBcnJheS5mcm9tKGFsbFZhbHVlc0hpZXJhcmNoeS52YWx1ZXMoKSk7XG4gICAgICAgIC8vIE5vdGU6IE9uY2UgRVNGIHN1cHBvcnRzIHRyZWUgdmlldywgd2Ugc2hvdWxkIHJldmVydCB0aGlzIGJhY2suXG4gICAgICAgIGNvbHVtblZhbHVlcyA9IGZsYXREYXRhLm1hcChyZWNvcmQgPT4gcmVjb3JkWyd2YWx1ZSddKTtcbiAgICAgICAgZG9uZShjb2x1bW5WYWx1ZXMpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlckVTRihkcm9wZG93bjogYW55LCBjb2x1bW46IENvbHVtblR5cGUsIG9wdGlvbnM6IE92ZXJsYXlTZXR0aW5ncywgc2hvdWxkUmVhdGFjaDogYm9vbGVhbikge1xuICAgICAgICBvcHRpb25zLm91dGxldCA9IHRoaXMub3V0bGV0O1xuICAgICAgICBpZiAoZHJvcGRvd24pIHtcbiAgICAgICAgICAgIGRyb3Bkb3duLmluaXRpYWxpemUoY29sdW1uLCB0aGlzLm92ZXJsYXlTZXJ2aWNlKTtcbiAgICAgICAgICAgIGlmIChzaG91bGRSZWF0YWNoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmF0dGFjaChkcm9wZG93bi5lbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5vdmVybGF5Q29tcG9uZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBpZCwgcmVmOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGlkOiBkcm9wZG93bi5vdmVybGF5Q29tcG9uZW50SWQsIHJlZjogdW5kZWZpbmVkIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBmZWF0dXJlQ29sdW1uc1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waXZvdFJvd1dpZHRocztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHZhbHVlIG9mIHRoZSBgaWRgIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1waXZvdC1ncmlkIFtpZF09XCInaWd4LXBpdm90LTEnXCIgW2RhdGFdPVwiRGF0YVwiPjwvaWd4LXBpdm90LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucF9pZDtcbiAgICB9XG4gICAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucF9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGxldHMgeW91IGZpbGwgdGhlIGBJZ3hQaXZvdEdyaWRDb21wb25lbnRgIHdpdGggYW4gYXJyYXkgb2YgZGF0YS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1waXZvdC1ncmlkIFtkYXRhXT1cIkRhdGFcIj48L2lneC1waXZvdC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkYXRhKHZhbHVlOiBhbnlbXSB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlIHx8IFtdO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRHZW5lcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmbG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodCA9PT0gbnVsbCB8fCB0aGlzLmhlaWdodC5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVpZ2h0IHdpbGwgY2hhbmdlIGJhc2VkIG9uIGhvdyBtdWNoIGRhdGEgdGhlcmUgaXMsIHJlY2FsY3VsYXRlIHNpemVzIGluIGlneEZvck9mLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIHNldCB0byB0aGUgY29tcG9uZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZGF0YSA9IHRoaXMuZ3JpZC5kYXRhO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGZpbHRlcmVkIGRhdGEuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5maWx0ZXJlZERhdGEgPSBbe1xuICAgICAqICAgICAgIElEOiAxLFxuICAgICAqICAgICAgIE5hbWU6IFwiQVwiXG4gICAgICogfV07XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBmaWx0ZXJlZERhdGEodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGZpbHRlcmVkIGRhdGEuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBmaWx0ZXJlZERhdGEgPSB0aGlzLmdyaWQuZmlsdGVyZWREYXRhO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkRGF0YTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29udGV4dChyb3dEYXRhLCByb3dJbmRleCk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICB0ZW1wbGF0ZUlEOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhdGFSb3cnLFxuICAgICAgICAgICAgICAgIGlkOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5kZXg6IHRoaXMuZ2V0RGF0YVZpZXdJbmRleChyb3dJbmRleCwgZmFsc2UpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpdm90Um93V2lkdGhzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dEaW1lbnNpb25zLmxlbmd0aCA/IHRoaXMucm93RGltZW5zaW9ucy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBkaW0pID0+IGFjY3VtdWxhdG9yICsgdGhpcy5yb3dEaW1lbnNpb25XaWR0aFRvUGl4ZWxzKGRpbSksIDApIDpcbiAgICAgICAgICAgIHRoaXMucm93RGltZW5zaW9uV2lkdGhUb1BpeGVscyh0aGlzLmVtcHR5Um93RGltZW5zaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dEaW1lbnNpb25XaWR0aFRvUGl4ZWxzKGRpbTogSVBpdm90RGltZW5zaW9uKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFkaW0ud2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBNSU5JTVVNX0NPTFVNTl9XSURUSDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1BlcmNlbnQgPSBkaW0ud2lkdGggJiYgZGltLndpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgICAgIGlmIChpc1BlcmNlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGRpbS53aWR0aCkgLyAxMDAgKiB0aGlzLmNhbGNXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChkaW0ud2lkdGgsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJldmVyc2VEaW1lbnNpb25XaWR0aFRvUGVyY2VudCh3aWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuICh3aWR0aCAqIDEwMCAvIHRoaXMuY2FsY1dpZHRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0RpbWVuc2lvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5yb3dzPy5maWx0ZXIoeCA9PiB4LmVuYWJsZWQpIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sdW1uRGltZW5zaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmNvbHVtbnM/LmZpbHRlcih4ID0+IHguZW5hYmxlZCkgfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJEaW1lbnNpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waXZvdENvbmZpZ3VyYXRpb24uZmlsdGVycz8uZmlsdGVyKHggPT4geC5lbmFibGVkKSB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcz8uZmlsdGVyKHggPT4geC5lbmFibGVkKSB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlQ29sdW1uKGNvbDogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jb2x1bW5Hcm91cFN0YXRlcy5nZXQoY29sLmZpZWxkKTtcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSAhc3RhdGU7XG4gICAgICAgIHRoaXMuY29sdW1uR3JvdXBTdGF0ZXMuc2V0KGNvbC5maWVsZCwgbmV3U3RhdGUpO1xuICAgICAgICB0aGlzLnRvZ2dsZVJvd0dyb3VwKGNvbCwgbmV3U3RhdGUpO1xuICAgICAgICB0aGlzLnJlZmxvdygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkQnlJbmRleChfcm93SW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KF9hcmdzOiBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZEFsbCgpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZUFsbCgpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRSb3coX3Jvd0lEOiBhbnkpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZVJvdyhfcm93SUQ6IGFueSkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dzKCk6IElneEdyaWRSb3dDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b3RhbFJlY29yZHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKF90b3RhbDogbnVtYmVyKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZUNvbHVtbihfY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIF90YXJnZXQ6IElneENvbHVtbkNvbXBvbmVudCwgX3BvczogRHJvcFBvc2l0aW9uID0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZFJvdyhfZGF0YTogYW55KTogdm9pZCB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlUm93KF9yb3dTZWxlY3RvcjogYW55KTogYW55IHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVDZWxsKF92YWx1ZTogYW55LCBfcm93U2VsZWN0b3I6IGFueSwgX2NvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlUm93KF92YWx1ZTogYW55LCBfcm93U2VsZWN0b3I6IGFueSk6IHZvaWQge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZVN1bW1hcmllcyguLi5fcmVzdCkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRpc2FibGVTdW1tYXJpZXMoLi4uX3Jlc3QpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5Db2x1bW4oX2NvbHVtbk5hbWU6IHN0cmluZyB8IElneENvbHVtbkNvbXBvbmVudCwgX2luZGV4Pyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5Db2x1bW4oX2NvbHVtbk5hbWU6IHN0cmluZyB8IElneENvbHVtbkNvbXBvbmVudCwgX2luZGV4Pyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGluUm93KF9yb3dJRDogYW55LCBfaW5kZXg/OiBudW1iZXIsIF9yb3c/OiBSb3dUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpblJvdyhfcm93SUQ6IGFueSwgX3Jvdz86IFJvd1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRWRpdGFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1N1bW1hcml6ZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01vdmFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZERhdGFWaWV3KCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9wZW5BZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhfb3ZlcmxheVNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhfYXBwbHlDaGFuZ2VzOiBib29sZWFuKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5kRWRpdChfY29tbWl0ID0gdHJ1ZSwgX2V2ZW50PzogRXZlbnQpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBiZWdpbkFkZFJvd0J5SWQoX3Jvd0lEOiBhbnksIF9hc0NoaWxkPzogYm9vbGVhbik6IHZvaWQge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGJlZ2luQWRkUm93QnlJbmRleChfaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU2VhcmNoKCkgeyB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwYWdpbmF0ZShfdmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIHByZXZpb3VzUGFnZSgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgcmVmcmVzaFNlYXJjaChfdXBkYXRlQWN0aXZlSW5mbz86IGJvb2xlYW4sIF9lbmRFZGl0ID0gdHJ1ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBmaW5kTmV4dChfdGV4dDogc3RyaW5nLCBfY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIF9leGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBmaW5kUHJldihfdGV4dDogc3RyaW5nLCBfY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIF9leGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXROZXh0Q2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmV4dENlbGwoY3VyclJvd0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJldmlvdXNDZWxsKGN1cnJSb3dJbmRleDogbnVtYmVyLCBjdXJWaXNpYmxlQ29sSW5kZXg6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChJZ3hDb2x1bW5Db21wb25lbnQpID0+IGJvb2xlYW4gPSBudWxsKTogSUNlbGxQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXRQcmV2aW91c0NlbGwoY3VyclJvd0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0UGlubmVkV2lkdGgodGFrZUhpZGRlbiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGNIZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbkdyb3VwRXhwYW5kU3RhdGUoY29sOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNvbHVtbkdyb3VwU3RhdGVzLmdldChjb2wuZmllbGQpO1xuICAgICAgICAvLyBjb2x1bW5zIGFyZSBleHBhbmRlZCBieSBkZWZhdWx0P1xuICAgICAgICByZXR1cm4gc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZSAhPT0gbnVsbCA/IHN0YXRlIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZVJvd0dyb3VwKGNvbDogSWd4Q29sdW1uQ29tcG9uZW50LCBuZXdTdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoIWNvbCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29scyA9IGNvbC5wYXJlbnQgPyBjb2wucGFyZW50LmNoaWxkcmVuLnRvQXJyYXkoKSA6IHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzLmZpbHRlcih4ID0+IHgubGV2ZWwgPT09IDApO1xuICAgICAgICAgICAgY29uc3Qgc2libGluZ0NvbCA9IHBhcmVudENvbHMuZmlsdGVyKHggPT4geC5oZWFkZXIgPT09IGNvbC5oZWFkZXIgJiYgeCAhPT0gY29sKVswXTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJJbmRleCA9IHBhcmVudENvbHMuaW5kZXhPZihjb2wpO1xuICAgICAgICAgICAgY29uc3Qgc2libGluZ0luZGV4ID0gcGFyZW50Q29scy5pbmRleE9mKHNpYmxpbmdDb2wpO1xuICAgICAgICAgICAgaWYgKGN1cnJJbmRleCA8IHNpYmxpbmdJbmRleCkge1xuICAgICAgICAgICAgICAgIC8vIGNsaWNrZWQgb24gdGhlIGZ1bGwgaGllcmFyY2h5IGhlYWRlclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVRvZ2dsZShjb2wsIG5ld1N0YXRlKTtcbiAgICAgICAgICAgICAgICBzaWJsaW5nQ29sLmhlYWRlclRlbXBsYXRlID0gdGhpcy5oZWFkZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2xpY2tlZCBvbiBzdW1tYXJ5IHBhcmVudCBjb2x1bW4gdGhhdCBjb250YWlucyBqdXN0IHRoZSBtZWFzdXJlc1xuICAgICAgICAgICAgICAgIGNvbC5oZWFkZXJUZW1wbGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVUb2dnbGUoc2libGluZ0NvbCwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29scyA9IGNvbC5wYXJlbnQgPyBjb2wucGFyZW50LmNoaWxkcmVuIDogdGhpcy5fYXV0b0dlbmVyYXRlZENvbHMuZmlsdGVyKHggPT4geC5sZXZlbCA9PT0gMCk7XG4gICAgICAgICAgICBjb25zdCBmaWVsZENvbHVtbiA9IHBhcmVudENvbHMuZmlsdGVyKHggPT4geC5oZWFkZXIgPT09IGNvbC5oZWFkZXIgJiYgIXguY29sdW1uR3JvdXApWzBdO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSBwYXJlbnRDb2xzLmZpbHRlcih4ID0+IHguaGVhZGVyID09PSBjb2wuaGVhZGVyICYmIHguY29sdW1uR3JvdXApWzBdO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVG9nZ2xlKGdyb3VwQ29sdW1uLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICBmaWVsZENvbHVtbi5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkQ29sdW1uLmhlYWRlclRlbXBsYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIHNldHVwQ29sdW1ucygpIHtcbiAgICAgICAgc3VwZXIuc2V0dXBDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXV0by1zaXplcyByb3cgZGltZW5zaW9uIGNlbGxzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPbmx5IHNpemVzIGJhc2VkIG9uIHRoZSBkaW1lbnNpb24gY2VsbHMgaW4gdmlldy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuYXV0b1NpemVSb3dEaW1lbnNpb24oZGltZW5zaW9uKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSByb3cgZGltZW5zaW9uIHRvIHNpemUuXG4gICAgICovXG4gICAgcHVibGljIGF1dG9TaXplUm93RGltZW5zaW9uKGRpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmdldERpbWVuc2lvblR5cGUoZGltZW5zaW9uKSA9PT0gUGl2b3REaW1lbnNpb25UeXBlLlJvdykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZERpbXMgPSBQaXZvdFV0aWwuZmxhdHRlbihbZGltZW5zaW9uXSkubWFwKHggPT4geC5tZW1iZXJOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnJvd0RpbWVuc2lvbkNvbnRlbnRDb2xsZWN0aW9uLmZpbHRlcih4ID0+IHJlbGF0ZWREaW1zLmluZGV4T2YoeC5kaW1lbnNpb24ubWVtYmVyTmFtZSkgIT09IC0xKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb250ZW50Lm1hcCh4ID0+IHguaGVhZGVyR3JvdXBzLnRvQXJyYXkoKSkuZmxhdCgpLm1hcCh4ID0+IHguaGVhZGVyICYmIHguaGVhZGVyLnJlZkluc3RhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IGF1dG9XaWR0aCA9IHRoaXMuZ2V0TGFyZ2VzQ29udGVudFdpZHRoKGhlYWRlcnMpO1xuICAgICAgICAgICAgZGltZW5zaW9uLndpZHRoID0gYXV0b1dpZHRoO1xuICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBkaW1lbnNpb24gaW4gdGFyZ2V0IGNvbGxlY3Rpb24gYnkgdHlwZSBhdCBzcGVjaWZpZWQgaW5kZXggb3IgYXQgdGhlIGNvbGxlY3Rpb24ncyBlbmQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuaW5zZXJ0RGltZW5zaW9uQXQoZGltZW5zaW9uLCBQaXZvdERpbWVuc2lvblR5cGUuUm93LCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdGhhdCB3aWxsIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSB0YXJnZXRDb2xsZWN0aW9uVHlwZSBUaGUgdGFyZ2V0IGNvbGxlY3Rpb24gdHlwZSB0byBhZGQgdG8uIENhbiBiZSBSb3csIENvbHVtbiBvciBGaWx0ZXIuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBpbiB0aGUgY29sbGVjdGlvbiBhdCB3aGljaCB0byBhZGQuXG4gICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIElmIG5vdCBzZXQgaXQgd2lsbCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0RGltZW5zaW9uQXQoZGltZW5zaW9uOiBJUGl2b3REaW1lbnNpb24sIHRhcmdldENvbGxlY3Rpb25UeXBlOiBQaXZvdERpbWVuc2lvblR5cGUsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldENvbGxlY3Rpb24gPSB0aGlzLmdldERpbWVuc2lvbnNCeVR5cGUodGFyZ2V0Q29sbGVjdGlvblR5cGUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGFyZ2V0Q29sbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDAsIGRpbWVuc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRDb2xsZWN0aW9uLnB1c2goZGltZW5zaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0Q29sbGVjdGlvblR5cGUgPT09IFBpdm90RGltZW5zaW9uVHlwZS5Db2x1bW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmRpbWVuc2lvbnNDaGFuZ2UuZW1pdCh7IGRpbWVuc2lvbnM6IHRhcmdldENvbGxlY3Rpb24sIGRpbWVuc2lvbkNvbGxlY3Rpb25UeXBlOiB0YXJnZXRDb2xsZWN0aW9uVHlwZSB9KTtcbiAgICAgICAgaWYgKHRhcmdldENvbGxlY3Rpb25UeXBlID09PSBQaXZvdERpbWVuc2lvblR5cGUuRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLmRpbWVuc2lvbkRhdGFDb2x1bW5zID0gdGhpcy5nZW5lcmF0ZURpbWVuc2lvbkNvbHVtbnMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmbG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIGRpbWVuc2lvbiBmcm9tIGl0cyBjdXJyZW50bHkgY29sbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBjb2xsZWN0aW9uIGJ5IHR5cGUgYXQgc3BlY2lmaWVkIGluZGV4IG9yIGF0IHRoZSBjb2xsZWN0aW9uJ3MgZW5kLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLm1vdmVEaW1lbnNpb24oZGltZW5zaW9uLCBQaXZvdERpbWVuc2lvblR5cGUuUm93LCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdGhhdCB3aWxsIGJlIG1vdmVkLlxuICAgICAqIEBwYXJhbSB0YXJnZXRDb2xsZWN0aW9uVHlwZSBUaGUgdGFyZ2V0IGNvbGxlY3Rpb24gdHlwZSB0byBtb3ZlIGl0IHRvLiBDYW4gYmUgUm93LCBDb2x1bW4gb3IgRmlsdGVyLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggaW4gdGhlIGNvbGxlY3Rpb24gYXQgd2hpY2ggdG8gYWRkLlxuICAgICAqIFRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBJZiBub3Qgc2V0IGl0IHdpbGwgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIG1vdmVEaW1lbnNpb24oZGltZW5zaW9uOiBJUGl2b3REaW1lbnNpb24sIHRhcmdldENvbGxlY3Rpb25UeXBlOiBQaXZvdERpbWVuc2lvblR5cGUsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHByZXZDb2xsZWN0aW9uVHlwZSA9IHRoaXMuZ2V0RGltZW5zaW9uVHlwZShkaW1lbnNpb24pO1xuICAgICAgICBpZiAocHJldkNvbGxlY3Rpb25UeXBlID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIC8vIHJlbW92ZSBmcm9tIG9sZCBjb2xsZWN0aW9uXG4gICAgICAgIHRoaXMuX3JlbW92ZURpbWVuc2lvbkludGVybmFsKGRpbWVuc2lvbik7XG4gICAgICAgIC8vIGFkZCB0byB0YXJnZXRcbiAgICAgICAgdGhpcy5pbnNlcnREaW1lbnNpb25BdChkaW1lbnNpb24sIHRhcmdldENvbGxlY3Rpb25UeXBlLCBpbmRleCk7XG5cbiAgICAgICAgaWYgKHByZXZDb2xsZWN0aW9uVHlwZSA9PT0gUGl2b3REaW1lbnNpb25UeXBlLkNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZGltZW5zaW9uIGZyb20gaXRzIGN1cnJlbnRseSBjb2xsZWN0aW9uLlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0b2dnbGVEaW1lbnNpb24gdGhhdCBlbmFibGVkL2Rpc2FibGVzIHRoZSBkaW1lbnNpb24uXG4gICAgICogVGhpcyBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBkaW1lbnNpb24gZnJvbSB0aGUgY29sbGVjdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucmVtb3ZlRGltZW5zaW9uKGRpbWVuc2lvbik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIGJlIHJlbW92ZWQuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZURpbWVuc2lvbihkaW1lbnNpb246IElQaXZvdERpbWVuc2lvbikge1xuICAgICAgICBjb25zdCBwcmV2Q29sbGVjdGlvblR5cGUgPSB0aGlzLmdldERpbWVuc2lvblR5cGUoZGltZW5zaW9uKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlRGltZW5zaW9uSW50ZXJuYWwoZGltZW5zaW9uKTtcbiAgICAgICAgaWYgKHByZXZDb2xsZWN0aW9uVHlwZSA9PT0gUGl2b3REaW1lbnNpb25UeXBlLkNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldkNvbGxlY3Rpb25UeXBlID09PSBQaXZvdERpbWVuc2lvblR5cGUuRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlZmxvdygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGRpbWVuc2lvbidzIGVuYWJsZWQgc3RhdGUgb24gb3Igb2ZmLlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRpbWVuc2lvbiByZW1haW5zIGluIGl0cyBjdXJyZW50IGNvbGxlY3Rpb24uIFRoaXMganVzdCBjaGFuZ2VzIGl0cyBlbmFibGVkIHN0YXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC50b2dnbGVEaW1lbnNpb24oZGltZW5zaW9uKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gYmUgdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlRGltZW5zaW9uKGRpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uKSB7XG4gICAgICAgIGNvbnN0IGRpbVR5cGUgPSB0aGlzLmdldERpbWVuc2lvblR5cGUoZGltZW5zaW9uKTtcbiAgICAgICAgaWYgKGRpbVR5cGUgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHRoaXMuZ2V0RGltZW5zaW9uc0J5VHlwZShkaW1UeXBlKTtcbiAgICAgICAgZGltZW5zaW9uLmVuYWJsZWQgPSAhZGltZW5zaW9uLmVuYWJsZWQ7XG4gICAgICAgIGlmIChkaW1UeXBlID09PSBQaXZvdERpbWVuc2lvblR5cGUuQ29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGltZW5zaW9uLmVuYWJsZWQgJiYgZGltZW5zaW9uLmZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKGRpbWVuc2lvbi5tZW1iZXJOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMuZGltZW5zaW9uc0NoYW5nZS5lbWl0KHsgZGltZW5zaW9uczogY29sbGVjdGlvbiwgZGltZW5zaW9uQ29sbGVjdGlvblR5cGU6IGRpbVR5cGUgfSk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgaWYgKGRpbVR5cGUgPT09IFBpdm90RGltZW5zaW9uVHlwZS5GaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVmbG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHZhbHVlIGF0IHNwZWNpZmllZCBpbmRleCBvciBhdCB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmluc2VydFZhbHVlQXQodmFsdWUsIDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgZGVmaW5pdGlvbiB0aGF0IHdpbGwgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBpbiB0aGUgY29sbGVjdGlvbiBhdCB3aGljaCB0byBhZGQuXG4gICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIElmIG5vdCBzZXQgaXQgd2lsbCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0VmFsdWVBdCh2YWx1ZTogSVBpdm90VmFsdWUsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5waXZvdENvbmZpZ3VyYXRpb24udmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi52YWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi52YWx1ZXM7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZXMuc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQoeyB2YWx1ZXMgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSB2YWx1ZSBmcm9tIGl0cyBjdXJyZW50bHkgYXQgc3BlY2lmaWVkIGluZGV4IG9yIGF0IHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQubW92ZVZhbHVlKHZhbHVlLCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBtb3ZlZC5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGluIHRoZSBjb2xsZWN0aW9uIGF0IHdoaWNoIHRvIGFkZC5cbiAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSWYgbm90IHNldCBpdCB3aWxsIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlVmFsdWUodmFsdWU6IElQaXZvdFZhbHVlLCBpbmRleD86IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5waXZvdENvbmZpZ3VyYXRpb24udmFsdWVzLmluZGV4T2YodmFsdWUpID09PSAtMSkgcmV0dXJuO1xuICAgICAgICAvLyByZW1vdmUgZnJvbSBvbGQgaW5kZXhcbiAgICAgICAgdGhpcy5yZW1vdmVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIC8vIGFkZCB0byBuZXdcbiAgICAgICAgdGhpcy5pbnNlcnRWYWx1ZUF0KHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB2YWx1ZSBmcm9tIGNvbGxlY3Rpb24uXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRvZ2dsZVZhbHVlIHRoYXQgZW5hYmxlZC9kaXNhYmxlcyB0aGUgdmFsdWUuXG4gICAgICogVGhpcyBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5yZW1vdmVWYWx1ZShkaW1lbnNpb24pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlVmFsdWUodmFsdWU6IElQaXZvdFZhbHVlLCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi52YWx1ZXM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHZhbHVlcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLnZhbHVlc0NoYW5nZS5lbWl0KHsgdmFsdWVzIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgdmFsdWUncyBlbmFibGVkIHN0YXRlIG9uIG9yIG9mZi5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSB2YWx1ZSByZW1haW5zIGluIGl0cyBjdXJyZW50IGNvbGxlY3Rpb24uIFRoaXMganVzdCBjaGFuZ2VzIGl0cyBlbmFibGVkIHN0YXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC50b2dnbGVWYWx1ZSh2YWx1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiZSB0b2dnbGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVWYWx1ZSh2YWx1ZTogSVBpdm90VmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcy5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHJldHVybjtcbiAgICAgICAgdmFsdWUuZW5hYmxlZCA9ICF2YWx1ZS5lbmFibGVkO1xuICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQoeyB2YWx1ZXM6IHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcyB9KTtcbiAgICAgICAgdGhpcy5yZWZsb3coKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0IHRoZSBkaW1lbnNpb24gYW5kIGl0cyBjaGlsZHJlbiBpbiB0aGUgcHJvdmlkZWQgZGlyZWN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zb3J0RGltZW5zaW9uKGRpbWVuc2lvbiwgU29ydGluZ0RpcmVjdGlvbi5Bc2MpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc29ydERpbWVuc2lvbihkaW1lbnNpb246IElQaXZvdERpbWVuc2lvbiwgc29ydERpcmVjdGlvbjogU29ydGluZ0RpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaW1lbnNpb25UeXBlID0gdGhpcy5nZXREaW1lbnNpb25UeXBlKGRpbWVuc2lvbik7XG4gICAgICAgIGRpbWVuc2lvbi5zb3J0RGlyZWN0aW9uID0gc29ydERpcmVjdGlvbjtcbiAgICAgICAgLy8gYXBwbHkgc2FtZSBzb3J0IGRpcmVjdGlvbiB0byBjaGlsZHJlbi5cbiAgICAgICAgbGV0IGRpbSA9IGRpbWVuc2lvbjtcbiAgICAgICAgd2hpbGUgKGRpbS5jaGlsZExldmVsKSB7XG4gICAgICAgICAgICBkaW0uY2hpbGRMZXZlbC5zb3J0RGlyZWN0aW9uID0gZGltZW5zaW9uLnNvcnREaXJlY3Rpb247XG4gICAgICAgICAgICBkaW0gPSBkaW0uY2hpbGRMZXZlbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaW1lbnNpb25zU29ydGluZ0V4cHJlc3Npb25zID0gUGl2b3RTb3J0VXRpbC5nZW5lcmF0ZURpbWVuc2lvblNvcnRpbmdFeHByZXNzaW9ucyh0aGlzLnJvd0RpbWVuc2lvbnMpXG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5kaW1lbnNpb25zU29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlLmVtaXQoZGltZW5zaW9uc1NvcnRpbmdFeHByZXNzaW9ucyk7XG4gICAgICAgIGlmIChkaW1lbnNpb25UeXBlID09PSBQaXZvdERpbWVuc2lvblR5cGUuQ29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREaW1lbnNpb25zQnlUeXBlKGRpbWVuc2lvbjogUGl2b3REaW1lbnNpb25UeXBlKSB7XG4gICAgICAgIHN3aXRjaCAoZGltZW5zaW9uKSB7XG4gICAgICAgICAgICBjYXNlIFBpdm90RGltZW5zaW9uVHlwZS5Sb3c6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5yb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnJvd3MgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnJvd3M7XG4gICAgICAgICAgICBjYXNlIFBpdm90RGltZW5zaW9uVHlwZS5Db2x1bW46XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmNvbHVtbnM7XG4gICAgICAgICAgICBjYXNlIFBpdm90RGltZW5zaW9uVHlwZS5GaWx0ZXI6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5maWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmZpbHRlcnM7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzaXplUm93RGltZW5zaW9uUGl4ZWxzKGRpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uLCBuZXdXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGlzUGVyY2VudGFnZVdpZHRoID0gZGltZW5zaW9uLndpZHRoICYmIHR5cGVvZiBkaW1lbnNpb24ud2lkdGggPT09ICdzdHJpbmcnICYmIGRpbWVuc2lvbi53aWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgICAgICBpZiAoaXNQZXJjZW50YWdlV2lkdGgpIHtcbiAgICAgICAgICAgIGRpbWVuc2lvbi53aWR0aCA9IHRoaXMucmV2ZXJzZURpbWVuc2lvbldpZHRoVG9QZXJjZW50KG5ld1dpZHRoKS50b0ZpeGVkKDIpICsgJyUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGltZW5zaW9uLndpZHRoID0gbmV3V2lkdGggKyAncHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBncmlkIHRvIHJlZmxvdywgdG8gdXBkYXRlIGlmIGhvcml6b250YWwgc2Nyb2xsYmFyIG5lZWRzIHRvIGJlIHJlbmRlcmVkL3JlbW92ZWQuXG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHByb3RlY3RlZCBfcmVtb3ZlRGltZW5zaW9uSW50ZXJuYWwoZGltZW5zaW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZDb2xsZWN0aW9uVHlwZSA9IHRoaXMuZ2V0RGltZW5zaW9uVHlwZShkaW1lbnNpb24pO1xuICAgICAgICBpZiAocHJldkNvbGxlY3Rpb25UeXBlID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHByZXZDb2xsZWN0aW9uID0gdGhpcy5nZXREaW1lbnNpb25zQnlUeXBlKHByZXZDb2xsZWN0aW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHByZXZDb2xsZWN0aW9uLmluZGV4T2YoZGltZW5zaW9uKTtcbiAgICAgICAgcHJldkNvbGxlY3Rpb24uc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXREaW1lbnNpb25UeXBlKGRpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uKTogUGl2b3REaW1lbnNpb25UeXBlIHtcbiAgICAgICAgcmV0dXJuIFBpdm90VXRpbC5mbGF0dGVuKHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnJvd3MpLmluZGV4T2YoZGltZW5zaW9uKSAhPT0gLTEgPyBQaXZvdERpbWVuc2lvblR5cGUuUm93IDpcbiAgICAgICAgICAgIFBpdm90VXRpbC5mbGF0dGVuKHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmNvbHVtbnMpLmluZGV4T2YoZGltZW5zaW9uKSAhPT0gLTEgPyBQaXZvdERpbWVuc2lvblR5cGUuQ29sdW1uIDpcbiAgICAgICAgICAgICAgICAoISF0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5maWx0ZXJzICYmIFBpdm90VXRpbC5mbGF0dGVuKHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmZpbHRlcnMpLmluZGV4T2YoZGltZW5zaW9uKSAhPT0gLTEpID9cbiAgICAgICAgICAgICAgICAgICAgUGl2b3REaW1lbnNpb25UeXBlLkZpbHRlciA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldExhcmdlc0NvbnRlbnRXaWR0aChjb250ZW50czogRWxlbWVudFJlZltdKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFyZ2VzdCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICAgIGlmIChjb250ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsc0NvbnRlbnRXaWR0aHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnRlbnRzLmZvckVhY2goKGVsZW0pID0+IGNlbGxzQ29udGVudFdpZHRocy5wdXNoKHRoaXMuZ2V0SGVhZGVyQ2VsbFdpZHRoKGVsZW0ubmF0aXZlRWxlbWVudCkud2lkdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2VsbHNDb250ZW50V2lkdGhzLmluZGV4T2YoTWF0aC5tYXgoLi4uY2VsbHNDb250ZW50V2lkdGhzKSk7XG4gICAgICAgICAgICBjb25zdCBjZWxsU3R5bGUgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoY29udGVudHNbaW5kZXhdLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgY2VsbFBhZGRpbmcgPSBwYXJzZUZsb2F0KGNlbGxTdHlsZS5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNlbGxTdHlsZS5wYWRkaW5nUmlnaHQpICtcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KGNlbGxTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjZWxsU3R5bGUuYm9yZGVyUmlnaHRXaWR0aCk7XG4gICAgICAgICAgICBsYXJnZXN0LnNldChNYXRoLm1heCguLi5jZWxsc0NvbnRlbnRXaWR0aHMpLCBjZWxsUGFkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFyZ2VzdENlbGwgPSBNYXRoLm1heCguLi5BcnJheS5mcm9tKGxhcmdlc3Qua2V5cygpKSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKGxhcmdlc3RDZWxsICsgbGFyZ2VzdC5nZXQobGFyZ2VzdENlbGwpKTtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc011bHRpcGxlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoID4gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXhjZWxTdHlsZUZpbHRlck1heEhlaWdodCgpIHtcbiAgICAgICAgLy8gbWF4IDEwIHJvd3MsIHJvdyBzaXplIGRlcGVuZHMgb24gZGVuc2l0eVxuICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogMTA7XG4gICAgICAgIHJldHVybiBgJHttYXhIZWlnaHR9cHhgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICovXG4gICAgcHVibGljIGdldCBleGNlbFN0eWxlRmlsdGVyTWluSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgICAgIC8vIG1pbiA1IHJvd3MsIHJvdyBzaXplIGRlcGVuZHMgb24gZGVuc2l0eVxuICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogNTtcbiAgICAgICAgcmV0dXJuIGAke21pbkhlaWdodH1weGA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVUb2dnbGUoZ3JvdXBDb2x1bW46IElneENvbHVtbkNvbXBvbmVudCwgc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCFncm91cENvbHVtbikgcmV0dXJuO1xuICAgICAgICBncm91cENvbHVtbi5oaWRkZW4gPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5jb2x1bW5Hcm91cFN0YXRlcy5zZXQoZ3JvdXBDb2x1bW4uZmllbGQsIHN0YXRlKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Ub3RhbCA9IHRoaXMuaGFzTXVsdGlwbGVWYWx1ZXMgP1xuICAgICAgICAgICAgZ3JvdXBDb2x1bW4uY2hpbGRyZW4uZmlsdGVyKHggPT4geC5jb2x1bW5Hcm91cCAmJiB4LmNoaWxkcmVuLmZpbHRlcih5ID0+ICF5LmNvbHVtbkdyb3VwKS5sZW5ndGggPT09IHRoaXMudmFsdWVzLmxlbmd0aCkgOlxuICAgICAgICAgICAgZ3JvdXBDb2x1bW4uY2hpbGRyZW4uZmlsdGVyKHggPT4gIXguY29sdW1uR3JvdXApO1xuICAgICAgICBjb25zdCBjaGlsZHJlblN1Ymdyb3VwcyA9IHRoaXMuaGFzTXVsdGlwbGVWYWx1ZXMgP1xuICAgICAgICAgICAgZ3JvdXBDb2x1bW4uY2hpbGRyZW4uZmlsdGVyKHggPT4geC5jb2x1bW5Hcm91cCAmJiB4LmNoaWxkcmVuLmZpbHRlcih5ID0+ICF5LmNvbHVtbkdyb3VwKS5sZW5ndGggPT09IDApIDpcbiAgICAgICAgICAgIGdyb3VwQ29sdW1uLmNoaWxkcmVuLmZpbHRlcih4ID0+IHguY29sdW1uR3JvdXApO1xuICAgICAgICBjaGlsZHJlblRvdGFsLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLmNvbHVtbkdyb3VwU3RhdGVzLmdldChncm91cC5maWVsZCkgfHwgc3RhdGU7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICBncm91cC5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdyb3VwLmhlYWRlclRlbXBsYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFncm91cENvbHVtbi5oaWRkZW4gJiYgY2hpbGRyZW5TdWJncm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2hpbGRyZW5TdWJncm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLmNvbHVtbkdyb3VwU3RhdGVzLmdldChncm91cC5maWVsZCkgfHwgc3RhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlVG9nZ2xlKGdyb3VwLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY0dyaWRIZWFkUm93KCkge1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZERhdGFWaWV3KGRhdGE6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGR2bCA9IHRoaXMuZGF0YVZpZXc/Lmxlbmd0aCB8fCAwO1xuICAgICAgICByZXR1cm4gZHZsIDwgdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlciA/IDAgOiB0aGlzLmRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBob3Jpem9udGFsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMudGhlYWRSb3cuaGVhZGVyQ29udGFpbmVycy5mb3JFYWNoKGhlYWRlckZvck9mID0+IHtcbiAgICAgICAgICAgIGhlYWRlckZvck9mLm9uSFNjcm9sbChzY3JvbGxMZWZ0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyLmhvcml6b250YWxTY3JvbGxIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmVydGljYWxTY3JvbGxIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudmVydGljYWxSb3dEaW1TY3JvbGxDb250YWluZXJzLmZvckVhY2goeCA9PiB7XG4gICAgICAgICAgICB4Lm9uU2Nyb2xsKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyLnZlcnRpY2FsU2Nyb2xsSGFuZGxlcihldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhdXRvZ2VuZXJhdGVDb2x1bW5zKCkge1xuICAgICAgICBsZXQgY29sdW1ucyA9IFtdO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkQVBJLmZpbHRlckRhdGFCeUV4cHJlc3Npb25zKHRoaXMuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgdGhpcy5kaW1lbnNpb25EYXRhQ29sdW1ucyA9IHRoaXMuZ2VuZXJhdGVEaW1lbnNpb25Db2x1bW5zKCk7XG4gICAgICAgIGxldCBmaWVsZHNNYXA7XG4gICAgICAgIGlmICh0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5jb2x1bW5TdHJhdGVneSAmJiB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5jb2x1bW5TdHJhdGVneSBpbnN0YW5jZW9mIE5vb3BQaXZvdERpbWVuc2lvbnNTdHJhdGVneSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5nZW5lcmF0ZURhdGFGaWVsZHMoZGF0YSk7XG4gICAgICAgICAgICBjb25zdCByb3dGaWVsZHMgPSBQaXZvdFV0aWwuZmxhdHRlbih0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5yb3dzKS5tYXAoeCA9PiB4Lm1lbWJlck5hbWUpO1xuICAgICAgICAgICAgY29uc3Qga2V5RmllbGRzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBpdm90S2V5cyk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoeCA9PiByb3dGaWVsZHMuaW5kZXhPZih4KSA9PT0gLTEgJiYga2V5RmllbGRzLmluZGV4T2YoeCkgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgeC5pbmRleE9mKHRoaXMucGl2b3RLZXlzLnJvd0RpbWVuc2lvblNlcGFyYXRvciArIHRoaXMucGl2b3RLZXlzLmxldmVsKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICB4LmluZGV4T2YodGhpcy5waXZvdEtleXMucm93RGltZW5zaW9uU2VwYXJhdG9yICsgdGhpcy5waXZvdEtleXMucmVjb3JkcykgPT09IC0xKTtcbiAgICAgICAgICAgIGZpZWxkc01hcCA9IHRoaXMuZ2VuZXJhdGVGcm9tRGF0YShmaWx0ZXJlZEZpZWxkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZHNNYXAgPSBQaXZvdFV0aWwuZ2V0RmllbGRzSGllcmFyY2h5KFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgIFBpdm90RGltZW5zaW9uVHlwZS5Db2x1bW4sXG4gICAgICAgICAgICAgICAgdGhpcy5waXZvdEtleXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1ucyA9IHRoaXMuZ2VuZXJhdGVDb2x1bW5IaWVyYXJjaHkoZmllbGRzTWFwLCBkYXRhKTtcbiAgICAgICAgdGhpcy5fYXV0b0dlbmVyYXRlZENvbHMgPSBjb2x1bW5zO1xuICAgICAgICAvLyByZXNldCBleHBhbnNpb24gc3RhdGVzIGlmIGFueSBhcmUgc3RvcmVkLlxuICAgICAgICB0aGlzLmNvbHVtbkdyb3VwU3RhdGVzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW4gPSBjb2x1bW5zLmZpbmQoeCA9PiB4LmZpZWxkID09PSBrZXkgJiYgeC5oZWFkZXJUZW1wbGF0ZSA9PT0gdGhpcy5oZWFkZXJUZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBTdW1tYXJ5Q29sdW1uID0gY29sdW1ucy5maW5kKHggPT4geC5maWVsZCA9PT0ga2V5ICYmIHguaGVhZGVyVGVtcGxhdGUgIT09IHRoaXMuaGVhZGVyVGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlUm93R3JvdXAocHJpbWFyeUNvbHVtbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChncm91cFN1bW1hcnlDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBTdW1tYXJ5Q29sdW1uLmhlYWRlclRlbXBsYXRlID0gdGhpcy5oZWFkZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlZmxvdygpO1xuXG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5yZXNldChjb2x1bW5zKTtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3VsZEdlbmVyYXRlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKGJhc2VTdHlsZUNsYXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zdXBlckNvbXBhY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7YmFzZVN0eWxlQ2xhc3N9LS0ke0Rpc3BsYXlEZW5zaXR5LmNvbXBhY3R9IGlneC1ncmlkX19waXZvdC0tc3VwZXItY29tcGFjdGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldENvbXBvbmVudERlbnNpdHlDbGFzcyhiYXNlU3R5bGVDbGFzcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlRGltZW5zaW9uQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGNvbnN0IGxlYWZGaWVsZHMgPSBQaXZvdFV0aWwuZmxhdHRlbih0aGlzLmFsbERpbWVuc2lvbnMsIDApLmZpbHRlcih4ID0+ICF4LmNoaWxkTGV2ZWwpLm1hcCh4ID0+IHgubWVtYmVyTmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgbGVhZkZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmID0gZmFjdG9yeS5jcmVhdGUodGhpcy52aWV3UmVmLmluamVjdG9yKTtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5maWVsZCA9IGZpZWxkO1xuICAgICAgICAgICAgcmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaChyZWYuaW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlRnJvbURhdGEoZmllbGRzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB0aGlzLnBpdm90S2V5cy5jb2x1bW5EaW1lbnNpb25TZXBhcmF0b3I7XG4gICAgICAgIGNvbnN0IGRhdGFBcnIgPSBmaWVsZHMubWFwKHggPT4geC5zcGxpdChzZXBhcmF0b3IpKS5zb3J0KHggPT4geC5sZW5ndGgpO1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICBkYXRhQXJyLmZvckVhY2goYXJyID0+IHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50SGllcmFyY2h5ID0gaGllcmFyY2h5O1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgYXJyKSB7XG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IHBhdGguam9pbihzZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRIaWVyYXJjaHkgPSBjdXJyZW50SGllcmFyY2h5LmdldChuZXdQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50SGllcmFyY2h5LnNldChuZXdQYXRoLCB7IHZhbHVlOiBuZXdQYXRoLCBleHBhbmRhYmxlOiB0cnVlLCBjaGlsZHJlbjogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSwgZGltZW5zaW9uOiB0aGlzLmNvbHVtbkRpbWVuc2lvbnNbMF0gfSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEhpZXJhcmNoeSA9IGN1cnJlbnRIaWVyYXJjaHkuZ2V0KG5ld1BhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50SGllcmFyY2h5ID0gdGFyZ2V0SGllcmFyY2h5LmNoaWxkcmVuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhpZXJhcmNoeTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVDb2x1bW5IaWVyYXJjaHkoZmllbGRzOiBNYXA8c3RyaW5nLCBhbnk+LCBkYXRhLCBwYXJlbnQgPSBudWxsKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICBjb25zdCBmYWN0b3J5Q29sdW1uID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShJZ3hDb2x1bW5Db21wb25lbnQpO1xuICAgICAgICBsZXQgY29sdW1ucyA9IFtdO1xuICAgICAgICBpZiAoZmllbGRzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmID0gZmFjdG9yeUNvbHVtbi5jcmVhdGUodGhpcy52aWV3UmVmLmluamVjdG9yKTtcbiAgICAgICAgICAgICAgICByZWYuaW5zdGFuY2UuaGVhZGVyID0gdmFsdWUuZGlzcGxheU5hbWU7XG4gICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLmZpZWxkID0gdmFsdWUubWVtYmVyO1xuICAgICAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLndpZHRoID0gTUlOSU1VTV9DT0xVTU5fV0lEVEggKyAncHgnO1xuICAgICAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5zb3J0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLmRhdGFUeXBlID0gdmFsdWUuZGF0YVR5cGUgfHwgdGhpcy5yZXNvbHZlRGF0YVR5cGVzKGRhdGFbMF1bdmFsdWUubWVtYmVyXSk7XG4gICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLmZvcm1hdHRlciA9IHZhbHVlLmZvcm1hdHRlcjtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2gocmVmLmluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3QgPSBmaWVsZHMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3QgZGltOiBJUGl2b3REaW1lbnNpb24gPSBmaWVsZHMuZ2V0KGZpcnN0KS5kaW1lbnNpb247XG4gICAgICAgIGxldCBjdXJyZW50RmllbGRzID0gZmllbGRzO1xuICAgICAgICBpZiAoZGltICYmIGRpbS5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbShmaWVsZHMuZW50cmllcygpKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gW3tcbiAgICAgICAgICAgICAgICBkaXI6IGRpbS5zb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZGltLm1lbWJlck5hbWUsXG4gICAgICAgICAgICAgICAgc3RyYXRlZ3k6IERlZmF1bHRQaXZvdFNvcnRpbmdTdHJhdGVneS5pbnN0YW5jZSgpXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IERhdGFVdGlsLnNvcnQoY2xvbmVBcnJheShlbnRyaWVzLCB0cnVlKSwgZXhwcmVzc2lvbnMsIHRoaXMuc29ydFN0cmF0ZWd5LCB0aGlzLmdyaWRBUEkuZ3JpZCk7XG4gICAgICAgICAgICBjdXJyZW50RmllbGRzID0gbmV3IE1hcChzb3J0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGaWVsZHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxldCBzaG91bGRHZW5lcmF0ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodmFsdWUuZGltZW5zaW9uICYmIHZhbHVlLmRpbWVuc2lvbi5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlOiB2YWx1ZS5kaW1lbnNpb24uZmlsdGVyLmZpbHRlcmluZ09wZXJhbmRzWzBdLFxuICAgICAgICAgICAgICAgICAgICBzdHJhdGVneTogdGhpcy5maWx0ZXJTdHJhdGVneSB8fCBuZXcgRGltZW5zaW9uVmFsdWVzRmlsdGVyaW5nU3RyYXRlZ3koKSxcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IHRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gRmlsdGVyVXRpbC5maWx0ZXIoY2xvbmVBcnJheSh2YWx1ZS5yZWNvcmRzKSwgc3RhdGUsIHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkR2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvdWxkR2VuZXJhdGUgJiYgKHZhbHVlLmNoaWxkcmVuID09IG51bGwgfHwgdmFsdWUuY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IHZhbHVlLmNoaWxkcmVuLnNpemUgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jcmVhdGVDb2x1bW5Gb3JEaW1lbnNpb24odmFsdWUsIGRhdGEsIHBhcmVudCwgdGhpcy5oYXNNdWx0aXBsZVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGNvbCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVhc3VyZUNoaWxkcmVuID0gdGhpcy5nZXRNZWFzdXJlQ2hpbGRyZW4oZmFjdG9yeUNvbHVtbiwgZGF0YSwgY29sLCBmYWxzZSwgdmFsdWUuZGltZW5zaW9uLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlc2V0KG1lYXN1cmVDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmNvbmNhdChtZWFzdXJlQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRHZW5lcmF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY3JlYXRlQ29sdW1uRm9yRGltZW5zaW9uKHZhbHVlLCBkYXRhLCBwYXJlbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5leHBhbmRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbC5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZW5lcmF0ZUNvbHVtbkhpZXJhcmNoeSh2YWx1ZS5jaGlsZHJlbiwgZGF0YSwgY29sKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZENoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKHggPT4geC5sZXZlbCA9PT0gY29sLmxldmVsICsgMSk7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGNvbCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVDaGlsZHJlbiA9IHRoaXMuZ2V0TWVhc3VyZUNoaWxkcmVuKGZhY3RvcnlDb2x1bW4sIGRhdGEsIGNvbCwgdHJ1ZSwgdmFsdWUuZGltZW5zaW9uLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ2hpbGRyZW4gPSBmaWx0ZXJlZENoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IGFsbENoaWxkcmVuID0gY2hpbGRyZW4uY29uY2F0KG1lYXN1cmVDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbC5jaGlsZHJlbi5yZXNldChuZXN0ZWRDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmNvbmNhdChjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5kaW1lbnNpb24uY2hpbGRMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IHRoaXMuY3JlYXRlQ29sdW1uRm9yRGltZW5zaW9uKHZhbHVlLCBkYXRhLCBwYXJlbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKHNpYmxpbmcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlQ2hpbGRyZW4gPSB0aGlzLmdldE1lYXN1cmVDaGlsZHJlbihmYWN0b3J5Q29sdW1uLCBkYXRhLCBzaWJsaW5nLCBmYWxzZSwgdmFsdWUuZGltZW5zaW9uPy53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nLmNoaWxkcmVuLnJlc2V0KG1lYXN1cmVDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gY29sdW1ucy5jb25jYXQobWVhc3VyZUNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlc2V0KGZpbHRlcmVkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gY29sdW1ucy5jb25jYXQoY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZGltZW5zaW9uLmNoaWxkTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmcgPSB0aGlzLmNyZWF0ZUNvbHVtbkZvckRpbWVuc2lvbih2YWx1ZSwgZGF0YSwgcGFyZW50LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5Gb3JEaW1lbnNpb24odmFsdWU6IGFueSwgZGF0YTogYW55LCBwYXJlbnQ6IENvbHVtblR5cGUsIGlzR3JvdXA6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZmFjdG9yeUNvbHVtbiA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgZmFjdG9yeUNvbHVtbkdyb3VwID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGtleSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICBjb25zdCByZWYgPSBpc0dyb3VwID9cbiAgICAgICAgICAgIGZhY3RvcnlDb2x1bW5Hcm91cC5jcmVhdGUodGhpcy52aWV3UmVmLmluamVjdG9yKSA6XG4gICAgICAgICAgICBmYWN0b3J5Q29sdW1uLmNyZWF0ZSh0aGlzLnZpZXdSZWYuaW5qZWN0b3IpO1xuICAgICAgICByZWYuaW5zdGFuY2UuaGVhZGVyID0gcGFyZW50ICE9IG51bGwgPyBrZXkuc3BsaXQocGFyZW50LmhlYWRlciArIHRoaXMucGl2b3RLZXlzLmNvbHVtbkRpbWVuc2lvblNlcGFyYXRvcilbMV0gOiBrZXk7XG4gICAgICAgIHJlZi5pbnN0YW5jZS5maWVsZCA9IGtleTtcbiAgICAgICAgcmVmLmluc3RhbmNlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgcmVmLmluc3RhbmNlLndpZHRoID0gdGhpcy5yZXNvbHZlQ29sdW1uRGltZW5zaW9uV2lkdGgodmFsdWUuZGltZW5zaW9uKTtcbiAgICAgICAgY29uc3QgdmFsdWVEZWZpbml0aW9uID0gdGhpcy52YWx1ZXNbMF07XG4gICAgICAgIHJlZi5pbnN0YW5jZS5kYXRhVHlwZSA9IHZhbHVlRGVmaW5pdGlvbj8uZGF0YVR5cGUgfHwgdGhpcy5yZXNvbHZlRGF0YVR5cGVzKGRhdGFbMF1bdmFsdWVEZWZpbml0aW9uPy5tZW1iZXJdKTtcbiAgICAgICAgcmVmLmluc3RhbmNlLmZvcm1hdHRlciA9IHZhbHVlRGVmaW5pdGlvbj8uZm9ybWF0dGVyO1xuICAgICAgICByZWYuaW5zdGFuY2Uuc29ydGFibGUgPSB0cnVlO1xuICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICByZXR1cm4gcmVmLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlQ29sdW1uRGltZW5zaW9uV2lkdGgoZGltOiBJUGl2b3REaW1lbnNpb24pIHtcbiAgICAgICAgaWYgKGRpbS53aWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpbS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdXBlckNvbXBhY3RNb2RlID8gTUlOSU1VTV9DT0xVTU5fV0lEVEhfU1VQRVJfQ09NUEFDVCArICdweCcgOiBNSU5JTVVNX0NPTFVNTl9XSURUSCArICdweCc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldE1lYXN1cmVDaGlsZHJlbihjb2xGYWN0b3J5LCBkYXRhLCBwYXJlbnQsIGhpZGRlbiwgcGFyZW50V2lkdGgpIHtcbiAgICAgICAgY29uc3QgY29scyA9IFtdO1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMudmFsdWVzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBwYXJlbnRXaWR0aCA/IHBhcnNlSW50KHBhcmVudFdpZHRoLCAxMCkgLyBjb3VudCA6XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29tcGFjdE1vZGUgPyBNSU5JTVVNX0NPTFVNTl9XSURUSF9TVVBFUl9DT01QQUNUIDogTUlOSU1VTV9DT0xVTU5fV0lEVEg7XG4gICAgICAgIGNvbnN0IGlzUGVyY2VudCA9IHBhcmVudFdpZHRoICYmIHBhcmVudFdpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgICAgIHRoaXMudmFsdWVzLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGNvbEZhY3RvcnkuY3JlYXRlKHRoaXMudmlld1JlZi5pbmplY3Rvcik7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuaGVhZGVyID0gdmFsLmRpc3BsYXlOYW1lIHx8IHZhbC5tZW1iZXI7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZmllbGQgPSBwYXJlbnQuZmllbGQgKyB0aGlzLnBpdm90S2V5cy5jb2x1bW5EaW1lbnNpb25TZXBhcmF0b3IgKyB2YWwubWVtYmVyO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS53aWR0aCA9IGlzUGVyY2VudCA/IHdpZHRoICsgJyUnIDogd2lkdGggKyAncHgnO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLmhpZGRlbiA9IGhpZGRlbjtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5zb3J0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZGF0YVR5cGUgPSB2YWwuZGF0YVR5cGUgfHwgdGhpcy5yZXNvbHZlRGF0YVR5cGVzKGRhdGFbMF1bdmFsLm1lbWJlcl0pO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLmZvcm1hdHRlciA9IHZhbC5mb3JtYXR0ZXI7XG4gICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29scy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJvcE5hbWUoZGltOiBJUGl2b3REaW1lbnNpb24pIHtcbiAgICAgICAgcmV0dXJuICEhZGltID8/IGRpbS5tZW1iZXJOYW1lICsgdGhpcy5waXZvdEtleXMucm93RGltZW5zaW9uU2VwYXJhdG9yICsgJ2hlaWdodCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlQaXZvdEdyaWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBkZWZhdWx0RW1wdHlQaXZvdEdyaWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB3aGVuIHBpdm90IGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBpdm90LWdyaWQgW2VtcHR5UGl2b3RHcmlkVGVtcGxhdGVdPVwibXlUZW1wbGF0ZVwiPjxpZ3gtcGl2b3QtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBlbXB0eVBpdm90R3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgY29uc3QgYWxsRW5hYmxlZERpbWVuc2lvbnMgPSB0aGlzLnJvd0RpbWVuc2lvbnMuY29uY2F0KHRoaXMuY29sdW1uRGltZW5zaW9ucyk7XG4gICAgICAgIGlmIChhbGxFbmFibGVkRGltZW5zaW9ucy5sZW5ndGggPT09IDAgJiYgdGhpcy52YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBubyBlbmFibGVkIHZhbHVlcyBhbmQgZGltZW5zaW9uc1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlQaXZvdEdyaWRUZW1wbGF0ZSB8fCB0aGlzLmRlZmF1bHRFbXB0eVBpdm90R3JpZFRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLnRlbXBsYXRlO1xuICAgIH1cbn1cbiIsIjwhLS0gVG9vbGJhciBhcmVhIC0tPlxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LWdyaWQtdG9vbGJhclwiPjwvbmctY29udGVudD5cblxuPCEtLSBHcmlkIHRhYmxlIGhlYWQgcm93IGFyZWEgLS0+XG48aWd4LXBpdm90LWhlYWRlci1yb3cgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZCBpZ3gtZ3JpZC10aGVhZC0tcGl2b3RcIiB0YWJpbmRleD1cIjBcIlxuICAgIFtncmlkXT1cInRoaXNcIlxuICAgIFtoYXNNUkxdPVwiaGFzQ29sdW1uTGF5b3V0c1wiXG4gICAgW2RlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgIFthY3RpdmVEZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIlxuICAgIFt3aWR0aF09XCJjYWxjV2lkdGhcIlxuICAgIFtwaW5uZWRDb2x1bW5Db2xsZWN0aW9uXT1cInBpbm5lZENvbHVtbnNcIlxuICAgIFt1bnBpbm5lZENvbHVtbkNvbGxlY3Rpb25dPVwidW5waW5uZWRDb2x1bW5zXCJcbiAgICAoa2V5ZG93bi5tZXRhLmMpPVwiY29weUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgKGtleWRvd24uY29udHJvbC5jKT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChjb3B5KT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChrZXlkb3duKT1cIm5hdmlnYXRpb24uaGVhZGVyTmF2aWdhdGlvbigkZXZlbnQpXCJcbiAgICAoc2Nyb2xsKT1cInByZXZlbnRIZWFkZXJTY3JvbGwoJGV2ZW50KVwiXG4+XG48L2lneC1waXZvdC1oZWFkZXItcm93PlxuXG48ZGl2IGlneEdyaWRCb2R5IChrZXlkb3duLmNvbnRyb2wuYyk9XCJjb3B5SGFuZGxlcigkZXZlbnQpXCIgKGNvcHkpPVwiY29weUhhbmRsZXIoJGV2ZW50KVwiIGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5XCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0RpbWVuc2lvbnMubGVuZ3RoID8gZGVmYXVsdFJvd0RpbWVuc2lvbnNUZW1wbGF0ZSA6IGVtcHR5Um93RGltZW5zaW9uc1RlbXBsYXRlOyBjb250ZXh0OiB0aGlzXCI+PC9uZy1jb250YWluZXI+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1jb250ZW50XCIgdGFiaW5kZXg9XCIwXCIgW2F0dHIucm9sZV09XCJkYXRhVmlldy5sZW5ndGggPyBudWxsIDogJ3JvdydcIiAoa2V5ZG93bik9XCJuYXZpZ2F0aW9uLmhhbmRsZU5hdmlnYXRpb24oJGV2ZW50KVwiIChmb2N1cyk9XCJuYXZpZ2F0aW9uLmZvY3VzVGJvZHkoJGV2ZW50KVwiXG4gICAgICAgIChkcmFnU3RvcCk9XCJzZWxlY3Rpb25TZXJ2aWNlLmRyYWdNb2RlID0gJGV2ZW50XCIgKHNjcm9sbCk9J3ByZXZlbnRDb250YWluZXJTY3JvbGwoJGV2ZW50KSdcbiAgICAgICAgKGRyYWdTY3JvbGwpPVwiZHJhZ1Njcm9sbCgkZXZlbnQpXCIgW2lneEdyaWREcmFnU2VsZWN0XT1cInNlbGVjdGlvblNlcnZpY2UuZHJhZ01vZGVcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0ndG90YWxIZWlnaHQnIFtzdHlsZS53aWR0aC5weF09J2NhbGNXaWR0aCB8fCBudWxsJyAjdGJvZHkgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJoYXNNb3ZhYmxlQ29sdW1ucyAmJiBjb2x1bW5JbkRyYWcgJiYgcGlubmVkQ29sdW1ucy5sZW5ndGggPD0gMFwiXG4gICAgICAgICAgICBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiIGlkPVwibGVmdFwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1sZWZ0XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImhhc01vdmFibGVDb2x1bW5zICYmIGNvbHVtbkluRHJhZyAmJiBwaW5uZWRDb2x1bW5zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCIgW2F0dHIuZHJvcHBhYmxlXT1cInRydWVcIiBpZD1cImxlZnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcGlubmVkXCIgW3N0eWxlLmxlZnQucHhdPVwicGlubmVkV2lkdGhcIj48L3NwYW4+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yIGxldC1yb3dEYXRhIFtpZ3hHcmlkRm9yT2ZdPVwiZGF0YVxuICAgICAgICB8IHBpdm90R3JpZEZpbHRlcjpwaXZvdENvbmZpZ3VyYXRpb246ZmlsdGVyU3RyYXRlZ3k6YWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6ZmlsdGVyaW5nUGlwZVRyaWdnZXI6cGlwZVRyaWdnZXJcbiAgICAgICAgfCBwaXZvdEdyaWRTb3J0OnBpdm90Q29uZmlndXJhdGlvbjpzb3J0U3RyYXRlZ3k6cGlwZVRyaWdnZXJcbiAgICAgICAgfCBwaXZvdEdyaWRSb3c6cGl2b3RDb25maWd1cmF0aW9uOmV4cGFuc2lvblN0YXRlczpwaXBlVHJpZ2dlcjpzb3J0aW5nRXhwcmVzc2lvbnNcbiAgICAgICAgfCBwaXZvdEdyaWRDb2x1bW46cGl2b3RDb25maWd1cmF0aW9uOmV4cGFuc2lvblN0YXRlczpwaXBlVHJpZ2dlcjpzb3J0aW5nRXhwcmVzc2lvbnNcbiAgICAgICAgfCBwaXZvdEdyaWRBdXRvVHJhbnNmb3JtOnBpdm90Q29uZmlndXJhdGlvbjpwaXBlVHJpZ2dlclxuICAgICAgICB8IHBpdm90R3JpZENvbHVtblNvcnQ6c29ydGluZ0V4cHJlc3Npb25zOnNvcnRTdHJhdGVneTpwaXBlVHJpZ2dlclxuICAgICAgICB8IHBpdm90R3JpZFJvd0V4cGFuc2lvbjpwaXZvdENvbmZpZ3VyYXRpb246ZXhwYW5zaW9uU3RhdGVzOmRlZmF1bHRFeHBhbmRTdGF0ZTpwaXBlVHJpZ2dlclwiXG4gICAgICAgICAgICBsZXQtcm93SW5kZXg9XCJpbmRleFwiIFtpZ3hGb3JTY3JvbGxPcmllbnRhdGlvbl09XCIndmVydGljYWwnXCIgW2lneEZvclNjcm9sbENvbnRhaW5lcl09J3ZlcnRpY2FsU2Nyb2xsJ1xuICAgICAgICAgICAgW2lneEZvckNvbnRhaW5lclNpemVdPSdjYWxjSGVpZ2h0J1xuICAgICAgICAgICAgW2lneEZvckl0ZW1TaXplXT1cImhhc0NvbHVtbkxheW91dHMgPyByb3dIZWlnaHQgKiBtdWx0aVJvd0xheW91dFJvd1NpemUgKyAxIDogcmVuZGVyZWRSb3dIZWlnaHRcIlxuICAgICAgICAgICAgI3ZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgW2lneFRlbXBsYXRlT3V0bGV0XT0ncmVjb3JkVGVtcGxhdGUnXG4gICAgICAgICAgICAgICAgW2lneFRlbXBsYXRlT3V0bGV0Q29udGV4dF09J2dldENvbnRleHQocm93RGF0YSwgcm93SW5kZXgpJ1xuICAgICAgICAgICAgICAgIChjYWNoZWRWaWV3TG9hZGVkKT0nY2FjaGVkVmlld0xvYWRlZCgkZXZlbnQpJz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVjb3JkX3RlbXBsYXRlIGxldC1yb3dJbmRleD1cImluZGV4XCIgbGV0LXJvd0RhdGE+XG4gICAgICAgICAgICA8aWd4LXBpdm90LXJvdyBbc3R5bGUubWluLWhlaWdodC5weF09XCJyZW5kZXJlZFJvd0hlaWdodFwiIFtncmlkSURdPVwiaWRcIiBbaW5kZXhdPVwicm93SW5kZXhcIiBbZGF0YV09XCJyb3dEYXRhXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dDbGFzc2VzIHwgaWd4R3JpZFJvd0NsYXNzZXM6cm93OnJvdy5pbkVkaXRNb2RlOnJvdy5zZWxlY3RlZDpyb3cuZGlydHk6cm93LmRlbGV0ZWQ6cm93LmRyYWdnaW5nOnJvd0luZGV4Omhhc0NvbHVtbkxheW91dHM6ZmFsc2U6cGlwZVRyaWdnZXJcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInJvd1N0eWxlcyB8IGlneEdyaWRSb3dTdHlsZXM6cm93RGF0YTpyb3dJbmRleDpwaXBlVHJpZ2dlclwiICNyb3c+XG4gICAgICAgICAgICA8L2lneC1waXZvdC1yb3c+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxpZ2MtdHJpYWwtd2F0ZXJtYXJrPjwvaWdjLXRyaWFsLXdhdGVybWFyaz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlneFRvZ2dsZSAjbG9hZGluZ092ZXJsYXk+XG4gICAgICAgIDxpZ3gtY2lyY3VsYXItYmFyIFtpbmRldGVybWluYXRlXT1cInRydWVcIiAqbmdJZj0nc2hvdWxkT3ZlcmxheUxvYWRpbmcnPlxuICAgICAgICA8L2lneC1jaXJjdWxhci1iYXI+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gKm5nSWY9XCJoYXNNb3ZhYmxlQ29sdW1ucyAmJiBjb2x1bW5JbkRyYWdcIiBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiXG4gICAgICAgIGlkPVwicmlnaHRcIiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1yaWdodFwiPjwvc3Bhbj5cbiAgICA8ZGl2IFtoaWRkZW5dPSchaGFzVmVydGljYWxTY3JvbGwoKScgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktc2Nyb2xsYmFyXCIgW3N0eWxlLndpZHRoLnB4XT1cInNjcm9sbFNpemVcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItc3RhcnRcIiBbc3R5bGUuaGVpZ2h0LnB4XT0nIGlzUm93UGlubmluZ1RvVG9wID8gcGlubmVkUm93SGVpZ2h0IDogMCc+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktc2Nyb2xsYmFyLW1haW5cIiBbc3R5bGUuaGVpZ2h0LnB4XT0nY2FsY0hlaWdodCc+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgaWd4R3JpZEZvciBbaWd4R3JpZEZvck9mXT0nW10nICN2ZXJ0aWNhbFNjcm9sbEhvbGRlcj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItZW5kXCIgW3N0eWxlLmhlaWdodC5weF09JyFpc1Jvd1Bpbm5pbmdUb1RvcCA/IHBpbm5lZFJvd0hlaWdodCA6IDAnPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19hZGRyb3ctc25hY2tiYXJcIj5cbiAgICAgICAgPGlneC1zbmFja2JhciAjYWRkUm93U25hY2tiYXIgW291dGxldF09XCJpZ3hCb2R5T3ZlcmxheU91dGxldFwiIFthY3Rpb25UZXh0XT1cInJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9zbmFja2Jhcl9hZGRyb3dfYWN0aW9udGV4dFwiIFtkaXNwbGF5VGltZV09J3NuYWNrYmFyRGlzcGxheVRpbWUnPnt7cmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3NuYWNrYmFyX2FkZHJvd19sYWJlbH19PC9pZ3gtc25hY2tiYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICNpZ3hCb2R5T3ZlcmxheU91dGxldD1cIm92ZXJsYXktb3V0bGV0XCIgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbFwiIFtzdHlsZS5oZWlnaHQucHhdPVwic2Nyb2xsU2l6ZVwiICNzY3IgW2hpZGRlbl09XCJpc0hvcml6b250YWxTY3JvbGxIaWRkZW5cIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1zdGFydFwiIFtzdHlsZS53aWR0aC5weF09J2lzUGlubmluZ1RvU3RhcnQgPyBwaW5uZWRXaWR0aCA6IGhlYWRlckZlYXR1cmVzV2lkdGgnIFtzdHlsZS5taW4td2lkdGgucHhdPSdpc1Bpbm5pbmdUb1N0YXJ0ID8gcGlubmVkV2lkdGggOiBoZWFkZXJGZWF0dXJlc1dpZHRoJz48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1tYWluXCIgW3N0eWxlLndpZHRoLnB4XT0ndW5waW5uZWRXaWR0aCc+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yIFtpZ3hHcmlkRm9yT2ZdPSdFTVBUWV9EQVRBJyAjc2Nyb2xsQ29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLWVuZFwiIFtzdHlsZS5mbG9hdF09J1wicmlnaHRcIicgW3N0eWxlLndpZHRoLnB4XT0ncGlubmVkV2lkdGgnIFtzdHlsZS5taW4td2lkdGgucHhdPSdwaW5uZWRXaWR0aCcgW2hpZGRlbl09XCJwaW5uZWRXaWR0aCA9PT0gMCB8fCBpc1Bpbm5pbmdUb1N0YXJ0XCI+PC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImlneC1ncmlkX190Zm9vdFwiIHJvbGU9XCJyb3dncm91cFwiICN0Zm9vdD5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2Zvb3RlclwiICNmb290ZXI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LWdyaWQtZm9vdGVyXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlGaWx0ZXJlZEdyaWQ+XG4gICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktbWVzc2FnZVwiIHJvbGU9XCJjZWxsXCI+XG4gICAgICAgIDxzcGFuPnt7ZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlfX08L3NwYW4+XG4gICAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RW1wdHlHcmlkPlxuICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LW1lc3NhZ2VcIiByb2xlPVwiY2VsbFwiPlxuICAgICAgICA8c3Bhbj57e2VtcHR5R3JpZE1lc3NhZ2V9fTwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRMb2FkaW5nR3JpZD5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2xvYWRpbmdcIj5cbiAgICAgICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiPlxuICAgICAgICA8L2lneC1jaXJjdWxhci1iYXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPGlneC1waXZvdC1ncmlkLWNvbHVtbi1yZXNpemVyIFtyZXN0cmljdFJlc2l6ZXJUb3BdPVwidGhlYWRSb3cubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHRcIiAqbmdJZj1cImNvbFJlc2l6aW5nU2VydmljZS5zaG93UmVzaXplclwiPjwvaWd4LXBpdm90LWdyaWQtY29sdW1uLXJlc2l6ZXI+XG48ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2xvYWRpbmctb3V0bGV0XCIgI2lneExvYWRpbmdPdmVybGF5T3V0bGV0IGlneE92ZXJsYXlPdXRsZXQ+PC9kaXY+XG48ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX291dGxldFwiICNpZ3hGaWx0ZXJpbmdPdmVybGF5T3V0bGV0IGlneE92ZXJsYXlPdXRsZXQ+PC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyVGVtcGxhdGUgbGV0LWNvbHVtbj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3RyLS1oZWFkZXJcIj5cbiAgICAgICAgPGlneC1pY29uIFthdHRyLmRyYWdnYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29sdW1uKGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgIHt7Z2V0Q29sdW1uR3JvdXBFeHBhbmRTdGF0ZShjb2x1bW4pID8gJ2NoZXZyb25fcmlnaHQnIDogJ2V4cGFuZF9tb3JlJ319PC9pZ3gtaWNvbj5cbiAgICAgICAge3tjb2x1bW4uaGVhZGVyfX1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJvd0RpbWVuc2lvbnNUZW1wbGF0ZT5cbiAgICA8ZGl2IHRhYmluZGV4PVwiMFwiIFtzdHlsZS5oZWlnaHQucHhdPSd0b3RhbEhlaWdodCcgKm5nRm9yPSdsZXQgZGltIG9mIHJvd0RpbWVuc2lvbnM7IGxldCBkaW1JbmRleCA9IGluZGV4OycgI3Jvd0RpbWVuc2lvbkNvbnRhaW5lciByb2xlPVwicm93Z3JvdXBcIiBjbGFzcz0naWd4LWdyaWRfX3Rib2R5LXBpdm90LWRpbWVuc2lvbicgKGZvY3VzKT1cIm5hdmlnYXRpb24uZm9jdXNUYm9keSgkZXZlbnQpXCIgKGtleWRvd24pPVwibmF2aWdhdGlvbi5oYW5kbGVOYXZpZ2F0aW9uKCRldmVudClcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgbGV0LXJvd0RhdGEgW2lneEdyaWRGb3JPZl09XCJkYXRhVmlld1xuICAgICAgICB8IHBpdm90R3JpZENlbGxNZXJnaW5nOnBpdm90Q29uZmlndXJhdGlvbjpkaW06cGlwZVRyaWdnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0luZGV4PVwiaW5kZXhcIiBbaWd4Rm9yU2Nyb2xsT3JpZW50YXRpb25dPVwiJ3ZlcnRpY2FsJ1wiIFtpZ3hGb3JTY3JvbGxDb250YWluZXJdPSd2ZXJ0aWNhbFNjcm9sbCdcbiAgICAgICAgICAgICAgICAgICAgIFtpZ3hGb3JDb250YWluZXJTaXplXT0nY2FsY0hlaWdodCdcbiAgICAgICAgICAgICAgICAgICAgIFtpZ3hGb3JJdGVtU2l6ZV09XCJyZW5kZXJlZFJvd0hlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICBbaWd4Rm9yU2l6ZVByb3BOYW1lXT0nXCJoZWlnaHRcIidcbiAgICAgICAgICAgICAgICAgICAgICN2ZXJ0aWNhbFJvd0RpbVNjcm9sbENvbnRhaW5lcj5cbiAgICAgICAgICAgIDxpZ3gtcGl2b3Qtcm93LWRpbWVuc2lvbi1jb250ZW50IHJvbGU9J3JvdycgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZFwiIFtncmlkXT1cInRoaXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RpbWVuc2lvbl09J3Jvd0RhdGEuZGltZW5zaW9uc1tkaW1JbmRleF0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm9vdERpbWVuc2lvbl09J2RpbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09J3Jvd0luZGV4JyBbcm93RGF0YV09J3Jvd0RhdGEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVuc2l0eV09XCJkaXNwbGF5RGVuc2l0eVwiIFt3aWR0aF09XCJyb3dEaW1lbnNpb25XaWR0aFRvUGl4ZWxzKGRpbSlcIj5cbiAgICAgICAgICAgIDwvaWd4LXBpdm90LXJvdy1kaW1lbnNpb24tY29udGVudD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2VtcHR5Um93RGltZW5zaW9uc1RlbXBsYXRlPlxuICAgIDxkaXYgdGFiaW5kZXg9XCIwXCIgKm5nSWY9J2NvbHVtbkRpbWVuc2lvbnMubGVuZ3RoID4gMCB8fCB2YWx1ZXMubGVuZ3RoID4gMCcgI3Jvd0RpbWVuc2lvbkNvbnRhaW5lciByb2xlPVwicm93Z3JvdXBcIiBjbGFzcz0naWd4LWdyaWRfX3Rib2R5LXBpdm90LWRpbWVuc2lvbicgKGZvY3VzKT1cIm5hdmlnYXRpb24uZm9jdXNUYm9keSgkZXZlbnQpXCIgKGtleWRvd24pPVwibmF2aWdhdGlvbi5oYW5kbGVOYXZpZ2F0aW9uKCRldmVudClcIj5cbiAgICAgICAgPGlneC1waXZvdC1yb3ctZGltZW5zaW9uLWNvbnRlbnQgcm9sZT0ncm93JyBjbGFzcz1cImlneC1ncmlkLXRoZWFkXCIgW2dyaWRdPVwidGhpc1wiXG4gICAgICAgICAgICBbZGltZW5zaW9uXT0nZW1wdHlSb3dEaW1lbnNpb24nXG4gICAgICAgICAgICBbcm9vdERpbWVuc2lvbl09J2VtcHR5Um93RGltZW5zaW9uJ1xuICAgICAgICAgICAgW3Jvd0luZGV4XT0nMCcgW3Jvd0RhdGFdPSdkYXRhVmlld1swXSdcbiAgICAgICAgICAgIFtkZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgW3dpZHRoXT1cInJvd0RpbWVuc2lvbldpZHRoVG9QaXhlbHMoZW1wdHlSb3dEaW1lbnNpb24pXCI+XG4gICAgICAgIDwvaWd4LXBpdm90LXJvdy1kaW1lbnNpb24tY29udGVudD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlQaXZvdEdyaWRUZW1wbGF0ZT5cbiAgICA8c3BhbiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1tZXNzYWdlXCIgcm9sZT1cImNlbGxcIj5cbiAgICAgICAgPHNwYW4+e3tyZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfcGl2b3RfZW1wdHlfbWVzc2FnZX19PC9zcGFuPlxuICAgIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgW2hpZGRlbl09J3RydWUnPlxuICAgIDxpZ3gtZ3JpZC1leGNlbC1zdHlsZS1maWx0ZXJpbmcgW21heEhlaWdodF09J2V4Y2VsU3R5bGVGaWx0ZXJNYXhIZWlnaHQnIFttaW5IZWlnaHRdPSdleGNlbFN0eWxlRmlsdGVyTWluSGVpZ2h0Jz5cbiAgICAgICAgPGRpdiBpZ3hFeGNlbFN0eWxlQ29sdW1uT3BlcmF0aW9ucyBbaGlkZGVuXT0ndHJ1ZSc+PC9kaXY+XG4gICAgICAgIDxpZ3gtZXhjZWwtc3R5bGUtZmlsdGVyLW9wZXJhdGlvbnM+XG4gICAgICAgICAgICA8aWd4LWV4Y2VsLXN0eWxlLXNlYXJjaD48L2lneC1leGNlbC1zdHlsZS1zZWFyY2g+XG4gICAgICAgIDwvaWd4LWV4Y2VsLXN0eWxlLWZpbHRlci1vcGVyYXRpb25zPlxuICAgIDwvaWd4LWdyaWQtZXhjZWwtc3R5bGUtZmlsdGVyaW5nPlxuPC9kaXY+XG4iXX0=
|
|
1879
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGl2b3QtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvZ3JpZHMvcGl2b3QtZ3JpZC9waXZvdC1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9waXZvdC1ncmlkL3Bpdm90LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFHSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFHWixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxTQUFTLEVBR1QsTUFBTSxFQUNOLFFBQVEsRUFFUixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFLZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM3RyxPQUFPLEVBQXdCLGFBQWEsRUFBVyxNQUFNLDBCQUEwQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBdUYsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNySyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUs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O3NCQURmLE1BQU07Z0JBT0EsWUFBWTtzQkFEbEIsTUFBTTtnQkFPQSxVQUFVO3NCQURoQixNQUFNO2dCQU9BLFlBQVk7c0JBRGxCLE1BQU07Z0JBT0EsT0FBTztzQkFEYixNQUFNO2dCQU9BLFdBQVc7c0JBRGpCLE1BQU07Z0JBT0EsV0FBVztzQkFEakIsTUFBTTtnQkFPQSxVQUFVO3NCQURoQixNQUFNO2dCQU9BLFNBQVM7c0JBRGYsTUFBTTtnQkErQ0ksa0JBQWtCO3NCQUQ1QixLQUFLO2dCQWFLLFVBQVU7c0JBRHBCLEtBQUs7Z0JBYUssZ0JBQWdCO3NCQUQxQixLQUFLO2dCQW9ESyxZQUFZO3NCQUR0QixLQUFLO2dCQWFLLHNCQUFzQjtzQkFEaEMsS0FBSztnQkFZSyxVQUFVO3NCQURwQixLQUFLO2dCQVlLLGNBQWM7c0JBRHhCLEtBQUs7Z0JBMEJLLElBQUk7c0JBRGQsS0FBSztnQkFhSyxNQUFNO3NCQURoQixLQUFLO2dCQVlLLE9BQU87c0JBRGpCLEtBQUs7Z0JBK0NLLGdCQUFnQjtzQkFEMUIsS0FBSztnQkF1Q0ssV0FBVztzQkFEckIsS0FBSztnQkFZSyxPQUFPO3NCQURqQixLQUFLO2dCQVdLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBWUssc0JBQXNCO3NCQURoQyxLQUFLO2dCQVlLLHFCQUFxQjtzQkFEL0IsS0FBSztnQkEwQkssWUFBWTtzQkFEdEIsS0FBSztnQkErTkssRUFBRTtzQkFGWixXQUFXO3VCQUFDLFNBQVM7O3NCQUNyQixLQUFLO2dCQWVLLElBQUk7c0JBRGQsS0FBSztnQkFzS0ssWUFBWTtzQkFEdEIsS0FBSztnQkF5NEJDLDZCQUE2QjtzQkFEbkMsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFZakUsc0JBQXNCO3NCQUQ1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgSXRlcmFibGVEaWZmZXJzLFxuICAgIExPQ0FMRV9JRCxcbiAgICBOZ1pvbmUsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBPcHRpb25hbCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIEluamVjdG9yLFxuICAgIE5nTW9kdWxlUmVmLFxuICAgIEFwcGxpY2F0aW9uUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL3NlbGVjdGlvbi9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hGb3JPZlN5bmNTZXJ2aWNlLCBJZ3hGb3JPZlNjcm9sbFN5bmNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLnN5bmMuc2VydmljZSc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBHcmlkVHlwZSwgSUdYX0dSSURfQkFTRSwgUm93VHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQ1JVRFNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IElneEdyaWRTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBERUZBVUxUX1BJVk9UX0tFWVMsIElEaW1lbnNpb25zQ2hhbmdlLCBJUGl2b3RDb25maWd1cmF0aW9uLCBJUGl2b3REaW1lbnNpb24sIElQaXZvdFZhbHVlLCBJVmFsdWVzQ2hhbmdlLCBQaXZvdERpbWVuc2lvblR5cGUgfSBmcm9tICcuL3Bpdm90LWdyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneFBpdm90SGVhZGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi9waXZvdC1oZWFkZXItcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbnMvY29sdW1uLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGl2b3RVdGlsIH0gZnJvbSAnLi9waXZvdC11dGlsJztcbmltcG9ydCB7IEZpbHRlck1vZGUsIEdyaWRQYWdpbmdNb2RlLCBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSwgR3JpZFN1bW1hcnlQb3NpdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9lbnVtcyc7XG5pbXBvcnQgeyBXYXRjaENoYW5nZXMgfSBmcm9tICcuLi93YXRjaC1jaGFuZ2VzJztcbmltcG9ydCB7IE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHtcbiAgICBJQ2VsbFBvc2l0aW9uLFxuICAgIElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3MsIElDb2x1bW5Nb3ZpbmdFdmVudEFyZ3MsIElDb2x1bW5Nb3ZpbmdTdGFydEV2ZW50QXJncyxcbiAgICBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MsIElHcmlkRWRpdERvbmVFdmVudEFyZ3MsIElHcmlkRWRpdEV2ZW50QXJncyxcbiAgICBJR3JpZFRvb2xiYXJFeHBvcnRFdmVudEFyZ3MsXG4gICAgSVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzLCBJUGluQ29sdW1uRXZlbnRBcmdzLCBJUGluUm93RXZlbnRBcmdzLCBJUm93RGF0YUV2ZW50QXJncywgSVJvd0RyYWdFbmRFdmVudEFyZ3MsIElSb3dEcmFnU3RhcnRFdmVudEFyZ3Ncbn0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBJZ3hHcmlkUm93Q29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC9ncmlkLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHJvcFBvc2l0aW9uIH0gZnJvbSAnLi4vbW92aW5nL21vdmluZy5zZXJ2aWNlJztcbmltcG9ydCB7IERpbWVuc2lvblZhbHVlc0ZpbHRlcmluZ1N0cmF0ZWd5LCBOb29wUGl2b3REaW1lbnNpb25zU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvcGl2b3Qtc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IElneFBpdm90R3JpZE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9waXZvdC1ncmlkLW5hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hQaXZvdENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4uL3Jlc2l6aW5nL3Bpdm90LWdyaWQvcGl2b3QtcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hGbGF0VHJhbnNhY3Rpb25GYWN0b3J5LCBJZ3hPdmVybGF5U2VydmljZSwgU3RhdGUsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5LCBEaXNwbGF5RGVuc2l0eVRva2VuLCBJRGVuc2l0eUNoYW5nZWRFdmVudEFyZ3MsIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IGNsb25lQXJyYXksIFBsYXRmb3JtVXRpbCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSWd4UGl2b3RGaWx0ZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi9waXZvdC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRhVXRpbCB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJZ3hHcmlkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgR3JpZEJhc2VBUElTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hQaXZvdFJvd0RpbWVuc2lvbkNvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL3Bpdm90LXJvdy1kaW1lbnNpb24tY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4UGl2b3RHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudCB9IGZyb20gJy4uL3Jlc2l6aW5nL3Bpdm90LWdyaWQvcGl2b3QtcmVzaXplci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4QWN0aW9uU3RyaXBDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hY3Rpb24tc3RyaXAvYWN0aW9uLXN0cmlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUGFnZUV2ZW50QXJncyB9IGZyb20gJy4uLy4uL3BhZ2luYXRvci9wYWdpbmF0b3ItaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJU29ydGluZ0V4cHJlc3Npb24sIFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvc29ydGluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBEZWZhdWx0UGl2b3RTb3J0aW5nU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9kYXRhLW9wZXJhdGlvbnMvcGl2b3Qtc29ydC1zdHJhdGVneSc7XG5pbXBvcnQgeyBQaXZvdFNvcnRVdGlsIH0gZnJvbSAnLi9waXZvdC1zb3J0LXV0aWwnO1xuaW1wb3J0IHsgRmlsdGVyVXRpbCwgSUZpbHRlcmluZ1N0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1zdHJhdGVneSc7XG5cbmxldCBORVhUX0lEID0gMDtcbmNvbnN0IE1JTklNVU1fQ09MVU1OX1dJRFRIID0gMjAwO1xuY29uc3QgTUlOSU1VTV9DT0xVTU5fV0lEVEhfU1VQRVJfQ09NUEFDVCA9IDEwNDtcblxuLyoqXG4gKiBQaXZvdCBHcmlkIHByb3ZpZGVzIGEgd2F5IHRvIHByZXNlbnQgYW5kIG1hbmlwdWxhdGUgZGF0YSBpbiBhIHBpdm90IHRhYmxlIHZpZXcuXG4gKlxuICogQGlneE1vZHVsZSBJZ3hQaXZvdEdyaWRNb2R1bGVcbiAqIEBpZ3hHcm91cCBHcmlkcyAmIExpc3RzXG4gKiBAaWd4S2V5d29yZHMgcGl2b3QsIGdyaWQsIHRhYmxlXG4gKiBAaWd4VGhlbWUgaWd4LWdyaWQtdGhlbWVcbiAqIEByZW1hcmtzXG4gKiBUaGUgSWduaXRlIFVJIFBpdm90IEdyaWQgaXMgdXNlZCBmb3IgZ3JvdXBpbmcgYW5kIGFnZ3JlZ2F0aW5nIHNpbXBsZSBmbGF0IGRhdGEgaW50byBhIHBpdm90IHRhYmxlLiAgT25jZSBkYXRhXG4gKiBoYXMgYmVlbiBib3VuZCBhbmQgdGhlIGRpbWVuc2lvbnMgYW5kIHZhbHVlcyBjb25maWd1cmVkIGl0IGNhbiBiZSBtYW5pcHVsYXRlZCB2aWEgc29ydGluZyBhbmQgZmlsdGVyaW5nLlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtcGl2b3QtZ3JpZCBbZGF0YV09XCJkYXRhXCIgW3Bpdm90Q29uZmlndXJhdGlvbl09XCJjb25maWd1cmF0aW9uXCI+XG4gKiA8L2lneC1waXZvdC1ncmlkPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiAnaWd4LXBpdm90LWdyaWQnLFxuICAgIHRlbXBsYXRlVXJsOiAncGl2b3QtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIElneEdyaWRDUlVEU2VydmljZSxcbiAgICAgICAgSWd4R3JpZFN1bW1hcnlTZXJ2aWNlLFxuICAgICAgICBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgR3JpZEJhc2VBUElTZXJ2aWNlLFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9HUklEX0JBU0UsIHVzZUV4aXN0aW5nOiBJZ3hQaXZvdEdyaWRDb21wb25lbnQgfSxcbiAgICAgICAgeyBwcm92aWRlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLCB1c2VDbGFzczogSWd4UGl2b3RGaWx0ZXJpbmdTZXJ2aWNlIH0sXG4gICAgICAgIElneFBpdm90R3JpZE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBJZ3hQaXZvdENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgSWd4Rm9yT2ZTeW5jU2VydmljZSxcbiAgICAgICAgSWd4Rm9yT2ZTY3JvbGxTeW5jU2VydmljZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UGl2b3RHcmlkQ29tcG9uZW50IGV4dGVuZHMgSWd4R3JpZEJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsXG4gICAgR3JpZFR5cGUsIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSBkaW1lbnNpb24gY29sbGVjdGlvbiBpcyBjaGFuZ2VkIHZpYSB0aGUgZ3JpZCBjaGlwIGFyZWEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIG5ldyBkaW1lbnNpb24gY29sbGVjdGlvbiBhbmQgaXRzIHR5cGU6XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1waXZvdC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiXG4gICAgICogICAgICAgICAgICAgIChkaW1lbnNpb25zQ2hhbmdlKT1cImRpbWVuc2lvbnNDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRpbWVuc2lvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElEaW1lbnNpb25zQ2hhbmdlPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBkaW1lbnNpb24gaXMgc29ydGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1waXZvdC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiXG4gICAgICogICAgICAgICAgICAgIChkaW1lbnNpb25zU29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlKT1cImRpbWVuc2lvbnNTb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LXBpdm90LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRpbWVuc2lvbnNTb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbltdPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIHRoZSB2YWx1ZXMgY29sbGVjdGlvbiBpcyBjaGFuZ2VkIHZpYSB0aGUgZ3JpZCBjaGlwIGFyZWEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIG5ldyBkaW1lbnNpb25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBpdm90LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCJcbiAgICAgKiAgICAgICAgICAgICAgKHZhbHVlc0NoYW5nZSk9XCJ2YWx1ZXNDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJVmFsdWVzQ2hhbmdlPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hQaXZvdEhlYWRlclJvd0NvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdGhlYWRSb3c6IElneFBpdm90SGVhZGVyUm93Q29tcG9uZW50O1xuXG4gICAgQElucHV0KClcbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHBpdm90IGNvbmZpZ3VyYXRpb24gd2l0aCBhbGwgcmVsYXRlZCBkaW1lbnNpb25zIGFuZCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBpdm90LWdyaWQgW3Bpdm90Q29uZmlndXJhdGlvbl09XCJjb25maWdcIj48L2lneC1waXZvdC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgcGl2b3RDb25maWd1cmF0aW9uKHZhbHVlOiBJUGl2b3RDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX3Bpdm90Q29uZmlndXJhdGlvbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwaXZvdENvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waXZvdENvbmZpZ3VyYXRpb24gfHwgeyByb3dzOiBudWxsLCBjb2x1bW5zOiBudWxsLCB2YWx1ZXM6IG51bGwsIGZpbHRlcnM6IG51bGwgfTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgcGl2b3QgY29uZmlndXJhdGlvbiB1aSBmb3IgdGhlIHBpdm90IGdyaWQgLSBjaGlwcyBhbmQgdGhlaXJcbiAgICAgKiBjb3JyZXNwb25kaW5nIGNvbnRhaW5lcnMgZm9yIHJvdywgZmlsdGVyLCBjb2x1bW4gZGltZW5zaW9ucyBhbmQgdmFsdWVzXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBpdm90LWdyaWQgW3Nob3dQaXZvdENvbmZpZ3VyYXRpb25VSV09XCJmYWxzZVwiPjwvaWd4LXBpdm90LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNob3dQaXZvdENvbmZpZ3VyYXRpb25VSTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBwdWJsaWMgcm9sZSA9ICdncmlkJztcblxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBhIHN1cGVyIGNvbXBhY3QgdGhlbWUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPdmVycmlkZXMgdGhlIGRpc3BsYXlEZW5zaXR5IG9wdGlvbiBpZiBvbmUgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtcGl2b3QtZ3JpZCBbc3VwZXJDb21wYWN0TW9kZV09XCJ0cnVlXCI+PC9pZ3gtcGl2b3QtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkX19waXZvdC0tc3VwZXItY29tcGFjdCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1cGVyQ29tcGFjdE1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdXBlckNvbXBhY3RNb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc3VwZXJDb21wYWN0TW9kZSh2YWx1ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjdXJyZW50IGRldGVjdGlvbiBjeWNsZSB0byBlbmQgYmVmb3JlIHRyaWdnZXJpbmcgYSBuZXcgb25lLlxuICAgICAgICAgICAgdGhpcy5fc3VwZXJDb21wYWN0TW9kZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHRoZW1lIG9mIHRoZSBjb21wb25lbnQuXG4gICAgKiBUaGUgZGVmYXVsdCB0aGVtZSBpcyBgY29tZm9ydGFibGVgLlxuICAgICogQXZhaWxhYmxlIG9wdGlvbnMgYXJlIGBjb21mb3J0YWJsZWAsIGBjb3N5YCwgYGNvbXBhY3RgLlxuICAgICogQHJlbWFya3NcbiAgICAqIElmIHNldCB3aGlsZSBzdXBlckNvbXBhY3RNb2RlIGlzIGVuYWJsZWQgd2lsbCBoYXZlIG5vIGFmZmVjdC5cbiAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAqIGxldCBjb21wb25lbnRUaGVtZSA9IHRoaXMuY29tcG9uZW50LmRpc3BsYXlEZW5zaXR5O1xuICAgICogYGBgXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZGlzcGxheURlbnNpdHkoKTogRGlzcGxheURlbnNpdHkge1xuICAgICAgICBpZiAodGhpcy5zdXBlckNvbXBhY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlzcGxheURlbnNpdHkuY29tcGFjdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGxheURlbnNpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTZXRzIHRoZSB0aGVtZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICovXG4gICAgcHVibGljIHNldCBkaXNwbGF5RGVuc2l0eSh2YWw6IERpc3BsYXlEZW5zaXR5KSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREaXNwbGF5RGVuc2l0eSA9IHRoaXMuX2Rpc3BsYXlEZW5zaXR5O1xuICAgICAgICB0aGlzLl9kaXNwbGF5RGVuc2l0eSA9IHZhbCBhcyBEaXNwbGF5RGVuc2l0eTtcblxuICAgICAgICBpZiAoY3VycmVudERpc3BsYXlEZW5zaXR5ICE9PSB0aGlzLl9kaXNwbGF5RGVuc2l0eSkge1xuICAgICAgICAgICAgY29uc3QgZGVuc2l0eUNoYW5nZWRBcmdzOiBJRGVuc2l0eUNoYW5nZWRFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgb2xkRGVuc2l0eTogY3VycmVudERpc3BsYXlEZW5zaXR5LFxuICAgICAgICAgICAgICAgIG5ld0RlbnNpdHk6IHRoaXMuX2Rpc3BsYXlEZW5zaXR5XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLm9uRGVuc2l0eUNoYW5nZWQuZW1pdChkZW5zaXR5Q2hhbmdlZEFyZ3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdyZWNvcmRfdGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgcmVjb3JkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneFBpdm90R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQpXG4gICAgcHVibGljIHJlc2l6ZUxpbmU6IElneFBpdm90R3JpZENvbHVtblJlc2l6ZXJDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQsIHsgcmVhZDogSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4UGl2b3RSb3dEaW1lbnNpb25Db250ZW50Q29tcG9uZW50KVxuICAgIHByb3RlY3RlZCByb3dEaW1lbnNpb25Db250ZW50Q29sbGVjdGlvbjogUXVlcnlMaXN0PElneFBpdm90Um93RGltZW5zaW9uQ29udGVudENvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oJ3ZlcnRpY2FsUm93RGltU2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgdmVydGljYWxSb3dEaW1TY3JvbGxDb250YWluZXJzOiBRdWVyeUxpc3Q8SWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueT4+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJhbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFkZFJvd0VtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNuYWNrYmFyRGlzcGxheVRpbWUgPSA2MDAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2VsbEVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbk1vdmluZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uTW92aW5nU3RhcnRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5QaW4gPSBuZXcgRXZlbnRFbWl0dGVyPElQaW5Db2x1bW5DYW5jZWxsYWJsZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtblBpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpbkNvbHVtbkV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0FkZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RhdGFFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEcmFnRW5kRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXRFeGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXREb25lRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93UGlubmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1Bpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIHB1YmxpYyBjb2x1bW5Hcm91cFN0YXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIHB1YmxpYyBkaW1lbnNpb25EYXRhQ29sdW1ucztcbiAgICBwdWJsaWMgZ2V0IHBpdm90S2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnBpdm90S2V5cyB8fCBERUZBVUxUX1BJVk9UX0tFWVM7XG4gICAgfVxuICAgIHB1YmxpYyBpc1Bpdm90ID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRyYWdSb3dJRCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvb3RTdW1tYXJpZXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcm93RGltZW5zaW9uUmVzaXppbmcgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIF9lbXB0eVJvd0RpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uID0geyBtZW1iZXJOYW1lOiAnJywgZW5hYmxlZDogdHJ1ZSwgbGV2ZWw6IDAgfTtcbiAgICBwdWJsaWMgZ2V0IGVtcHR5Um93RGltZW5zaW9uKCk6IElQaXZvdERpbWVuc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eVJvd0RpbWVuc2lvbjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyU3RyYXRlZ3k6IElGaWx0ZXJpbmdTdHJhdGVneSA9IG5ldyBEaW1lbnNpb25WYWx1ZXNGaWx0ZXJpbmdTdHJhdGVneSgpO1xuICAgIHByaXZhdGUgX2RhdGE7XG4gICAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhO1xuICAgIHByaXZhdGUgX3Bpdm90Q29uZmlndXJhdGlvbjogSVBpdm90Q29uZmlndXJhdGlvbiA9IHsgcm93czogbnVsbCwgY29sdW1uczogbnVsbCwgdmFsdWVzOiBudWxsLCBmaWx0ZXJzOiBudWxsIH07XG4gICAgcHJpdmF0ZSBwX2lkID0gYGlneC1waXZvdC1ncmlkLSR7TkVYVF9JRCsrfWA7XG4gICAgcHJpdmF0ZSBfc3VwZXJDb21wYWN0TW9kZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgKiBHZXRzL1NldHMgdGhlIGRlZmF1bHQgZXhwYW5kIHN0YXRlIGZvciBhbGwgcm93cy5cbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBkZWZhdWx0RXhwYW5kU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0RXhwYW5kU3RhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBkZWZhdWx0RXhwYW5kU3RhdGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdpbmdNb2RlKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmdNb2RlKF92YWw6IEdyaWRQYWdpbmdNb2RlKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGlkZVJvd1NlbGVjdG9ycygpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGlkZVJvd1NlbGVjdG9ycyhfdmFsdWU6IGJvb2xlYW4pIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhdXRvR2VuZXJhdGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgYWN0aW9uU3RyaXA6IElneEFjdGlvblN0cmlwQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnaW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVBhZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwZXJQYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG91bGRHZW5lcmF0ZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG1vdmluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9vbGJhckV4cG9ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgc2V0IHJvd0RyYWdnYWJsZShfdmFsOiBib29sZWFuKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYWxsb3dBZHZhbmNlZEZpbHRlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dBZHZhbmNlZEZpbHRlcmluZyhfdmFsdWUpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJNb2RlKCkge1xuICAgICAgICByZXR1cm4gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlck1vZGUoX3ZhbHVlOiBGaWx0ZXJNb2RlKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYWxsb3dGaWx0ZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFsbG93RmlsdGVyaW5nKF92YWx1ZSkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdlKF92YWw6IG51bWJlcikge1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFnaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmcoX3ZhbHVlOiBib29sZWFuKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGVyUGFnZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwZXJQYWdlKF92YWw6IG51bWJlcikge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnVucGlubmVkQ29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkRGF0YVZpZXcoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gc3VwZXIudW5waW5uZWREYXRhVmlldztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci51bnBpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLnBpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlSb3dIZWlnaHQoX3ZhbHVlOiBudW1iZXIpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2FjdGlvbnMoKTogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb25zO1xuICAgIH1cblxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZShfdmFsOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHJvd0VkaXRhYmxlKF92YWw6IGJvb2xlYW4pIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwaW5uaW5nKCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcGlubmluZyhfdmFsdWUpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlQb3NpdGlvbihfdmFsdWU6IEdyaWRTdW1tYXJ5UG9zaXRpb24pIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUoX3ZhbHVlOiBHcmlkU3VtbWFyeUNhbGN1bGF0aW9uTW9kZSkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVyYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2hvd1N1bW1hcnlPbkNvbGxhcHNlKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzaG93U3VtbWFyeU9uQ29sbGFwc2UoX3ZhbHVlOiBib29sZWFuKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhpZGRlbkNvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgYmF0Y2hFZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBiYXRjaEVkaXRpbmcoX3ZhbDogYm9vbGVhbikge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWRSb3dzKCk6IGFueVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRSb3dzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZFJvd0lkcyA9IFtdO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LmZvckVhY2gocmVjb3JkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZGltIG9mIHRoaXMucm93RGltZW5zaW9ucykge1xuICAgICAgICAgICAgICAgIGxldCBjdXJyRGltID0gZGltO1xuICAgICAgICAgICAgICAgIGxldCBzaG91bGRCcmVhayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gUGl2b3RVdGlsLmdldFJlY29yZEtleShyZWNvcmQsIGN1cnJEaW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzUGl2b3RSb3dTZWxlY3RlZChrZXkpICYmICFzZWxlY3RlZFJvd0lkcy5maW5kKHggPT4geCA9PT0gcmVjb3JkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3dJZHMucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyckRpbSA9IGN1cnJEaW0uY2hpbGRMZXZlbDtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJyRGltKTtcbiAgICAgICAgICAgICAgICBwcmV2LnB1c2goZGltKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQnJlYWspIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxlY3RlZFJvd0lkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dIZWlnaCA9IHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5zdXBlckNvbXBhY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmRlZmF1bHRSb3dIZWlnaHQ7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4UGl2b3RDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPixcbiAgICAgICAgcHJvdGVjdGVkIHRyYW5zYWN0aW9uRmFjdG9yeTogSWd4RmxhdFRyYW5zYWN0aW9uRmFjdG9yeSxcbiAgICAgICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50LFxuICAgICAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICBkaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsXG4gICAgICAgIHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIG1vZHVsZVJlZjogTmdNb2R1bGVSZWY8YW55PixcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBuYXZpZ2F0aW9uOiBJZ3hQaXZvdEdyaWROYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgZmlsdGVyaW5nU2VydmljZTogSWd4RmlsdGVyaW5nU2VydmljZSxcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJvdGVjdGVkIG92ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZSxcbiAgICAgICAgcHVibGljIHN1bW1hcnlTZXJ2aWNlOiBJZ3hHcmlkU3VtbWFyeVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBsb2NhbGVJZDogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtVXRpbCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJZ3hHcmlkVHJhbnNhY3Rpb24pIHByb3RlY3RlZCBfZGlUcmFuc2FjdGlvbnM/OiBUcmFuc2FjdGlvblNlcnZpY2U8VHJhbnNhY3Rpb24sIFN0YXRlPikge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgIHNlbGVjdGlvblNlcnZpY2UsXG4gICAgICAgICAgICBjb2xSZXNpemluZ1NlcnZpY2UsXG4gICAgICAgICAgICBncmlkQVBJLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25GYWN0b3J5LFxuICAgICAgICAgICAgZWxlbWVudFJlZixcbiAgICAgICAgICAgIHpvbmUsXG4gICAgICAgICAgICBkb2N1bWVudCxcbiAgICAgICAgICAgIGNkcixcbiAgICAgICAgICAgIHJlc29sdmVyLFxuICAgICAgICAgICAgZGlmZmVycyxcbiAgICAgICAgICAgIHZpZXdSZWYsXG4gICAgICAgICAgICBhcHBSZWYsXG4gICAgICAgICAgICBtb2R1bGVSZWYsXG4gICAgICAgICAgICBpbmplY3RvcixcbiAgICAgICAgICAgIG5hdmlnYXRpb24sXG4gICAgICAgICAgICBmaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICAgICAgb3ZlcmxheVNlcnZpY2UsXG4gICAgICAgICAgICBzdW1tYXJ5U2VydmljZSxcbiAgICAgICAgICAgIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgICAgICBsb2NhbGVJZCxcbiAgICAgICAgICAgIHBsYXRmb3JtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICAvLyBwaXZvdCBncmlkIGFsd2F5cyBnZW5lcmF0ZXMgY29sdW1ucyBhdXRvbWF0aWNhbGx5LlxuICAgICAgICB0aGlzLmF1dG9HZW5lcmF0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMudW5pcXVlQ29sdW1uVmFsdWVzU3RyYXRlZ3kgPSB0aGlzLnVuaXF1ZUNvbHVtblZhbHVlc1N0cmF0ZWd5IHx8IHRoaXMudW5pcXVlRGltZW5zaW9uVmFsdWVzU3RyYXRlZ3k7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMucGl2b3RDb25maWd1cmF0aW9uO1xuICAgICAgICB0aGlzLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IFBpdm90VXRpbC5idWlsZEV4cHJlc3Npb25UcmVlKGNvbmZpZyk7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIC8vIGlnbm9yZSBhbnkgdXNlciBkZWZpbmVkIGNvbHVtbnMgYW5kIGF1dG8tZ2VuZXJhdGUgYmFzZWQgb24gcGl2b3QgY29uZmlnLlxuICAgICAgICB0aGlzLmNvbHVtbkxpc3QucmVzZXQoW10pO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90aWZpZXMgZm9yIGRpbWVuc2lvbiBjaGFuZ2UuXG4gICAgICovXG4gICAgcHVibGljIG5vdGlmeURpbWVuc2lvbkNoYW5nZShyZWdlbmVyYXRlQ29sdW1ucyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChyZWdlbmVyYXRlQ29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5pcXVlRGltZW5zaW9uVmFsdWVzU3RyYXRlZ3koY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIGV4cHJUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLFxuICAgICAgICBkb25lOiAodW5pcXVlVmFsdWVzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICBjb25zdCBlbmFibGVkRGltZW5zaW9ucyA9IHRoaXMuYWxsRGltZW5zaW9ucy5maWx0ZXIoeCA9PiB4ICYmIHguZW5hYmxlZCk7XG4gICAgICAgIGNvbnN0IGRpbSA9IFBpdm90VXRpbC5mbGF0dGVuKGVuYWJsZWREaW1lbnNpb25zKS5maW5kKHggPT4geC5tZW1iZXJOYW1lID09PSBjb2x1bW4uZmllbGQpO1xuICAgICAgICBpZiAoZGltKSB7XG4gICAgICAgICAgICB0aGlzLmdldERpbWVuc2lvbkRhdGEoZGltLCBleHByVHJlZSwgdW5pcXVlVmFsdWVzID0+IGRvbmUodW5pcXVlVmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmdWxsIGxpc3Qgb2YgZGltZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmdyaWQuYWxsRGltZW5zaW9ucztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGFsbERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMucGl2b3RDb25maWd1cmF0aW9uO1xuICAgICAgICByZXR1cm4gKGNvbmZpZy5yb3dzIHx8IFtdKS5jb25jYXQoKGNvbmZpZy5jb2x1bW5zIHx8IFtdKSkuY29uY2F0KGNvbmZpZy5maWx0ZXJzIHx8IFtdKS5maWx0ZXIoeCA9PiB4ICE9PSBudWxsICYmIHggIT09IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGltZW5zaW9uRGF0YShkaW06IElQaXZvdERpbWVuc2lvbixcbiAgICAgICAgZGltRXhwclRyZWU6IElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUsXG4gICAgICAgIGRvbmU6IChjb2xWYWxzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICBsZXQgY29sdW1uVmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0X2RhdGEoKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICBleHByZXNzaW9uc1RyZWU6IGRpbUV4cHJUcmVlLFxuICAgICAgICAgICAgc3RyYXRlZ3k6IHRoaXMuZmlsdGVyU3RyYXRlZ3kgfHwgbmV3IERpbWVuc2lvblZhbHVlc0ZpbHRlcmluZ1N0cmF0ZWd5KCksXG4gICAgICAgICAgICBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogdGhpcy5hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IEZpbHRlclV0aWwuZmlsdGVyKGRhdGEsIHN0YXRlLCB0aGlzKTtcbiAgICAgICAgY29uc3QgYWxsVmFsdWVzSGllcmFyY2h5ID0gUGl2b3RVdGlsLmdldEZpZWxkc0hpZXJhcmNoeShcbiAgICAgICAgICAgIGZpbHRlcmVkLFxuICAgICAgICAgICAgW2RpbV0sXG4gICAgICAgICAgICBQaXZvdERpbWVuc2lvblR5cGUuQ29sdW1uLFxuICAgICAgICAgICAgdGhpcy5waXZvdEtleXNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZmxhdERhdGEgPSBBcnJheS5mcm9tKGFsbFZhbHVlc0hpZXJhcmNoeS52YWx1ZXMoKSk7XG4gICAgICAgIC8vIE5vdGU6IE9uY2UgRVNGIHN1cHBvcnRzIHRyZWUgdmlldywgd2Ugc2hvdWxkIHJldmVydCB0aGlzIGJhY2suXG4gICAgICAgIGNvbHVtblZhbHVlcyA9IGZsYXREYXRhLm1hcChyZWNvcmQgPT4gcmVjb3JkWyd2YWx1ZSddKTtcbiAgICAgICAgZG9uZShjb2x1bW5WYWx1ZXMpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlckVTRihkcm9wZG93bjogYW55LCBjb2x1bW46IENvbHVtblR5cGUsIG9wdGlvbnM6IE92ZXJsYXlTZXR0aW5ncywgc2hvdWxkUmVhdGFjaDogYm9vbGVhbikge1xuICAgICAgICBvcHRpb25zLm91dGxldCA9IHRoaXMub3V0bGV0O1xuICAgICAgICBpZiAoZHJvcGRvd24pIHtcbiAgICAgICAgICAgIGRyb3Bkb3duLmluaXRpYWxpemUoY29sdW1uLCB0aGlzLm92ZXJsYXlTZXJ2aWNlKTtcbiAgICAgICAgICAgIGlmIChzaG91bGRSZWF0YWNoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmF0dGFjaChkcm9wZG93bi5lbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5vdmVybGF5Q29tcG9uZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBpZCwgcmVmOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGlkOiBkcm9wZG93bi5vdmVybGF5Q29tcG9uZW50SWQsIHJlZjogdW5kZWZpbmVkIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBmZWF0dXJlQ29sdW1uc1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waXZvdFJvd1dpZHRocztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHZhbHVlIG9mIHRoZSBgaWRgIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgbm90IHByb3ZpZGVkIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1waXZvdC1ncmlkIFtpZF09XCInaWd4LXBpdm90LTEnXCIgW2RhdGFdPVwiRGF0YVwiPjwvaWd4LXBpdm90LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucF9pZDtcbiAgICB9XG4gICAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucF9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGxldHMgeW91IGZpbGwgdGhlIGBJZ3hQaXZvdEdyaWRDb21wb25lbnRgIHdpdGggYW4gYXJyYXkgb2YgZGF0YS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1waXZvdC1ncmlkIFtkYXRhXT1cIkRhdGFcIj48L2lneC1waXZvdC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkYXRhKHZhbHVlOiBhbnlbXSB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlIHx8IFtdO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRHZW5lcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmbG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIGlmICh0aGlzLmhlaWdodCA9PT0gbnVsbCB8fCB0aGlzLmhlaWdodC5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVpZ2h0IHdpbGwgY2hhbmdlIGJhc2VkIG9uIGhvdyBtdWNoIGRhdGEgdGhlcmUgaXMsIHJlY2FsY3VsYXRlIHNpemVzIGluIGlneEZvck9mLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRhIHNldCB0byB0aGUgY29tcG9uZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZGF0YSA9IHRoaXMuZ3JpZC5kYXRhO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGZpbHRlcmVkIGRhdGEuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5maWx0ZXJlZERhdGEgPSBbe1xuICAgICAqICAgICAgIElEOiAxLFxuICAgICAqICAgICAgIE5hbWU6IFwiQVwiXG4gICAgICogfV07XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBmaWx0ZXJlZERhdGEodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIGZpbHRlcmVkIGRhdGEuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBmaWx0ZXJlZERhdGEgPSB0aGlzLmdyaWQuZmlsdGVyZWREYXRhO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkRGF0YTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29udGV4dChyb3dEYXRhLCByb3dJbmRleCk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsXG4gICAgICAgICAgICB0ZW1wbGF0ZUlEOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhdGFSb3cnLFxuICAgICAgICAgICAgICAgIGlkOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5kZXg6IHRoaXMuZ2V0RGF0YVZpZXdJbmRleChyb3dJbmRleCwgZmFsc2UpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpdm90Um93V2lkdGhzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dEaW1lbnNpb25zLmxlbmd0aCA/IHRoaXMucm93RGltZW5zaW9ucy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBkaW0pID0+IGFjY3VtdWxhdG9yICsgdGhpcy5yb3dEaW1lbnNpb25XaWR0aFRvUGl4ZWxzKGRpbSksIDApIDpcbiAgICAgICAgICAgIHRoaXMucm93RGltZW5zaW9uV2lkdGhUb1BpeGVscyh0aGlzLmVtcHR5Um93RGltZW5zaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dEaW1lbnNpb25XaWR0aFRvUGl4ZWxzKGRpbTogSVBpdm90RGltZW5zaW9uKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCFkaW0ud2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBNSU5JTVVNX0NPTFVNTl9XSURUSDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1BlcmNlbnQgPSBkaW0ud2lkdGggJiYgZGltLndpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgICAgIGlmIChpc1BlcmNlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KGRpbS53aWR0aCkgLyAxMDAgKiB0aGlzLmNhbGNXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChkaW0ud2lkdGgsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJldmVyc2VEaW1lbnNpb25XaWR0aFRvUGVyY2VudCh3aWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuICh3aWR0aCAqIDEwMCAvIHRoaXMuY2FsY1dpZHRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd0RpbWVuc2lvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5yb3dzPy5maWx0ZXIoeCA9PiB4LmVuYWJsZWQpIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sdW1uRGltZW5zaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmNvbHVtbnM/LmZpbHRlcih4ID0+IHguZW5hYmxlZCkgfHwgW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWx0ZXJEaW1lbnNpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waXZvdENvbmZpZ3VyYXRpb24uZmlsdGVycz8uZmlsdGVyKHggPT4geC5lbmFibGVkKSB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcz8uZmlsdGVyKHggPT4geC5lbmFibGVkKSB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlQ29sdW1uKGNvbDogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jb2x1bW5Hcm91cFN0YXRlcy5nZXQoY29sLmZpZWxkKTtcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSAhc3RhdGU7XG4gICAgICAgIHRoaXMuY29sdW1uR3JvdXBTdGF0ZXMuc2V0KGNvbC5maWVsZCwgbmV3U3RhdGUpO1xuICAgICAgICB0aGlzLnRvZ2dsZVJvd0dyb3VwKGNvbCwgbmV3U3RhdGUpO1xuICAgICAgICB0aGlzLnJlZmxvdygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkQnlJbmRleChfcm93SW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVDb2x1bW5WaXNpYmlsaXR5KF9hcmdzOiBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZEFsbCgpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZUFsbCgpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBleHBhbmRSb3coX3Jvd0lEOiBhbnkpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZVJvdyhfcm93SUQ6IGFueSkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dzKCk6IElneEdyaWRSb3dDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b3RhbFJlY29yZHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKF90b3RhbDogbnVtYmVyKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZUNvbHVtbihfY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIF90YXJnZXQ6IElneENvbHVtbkNvbXBvbmVudCwgX3BvczogRHJvcFBvc2l0aW9uID0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGFkZFJvdyhfZGF0YTogYW55KTogdm9pZCB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlUm93KF9yb3dTZWxlY3RvcjogYW55KTogYW55IHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVDZWxsKF92YWx1ZTogYW55LCBfcm93U2VsZWN0b3I6IGFueSwgX2NvbHVtbjogc3RyaW5nKTogdm9pZCB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlUm93KF92YWx1ZTogYW55LCBfcm93U2VsZWN0b3I6IGFueSk6IHZvaWQge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZVN1bW1hcmllcyguLi5fcmVzdCkge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRpc2FibGVTdW1tYXJpZXMoLi4uX3Jlc3QpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5Db2x1bW4oX2NvbHVtbk5hbWU6IHN0cmluZyB8IElneENvbHVtbkNvbXBvbmVudCwgX2luZGV4Pyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5Db2x1bW4oX2NvbHVtbk5hbWU6IHN0cmluZyB8IElneENvbHVtbkNvbXBvbmVudCwgX2luZGV4Pyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGluUm93KF9yb3dJRDogYW55LCBfaW5kZXg/OiBudW1iZXIsIF9yb3c/OiBSb3dUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpblJvdyhfcm93SUQ6IGFueSwgX3Jvdz86IFJvd1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRWRpdGFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1N1bW1hcml6ZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc01vdmFibGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZERhdGFWaWV3KCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG9wZW5BZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhfb3ZlcmxheVNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhfYXBwbHlDaGFuZ2VzOiBib29sZWFuKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5kRWRpdChfY29tbWl0ID0gdHJ1ZSwgX2V2ZW50PzogRXZlbnQpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBiZWdpbkFkZFJvd0J5SWQoX3Jvd0lEOiBhbnksIF9hc0NoaWxkPzogYm9vbGVhbik6IHZvaWQge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGJlZ2luQWRkUm93QnlJbmRleChfaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU2VhcmNoKCkgeyB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwYWdpbmF0ZShfdmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIHByZXZpb3VzUGFnZSgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgcmVmcmVzaFNlYXJjaChfdXBkYXRlQWN0aXZlSW5mbz86IGJvb2xlYW4sIF9lbmRFZGl0ID0gdHJ1ZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBmaW5kTmV4dChfdGV4dDogc3RyaW5nLCBfY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIF9leGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBmaW5kUHJldihfdGV4dDogc3RyaW5nLCBfY2FzZVNlbnNpdGl2ZT86IGJvb2xlYW4sIF9leGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHB1YmxpYyBnZXROZXh0Q2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmV4dENlbGwoY3VyclJvd0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJldmlvdXNDZWxsKGN1cnJSb3dJbmRleDogbnVtYmVyLCBjdXJWaXNpYmxlQ29sSW5kZXg6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChJZ3hDb2x1bW5Db21wb25lbnQpID0+IGJvb2xlYW4gPSBudWxsKTogSUNlbGxQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXRQcmV2aW91c0NlbGwoY3VyclJvd0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0UGlubmVkV2lkdGgodGFrZUhpZGRlbiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGNIZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbkdyb3VwRXhwYW5kU3RhdGUoY29sOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNvbHVtbkdyb3VwU3RhdGVzLmdldChjb2wuZmllbGQpO1xuICAgICAgICAvLyBjb2x1bW5zIGFyZSBleHBhbmRlZCBieSBkZWZhdWx0P1xuICAgICAgICByZXR1cm4gc3RhdGUgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZSAhPT0gbnVsbCA/IHN0YXRlIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZVJvd0dyb3VwKGNvbDogSWd4Q29sdW1uQ29tcG9uZW50LCBuZXdTdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoIWNvbCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29scyA9IGNvbC5wYXJlbnQgPyBjb2wucGFyZW50LmNoaWxkcmVuLnRvQXJyYXkoKSA6IHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzLmZpbHRlcih4ID0+IHgubGV2ZWwgPT09IDApO1xuICAgICAgICAgICAgY29uc3Qgc2libGluZ0NvbCA9IHBhcmVudENvbHMuZmlsdGVyKHggPT4geC5oZWFkZXIgPT09IGNvbC5oZWFkZXIgJiYgeCAhPT0gY29sKVswXTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJJbmRleCA9IHBhcmVudENvbHMuaW5kZXhPZihjb2wpO1xuICAgICAgICAgICAgY29uc3Qgc2libGluZ0luZGV4ID0gcGFyZW50Q29scy5pbmRleE9mKHNpYmxpbmdDb2wpO1xuICAgICAgICAgICAgaWYgKGN1cnJJbmRleCA8IHNpYmxpbmdJbmRleCkge1xuICAgICAgICAgICAgICAgIC8vIGNsaWNrZWQgb24gdGhlIGZ1bGwgaGllcmFyY2h5IGhlYWRlclxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVRvZ2dsZShjb2wsIG5ld1N0YXRlKTtcbiAgICAgICAgICAgICAgICBzaWJsaW5nQ29sLmhlYWRlclRlbXBsYXRlID0gdGhpcy5oZWFkZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2xpY2tlZCBvbiBzdW1tYXJ5IHBhcmVudCBjb2x1bW4gdGhhdCBjb250YWlucyBqdXN0IHRoZSBtZWFzdXJlc1xuICAgICAgICAgICAgICAgIGNvbC5oZWFkZXJUZW1wbGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVUb2dnbGUoc2libGluZ0NvbCwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Q29scyA9IGNvbC5wYXJlbnQgPyBjb2wucGFyZW50LmNoaWxkcmVuIDogdGhpcy5fYXV0b0dlbmVyYXRlZENvbHMuZmlsdGVyKHggPT4geC5sZXZlbCA9PT0gMCk7XG4gICAgICAgICAgICBjb25zdCBmaWVsZENvbHVtbiA9IHBhcmVudENvbHMuZmlsdGVyKHggPT4geC5oZWFkZXIgPT09IGNvbC5oZWFkZXIgJiYgIXguY29sdW1uR3JvdXApWzBdO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSBwYXJlbnRDb2xzLmZpbHRlcih4ID0+IHguaGVhZGVyID09PSBjb2wuaGVhZGVyICYmIHguY29sdW1uR3JvdXApWzBdO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVG9nZ2xlKGdyb3VwQ29sdW1uLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICBmaWVsZENvbHVtbi5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkQ29sdW1uLmhlYWRlclRlbXBsYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIHNldHVwQ29sdW1ucygpIHtcbiAgICAgICAgc3VwZXIuc2V0dXBDb2x1bW5zKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXV0by1zaXplcyByb3cgZGltZW5zaW9uIGNlbGxzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPbmx5IHNpemVzIGJhc2VkIG9uIHRoZSBkaW1lbnNpb24gY2VsbHMgaW4gdmlldy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuYXV0b1NpemVSb3dEaW1lbnNpb24oZGltZW5zaW9uKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSByb3cgZGltZW5zaW9uIHRvIHNpemUuXG4gICAgICovXG4gICAgcHVibGljIGF1dG9TaXplUm93RGltZW5zaW9uKGRpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmdldERpbWVuc2lvblR5cGUoZGltZW5zaW9uKSA9PT0gUGl2b3REaW1lbnNpb25UeXBlLlJvdykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZERpbXMgPSBQaXZvdFV0aWwuZmxhdHRlbihbZGltZW5zaW9uXSkubWFwKHggPT4geC5tZW1iZXJOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnJvd0RpbWVuc2lvbkNvbnRlbnRDb2xsZWN0aW9uLmZpbHRlcih4ID0+IHJlbGF0ZWREaW1zLmluZGV4T2YoeC5kaW1lbnNpb24ubWVtYmVyTmFtZSkgIT09IC0xKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb250ZW50Lm1hcCh4ID0+IHguaGVhZGVyR3JvdXBzLnRvQXJyYXkoKSkuZmxhdCgpLm1hcCh4ID0+IHguaGVhZGVyICYmIHguaGVhZGVyLnJlZkluc3RhbmNlKTtcbiAgICAgICAgICAgIGNvbnN0IGF1dG9XaWR0aCA9IHRoaXMuZ2V0TGFyZ2VzQ29udGVudFdpZHRoKGhlYWRlcnMpO1xuICAgICAgICAgICAgZGltZW5zaW9uLndpZHRoID0gYXV0b1dpZHRoO1xuICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBkaW1lbnNpb24gaW4gdGFyZ2V0IGNvbGxlY3Rpb24gYnkgdHlwZSBhdCBzcGVjaWZpZWQgaW5kZXggb3IgYXQgdGhlIGNvbGxlY3Rpb24ncyBlbmQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuaW5zZXJ0RGltZW5zaW9uQXQoZGltZW5zaW9uLCBQaXZvdERpbWVuc2lvblR5cGUuUm93LCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdGhhdCB3aWxsIGJlIGFkZGVkLlxuICAgICAqIEBwYXJhbSB0YXJnZXRDb2xsZWN0aW9uVHlwZSBUaGUgdGFyZ2V0IGNvbGxlY3Rpb24gdHlwZSB0byBhZGQgdG8uIENhbiBiZSBSb3csIENvbHVtbiBvciBGaWx0ZXIuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBpbiB0aGUgY29sbGVjdGlvbiBhdCB3aGljaCB0byBhZGQuXG4gICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIElmIG5vdCBzZXQgaXQgd2lsbCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0RGltZW5zaW9uQXQoZGltZW5zaW9uOiBJUGl2b3REaW1lbnNpb24sIHRhcmdldENvbGxlY3Rpb25UeXBlOiBQaXZvdERpbWVuc2lvblR5cGUsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldENvbGxlY3Rpb24gPSB0aGlzLmdldERpbWVuc2lvbnNCeVR5cGUodGFyZ2V0Q29sbGVjdGlvblR5cGUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGFyZ2V0Q29sbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDAsIGRpbWVuc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRDb2xsZWN0aW9uLnB1c2goZGltZW5zaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0Q29sbGVjdGlvblR5cGUgPT09IFBpdm90RGltZW5zaW9uVHlwZS5Db2x1bW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmRpbWVuc2lvbnNDaGFuZ2UuZW1pdCh7IGRpbWVuc2lvbnM6IHRhcmdldENvbGxlY3Rpb24sIGRpbWVuc2lvbkNvbGxlY3Rpb25UeXBlOiB0YXJnZXRDb2xsZWN0aW9uVHlwZSB9KTtcbiAgICAgICAgaWYgKHRhcmdldENvbGxlY3Rpb25UeXBlID09PSBQaXZvdERpbWVuc2lvblR5cGUuRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLmRpbWVuc2lvbkRhdGFDb2x1bW5zID0gdGhpcy5nZW5lcmF0ZURpbWVuc2lvbkNvbHVtbnMoKTtcbiAgICAgICAgICAgIHRoaXMucmVmbG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIGRpbWVuc2lvbiBmcm9tIGl0cyBjdXJyZW50bHkgY29sbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBjb2xsZWN0aW9uIGJ5IHR5cGUgYXQgc3BlY2lmaWVkIGluZGV4IG9yIGF0IHRoZSBjb2xsZWN0aW9uJ3MgZW5kLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLm1vdmVEaW1lbnNpb24oZGltZW5zaW9uLCBQaXZvdERpbWVuc2lvblR5cGUuUm93LCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdGhhdCB3aWxsIGJlIG1vdmVkLlxuICAgICAqIEBwYXJhbSB0YXJnZXRDb2xsZWN0aW9uVHlwZSBUaGUgdGFyZ2V0IGNvbGxlY3Rpb24gdHlwZSB0byBtb3ZlIGl0IHRvLiBDYW4gYmUgUm93LCBDb2x1bW4gb3IgRmlsdGVyLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggaW4gdGhlIGNvbGxlY3Rpb24gYXQgd2hpY2ggdG8gYWRkLlxuICAgICAqIFRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBJZiBub3Qgc2V0IGl0IHdpbGwgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIG1vdmVEaW1lbnNpb24oZGltZW5zaW9uOiBJUGl2b3REaW1lbnNpb24sIHRhcmdldENvbGxlY3Rpb25UeXBlOiBQaXZvdERpbWVuc2lvblR5cGUsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHByZXZDb2xsZWN0aW9uVHlwZSA9IHRoaXMuZ2V0RGltZW5zaW9uVHlwZShkaW1lbnNpb24pO1xuICAgICAgICBpZiAocHJldkNvbGxlY3Rpb25UeXBlID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIC8vIHJlbW92ZSBmcm9tIG9sZCBjb2xsZWN0aW9uXG4gICAgICAgIHRoaXMuX3JlbW92ZURpbWVuc2lvbkludGVybmFsKGRpbWVuc2lvbik7XG4gICAgICAgIC8vIGFkZCB0byB0YXJnZXRcbiAgICAgICAgdGhpcy5pbnNlcnREaW1lbnNpb25BdChkaW1lbnNpb24sIHRhcmdldENvbGxlY3Rpb25UeXBlLCBpbmRleCk7XG5cbiAgICAgICAgaWYgKHByZXZDb2xsZWN0aW9uVHlwZSA9PT0gUGl2b3REaW1lbnNpb25UeXBlLkNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZGltZW5zaW9uIGZyb20gaXRzIGN1cnJlbnRseSBjb2xsZWN0aW9uLlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0b2dnbGVEaW1lbnNpb24gdGhhdCBlbmFibGVkL2Rpc2FibGVzIHRoZSBkaW1lbnNpb24uXG4gICAgICogVGhpcyBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBkaW1lbnNpb24gZnJvbSB0aGUgY29sbGVjdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucmVtb3ZlRGltZW5zaW9uKGRpbWVuc2lvbik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGRpbWVuc2lvbiBUaGUgZGltZW5zaW9uIHRvIGJlIHJlbW92ZWQuXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZURpbWVuc2lvbihkaW1lbnNpb246IElQaXZvdERpbWVuc2lvbikge1xuICAgICAgICBjb25zdCBwcmV2Q29sbGVjdGlvblR5cGUgPSB0aGlzLmdldERpbWVuc2lvblR5cGUoZGltZW5zaW9uKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlRGltZW5zaW9uSW50ZXJuYWwoZGltZW5zaW9uKTtcbiAgICAgICAgaWYgKHByZXZDb2xsZWN0aW9uVHlwZSA9PT0gUGl2b3REaW1lbnNpb25UeXBlLkNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldkNvbGxlY3Rpb25UeXBlID09PSBQaXZvdERpbWVuc2lvblR5cGUuRmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLnJlZmxvdygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIGRpbWVuc2lvbidzIGVuYWJsZWQgc3RhdGUgb24gb3Igb2ZmLlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGRpbWVuc2lvbiByZW1haW5zIGluIGl0cyBjdXJyZW50IGNvbGxlY3Rpb24uIFRoaXMganVzdCBjaGFuZ2VzIGl0cyBlbmFibGVkIHN0YXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC50b2dnbGVEaW1lbnNpb24oZGltZW5zaW9uKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gZGltZW5zaW9uIFRoZSBkaW1lbnNpb24gdG8gYmUgdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlRGltZW5zaW9uKGRpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uKSB7XG4gICAgICAgIGNvbnN0IGRpbVR5cGUgPSB0aGlzLmdldERpbWVuc2lvblR5cGUoZGltZW5zaW9uKTtcbiAgICAgICAgaWYgKGRpbVR5cGUgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IHRoaXMuZ2V0RGltZW5zaW9uc0J5VHlwZShkaW1UeXBlKTtcbiAgICAgICAgZGltZW5zaW9uLmVuYWJsZWQgPSAhZGltZW5zaW9uLmVuYWJsZWQ7XG4gICAgICAgIGlmIChkaW1UeXBlID09PSBQaXZvdERpbWVuc2lvblR5cGUuQ29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGltZW5zaW9uLmVuYWJsZWQgJiYgZGltZW5zaW9uLmZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKGRpbWVuc2lvbi5tZW1iZXJOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMuZGltZW5zaW9uc0NoYW5nZS5lbWl0KHsgZGltZW5zaW9uczogY29sbGVjdGlvbiwgZGltZW5zaW9uQ29sbGVjdGlvblR5cGU6IGRpbVR5cGUgfSk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgaWYgKGRpbVR5cGUgPT09IFBpdm90RGltZW5zaW9uVHlwZS5GaWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVmbG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIHZhbHVlIGF0IHNwZWNpZmllZCBpbmRleCBvciBhdCB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmluc2VydFZhbHVlQXQodmFsdWUsIDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgZGVmaW5pdGlvbiB0aGF0IHdpbGwgYmUgYWRkZWQuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBpbiB0aGUgY29sbGVjdGlvbiBhdCB3aGljaCB0byBhZGQuXG4gICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIElmIG5vdCBzZXQgaXQgd2lsbCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zZXJ0VmFsdWVBdCh2YWx1ZTogSVBpdm90VmFsdWUsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5waXZvdENvbmZpZ3VyYXRpb24udmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi52YWx1ZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi52YWx1ZXM7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZXMuc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQoeyB2YWx1ZXMgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSB2YWx1ZSBmcm9tIGl0cyBjdXJyZW50bHkgYXQgc3BlY2lmaWVkIGluZGV4IG9yIGF0IHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQubW92ZVZhbHVlKHZhbHVlLCAxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBtb3ZlZC5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGluIHRoZSBjb2xsZWN0aW9uIGF0IHdoaWNoIHRvIGFkZC5cbiAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSWYgbm90IHNldCBpdCB3aWxsIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlVmFsdWUodmFsdWU6IElQaXZvdFZhbHVlLCBpbmRleD86IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5waXZvdENvbmZpZ3VyYXRpb24udmFsdWVzLmluZGV4T2YodmFsdWUpID09PSAtMSkgcmV0dXJuO1xuICAgICAgICAvLyByZW1vdmUgZnJvbSBvbGQgaW5kZXhcbiAgICAgICAgdGhpcy5yZW1vdmVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIC8vIGFkZCB0byBuZXdcbiAgICAgICAgdGhpcy5pbnNlcnRWYWx1ZUF0KHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB2YWx1ZSBmcm9tIGNvbGxlY3Rpb24uXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRvZ2dsZVZhbHVlIHRoYXQgZW5hYmxlZC9kaXNhYmxlcyB0aGUgdmFsdWUuXG4gICAgICogVGhpcyBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5yZW1vdmVWYWx1ZShkaW1lbnNpb24pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlVmFsdWUodmFsdWU6IElQaXZvdFZhbHVlLCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi52YWx1ZXM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHZhbHVlcy5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHZhbHVlcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBDb2x1bW5zKCk7XG4gICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLnZhbHVlc0NoYW5nZS5lbWl0KHsgdmFsdWVzIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgdmFsdWUncyBlbmFibGVkIHN0YXRlIG9uIG9yIG9mZi5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSB2YWx1ZSByZW1haW5zIGluIGl0cyBjdXJyZW50IGNvbGxlY3Rpb24uIFRoaXMganVzdCBjaGFuZ2VzIGl0cyBlbmFibGVkIHN0YXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC50b2dnbGVWYWx1ZSh2YWx1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBiZSB0b2dnbGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVWYWx1ZSh2YWx1ZTogSVBpdm90VmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcy5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHJldHVybjtcbiAgICAgICAgdmFsdWUuZW5hYmxlZCA9ICF2YWx1ZS5lbmFibGVkO1xuICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQoeyB2YWx1ZXM6IHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnZhbHVlcyB9KTtcbiAgICAgICAgdGhpcy5yZWZsb3coKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0IHRoZSBkaW1lbnNpb24gYW5kIGl0cyBjaGlsZHJlbiBpbiB0aGUgcHJvdmlkZWQgZGlyZWN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zb3J0RGltZW5zaW9uKGRpbWVuc2lvbiwgU29ydGluZ0RpcmVjdGlvbi5Bc2MpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgdG9nZ2xlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc29ydERpbWVuc2lvbihkaW1lbnNpb246IElQaXZvdERpbWVuc2lvbiwgc29ydERpcmVjdGlvbjogU29ydGluZ0RpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaW1lbnNpb25UeXBlID0gdGhpcy5nZXREaW1lbnNpb25UeXBlKGRpbWVuc2lvbik7XG4gICAgICAgIGRpbWVuc2lvbi5zb3J0RGlyZWN0aW9uID0gc29ydERpcmVjdGlvbjtcbiAgICAgICAgLy8gYXBwbHkgc2FtZSBzb3J0IGRpcmVjdGlvbiB0byBjaGlsZHJlbi5cbiAgICAgICAgbGV0IGRpbSA9IGRpbWVuc2lvbjtcbiAgICAgICAgd2hpbGUgKGRpbS5jaGlsZExldmVsKSB7XG4gICAgICAgICAgICBkaW0uY2hpbGRMZXZlbC5zb3J0RGlyZWN0aW9uID0gZGltZW5zaW9uLnNvcnREaXJlY3Rpb247XG4gICAgICAgICAgICBkaW0gPSBkaW0uY2hpbGRMZXZlbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaW1lbnNpb25zU29ydGluZ0V4cHJlc3Npb25zID0gUGl2b3RTb3J0VXRpbC5nZW5lcmF0ZURpbWVuc2lvblNvcnRpbmdFeHByZXNzaW9ucyh0aGlzLnJvd0RpbWVuc2lvbnMpXG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5kaW1lbnNpb25zU29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlLmVtaXQoZGltZW5zaW9uc1NvcnRpbmdFeHByZXNzaW9ucyk7XG4gICAgICAgIGlmIChkaW1lbnNpb25UeXBlID09PSBQaXZvdERpbWVuc2lvblR5cGUuQ29sdW1uKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREaW1lbnNpb25zQnlUeXBlKGRpbWVuc2lvbjogUGl2b3REaW1lbnNpb25UeXBlKSB7XG4gICAgICAgIHN3aXRjaCAoZGltZW5zaW9uKSB7XG4gICAgICAgICAgICBjYXNlIFBpdm90RGltZW5zaW9uVHlwZS5Sb3c6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5yb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnJvd3MgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnJvd3M7XG4gICAgICAgICAgICBjYXNlIFBpdm90RGltZW5zaW9uVHlwZS5Db2x1bW46XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmNvbHVtbnM7XG4gICAgICAgICAgICBjYXNlIFBpdm90RGltZW5zaW9uVHlwZS5GaWx0ZXI6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5maWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmZpbHRlcnM7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzaXplUm93RGltZW5zaW9uUGl4ZWxzKGRpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uLCBuZXdXaWR0aDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGlzUGVyY2VudGFnZVdpZHRoID0gZGltZW5zaW9uLndpZHRoICYmIHR5cGVvZiBkaW1lbnNpb24ud2lkdGggPT09ICdzdHJpbmcnICYmIGRpbWVuc2lvbi53aWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgICAgICBpZiAoaXNQZXJjZW50YWdlV2lkdGgpIHtcbiAgICAgICAgICAgIGRpbWVuc2lvbi53aWR0aCA9IHRoaXMucmV2ZXJzZURpbWVuc2lvbldpZHRoVG9QZXJjZW50KG5ld1dpZHRoKS50b0ZpeGVkKDIpICsgJyUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGltZW5zaW9uLndpZHRoID0gbmV3V2lkdGggKyAncHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBncmlkIHRvIHJlZmxvdywgdG8gdXBkYXRlIGlmIGhvcml6b250YWwgc2Nyb2xsYmFyIG5lZWRzIHRvIGJlIHJlbmRlcmVkL3JlbW92ZWQuXG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qXG4gICAgKiBAaGlkZGVuXG4gICAgKiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHByb3RlY3RlZCBfcmVtb3ZlRGltZW5zaW9uSW50ZXJuYWwoZGltZW5zaW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZDb2xsZWN0aW9uVHlwZSA9IHRoaXMuZ2V0RGltZW5zaW9uVHlwZShkaW1lbnNpb24pO1xuICAgICAgICBpZiAocHJldkNvbGxlY3Rpb25UeXBlID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHByZXZDb2xsZWN0aW9uID0gdGhpcy5nZXREaW1lbnNpb25zQnlUeXBlKHByZXZDb2xsZWN0aW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHByZXZDb2xsZWN0aW9uLmluZGV4T2YoZGltZW5zaW9uKTtcbiAgICAgICAgcHJldkNvbGxlY3Rpb24uc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXREaW1lbnNpb25UeXBlKGRpbWVuc2lvbjogSVBpdm90RGltZW5zaW9uKTogUGl2b3REaW1lbnNpb25UeXBlIHtcbiAgICAgICAgcmV0dXJuIFBpdm90VXRpbC5mbGF0dGVuKHRoaXMucGl2b3RDb25maWd1cmF0aW9uLnJvd3MpLmluZGV4T2YoZGltZW5zaW9uKSAhPT0gLTEgPyBQaXZvdERpbWVuc2lvblR5cGUuUm93IDpcbiAgICAgICAgICAgIFBpdm90VXRpbC5mbGF0dGVuKHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmNvbHVtbnMpLmluZGV4T2YoZGltZW5zaW9uKSAhPT0gLTEgPyBQaXZvdERpbWVuc2lvblR5cGUuQ29sdW1uIDpcbiAgICAgICAgICAgICAgICAoISF0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5maWx0ZXJzICYmIFBpdm90VXRpbC5mbGF0dGVuKHRoaXMucGl2b3RDb25maWd1cmF0aW9uLmZpbHRlcnMpLmluZGV4T2YoZGltZW5zaW9uKSAhPT0gLTEpID9cbiAgICAgICAgICAgICAgICAgICAgUGl2b3REaW1lbnNpb25UeXBlLkZpbHRlciA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldExhcmdlc0NvbnRlbnRXaWR0aChjb250ZW50czogRWxlbWVudFJlZltdKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGFyZ2VzdCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICAgIGlmIChjb250ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsc0NvbnRlbnRXaWR0aHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnRlbnRzLmZvckVhY2goKGVsZW0pID0+IGNlbGxzQ29udGVudFdpZHRocy5wdXNoKHRoaXMuZ2V0SGVhZGVyQ2VsbFdpZHRoKGVsZW0ubmF0aXZlRWxlbWVudCkud2lkdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2VsbHNDb250ZW50V2lkdGhzLmluZGV4T2YoTWF0aC5tYXgoLi4uY2VsbHNDb250ZW50V2lkdGhzKSk7XG4gICAgICAgICAgICBjb25zdCBjZWxsU3R5bGUgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoY29udGVudHNbaW5kZXhdLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgY2VsbFBhZGRpbmcgPSBwYXJzZUZsb2F0KGNlbGxTdHlsZS5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNlbGxTdHlsZS5wYWRkaW5nUmlnaHQpICtcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KGNlbGxTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjZWxsU3R5bGUuYm9yZGVyUmlnaHRXaWR0aCk7XG4gICAgICAgICAgICBsYXJnZXN0LnNldChNYXRoLm1heCguLi5jZWxsc0NvbnRlbnRXaWR0aHMpLCBjZWxsUGFkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFyZ2VzdENlbGwgPSBNYXRoLm1heCguLi5BcnJheS5mcm9tKGxhcmdlc3Qua2V5cygpKSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKGxhcmdlc3RDZWxsICsgbGFyZ2VzdC5nZXQobGFyZ2VzdENlbGwpKTtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc011bHRpcGxlVmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoID4gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW5cbiAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXhjZWxTdHlsZUZpbHRlck1heEhlaWdodCgpIHtcbiAgICAgICAgLy8gbWF4IDEwIHJvd3MsIHJvdyBzaXplIGRlcGVuZHMgb24gZGVuc2l0eVxuICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogMTA7XG4gICAgICAgIHJldHVybiBgJHttYXhIZWlnaHR9cHhgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQGhpZGRlblxuICAgICovXG4gICAgcHVibGljIGdldCBleGNlbFN0eWxlRmlsdGVyTWluSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgICAgIC8vIG1pbiA1IHJvd3MsIHJvdyBzaXplIGRlcGVuZHMgb24gZGVuc2l0eVxuICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogNTtcbiAgICAgICAgcmV0dXJuIGAke21pbkhlaWdodH1weGA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc29sdmVUb2dnbGUoZ3JvdXBDb2x1bW46IElneENvbHVtbkNvbXBvbmVudCwgc3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCFncm91cENvbHVtbikgcmV0dXJuO1xuICAgICAgICBncm91cENvbHVtbi5oaWRkZW4gPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5jb2x1bW5Hcm91cFN0YXRlcy5zZXQoZ3JvdXBDb2x1bW4uZmllbGQsIHN0YXRlKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5Ub3RhbCA9IHRoaXMuaGFzTXVsdGlwbGVWYWx1ZXMgP1xuICAgICAgICAgICAgZ3JvdXBDb2x1bW4uY2hpbGRyZW4uZmlsdGVyKHggPT4geC5jb2x1bW5Hcm91cCAmJiB4LmNoaWxkcmVuLmZpbHRlcih5ID0+ICF5LmNvbHVtbkdyb3VwKS5sZW5ndGggPT09IHRoaXMudmFsdWVzLmxlbmd0aCkgOlxuICAgICAgICAgICAgZ3JvdXBDb2x1bW4uY2hpbGRyZW4uZmlsdGVyKHggPT4gIXguY29sdW1uR3JvdXApO1xuICAgICAgICBjb25zdCBjaGlsZHJlblN1Ymdyb3VwcyA9IHRoaXMuaGFzTXVsdGlwbGVWYWx1ZXMgP1xuICAgICAgICAgICAgZ3JvdXBDb2x1bW4uY2hpbGRyZW4uZmlsdGVyKHggPT4geC5jb2x1bW5Hcm91cCAmJiB4LmNoaWxkcmVuLmZpbHRlcih5ID0+ICF5LmNvbHVtbkdyb3VwKS5sZW5ndGggPT09IDApIDpcbiAgICAgICAgICAgIGdyb3VwQ29sdW1uLmNoaWxkcmVuLmZpbHRlcih4ID0+IHguY29sdW1uR3JvdXApO1xuICAgICAgICBjaGlsZHJlblRvdGFsLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLmNvbHVtbkdyb3VwU3RhdGVzLmdldChncm91cC5maWVsZCkgfHwgc3RhdGU7XG4gICAgICAgICAgICBpZiAobmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICBncm91cC5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdyb3VwLmhlYWRlclRlbXBsYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFncm91cENvbHVtbi5oaWRkZW4gJiYgY2hpbGRyZW5TdWJncm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2hpbGRyZW5TdWJncm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLmNvbHVtbkdyb3VwU3RhdGVzLmdldChncm91cC5maWVsZCkgfHwgc3RhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlVG9nZ2xlKGdyb3VwLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY0dyaWRIZWFkUm93KCkge1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZERhdGFWaWV3KGRhdGE6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGR2bCA9IHRoaXMuZGF0YVZpZXc/Lmxlbmd0aCB8fCAwO1xuICAgICAgICByZXR1cm4gZHZsIDwgdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlciA/IDAgOiB0aGlzLmRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBob3Jpem9udGFsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMudGhlYWRSb3cuaGVhZGVyQ29udGFpbmVycy5mb3JFYWNoKGhlYWRlckZvck9mID0+IHtcbiAgICAgICAgICAgIGhlYWRlckZvck9mLm9uSFNjcm9sbChzY3JvbGxMZWZ0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyLmhvcml6b250YWxTY3JvbGxIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmVydGljYWxTY3JvbGxIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudmVydGljYWxSb3dEaW1TY3JvbGxDb250YWluZXJzLmZvckVhY2goeCA9PiB7XG4gICAgICAgICAgICB4Lm9uU2Nyb2xsKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyLnZlcnRpY2FsU2Nyb2xsSGFuZGxlcihldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhdXRvZ2VuZXJhdGVDb2x1bW5zKCkge1xuICAgICAgICBsZXQgY29sdW1ucyA9IFtdO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkQVBJLmZpbHRlckRhdGFCeUV4cHJlc3Npb25zKHRoaXMuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKTtcbiAgICAgICAgdGhpcy5kaW1lbnNpb25EYXRhQ29sdW1ucyA9IHRoaXMuZ2VuZXJhdGVEaW1lbnNpb25Db2x1bW5zKCk7XG4gICAgICAgIGxldCBmaWVsZHNNYXA7XG4gICAgICAgIGlmICh0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5jb2x1bW5TdHJhdGVneSAmJiB0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5jb2x1bW5TdHJhdGVneSBpbnN0YW5jZW9mIE5vb3BQaXZvdERpbWVuc2lvbnNTdHJhdGVneSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5nZW5lcmF0ZURhdGFGaWVsZHMoZGF0YSk7XG4gICAgICAgICAgICBjb25zdCByb3dGaWVsZHMgPSBQaXZvdFV0aWwuZmxhdHRlbih0aGlzLnBpdm90Q29uZmlndXJhdGlvbi5yb3dzKS5tYXAoeCA9PiB4Lm1lbWJlck5hbWUpO1xuICAgICAgICAgICAgY29uc3Qga2V5RmllbGRzID0gT2JqZWN0LnZhbHVlcyh0aGlzLnBpdm90S2V5cyk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoeCA9PiByb3dGaWVsZHMuaW5kZXhPZih4KSA9PT0gLTEgJiYga2V5RmllbGRzLmluZGV4T2YoeCkgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgeC5pbmRleE9mKHRoaXMucGl2b3RLZXlzLnJvd0RpbWVuc2lvblNlcGFyYXRvciArIHRoaXMucGl2b3RLZXlzLmxldmVsKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICB4LmluZGV4T2YodGhpcy5waXZvdEtleXMucm93RGltZW5zaW9uU2VwYXJhdG9yICsgdGhpcy5waXZvdEtleXMucmVjb3JkcykgPT09IC0xKTtcbiAgICAgICAgICAgIGZpZWxkc01hcCA9IHRoaXMuZ2VuZXJhdGVGcm9tRGF0YShmaWx0ZXJlZEZpZWxkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWVsZHNNYXAgPSBQaXZvdFV0aWwuZ2V0RmllbGRzSGllcmFyY2h5KFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5EaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgIFBpdm90RGltZW5zaW9uVHlwZS5Db2x1bW4sXG4gICAgICAgICAgICAgICAgdGhpcy5waXZvdEtleXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29sdW1ucyA9IHRoaXMuZ2VuZXJhdGVDb2x1bW5IaWVyYXJjaHkoZmllbGRzTWFwLCBkYXRhKTtcbiAgICAgICAgdGhpcy5fYXV0b0dlbmVyYXRlZENvbHMgPSBjb2x1bW5zO1xuICAgICAgICAvLyByZXNldCBleHBhbnNpb24gc3RhdGVzIGlmIGFueSBhcmUgc3RvcmVkLlxuICAgICAgICB0aGlzLmNvbHVtbkdyb3VwU3RhdGVzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW4gPSBjb2x1bW5zLmZpbmQoeCA9PiB4LmZpZWxkID09PSBrZXkgJiYgeC5oZWFkZXJUZW1wbGF0ZSA9PT0gdGhpcy5oZWFkZXJUZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBTdW1tYXJ5Q29sdW1uID0gY29sdW1ucy5maW5kKHggPT4geC5maWVsZCA9PT0ga2V5ICYmIHguaGVhZGVyVGVtcGxhdGUgIT09IHRoaXMuaGVhZGVyVGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlUm93R3JvdXAocHJpbWFyeUNvbHVtbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChncm91cFN1bW1hcnlDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBTdW1tYXJ5Q29sdW1uLmhlYWRlclRlbXBsYXRlID0gdGhpcy5oZWFkZXJUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlZmxvdygpO1xuXG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5yZXNldChjb2x1bW5zKTtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNob3VsZEdlbmVyYXRlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Q29tcG9uZW50RGVuc2l0eUNsYXNzKGJhc2VTdHlsZUNsYXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zdXBlckNvbXBhY3RNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7YmFzZVN0eWxlQ2xhc3N9LS0ke0Rpc3BsYXlEZW5zaXR5LmNvbXBhY3R9IGlneC1ncmlkX19waXZvdC0tc3VwZXItY29tcGFjdGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldENvbXBvbmVudERlbnNpdHlDbGFzcyhiYXNlU3R5bGVDbGFzcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlRGltZW5zaW9uQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGNvbnN0IGxlYWZGaWVsZHMgPSBQaXZvdFV0aWwuZmxhdHRlbih0aGlzLmFsbERpbWVuc2lvbnMsIDApLmZpbHRlcih4ID0+ICF4LmNoaWxkTGV2ZWwpLm1hcCh4ID0+IHgubWVtYmVyTmFtZSk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgbGVhZkZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmID0gZmFjdG9yeS5jcmVhdGUodGhpcy52aWV3UmVmLmluamVjdG9yKTtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5maWVsZCA9IGZpZWxkO1xuICAgICAgICAgICAgcmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbHVtbnMucHVzaChyZWYuaW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlRnJvbURhdGEoZmllbGRzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB0aGlzLnBpdm90S2V5cy5jb2x1bW5EaW1lbnNpb25TZXBhcmF0b3I7XG4gICAgICAgIGNvbnN0IGRhdGFBcnIgPSBmaWVsZHMubWFwKHggPT4geC5zcGxpdChzZXBhcmF0b3IpKS5zb3J0KHggPT4geC5sZW5ndGgpO1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICBkYXRhQXJyLmZvckVhY2goYXJyID0+IHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50SGllcmFyY2h5ID0gaGllcmFyY2h5O1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgYXJyKSB7XG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UGF0aCA9IHBhdGguam9pbihzZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRIaWVyYXJjaHkgPSBjdXJyZW50SGllcmFyY2h5LmdldChuZXdQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50SGllcmFyY2h5LnNldChuZXdQYXRoLCB7IHZhbHVlOiBuZXdQYXRoLCBleHBhbmRhYmxlOiB0cnVlLCBjaGlsZHJlbjogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSwgZGltZW5zaW9uOiB0aGlzLmNvbHVtbkRpbWVuc2lvbnNbMF0gfSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEhpZXJhcmNoeSA9IGN1cnJlbnRIaWVyYXJjaHkuZ2V0KG5ld1BhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50SGllcmFyY2h5ID0gdGFyZ2V0SGllcmFyY2h5LmNoaWxkcmVuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGhpZXJhcmNoeTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVDb2x1bW5IaWVyYXJjaHkoZmllbGRzOiBNYXA8c3RyaW5nLCBhbnk+LCBkYXRhLCBwYXJlbnQgPSBudWxsKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICBjb25zdCBmYWN0b3J5Q29sdW1uID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShJZ3hDb2x1bW5Db21wb25lbnQpO1xuICAgICAgICBsZXQgY29sdW1ucyA9IFtdO1xuICAgICAgICBpZiAoZmllbGRzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmID0gZmFjdG9yeUNvbHVtbi5jcmVhdGUodGhpcy52aWV3UmVmLmluamVjdG9yKTtcbiAgICAgICAgICAgICAgICByZWYuaW5zdGFuY2UuaGVhZGVyID0gdmFsdWUuZGlzcGxheU5hbWU7XG4gICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLmZpZWxkID0gdmFsdWUubWVtYmVyO1xuICAgICAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLndpZHRoID0gTUlOSU1VTV9DT0xVTU5fV0lEVEggKyAncHgnO1xuICAgICAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5zb3J0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLmRhdGFUeXBlID0gdmFsdWUuZGF0YVR5cGUgfHwgdGhpcy5yZXNvbHZlRGF0YVR5cGVzKGRhdGFbMF1bdmFsdWUubWVtYmVyXSk7XG4gICAgICAgICAgICAgICAgcmVmLmluc3RhbmNlLmZvcm1hdHRlciA9IHZhbHVlLmZvcm1hdHRlcjtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2gocmVmLmluc3RhbmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3QgPSBmaWVsZHMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3QgZGltOiBJUGl2b3REaW1lbnNpb24gPSBmaWVsZHMuZ2V0KGZpcnN0KS5kaW1lbnNpb247XG4gICAgICAgIGxldCBjdXJyZW50RmllbGRzID0gZmllbGRzO1xuICAgICAgICBpZiAoZGltICYmIGRpbS5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gQXJyYXkuZnJvbShmaWVsZHMuZW50cmllcygpKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gW3tcbiAgICAgICAgICAgICAgICBkaXI6IGRpbS5zb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIGZpZWxkTmFtZTogZGltLm1lbWJlck5hbWUsXG4gICAgICAgICAgICAgICAgc3RyYXRlZ3k6IERlZmF1bHRQaXZvdFNvcnRpbmdTdHJhdGVneS5pbnN0YW5jZSgpXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IERhdGFVdGlsLnNvcnQoY2xvbmVBcnJheShlbnRyaWVzLCB0cnVlKSwgZXhwcmVzc2lvbnMsIHRoaXMuc29ydFN0cmF0ZWd5LCB0aGlzLmdyaWRBUEkuZ3JpZCk7XG4gICAgICAgICAgICBjdXJyZW50RmllbGRzID0gbmV3IE1hcChzb3J0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGaWVsZHMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxldCBzaG91bGRHZW5lcmF0ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodmFsdWUuZGltZW5zaW9uICYmIHZhbHVlLmRpbWVuc2lvbi5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnNUcmVlOiB2YWx1ZS5kaW1lbnNpb24uZmlsdGVyLmZpbHRlcmluZ09wZXJhbmRzWzBdLFxuICAgICAgICAgICAgICAgICAgICBzdHJhdGVneTogdGhpcy5maWx0ZXJTdHJhdGVneSB8fCBuZXcgRGltZW5zaW9uVmFsdWVzRmlsdGVyaW5nU3RyYXRlZ3koKSxcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6IHRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gRmlsdGVyVXRpbC5maWx0ZXIoY2xvbmVBcnJheSh2YWx1ZS5yZWNvcmRzKSwgc3RhdGUsIHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkR2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvdWxkR2VuZXJhdGUgJiYgKHZhbHVlLmNoaWxkcmVuID09IG51bGwgfHwgdmFsdWUuY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IHZhbHVlLmNoaWxkcmVuLnNpemUgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5jcmVhdGVDb2x1bW5Gb3JEaW1lbnNpb24odmFsdWUsIGRhdGEsIHBhcmVudCwgdGhpcy5oYXNNdWx0aXBsZVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGNvbCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVhc3VyZUNoaWxkcmVuID0gdGhpcy5nZXRNZWFzdXJlQ2hpbGRyZW4oZmFjdG9yeUNvbHVtbiwgZGF0YSwgY29sLCBmYWxzZSwgdmFsdWUuZGltZW5zaW9uLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlc2V0KG1lYXN1cmVDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmNvbmNhdChtZWFzdXJlQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaG91bGRHZW5lcmF0ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuY3JlYXRlQ29sdW1uRm9yRGltZW5zaW9uKHZhbHVlLCBkYXRhLCBwYXJlbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5leHBhbmRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbC5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZW5lcmF0ZUNvbHVtbkhpZXJhcmNoeSh2YWx1ZS5jaGlsZHJlbiwgZGF0YSwgY29sKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZENoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKHggPT4geC5sZXZlbCA9PT0gY29sLmxldmVsICsgMSk7XG4gICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKGNvbCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVDaGlsZHJlbiA9IHRoaXMuZ2V0TWVhc3VyZUNoaWxkcmVuKGZhY3RvcnlDb2x1bW4sIGRhdGEsIGNvbCwgdHJ1ZSwgdmFsdWUuZGltZW5zaW9uLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ2hpbGRyZW4gPSBmaWx0ZXJlZENoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IGFsbENoaWxkcmVuID0gY2hpbGRyZW4uY29uY2F0KG1lYXN1cmVDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbC5jaGlsZHJlbi5yZXNldChuZXN0ZWRDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmNvbmNhdChjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5kaW1lbnNpb24uY2hpbGRMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IHRoaXMuY3JlYXRlQ29sdW1uRm9yRGltZW5zaW9uKHZhbHVlLCBkYXRhLCBwYXJlbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoKHNpYmxpbmcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlQ2hpbGRyZW4gPSB0aGlzLmdldE1lYXN1cmVDaGlsZHJlbihmYWN0b3J5Q29sdW1uLCBkYXRhLCBzaWJsaW5nLCBmYWxzZSwgdmFsdWUuZGltZW5zaW9uPy53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nLmNoaWxkcmVuLnJlc2V0KG1lYXN1cmVDaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gY29sdW1ucy5jb25jYXQobWVhc3VyZUNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlc2V0KGZpbHRlcmVkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gY29sdW1ucy5jb25jYXQoY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuZGltZW5zaW9uLmNoaWxkTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmcgPSB0aGlzLmNyZWF0ZUNvbHVtbkZvckRpbWVuc2lvbih2YWx1ZSwgZGF0YSwgcGFyZW50LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5Gb3JEaW1lbnNpb24odmFsdWU6IGFueSwgZGF0YTogYW55LCBwYXJlbnQ6IENvbHVtblR5cGUsIGlzR3JvdXA6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZmFjdG9yeUNvbHVtbiA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoSWd4Q29sdW1uQ29tcG9uZW50KTtcbiAgICAgICAgY29uc3QgZmFjdG9yeUNvbHVtbkdyb3VwID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGtleSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICBjb25zdCByZWYgPSBpc0dyb3VwID9cbiAgICAgICAgICAgIGZhY3RvcnlDb2x1bW5Hcm91cC5jcmVhdGUodGhpcy52aWV3UmVmLmluamVjdG9yKSA6XG4gICAgICAgICAgICBmYWN0b3J5Q29sdW1uLmNyZWF0ZSh0aGlzLnZpZXdSZWYuaW5qZWN0b3IpO1xuICAgICAgICByZWYuaW5zdGFuY2UuaGVhZGVyID0gcGFyZW50ICE9IG51bGwgPyBrZXkuc3BsaXQocGFyZW50LmhlYWRlciArIHRoaXMucGl2b3RLZXlzLmNvbHVtbkRpbWVuc2lvblNlcGFyYXRvcilbMV0gOiBrZXk7XG4gICAgICAgIHJlZi5pbnN0YW5jZS5maWVsZCA9IGtleTtcbiAgICAgICAgcmVmLmluc3RhbmNlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgcmVmLmluc3RhbmNlLndpZHRoID0gdGhpcy5yZXNvbHZlQ29sdW1uRGltZW5zaW9uV2lkdGgodmFsdWUuZGltZW5zaW9uKTtcbiAgICAgICAgY29uc3QgdmFsdWVEZWZpbml0aW9uID0gdGhpcy52YWx1ZXNbMF07XG4gICAgICAgIHJlZi5pbnN0YW5jZS5kYXRhVHlwZSA9IHZhbHVlRGVmaW5pdGlvbj8uZGF0YVR5cGUgfHwgdGhpcy5yZXNvbHZlRGF0YVR5cGVzKGRhdGFbMF1bdmFsdWVEZWZpbml0aW9uPy5tZW1iZXJdKTtcbiAgICAgICAgcmVmLmluc3RhbmNlLmZvcm1hdHRlciA9IHZhbHVlRGVmaW5pdGlvbj8uZm9ybWF0dGVyO1xuICAgICAgICByZWYuaW5zdGFuY2Uuc29ydGFibGUgPSB0cnVlO1xuICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICByZXR1cm4gcmVmLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlQ29sdW1uRGltZW5zaW9uV2lkdGgoZGltOiBJUGl2b3REaW1lbnNpb24pIHtcbiAgICAgICAgaWYgKGRpbS53aWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpbS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdXBlckNvbXBhY3RNb2RlID8gTUlOSU1VTV9DT0xVTU5fV0lEVEhfU1VQRVJfQ09NUEFDVCArICdweCcgOiBNSU5JTVVNX0NPTFVNTl9XSURUSCArICdweCc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldE1lYXN1cmVDaGlsZHJlbihjb2xGYWN0b3J5LCBkYXRhLCBwYXJlbnQsIGhpZGRlbiwgcGFyZW50V2lkdGgpIHtcbiAgICAgICAgY29uc3QgY29scyA9IFtdO1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMudmFsdWVzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBwYXJlbnRXaWR0aCA/IHBhcnNlSW50KHBhcmVudFdpZHRoLCAxMCkgLyBjb3VudCA6XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29tcGFjdE1vZGUgPyBNSU5JTVVNX0NPTFVNTl9XSURUSF9TVVBFUl9DT01QQUNUIDogTUlOSU1VTV9DT0xVTU5fV0lEVEg7XG4gICAgICAgIGNvbnN0IGlzUGVyY2VudCA9IHBhcmVudFdpZHRoICYmIHBhcmVudFdpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgICAgIHRoaXMudmFsdWVzLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZiA9IGNvbEZhY3RvcnkuY3JlYXRlKHRoaXMudmlld1JlZi5pbmplY3Rvcik7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuaGVhZGVyID0gdmFsLmRpc3BsYXlOYW1lIHx8IHZhbC5tZW1iZXI7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZmllbGQgPSBwYXJlbnQuZmllbGQgKyB0aGlzLnBpdm90S2V5cy5jb2x1bW5EaW1lbnNpb25TZXBhcmF0b3IgKyB2YWwubWVtYmVyO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS53aWR0aCA9IGlzUGVyY2VudCA/IHdpZHRoICsgJyUnIDogd2lkdGggKyAncHgnO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLmhpZGRlbiA9IGhpZGRlbjtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5zb3J0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZGF0YVR5cGUgPSB2YWwuZGF0YVR5cGUgfHwgdGhpcy5yZXNvbHZlRGF0YVR5cGVzKGRhdGFbMF1bdmFsLm1lbWJlcl0pO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLmZvcm1hdHRlciA9IHZhbC5mb3JtYXR0ZXI7XG4gICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29scy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29scztcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJvcE5hbWUoZGltOiBJUGl2b3REaW1lbnNpb24pIHtcbiAgICAgICAgcmV0dXJuICEhZGltID8/IGRpbS5tZW1iZXJOYW1lICsgdGhpcy5waXZvdEtleXMucm93RGltZW5zaW9uU2VwYXJhdG9yICsgJ2hlaWdodCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlQaXZvdEdyaWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBkZWZhdWx0RW1wdHlQaXZvdEdyaWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB3aGVuIHBpdm90IGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXBpdm90LWdyaWQgW2VtcHR5UGl2b3RHcmlkVGVtcGxhdGVdPVwibXlUZW1wbGF0ZVwiPjxpZ3gtcGl2b3QtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBlbXB0eVBpdm90R3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgY29uc3QgYWxsRW5hYmxlZERpbWVuc2lvbnMgPSB0aGlzLnJvd0RpbWVuc2lvbnMuY29uY2F0KHRoaXMuY29sdW1uRGltZW5zaW9ucyk7XG4gICAgICAgIGlmIChhbGxFbmFibGVkRGltZW5zaW9ucy5sZW5ndGggPT09IDAgJiYgdGhpcy52YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBubyBlbmFibGVkIHZhbHVlcyBhbmQgZGltZW5zaW9uc1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlQaXZvdEdyaWRUZW1wbGF0ZSB8fCB0aGlzLmRlZmF1bHRFbXB0eVBpdm90R3JpZFRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLnRlbXBsYXRlO1xuICAgIH1cbn1cbiIsIjwhLS0gVG9vbGJhciBhcmVhIC0tPlxuPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LWdyaWQtdG9vbGJhclwiPjwvbmctY29udGVudD5cblxuPCEtLSBHcmlkIHRhYmxlIGhlYWQgcm93IGFyZWEgLS0+XG48aWd4LXBpdm90LWhlYWRlci1yb3cgY2xhc3M9XCJpZ3gtZ3JpZC10aGVhZCBpZ3gtZ3JpZC10aGVhZC0tcGl2b3RcIiB0YWJpbmRleD1cIjBcIlxuICAgIFtncmlkXT1cInRoaXNcIlxuICAgIFtoYXNNUkxdPVwiaGFzQ29sdW1uTGF5b3V0c1wiXG4gICAgW2RlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgIFthY3RpdmVEZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIlxuICAgIFt3aWR0aF09XCJjYWxjV2lkdGhcIlxuICAgIFtwaW5uZWRDb2x1bW5Db2xsZWN0aW9uXT1cInBpbm5lZENvbHVtbnNcIlxuICAgIFt1bnBpbm5lZENvbHVtbkNvbGxlY3Rpb25dPVwidW5waW5uZWRDb2x1bW5zXCJcbiAgICAoa2V5ZG93bi5tZXRhLmMpPVwiY29weUhhbmRsZXIoJGV2ZW50KVwiXG4gICAgKGtleWRvd24uY29udHJvbC5jKT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChjb3B5KT1cImNvcHlIYW5kbGVyKCRldmVudClcIlxuICAgIChrZXlkb3duKT1cIm5hdmlnYXRpb24uaGVhZGVyTmF2aWdhdGlvbigkZXZlbnQpXCJcbiAgICAoc2Nyb2xsKT1cInByZXZlbnRIZWFkZXJTY3JvbGwoJGV2ZW50KVwiXG4+XG48L2lneC1waXZvdC1oZWFkZXItcm93PlxuXG48ZGl2IGlneEdyaWRCb2R5IChrZXlkb3duLmNvbnRyb2wuYyk9XCJjb3B5SGFuZGxlcigkZXZlbnQpXCIgKGNvcHkpPVwiY29weUhhbmRsZXIoJGV2ZW50KVwiIGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5XCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0RpbWVuc2lvbnMubGVuZ3RoID8gZGVmYXVsdFJvd0RpbWVuc2lvbnNUZW1wbGF0ZSA6IGVtcHR5Um93RGltZW5zaW9uc1RlbXBsYXRlOyBjb250ZXh0OiB0aGlzXCI+PC9uZy1jb250YWluZXI+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1jb250ZW50XCIgdGFiaW5kZXg9XCIwXCIgW2F0dHIucm9sZV09XCJkYXRhVmlldy5sZW5ndGggPyBudWxsIDogJ3JvdydcIiAoa2V5ZG93bik9XCJuYXZpZ2F0aW9uLmhhbmRsZU5hdmlnYXRpb24oJGV2ZW50KVwiIChmb2N1cyk9XCJuYXZpZ2F0aW9uLmZvY3VzVGJvZHkoJGV2ZW50KVwiXG4gICAgICAgIChkcmFnU3RvcCk9XCJzZWxlY3Rpb25TZXJ2aWNlLmRyYWdNb2RlID0gJGV2ZW50XCIgKHNjcm9sbCk9J3ByZXZlbnRDb250YWluZXJTY3JvbGwoJGV2ZW50KSdcbiAgICAgICAgKGRyYWdTY3JvbGwpPVwiZHJhZ1Njcm9sbCgkZXZlbnQpXCIgW2lneEdyaWREcmFnU2VsZWN0XT1cInNlbGVjdGlvblNlcnZpY2UuZHJhZ01vZGVcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT0ndG90YWxIZWlnaHQnIFtzdHlsZS53aWR0aC5weF09J2NhbGNXaWR0aCB8fCBudWxsJyAjdGJvZHkgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImFjdGl2ZURlc2NlbmRhbnRcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJoYXNNb3ZhYmxlQ29sdW1ucyAmJiBjb2x1bW5JbkRyYWcgJiYgcGlubmVkQ29sdW1ucy5sZW5ndGggPD0gMFwiXG4gICAgICAgICAgICBbaWd4Q29sdW1uTW92aW5nRHJvcF09XCJoZWFkZXJDb250YWluZXJcIiBbYXR0ci5kcm9wcGFibGVdPVwidHJ1ZVwiIGlkPVwibGVmdFwiXG4gICAgICAgICAgICBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtb24tZHJhZy1sZWZ0XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImhhc01vdmFibGVDb2x1bW5zICYmIGNvbHVtbkluRHJhZyAmJiBwaW5uZWRDb2x1bW5zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgW2lneENvbHVtbk1vdmluZ0Ryb3BdPVwiaGVhZGVyQ29udGFpbmVyXCIgW2F0dHIuZHJvcHBhYmxlXT1cInRydWVcIiBpZD1cImxlZnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW9uLWRyYWctcGlubmVkXCIgW3N0eWxlLmxlZnQucHhdPVwicGlubmVkV2lkdGhcIj48L3NwYW4+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yIGxldC1yb3dEYXRhIFtpZ3hHcmlkRm9yT2ZdPVwiZGF0YVxuICAgICAgICB8IHBpdm90R3JpZEZpbHRlcjpwaXZvdENvbmZpZ3VyYXRpb246ZmlsdGVyU3RyYXRlZ3k6YWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU6ZmlsdGVyaW5nUGlwZVRyaWdnZXI6cGlwZVRyaWdnZXJcbiAgICAgICAgfCBwaXZvdEdyaWRTb3J0OnBpdm90Q29uZmlndXJhdGlvbjpzb3J0U3RyYXRlZ3k6cGlwZVRyaWdnZXJcbiAgICAgICAgfCBwaXZvdEdyaWRSb3c6cGl2b3RDb25maWd1cmF0aW9uOmV4cGFuc2lvblN0YXRlczpwaXBlVHJpZ2dlcjpzb3J0aW5nRXhwcmVzc2lvbnNcbiAgICAgICAgfCBwaXZvdEdyaWRDb2x1bW46cGl2b3RDb25maWd1cmF0aW9uOmV4cGFuc2lvblN0YXRlczpwaXBlVHJpZ2dlcjpzb3J0aW5nRXhwcmVzc2lvbnNcbiAgICAgICAgfCBwaXZvdEdyaWRBdXRvVHJhbnNmb3JtOnBpdm90Q29uZmlndXJhdGlvbjpwaXBlVHJpZ2dlclxuICAgICAgICB8IHBpdm90R3JpZENvbHVtblNvcnQ6c29ydGluZ0V4cHJlc3Npb25zOnNvcnRTdHJhdGVneTpwaXBlVHJpZ2dlclxuICAgICAgICB8IHBpdm90R3JpZFJvd0V4cGFuc2lvbjpwaXZvdENvbmZpZ3VyYXRpb246ZXhwYW5zaW9uU3RhdGVzOmRlZmF1bHRFeHBhbmRTdGF0ZTpwaXBlVHJpZ2dlclwiXG4gICAgICAgICAgICBsZXQtcm93SW5kZXg9XCJpbmRleFwiIFtpZ3hGb3JTY3JvbGxPcmllbnRhdGlvbl09XCIndmVydGljYWwnXCIgW2lneEZvclNjcm9sbENvbnRhaW5lcl09J3ZlcnRpY2FsU2Nyb2xsJ1xuICAgICAgICAgICAgW2lneEZvckNvbnRhaW5lclNpemVdPSdjYWxjSGVpZ2h0J1xuICAgICAgICAgICAgW2lneEZvckl0ZW1TaXplXT1cImhhc0NvbHVtbkxheW91dHMgPyByb3dIZWlnaHQgKiBtdWx0aVJvd0xheW91dFJvd1NpemUgKyAxIDogcmVuZGVyZWRSb3dIZWlnaHRcIlxuICAgICAgICAgICAgI3ZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgW2lneFRlbXBsYXRlT3V0bGV0XT0ncmVjb3JkVGVtcGxhdGUnXG4gICAgICAgICAgICAgICAgW2lneFRlbXBsYXRlT3V0bGV0Q29udGV4dF09J2dldENvbnRleHQocm93RGF0YSwgcm93SW5kZXgpJ1xuICAgICAgICAgICAgICAgIChjYWNoZWRWaWV3TG9hZGVkKT0nY2FjaGVkVmlld0xvYWRlZCgkZXZlbnQpJz5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcmVjb3JkX3RlbXBsYXRlIGxldC1yb3dJbmRleD1cImluZGV4XCIgbGV0LXJvd0RhdGE+XG4gICAgICAgICAgICA8aWd4LXBpdm90LXJvdyBbc3R5bGUuaGVpZ2h0LnB4XT1cInJlbmRlcmVkUm93SGVpZ2h0XCIgW2dyaWRJRF09XCJpZFwiIFtpbmRleF09XCJyb3dJbmRleFwiIFtkYXRhXT1cInJvd0RhdGFcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0NsYXNzZXMgfCBpZ3hHcmlkUm93Q2xhc3Nlczpyb3c6cm93LmluRWRpdE1vZGU6cm93LnNlbGVjdGVkOnJvdy5kaXJ0eTpyb3cuZGVsZXRlZDpyb3cuZHJhZ2dpbmc6cm93SW5kZXg6aGFzQ29sdW1uTGF5b3V0czpmYWxzZTpwaXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwicm93U3R5bGVzIHwgaWd4R3JpZFJvd1N0eWxlczpyb3dEYXRhOnJvd0luZGV4OnBpcGVUcmlnZ2VyXCIgI3Jvdz5cbiAgICAgICAgICAgIDwvaWd4LXBpdm90LXJvdz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGlnYy10cmlhbC13YXRlcm1hcms+PC9pZ2MtdHJpYWwtd2F0ZXJtYXJrPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWd4VG9nZ2xlICNsb2FkaW5nT3ZlcmxheT5cbiAgICAgICAgPGlneC1jaXJjdWxhci1iYXIgW2luZGV0ZXJtaW5hdGVdPVwidHJ1ZVwiICpuZ0lmPSdzaG91bGRPdmVybGF5TG9hZGluZyc+XG4gICAgICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiAqbmdJZj1cImhhc01vdmFibGVDb2x1bW5zICYmIGNvbHVtbkluRHJhZ1wiIFtpZ3hDb2x1bW5Nb3ZpbmdEcm9wXT1cImhlYWRlckNvbnRhaW5lclwiIFthdHRyLmRyb3BwYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgaWQ9XCJyaWdodFwiIGNsYXNzPVwiaWd4LWdyaWRfX3Njcm9sbC1vbi1kcmFnLXJpZ2h0XCI+PC9zcGFuPlxuICAgIDxkaXYgW2hpZGRlbl09JyFoYXNWZXJ0aWNhbFNjcm9sbCgpJyBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXJcIiBbc3R5bGUud2lkdGgucHhdPVwic2Nyb2xsU2l6ZVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LXNjcm9sbGJhci1zdGFydFwiIFtzdHlsZS5oZWlnaHQucHhdPScgaXNSb3dQaW5uaW5nVG9Ub3AgPyBwaW5uZWRSb3dIZWlnaHQgOiAwJz48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1zY3JvbGxiYXItbWFpblwiIFtzdHlsZS5oZWlnaHQucHhdPSdjYWxjSGVpZ2h0Jz5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hHcmlkRm9yIFtpZ3hHcmlkRm9yT2ZdPSdbXScgI3ZlcnRpY2FsU2Nyb2xsSG9sZGVyPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LXNjcm9sbGJhci1lbmRcIiBbc3R5bGUuaGVpZ2h0LnB4XT0nIWlzUm93UGlubmluZ1RvVG9wID8gcGlubmVkUm93SGVpZ2h0IDogMCc+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX2FkZHJvdy1zbmFja2JhclwiPlxuICAgICAgICA8aWd4LXNuYWNrYmFyICNhZGRSb3dTbmFja2JhciBbb3V0bGV0XT1cImlneEJvZHlPdmVybGF5T3V0bGV0XCIgW2FjdGlvblRleHRdPVwicmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3NuYWNrYmFyX2FkZHJvd19hY3Rpb250ZXh0XCIgW2Rpc3BsYXlUaW1lXT0nc25hY2tiYXJEaXNwbGF5VGltZSc+e3tyZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2xhYmVsfX08L2lneC1zbmFja2Jhcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgI2lneEJvZHlPdmVybGF5T3V0bGV0PVwib3ZlcmxheS1vdXRsZXRcIiBpZ3hPdmVybGF5T3V0bGV0PjwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsXCIgW3N0eWxlLmhlaWdodC5weF09XCJzY3JvbGxTaXplXCIgI3NjciBbaGlkZGVuXT1cImlzSG9yaXpvbnRhbFNjcm9sbEhpZGRlblwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLXN0YXJ0XCIgW3N0eWxlLndpZHRoLnB4XT0naXNQaW5uaW5nVG9TdGFydCA/IHBpbm5lZFdpZHRoIDogaGVhZGVyRmVhdHVyZXNXaWR0aCcgW3N0eWxlLm1pbi13aWR0aC5weF09J2lzUGlubmluZ1RvU3RhcnQgPyBwaW5uZWRXaWR0aCA6IGhlYWRlckZlYXR1cmVzV2lkdGgnPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fc2Nyb2xsLW1haW5cIiBbc3R5bGUud2lkdGgucHhdPSd1bnBpbm5lZFdpZHRoJz5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGlneEdyaWRGb3IgW2lneEdyaWRGb3JPZl09J0VNUFRZX0RBVEEnICNzY3JvbGxDb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlneC1ncmlkX19zY3JvbGwtZW5kXCIgW3N0eWxlLmZsb2F0XT0nXCJyaWdodFwiJyBbc3R5bGUud2lkdGgucHhdPSdwaW5uZWRXaWR0aCcgW3N0eWxlLm1pbi13aWR0aC5weF09J3Bpbm5lZFdpZHRoJyBbaGlkZGVuXT1cInBpbm5lZFdpZHRoID09PSAwIHx8IGlzUGlubmluZ1RvU3RhcnRcIj48L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiaWd4LWdyaWRfX3Rmb290XCIgcm9sZT1cInJvd2dyb3VwXCIgI3Rmb290PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fZm9vdGVyXCIgI2Zvb3Rlcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtZ3JpZC1mb290ZXJcIj48L25nLWNvbnRlbnQ+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eUZpbHRlcmVkR3JpZD5cbiAgICA8c3BhbiBjbGFzcz1cImlneC1ncmlkX190Ym9keS1tZXNzYWdlXCIgcm9sZT1cImNlbGxcIj5cbiAgICAgICAgPHNwYW4+e3tlbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2V9fTwvc3Bhbj5cbiAgICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFbXB0eUdyaWQ+XG4gICAgPHNwYW4gY2xhc3M9XCJpZ3gtZ3JpZF9fdGJvZHktbWVzc2FnZVwiIHJvbGU9XCJjZWxsXCI+XG4gICAgICAgIDxzcGFuPnt7ZW1wdHlHcmlkTWVzc2FnZX19PC9zcGFuPlxuICAgIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmdHcmlkPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fbG9hZGluZ1wiPlxuICAgICAgICA8aWd4LWNpcmN1bGFyLWJhciBbaW5kZXRlcm1pbmF0ZV09XCJ0cnVlXCI+XG4gICAgICAgIDwvaWd4LWNpcmN1bGFyLWJhcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48aWd4LXBpdm90LWdyaWQtY29sdW1uLXJlc2l6ZXIgW3Jlc3RyaWN0UmVzaXplclRvcF09XCJ0aGVhZFJvdy5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodFwiICpuZ0lmPVwiY29sUmVzaXppbmdTZXJ2aWNlLnNob3dSZXNpemVyXCI+PC9pZ3gtcGl2b3QtZ3JpZC1jb2x1bW4tcmVzaXplcj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fbG9hZGluZy1vdXRsZXRcIiAjaWd4TG9hZGluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cbjxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fb3V0bGV0XCIgI2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQgaWd4T3ZlcmxheU91dGxldD48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNoZWFkZXJUZW1wbGF0ZSBsZXQtY29sdW1uPlxuICAgIDxkaXYgY2xhc3M9XCJpZ3gtZ3JpZF9fdHItLWhlYWRlclwiPlxuICAgICAgICA8aWd4LWljb24gW2F0dHIuZHJhZ2dhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDb2x1bW4oY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAge3tnZXRDb2x1bW5Hcm91cEV4cGFuZFN0YXRlKGNvbHVtbikgPyAnY2hldnJvbl9yaWdodCcgOiAnZXhwYW5kX21vcmUnfX08L2lneC1pY29uPlxuICAgICAgICB7e2NvbHVtbi5oZWFkZXJ9fVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Um93RGltZW5zaW9uc1RlbXBsYXRlPlxuICAgIDxkaXYgdGFiaW5kZXg9XCIwXCIgW3N0eWxlLmhlaWdodC5weF09J3RvdGFsSGVpZ2h0JyAqbmdGb3I9J2xldCBkaW0gb2Ygcm93RGltZW5zaW9uczsgbGV0IGRpbUluZGV4ID0gaW5kZXg7JyAjcm93RGltZW5zaW9uQ29udGFpbmVyIHJvbGU9XCJyb3dncm91cFwiIGNsYXNzPSdpZ3gtZ3JpZF9fdGJvZHktcGl2b3QtZGltZW5zaW9uJyAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c1Rib2R5KCRldmVudClcIiAoa2V5ZG93bik9XCJuYXZpZ2F0aW9uLmhhbmRsZU5hdmlnYXRpb24oJGV2ZW50KVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgaWd4R3JpZEZvciBsZXQtcm93RGF0YSBbaWd4R3JpZEZvck9mXT1cImRhdGFWaWV3XG4gICAgICAgIHwgcGl2b3RHcmlkQ2VsbE1lcmdpbmc6cGl2b3RDb25maWd1cmF0aW9uOmRpbTpwaXBlVHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgICBsZXQtcm93SW5kZXg9XCJpbmRleFwiIFtpZ3hGb3JTY3JvbGxPcmllbnRhdGlvbl09XCIndmVydGljYWwnXCIgW2lneEZvclNjcm9sbENvbnRhaW5lcl09J3ZlcnRpY2FsU2Nyb2xsJ1xuICAgICAgICAgICAgICAgICAgICAgW2lneEZvckNvbnRhaW5lclNpemVdPSdjYWxjSGVpZ2h0J1xuICAgICAgICAgICAgICAgICAgICAgW2lneEZvckl0ZW1TaXplXT1cInJlbmRlcmVkUm93SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgIFtpZ3hGb3JTaXplUHJvcE5hbWVdPSdcImhlaWdodFwiJ1xuICAgICAgICAgICAgICAgICAgICAgI3ZlcnRpY2FsUm93RGltU2Nyb2xsQ29udGFpbmVyPlxuICAgICAgICAgICAgPGlneC1waXZvdC1yb3ctZGltZW5zaW9uLWNvbnRlbnQgcm9sZT0ncm93JyBjbGFzcz1cImlneC1ncmlkLXRoZWFkXCIgW2dyaWRdPVwidGhpc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGltZW5zaW9uXT0ncm93RGF0YS5kaW1lbnNpb25zW2RpbUluZGV4XSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb290RGltZW5zaW9uXT0nZGltJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJyZW5kZXJlZFJvd0hlaWdodCAqIChyb3dEYXRhLnJvd1NwYW4gfHwgMSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd0luZGV4XT0ncm93SW5kZXgnIFtyb3dEYXRhXT0ncm93RGF0YSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgW3dpZHRoXT1cInJvd0RpbWVuc2lvbldpZHRoVG9QaXhlbHMoZGltKVwiPlxuICAgICAgICAgICAgPC9pZ3gtcGl2b3Qtcm93LWRpbWVuc2lvbi1jb250ZW50PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZW1wdHlSb3dEaW1lbnNpb25zVGVtcGxhdGU+XG4gICAgPGRpdiB0YWJpbmRleD1cIjBcIiAqbmdJZj0nY29sdW1uRGltZW5zaW9ucy5sZW5ndGggPiAwIHx8IHZhbHVlcy5sZW5ndGggPiAwJyAjcm93RGltZW5zaW9uQ29udGFpbmVyIHJvbGU9XCJyb3dncm91cFwiIGNsYXNzPSdpZ3gtZ3JpZF9fdGJvZHktcGl2b3QtZGltZW5zaW9uJyAoZm9jdXMpPVwibmF2aWdhdGlvbi5mb2N1c1Rib2R5KCRldmVudClcIiAoa2V5ZG93bik9XCJuYXZpZ2F0aW9uLmhhbmRsZU5hdmlnYXRpb24oJGV2ZW50KVwiPlxuICAgICAgICA8aWd4LXBpdm90LXJvdy1kaW1lbnNpb24tY29udGVudCByb2xlPSdyb3cnIGNsYXNzPVwiaWd4LWdyaWQtdGhlYWRcIiBbZ3JpZF09XCJ0aGlzXCJcbiAgICAgICAgICAgIFtkaW1lbnNpb25dPSdlbXB0eVJvd0RpbWVuc2lvbidcbiAgICAgICAgICAgIFtyb290RGltZW5zaW9uXT0nZW1wdHlSb3dEaW1lbnNpb24nXG4gICAgICAgICAgICBbcm93SW5kZXhdPScwJyBbcm93RGF0YV09J2RhdGFWaWV3WzBdJ1xuICAgICAgICAgICAgW2RlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiBbd2lkdGhdPVwicm93RGltZW5zaW9uV2lkdGhUb1BpeGVscyhlbXB0eVJvd0RpbWVuc2lvbilcIj5cbiAgICAgICAgPC9pZ3gtcGl2b3Qtcm93LWRpbWVuc2lvbi1jb250ZW50PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVBpdm90R3JpZFRlbXBsYXRlPlxuICAgIDxzcGFuIGNsYXNzPVwiaWd4LWdyaWRfX3Rib2R5LW1lc3NhZ2VcIiByb2xlPVwiY2VsbFwiPlxuICAgICAgICA8c3Bhbj57e3Jlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9waXZvdF9lbXB0eV9tZXNzYWdlfX08L3NwYW4+XG4gICAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBbaGlkZGVuXT0ndHJ1ZSc+XG4gICAgPGlneC1ncmlkLWV4Y2VsLXN0eWxlLWZpbHRlcmluZyBbbWF4SGVpZ2h0XT0nZXhjZWxTdHlsZUZpbHRlck1heEhlaWdodCcgW21pbkhlaWdodF09J2V4Y2VsU3R5bGVGaWx0ZXJNaW5IZWlnaHQnPlxuICAgICAgICA8ZGl2IGlneEV4Y2VsU3R5bGVDb2x1bW5PcGVyYXRpb25zIFtoaWRkZW5dPSd0cnVlJz48L2Rpdj5cbiAgICAgICAgPGlneC1leGNlbC1zdHlsZS1maWx0ZXItb3BlcmF0aW9ucz5cbiAgICAgICAgICAgIDxpZ3gtZXhjZWwtc3R5bGUtc2VhcmNoPjwvaWd4LWV4Y2VsLXN0eWxlLXNlYXJjaD5cbiAgICAgICAgPC9pZ3gtZXhjZWwtc3R5bGUtZmlsdGVyLW9wZXJhdGlvbnM+XG4gICAgPC9pZ3gtZ3JpZC1leGNlbC1zdHlsZS1maWx0ZXJpbmc+XG48L2Rpdj5cbiJdfQ==
|