kwikid-agent-dashboard
Version:
KwikID's EKYC Agent Map View Module.
186 lines • 30.5 kB
JavaScript
import { __awaiter, __decorate } from "tslib";
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core";
import { FormControl, FormGroup } from "@angular/forms";
import { TuiDay, TuiDayRange } from "@taiga-ui/cdk";
import { isNotEmptyValue, logMethod } from "kwikid-toolkit";
import { convertNormalDateToStringFormat } from "../../helpers/date.helplers";
import { sortItems } from "../../helpers/array.helper";
import * as i0 from "@angular/core";
import * as i1 from "kwikui";
import * as i2 from "../task-list-search/task-list-search.component";
import * as i3 from "../task-item/task-item.component";
import * as i4 from "@taiga-ui/kit";
import * as i5 from "@angular/common";
export class TaskListComponent {
constructor(loaderService) {
this.loaderService = loaderService;
this.config = {};
this.taskItems = [];
this.onClickTaskItemViewDetail = new EventEmitter();
// Pagination
this.paginationIndex = 0;
this.paginationLength = null;
this.activePageItems = [];
this.filteredItems = [];
this.itemPerPage = 50;
// Loaders
this.loading = false;
// Search Text
this.searchText = "";
// Sort Filter
this.sortFilterKey = "";
this.sortInAscendingOrder = "ASC";
// Date Range Values
this.start_time = undefined;
this.end_time = undefined;
this.max = new TuiDay(new Date().getFullYear(), new Date().getMonth(), new Date().getDate());
this.formGroup = new FormGroup({});
// Event Emitters
this.onGetTaskList = new EventEmitter();
}
ngOnInit() {
return __awaiter(this, void 0, void 0, function* () {
this.toggleLoader(true);
// this.taskItems = Array.from({ length: 1000 }, (_, i) =>
// String(`test_${i}`)
// );
this.handleInitialDateRange();
});
}
ngOnChanges(changes) {
const verifyChange = (key) => {
return changes.hasOwnProperty(key) && !changes[key].firstChange;
};
if (verifyChange("taskItems")) {
this.toggleLoader(true);
this.taskItems = changes.taskItems.currentValue;
this.handleOnSortTaskItems(this.sortFilterKey, this.sortInAscendingOrder);
this.handleOnTaskItemsChange();
}
}
handleOnTaskItemsChange() {
this.toggleLoader(true);
this.handleOnFilterTaskItems();
this.paginationLength = Math.ceil(this.filteredItems.length / this.itemPerPage);
this.activePageItems = this.filteredItems.slice(this.paginationIndex * this.itemPerPage, this.paginationIndex * this.itemPerPage + this.itemPerPage);
this.toggleLoader(false);
}
handleInitialDateRange() {
var _a, _b, _c, _d, _e, _f;
const searchFilterStartPoint = (_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.extendedFlags) === null || _b === void 0 ? void 0 : _b.searchFilterStartPoint) !== null && _c !== void 0 ? _c : {
day: 0,
month: 0,
year: 0
};
const currentDate = new Date();
const startDate = new Date((_d = currentDate.getFullYear() - (searchFilterStartPoint === null || searchFilterStartPoint === void 0 ? void 0 : searchFilterStartPoint.year)) !== null && _d !== void 0 ? _d : 0, (_e = currentDate.getMonth() - (searchFilterStartPoint === null || searchFilterStartPoint === void 0 ? void 0 : searchFilterStartPoint.month)) !== null && _e !== void 0 ? _e : 0, (_f = currentDate.getDate() - (searchFilterStartPoint === null || searchFilterStartPoint === void 0 ? void 0 : searchFilterStartPoint.day)) !== null && _f !== void 0 ? _f : 0);
this.start_time = convertNormalDateToStringFormat(startDate);
this.end_time = convertNormalDateToStringFormat(null);
this.searchDataFormControl = new FormControl({
value: new TuiDayRange(new TuiDay(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()), this.max),
disabled: false
});
this.formGroup.addControl("searchDate", this.searchDataFormControl);
this.searchTextFormControl = new FormControl("");
this.formGroup.addControl("searchText", this.searchTextFormControl);
this.handleOnGetTaskItems();
}
handleOnFilterTasksByText(event) {
this.searchText = event === null || event === void 0 ? void 0 : event.text;
this.handleOnTaskItemsChange();
}
handleOnFilterTasksByDate(event) {
this.start_time = event.start_time;
this.end_time = event.end_time;
this.handleOnGetTaskItems();
}
handleOnGetTaskItems() {
this.toggleLoader(true);
this.onGetTaskList.emit({
from_date: this.start_time,
to_date: this.end_time
});
}
handleOnChangeSortFilter(event) {
var _a;
if (event && isNotEmptyValue(event.sortFilterKey)) {
this.sortFilterKey = event.sortFilterKey;
this.sortInAscendingOrder = (_a = event.sortFilterOrder) !== null && _a !== void 0 ? _a : true;
this.handleOnSortTaskItems(this.sortFilterKey, this.sortInAscendingOrder);
this.handleOnTaskItemsChange();
}
}
handleOnSortTaskItems(key, order) {
const sortedTaskItems = sortItems(this.taskItems, key, order);
this.taskItems = sortedTaskItems;
this.handleOnTaskItemsChange();
}
handleOnClickTaskItemViewDetail(e) {
this.onClickTaskItemViewDetail.emit(e);
}
handleOnClickChangePaginationIndex(indexOfPage) {
if (indexOfPage >= 0) {
this.paginationIndex = indexOfPage;
this.activePageItems = this.taskItems.slice(this.paginationIndex * this.itemPerPage, this.paginationIndex * this.itemPerPage + this.itemPerPage);
}
}
handleOnFilterTaskItems() {
const lowerCaseSearchText = this.searchText.toLowerCase();
this.filteredItems = this.taskItems.filter((item) => {
return Object.values(item).some((value) =>
// Ensure the value can be converted to string and check if it includes the search text
value != null &&
value.toString().toLowerCase().includes(lowerCaseSearchText));
});
}
trackByFn(index, item) {
return index; // or unique identifier if available
}
toggleLoader(loader, message = undefined) {
return __awaiter(this, void 0, void 0, function* () {
if (loader) {
this.loaderService.show({
fullscreen: true,
loaderText: message !== null && message !== void 0 ? message : "Please Wait"
});
this.loading = true;
}
else {
this.loaderService.hide();
this.loading = false;
}
});
}
}
/** @nocollapse */ TaskListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: TaskListComponent, deps: [{ token: i1.KwikUILoaderService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TaskListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: TaskListComponent, selector: "task-list", inputs: { config: "config", taskItems: "taskItems" }, outputs: { onClickTaskItemViewDetail: "onClickTaskItemViewDetail", onGetTaskList: "onGetTaskList" }, usesOnChanges: true, ngImport: i0, template: "<kwikui-loader></kwikui-loader>\n<div id=\"task-list-container\">\n <div id=\"task-list-search-wrapper\">\n <task-list-search\n [config]=\"config\"\n (onFilterTasksByText)=\"handleOnFilterTasksByText($event)\"\n (onFilterTasksByDate)=\"handleOnFilterTasksByDate($event)\"\n (onChangeSortFilter)=\"handleOnChangeSortFilter($event)\"\n ></task-list-search>\n </div>\n <hr />\n <div\n itemSize=\"50\"\n class=\"virtualscroll-container\"\n *ngIf=\"activePageItems.length > 0 && !loading; else NO_TASKS\"\n >\n <div id=\"task-list-items-container\">\n <div\n *ngFor=\"let taskItem of activePageItems\"\n class=\"task-item-container\"\n >\n <task-item\n [config]=\"config\"\n [data]=\"taskItem\"\n (onClickTaskItemViewDetail)=\"handleOnClickTaskItemViewDetail($event)\"\n >\n </task-item>\n </div>\n </div>\n <div id=\"task-list-items-pagination-container\">\n <tui-pagination\n [index]=\"paginationIndex\"\n [length]=\"paginationLength\"\n (indexChange)=\"handleOnClickChangePaginationIndex($event)\"\n ></tui-pagination>\n </div>\n </div>\n <ng-template #NO_TASKS>\n <div class=\"no-tasks\">No Tasks</div>\n </ng-template>\n</div>\n", styles: ["#task-list-container{width:100%;height:100%;overflow:hidden;display:flex;flex-direction:column}#task-list-container ::-webkit-scrollbar{width:8px!important}#task-list-container ::-webkit-scrollbar-track{border-radius:10px!important}#task-list-container ::-webkit-scrollbar-thumb{background:lightgray!important;border-radius:10px!important}#task-list-container ::-webkit-scrollbar-thumb:hover{background:gray!important}#task-list-container #task-list-search-wrapper{width:100%;padding:1rem}#task-list-container .virtualscroll-container{width:100%;height:100%;display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;overflow:auto}#task-list-container .no-tasks{width:100%;height:100%;display:flex;flex-direction:row;justify-content:center;align-items:center;font-size:1rem;font-weight:bold}#task-list-container #task-list-items-container{overflow:auto}#task-list-container #task-list-items-container>*:first-child{margin-top:1rem}#task-list-container #task-list-items-container .task-item-container{padding:0 1rem;margin-bottom:1rem}#task-list-container #task-list-items-pagination-container{padding:1rem}\n"], components: [{ type: i1.KwikUILoaderComponent, selector: "kwikui-loader" }, { type: i2.TaskListSearchComponent, selector: "task-list-search", inputs: ["config"], outputs: ["onFilterTasksByText", "onFilterTasksByDate", "onChangeSortFilter"] }, { type: i3.TaskItemComponent, selector: "task-item", inputs: ["config", "data"], outputs: ["onClickTaskItem", "onClickTaskItemViewDetail", "onClickPerformAction"] }, { type: i4.TuiPaginationComponent, selector: "tui-pagination", inputs: ["length", "size", "disabled", "activePadding", "sidePadding", "content", "index"], outputs: ["indexChange"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
__decorate([
logMethod
], TaskListComponent.prototype, "ngOnChanges", null);
__decorate([
logMethod
], TaskListComponent.prototype, "handleOnTaskItemsChange", null);
__decorate([
logMethod
], TaskListComponent.prototype, "handleOnClickTaskItemViewDetail", null);
__decorate([
logMethod
], TaskListComponent.prototype, "handleOnClickChangePaginationIndex", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: TaskListComponent, decorators: [{
type: Component,
args: [{
selector: "task-list",
templateUrl: "./task-list.component.html",
styleUrls: ["./task-list.component.scss"],
changeDetection: ChangeDetectionStrategy.OnPush
}]
}], ctorParameters: function () { return [{ type: i1.KwikUILoaderService }]; }, propDecorators: { config: [{
type: Input
}], taskItems: [{
type: Input
}], onClickTaskItemViewDetail: [{
type: Output
}], onGetTaskList: [{
type: Output
}], ngOnChanges: [], handleOnTaskItemsChange: [], handleOnClickTaskItemViewDetail: [], handleOnClickChangePaginationIndex: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1hZ2VudC1kYXNoYm9hcmQvc3JjL2xpYi92Mi9jb21wb25lbnRzL3Rhc2stbGlzdC90YXNrLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWFnZW50LWRhc2hib2FyZC9zcmMvbGliL3YyL2NvbXBvbmVudHMvdGFzay1saXN0L3Rhc2stbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVELE9BQU8sRUFFTCwrQkFBK0IsRUFDaEMsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7QUFRdkQsTUFBTSxPQUFPLGlCQUFpQjtJQXVENUIsWUFBb0IsYUFBa0M7UUFBbEMsa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBckR0RCxXQUFNLEdBQVEsRUFBRSxDQUFDO1FBR2pCLGNBQVMsR0FBVSxFQUFFLENBQUM7UUFHdEIsOEJBQXlCLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFdkUsYUFBYTtRQUNiLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLHFCQUFnQixHQUFXLElBQUksQ0FBQztRQUVoQyxvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUUxQixrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUV4QixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUVqQixVQUFVO1FBQ1YsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQixjQUFjO1FBQ2QsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVoQixjQUFjO1FBQ2Qsa0JBQWEsR0FBdUIsRUFBRSxDQUFDO1FBRXZDLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUU3QixvQkFBb0I7UUFDcEIsZUFBVSxHQUFrQixTQUFTLENBQUM7UUFFdEMsYUFBUSxHQUFrQixTQUFTLENBQUM7UUFFcEMsUUFBRyxHQUFXLElBQUksTUFBTSxDQUN0QixJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUN4QixJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUNyQixJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUNyQixDQUFDO1FBSUYsY0FBUyxHQUFjLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBTXpDLGlCQUFpQjtRQUVqQixrQkFBYSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRUcsQ0FBQztJQUVwRCxRQUFROztZQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFeEIsMERBQTBEO1lBQzFELHdCQUF3QjtZQUN4QixLQUFLO1lBQ0wsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDaEMsQ0FBQztLQUFBO0lBR0QsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7WUFDbkMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUNsRSxDQUFDLENBQUM7UUFFRixJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUM7WUFDaEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBR0QsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQzdDLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUM3QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUMzRCxDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsc0JBQXNCOztRQUNwQixNQUFNLHNCQUFzQixHQUFHLE1BQUEsTUFBQSxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLGFBQWEsMENBQ3JELHNCQUFzQixtQ0FBSTtZQUM1QixHQUFHLEVBQUUsQ0FBQztZQUNOLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxFQUFFLENBQUM7U0FDUixDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FDeEIsTUFBQSxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUcsc0JBQXNCLGFBQXRCLHNCQUFzQix1QkFBdEIsc0JBQXNCLENBQUUsSUFBSSxDQUFBLG1DQUFJLENBQUMsRUFDN0QsTUFBQSxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUcsc0JBQXNCLGFBQXRCLHNCQUFzQix1QkFBdEIsc0JBQXNCLENBQUUsS0FBSyxDQUFBLG1DQUFJLENBQUMsRUFDM0QsTUFBQSxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUcsc0JBQXNCLGFBQXRCLHNCQUFzQix1QkFBdEIsc0JBQXNCLENBQUUsR0FBRyxDQUFBLG1DQUFJLENBQUMsQ0FDekQsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLEdBQUcsK0JBQStCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsR0FBRywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDM0MsS0FBSyxFQUFFLElBQUksV0FBVyxDQUNwQixJQUFJLE1BQU0sQ0FDUixTQUFTLENBQUMsV0FBVyxFQUFFLEVBQ3ZCLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFDcEIsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUNwQixFQUNELElBQUksQ0FBQyxHQUFHLENBQ1Q7WUFDRCxRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQseUJBQXlCLENBQUMsS0FBSztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELHlCQUF5QixDQUFDLEtBQUs7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDdEIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FBVTs7UUFDakMsSUFBSSxLQUFLLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQUEsS0FBSyxDQUFDLGVBQWUsbUNBQUksSUFBSSxDQUFDO1lBQzFELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLEdBQUcsRUFBRSxLQUFLO1FBQzlCLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztRQUNqQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBR0QsK0JBQStCLENBQUMsQ0FBTTtRQUNwQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFHRCxrQ0FBa0MsQ0FBQyxXQUFtQjtRQUNwRCxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7WUFFbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUN2QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FDM0QsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzdCLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUix1RkFBdUY7WUFDdkYsS0FBSyxJQUFJLElBQUk7Z0JBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUMvRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWEsRUFBRSxJQUFTO1FBQ2hDLE9BQU8sS0FBSyxDQUFDLENBQUMsb0NBQW9DO0lBQ3BELENBQUM7SUFFSyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sR0FBRyxTQUFTOztZQUM1QyxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztvQkFDdEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFVBQVUsRUFBRSxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxhQUFhO2lCQUNyQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFDdEI7UUFDSCxDQUFDO0tBQUE7O2tJQW5OVSxpQkFBaUI7c0hBQWpCLGlCQUFpQixpT0N6QjlCLGd4Q0F5Q0E7QURtREU7SUFEQyxTQUFTO29EQVlUO0FBR0Q7SUFEQyxTQUFTO2dFQWVUO0FBeUVEO0lBREMsU0FBUzt3RUFHVDtBQUdEO0lBREMsU0FBUzsyRUFVVDs0RkF0TFUsaUJBQWlCO2tCQU43QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxXQUFXO29CQUNyQixXQUFXLEVBQUUsNEJBQTRCO29CQUN6QyxTQUFTLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDekMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzBHQUdDLE1BQU07c0JBREwsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4seUJBQXlCO3NCQUR4QixNQUFNO2dCQThDUCxhQUFhO3NCQURaLE1BQU07Z0JBZVAsV0FBVyxNQWNYLHVCQUF1QixNQXVGdkIsK0JBQStCLE1BSy9CLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUdWlEYXksIFR1aURheVJhbmdlIH0gZnJvbSBcIkB0YWlnYS11aS9jZGtcIjtcbmltcG9ydCB7IGlzTm90RW1wdHlWYWx1ZSwgbG9nTWV0aG9kIH0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBLd2lrVUlMb2FkZXJTZXJ2aWNlIH0gZnJvbSBcImt3aWt1aVwiO1xuaW1wb3J0IHtcbiAgY29udmVydEt3aWtVSURhdGVUb1N0cmluZ0Zvcm1hdCxcbiAgY29udmVydE5vcm1hbERhdGVUb1N0cmluZ0Zvcm1hdFxufSBmcm9tIFwiLi4vLi4vaGVscGVycy9kYXRlLmhlbHBsZXJzXCI7XG5pbXBvcnQgeyBzb3J0SXRlbXMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9hcnJheS5oZWxwZXJcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInRhc2stbGlzdFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3Rhc2stbGlzdC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGFzay1saXN0LmNvbXBvbmVudC5zY3NzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYXNrTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIGNvbmZpZzogYW55ID0ge307XG5cbiAgQElucHV0KClcbiAgdGFza0l0ZW1zOiBhbnlbXSA9IFtdO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrVGFza0l0ZW1WaWV3RGV0YWlsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIFBhZ2luYXRpb25cbiAgcGFnaW5hdGlvbkluZGV4ID0gMDtcblxuICBwYWdpbmF0aW9uTGVuZ3RoOiBudW1iZXIgPSBudWxsO1xuXG4gIGFjdGl2ZVBhZ2VJdGVtczogYW55ID0gW107XG5cbiAgZmlsdGVyZWRJdGVtczogYW55ID0gW107XG5cbiAgaXRlbVBlclBhZ2UgPSA1MDtcblxuICAvLyBMb2FkZXJzXG4gIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvLyBTZWFyY2ggVGV4dFxuICBzZWFyY2hUZXh0ID0gXCJcIjtcblxuICAvLyBTb3J0IEZpbHRlclxuICBzb3J0RmlsdGVyS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBcIlwiO1xuXG4gIHNvcnRJbkFzY2VuZGluZ09yZGVyID0gXCJBU0NcIjtcblxuICAvLyBEYXRlIFJhbmdlIFZhbHVlc1xuICBzdGFydF90aW1lOiBzdHJpbmcgfCBEYXRlID0gdW5kZWZpbmVkO1xuXG4gIGVuZF90aW1lOiBzdHJpbmcgfCBEYXRlID0gdW5kZWZpbmVkO1xuXG4gIG1heDogVHVpRGF5ID0gbmV3IFR1aURheShcbiAgICBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXG4gICAgbmV3IERhdGUoKS5nZXRNb250aCgpLFxuICAgIG5ldyBEYXRlKCkuZ2V0RGF0ZSgpXG4gICk7XG5cbiAgbWF4TGVuZ3RoOiBhbnk7XG5cbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcblxuICBzZWFyY2hEYXRhRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gIHNlYXJjaFRleHRGb3JtQ29udHJvbDogRm9ybUNvbnRyb2w7XG5cbiAgLy8gRXZlbnQgRW1pdHRlcnNcbiAgQE91dHB1dCgpXG4gIG9uR2V0VGFza0xpc3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9hZGVyU2VydmljZTogS3dpa1VJTG9hZGVyU2VydmljZSkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnRvZ2dsZUxvYWRlcih0cnVlKTtcblxuICAgIC8vIHRoaXMudGFza0l0ZW1zID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTAwMCB9LCAoXywgaSkgPT5cbiAgICAvLyAgIFN0cmluZyhgdGVzdF8ke2l9YClcbiAgICAvLyApO1xuICAgIHRoaXMuaGFuZGxlSW5pdGlhbERhdGVSYW5nZSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgdmVyaWZ5Q2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFjaGFuZ2VzW2tleV0uZmlyc3RDaGFuZ2U7XG4gICAgfTtcblxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJ0YXNrSXRlbXNcIikpIHtcbiAgICAgIHRoaXMudG9nZ2xlTG9hZGVyKHRydWUpO1xuICAgICAgdGhpcy50YXNrSXRlbXMgPSBjaGFuZ2VzLnRhc2tJdGVtcy5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLmhhbmRsZU9uU29ydFRhc2tJdGVtcyh0aGlzLnNvcnRGaWx0ZXJLZXksIHRoaXMuc29ydEluQXNjZW5kaW5nT3JkZXIpO1xuICAgICAgdGhpcy5oYW5kbGVPblRhc2tJdGVtc0NoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25UYXNrSXRlbXNDaGFuZ2UoKSB7XG4gICAgdGhpcy50b2dnbGVMb2FkZXIodHJ1ZSk7XG5cbiAgICB0aGlzLmhhbmRsZU9uRmlsdGVyVGFza0l0ZW1zKCk7XG5cbiAgICB0aGlzLnBhZ2luYXRpb25MZW5ndGggPSBNYXRoLmNlaWwoXG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIC8gdGhpcy5pdGVtUGVyUGFnZVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVQYWdlSXRlbXMgPSB0aGlzLmZpbHRlcmVkSXRlbXMuc2xpY2UoXG4gICAgICB0aGlzLnBhZ2luYXRpb25JbmRleCAqIHRoaXMuaXRlbVBlclBhZ2UsXG4gICAgICB0aGlzLnBhZ2luYXRpb25JbmRleCAqIHRoaXMuaXRlbVBlclBhZ2UgKyB0aGlzLml0ZW1QZXJQYWdlXG4gICAgKTtcblxuICAgIHRoaXMudG9nZ2xlTG9hZGVyKGZhbHNlKTtcbiAgfVxuXG4gIGhhbmRsZUluaXRpYWxEYXRlUmFuZ2UoKSB7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyU3RhcnRQb2ludCA9IHRoaXMuY29uZmlnPy5leHRlbmRlZEZsYWdzXG4gICAgICA/LnNlYXJjaEZpbHRlclN0YXJ0UG9pbnQgPz8ge1xuICAgICAgZGF5OiAwLFxuICAgICAgbW9udGg6IDAsXG4gICAgICB5ZWFyOiAwXG4gICAgfTtcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoXG4gICAgICBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpIC0gc2VhcmNoRmlsdGVyU3RhcnRQb2ludD8ueWVhciA/PyAwLFxuICAgICAgY3VycmVudERhdGUuZ2V0TW9udGgoKSAtIHNlYXJjaEZpbHRlclN0YXJ0UG9pbnQ/Lm1vbnRoID8/IDAsXG4gICAgICBjdXJyZW50RGF0ZS5nZXREYXRlKCkgLSBzZWFyY2hGaWx0ZXJTdGFydFBvaW50Py5kYXkgPz8gMFxuICAgICk7XG5cbiAgICB0aGlzLnN0YXJ0X3RpbWUgPSBjb252ZXJ0Tm9ybWFsRGF0ZVRvU3RyaW5nRm9ybWF0KHN0YXJ0RGF0ZSk7XG4gICAgdGhpcy5lbmRfdGltZSA9IGNvbnZlcnROb3JtYWxEYXRlVG9TdHJpbmdGb3JtYXQobnVsbCk7XG5cbiAgICB0aGlzLnNlYXJjaERhdGFGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCh7XG4gICAgICB2YWx1ZTogbmV3IFR1aURheVJhbmdlKFxuICAgICAgICBuZXcgVHVpRGF5KFxuICAgICAgICAgIHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgIHN0YXJ0RGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgIHN0YXJ0RGF0ZS5nZXREYXRlKClcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy5tYXhcbiAgICAgICksXG4gICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmZvcm1Hcm91cC5hZGRDb250cm9sKFwic2VhcmNoRGF0ZVwiLCB0aGlzLnNlYXJjaERhdGFGb3JtQ29udHJvbCk7XG5cbiAgICB0aGlzLnNlYXJjaFRleHRGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChcIlwiKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5hZGRDb250cm9sKFwic2VhcmNoVGV4dFwiLCB0aGlzLnNlYXJjaFRleHRGb3JtQ29udHJvbCk7XG5cbiAgICB0aGlzLmhhbmRsZU9uR2V0VGFza0l0ZW1zKCk7XG4gIH1cblxuICBoYW5kbGVPbkZpbHRlclRhc2tzQnlUZXh0KGV2ZW50KSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gZXZlbnQ/LnRleHQ7XG4gICAgdGhpcy5oYW5kbGVPblRhc2tJdGVtc0NoYW5nZSgpO1xuICB9XG5cbiAgaGFuZGxlT25GaWx0ZXJUYXNrc0J5RGF0ZShldmVudCkge1xuICAgIHRoaXMuc3RhcnRfdGltZSA9IGV2ZW50LnN0YXJ0X3RpbWU7XG4gICAgdGhpcy5lbmRfdGltZSA9IGV2ZW50LmVuZF90aW1lO1xuICAgIHRoaXMuaGFuZGxlT25HZXRUYXNrSXRlbXMoKTtcbiAgfVxuXG4gIGhhbmRsZU9uR2V0VGFza0l0ZW1zKCkge1xuICAgIHRoaXMudG9nZ2xlTG9hZGVyKHRydWUpO1xuICAgIHRoaXMub25HZXRUYXNrTGlzdC5lbWl0KHtcbiAgICAgIGZyb21fZGF0ZTogdGhpcy5zdGFydF90aW1lLFxuICAgICAgdG9fZGF0ZTogdGhpcy5lbmRfdGltZVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlT25DaGFuZ2VTb3J0RmlsdGVyKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZXZlbnQgJiYgaXNOb3RFbXB0eVZhbHVlKGV2ZW50LnNvcnRGaWx0ZXJLZXkpKSB7XG4gICAgICB0aGlzLnNvcnRGaWx0ZXJLZXkgPSBldmVudC5zb3J0RmlsdGVyS2V5O1xuICAgICAgdGhpcy5zb3J0SW5Bc2NlbmRpbmdPcmRlciA9IGV2ZW50LnNvcnRGaWx0ZXJPcmRlciA/PyB0cnVlO1xuICAgICAgdGhpcy5oYW5kbGVPblNvcnRUYXNrSXRlbXModGhpcy5zb3J0RmlsdGVyS2V5LCB0aGlzLnNvcnRJbkFzY2VuZGluZ09yZGVyKTtcbiAgICAgIHRoaXMuaGFuZGxlT25UYXNrSXRlbXNDaGFuZ2UoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVPblNvcnRUYXNrSXRlbXMoa2V5LCBvcmRlcikge1xuICAgIGNvbnN0IHNvcnRlZFRhc2tJdGVtcyA9IHNvcnRJdGVtcyh0aGlzLnRhc2tJdGVtcywga2V5LCBvcmRlcik7XG4gICAgdGhpcy50YXNrSXRlbXMgPSBzb3J0ZWRUYXNrSXRlbXM7XG4gICAgdGhpcy5oYW5kbGVPblRhc2tJdGVtc0NoYW5nZSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrVGFza0l0ZW1WaWV3RGV0YWlsKGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DbGlja1Rhc2tJdGVtVmlld0RldGFpbC5lbWl0KGUpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrQ2hhbmdlUGFnaW5hdGlvbkluZGV4KGluZGV4T2ZQYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXhPZlBhZ2UgPj0gMCkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uSW5kZXggPSBpbmRleE9mUGFnZTtcblxuICAgICAgdGhpcy5hY3RpdmVQYWdlSXRlbXMgPSB0aGlzLnRhc2tJdGVtcy5zbGljZShcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uSW5kZXggKiB0aGlzLml0ZW1QZXJQYWdlLFxuICAgICAgICB0aGlzLnBhZ2luYXRpb25JbmRleCAqIHRoaXMuaXRlbVBlclBhZ2UgKyB0aGlzLml0ZW1QZXJQYWdlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU9uRmlsdGVyVGFza0l0ZW1zKCkge1xuICAgIGNvbnN0IGxvd2VyQ2FzZVNlYXJjaFRleHQgPSB0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSB0aGlzLnRhc2tJdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKGl0ZW0pLnNvbWUoXG4gICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhlIHZhbHVlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIGFuZCBjaGVjayBpZiBpdCBpbmNsdWRlcyB0aGUgc2VhcmNoIHRleHRcbiAgICAgICAgICB2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyQ2FzZVNlYXJjaFRleHQpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgIHJldHVybiBpbmRleDsgLy8gb3IgdW5pcXVlIGlkZW50aWZpZXIgaWYgYXZhaWxhYmxlXG4gIH1cblxuICBhc3luYyB0b2dnbGVMb2FkZXIobG9hZGVyLCBtZXNzYWdlID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGxvYWRlcikge1xuICAgICAgdGhpcy5sb2FkZXJTZXJ2aWNlLnNob3coe1xuICAgICAgICBmdWxsc2NyZWVuOiB0cnVlLFxuICAgICAgICBsb2FkZXJUZXh0OiBtZXNzYWdlID8/IFwiUGxlYXNlIFdhaXRcIlxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRlclNlcnZpY2UuaGlkZSgpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCI8a3dpa3VpLWxvYWRlcj48L2t3aWt1aS1sb2FkZXI+XG48ZGl2IGlkPVwidGFzay1saXN0LWNvbnRhaW5lclwiPlxuICA8ZGl2IGlkPVwidGFzay1saXN0LXNlYXJjaC13cmFwcGVyXCI+XG4gICAgPHRhc2stbGlzdC1zZWFyY2hcbiAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgIChvbkZpbHRlclRhc2tzQnlUZXh0KT1cImhhbmRsZU9uRmlsdGVyVGFza3NCeVRleHQoJGV2ZW50KVwiXG4gICAgICAob25GaWx0ZXJUYXNrc0J5RGF0ZSk9XCJoYW5kbGVPbkZpbHRlclRhc2tzQnlEYXRlKCRldmVudClcIlxuICAgICAgKG9uQ2hhbmdlU29ydEZpbHRlcik9XCJoYW5kbGVPbkNoYW5nZVNvcnRGaWx0ZXIoJGV2ZW50KVwiXG4gICAgPjwvdGFzay1saXN0LXNlYXJjaD5cbiAgPC9kaXY+XG4gIDxociAvPlxuICA8ZGl2XG4gICAgaXRlbVNpemU9XCI1MFwiXG4gICAgY2xhc3M9XCJ2aXJ0dWFsc2Nyb2xsLWNvbnRhaW5lclwiXG4gICAgKm5nSWY9XCJhY3RpdmVQYWdlSXRlbXMubGVuZ3RoID4gMCAmJiAhbG9hZGluZzsgZWxzZSBOT19UQVNLU1wiXG4gID5cbiAgICA8ZGl2IGlkPVwidGFzay1saXN0LWl0ZW1zLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgdGFza0l0ZW0gb2YgYWN0aXZlUGFnZUl0ZW1zXCJcbiAgICAgICAgY2xhc3M9XCJ0YXNrLWl0ZW0tY29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPHRhc2staXRlbVxuICAgICAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgICBbZGF0YV09XCJ0YXNrSXRlbVwiXG4gICAgICAgICAgKG9uQ2xpY2tUYXNrSXRlbVZpZXdEZXRhaWwpPVwiaGFuZGxlT25DbGlja1Rhc2tJdGVtVmlld0RldGFpbCgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L3Rhc2staXRlbT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgaWQ9XCJ0YXNrLWxpc3QtaXRlbXMtcGFnaW5hdGlvbi1jb250YWluZXJcIj5cbiAgICAgIDx0dWktcGFnaW5hdGlvblxuICAgICAgICBbaW5kZXhdPVwicGFnaW5hdGlvbkluZGV4XCJcbiAgICAgICAgW2xlbmd0aF09XCJwYWdpbmF0aW9uTGVuZ3RoXCJcbiAgICAgICAgKGluZGV4Q2hhbmdlKT1cImhhbmRsZU9uQ2xpY2tDaGFuZ2VQYWdpbmF0aW9uSW5kZXgoJGV2ZW50KVwiXG4gICAgICA+PC90dWktcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSAjTk9fVEFTS1M+XG4gICAgPGRpdiBjbGFzcz1cIm5vLXRhc2tzXCI+Tm8gVGFza3M8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19