UNPKG

ngx-mat-cdk

Version:

Extra Components for Angular Material including Filters,Drag Drop File, MatSelect Mobile Version

259 lines 34.3 kB
import { Component, ViewEncapsulation, Input, ViewChild, Inject, } from "@angular/core"; import { Router } from "@angular/router"; import { v4 as uuid } from "uuid"; import { Subscription } from "rxjs"; // import { KeyValuePair } from "../.."; import { orderBy } from "natural-orderby"; import { NgxSidePanelsService } from "./ngx-side-panels.service"; // import { AuthComponent } from "src/app/core/auth/auth.component"; export class NgxSidePanelsComponent { constructor(router, sidePanelService) { this.router = router; this.sidePanelService = sidePanelService; this.width = "100%"; this.title = ""; this.label = ""; this.saveConfirm = false; this.justAuth = false; this.skipLocationChange = true; this.firstWidth = 180; this.stepWidth = 60; this.startZIndex = 500; this.subscriber = new Subscription(); this.panels = []; // private activateRoute: ActivatedRoute; this.subSidePanelAuthComponent = new Subscription(); } openPanel(sidePanel) { this.populate(sidePanel); } ngOnInit() { this.sidePanelSubscription(); } closeWindow(key) { return new Promise((resolve, reject) => { if (key - 1 === 0) { this.sidePanelService.isPopup = false; } const obj = {}; const kk = `sidePanel_${key}`; obj[kk] = null; this.router .navigate([{ outlets: obj }]) .then(() => { const index = this.panels.findIndex((z) => z.key === key); if (index !== -1 && this.allRoutes) { const rIndex = this.allRoutes.findIndex((z) => z.outlet && z.outlet === "sidePanel_" + key); this.allRoutes.splice(rIndex, 1); this.panels.splice(index, 1); } else { this.panels = []; } resolve(); }); }); } onCloseWindow(key) { return new Promise((resolve, reject) => { this.closeWindow(key).then(() => { const panels = orderBy(this.panels, (v) => v.key, "desc"); if (panels && panels[0]) { panels[0].hidden = false; } setTimeout(() => { this.configLabelTop(); }, 0); if (this.panels.filter((w) => w.show).length === 0) { this.changeHtmlOverFlow(true); } resolve(); }); }); } configRoute(key, mainId, zIndex, sidePanel) { return new Promise((resolve, reject) => { var _a; // if (sidePanel.componentOrTemplateRef instanceof Component) { const rt = { path: sidePanel.routePath, component: sidePanel.componentOrTemplateRef, canActivate: (_a = sidePanel.sidePanelConfig) === null || _a === void 0 ? void 0 : _a.canActivate }; rt.outlet = `sidePanel_${key}`; // rt.children = route.children; const segments = sidePanel.routePath.split("/"); segments[0] = `${segments[0]}_${key}`; rt.path = segments.join("/"); sidePanel.mainId = mainId; sidePanel.zIndex = this.sidePanelService.zIndex + zIndex; this.sidePanelService.zIndex = this.sidePanelService.zIndex + zIndex; this.sidePanelService.container = `#main_${mainId}`; if (!this.allRoutes.find((z) => z.outlet === rt.outlet)) { this.allRoutes.push(rt); } else { } // } resolve(); }); } routeTo(key, path, queryParams = null) { this.sidePanelService.isPopup = true; const obj = {}; const kk = `sidePanel_${key}`; const segments = path.split("/"); segments[0] = `${segments[0]}_${key}`; obj[kk] = segments; this.router.navigate([{ outlets: obj }], { // relativeTo: this.activateRoute, skipLocationChange: this.skipLocationChange, queryParams: queryParams, }); } changeHtmlOverFlow(show) { const body = document.documentElement.querySelector("body"); const imBox = document.querySelector(".bx-im-bar"); if (show) { body.classList.remove("ngx-side-panel-disable-scrollbar"); imBox === null || imBox === void 0 ? void 0 : imBox.classList.remove("bx-im-bar-default"); body.style.paddingLeft = ""; imBox === null || imBox === void 0 ? void 0 : imBox.removeAttribute("style"); } else { body.classList.add("ngx-side-panel-disable-scrollbar"); if (imBox) { imBox.classList.add("bx-im-bar-default"); body.style.paddingLeft = "11px"; imBox.setAttribute("style", `position: fixed; height: 100%; top: 0px; left: 0px; transition: none 0s ease 0s; margin-left: 0; width: 76px `); } } } configLabelTop() { const el = this.mainDivPanels.nativeElement; if (el) { const els = el.querySelectorAll(".ngx-side-panel-label"); if (els) { const len = els.length - 1; els.forEach((label, index) => { label.style.top = (21 + (len - index) * 50).toString() + "px"; }); } } } sidePanelSubscription() { this.subscriber = this.sidePanelService.sidePanelObserver.subscribe((sidePanel) => { this.populate(sidePanel); }); } populate(sidePanel) { var _a, _b; debugger; this.changeHtmlOverFlow(false); this.allRoutes = this.router.config; const closeCurrent = !sidePanel; if (closeCurrent && this.panels) { this.closeCurrentPanel(sidePanel); return; } let width = (_a = sidePanel.sidePanelConfig) === null || _a === void 0 ? void 0 : _a.width; if (width) { if (typeof width === "number") { width = width + "px"; } } else { width = this.width; } let routePath = (_b = sidePanel.sidePanelConfig) === null || _b === void 0 ? void 0 : _b.routePath; if (!routePath) { routePath = 'panel'; } const mainId = uuid(); this.panels.forEach((z) => (z.hidden = true)); const count = this.panels.length + 1; const zIndex = this.panels.filter((w) => w.show).length + 1; const nSidePanel = { sidePanelConfig: Object.assign({}, sidePanel.sidePanelConfig), componentOrTemplateRef: sidePanel.componentOrTemplateRef, key: count, mainId, show: true, isNew: true, zIndex, width, routePath }; this.panels.push(nSidePanel); this.configRoute(count, mainId, zIndex, nSidePanel).then(() => { var _a; this.routeTo(count, routePath, (_a = nSidePanel.sidePanelConfig) === null || _a === void 0 ? void 0 : _a.queryParams); }); setTimeout(() => { this.configLabelTop(); }, 0); } closeCurrentPanel(sidePanel) { const len = this.panels.length; this.panels[len - 1].show = false; let prevPanel; if (len > 1) { prevPanel = this.panels[len - 2]; } this.onCloseWindow(len).then(() => { setTimeout(() => { var _a; const hasRefreshPrev = (_a = sidePanel === null || sidePanel === void 0 ? void 0 : sidePanel.sidePanelConfig) === null || _a === void 0 ? void 0 : _a.refreshPrev; if (prevPanel && hasRefreshPrev) { setTimeout(() => { var _a; (_a = prevPanel === null || prevPanel === void 0 ? void 0 : prevPanel.sidePanelConfig) === null || _a === void 0 ? void 0 : _a.refreshFunc(); }, 10); } }, 0); }); } ngOnDestroy() { this.sidePanelService.isPopup = false; this.subscriber.unsubscribe(); this.subSidePanelAuthComponent.unsubscribe(); } } NgxSidePanelsComponent.decorators = [ { type: Component, args: [{ selector: "ngxSidePanels", template: "<div #container>\r\n <ng-content></ng-content>\r\n <div #mainDivPanels>\r\n <ngxSidePanel class=\"ngx-side-panel-animate\" [label]=\"label\" [saveConfirm]=\"saveConfirm\"\r\n [firstWidth]=\"firstWidth\"\r\n [stepWidth]=\"stepWidth\"\r\n [width]=\"panel.width\"\r\n [title]=\"title\" *ngFor=\"let panel of panels; let i = index\" [zIndex]=\"panel.key\"\r\n [id]=\"panel.mainId\"\r\n [hidden]=\"panel.hidden\" (close)=\"onCloseWindow(panel.key)\" [(show)]=\"panel.show\"\r\n [hasLabel]=\"!justAuth\">\r\n <named-outlet [name]=\"'sidePanel_' + panel.key\"></named-outlet>\r\n </ngxSidePanel>\r\n </div>\r\n</div>\r\n", encapsulation: ViewEncapsulation.None, providers: [], styles: [".side-panel-disable-scrollbar{overflow:hidden}"] },] } ]; NgxSidePanelsComponent.ctorParameters = () => [ { type: Router }, { type: NgxSidePanelsService, decorators: [{ type: Inject, args: [NgxSidePanelsService,] }] } ]; NgxSidePanelsComponent.propDecorators = { container: [{ type: ViewChild, args: ["container",] }], width: [{ type: Input }], title: [{ type: Input }], label: [{ type: Input }], saveConfirm: [{ type: Input }], justAuth: [{ type: Input }], skipLocationChange: [{ type: Input }], firstWidth: [{ type: Input }], stepWidth: [{ type: Input }], startZIndex: [{ type: Input }], mainDivPanels: [{ type: ViewChild, args: ["mainDivPanels",] }] }; export class SidePanelConfig { } export class SidePanel { } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNpZGUtcGFuZWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9BbGlyZXphIE1vaGFtbWFkaS9zb3VyY2UvcmVwb3MvTXlMaWJyYXJ5L0FuZ3VsYXIuTGlicmFyeS9saWJzL3Byb2plY3RzL25neC1tYXQtY2RrL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtc2lkZS1wYW5lbHMvbmd4LXNpZGUtcGFuZWxzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUVqQixLQUFLLEVBS0wsU0FBUyxFQUFFLE1BQU0sR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLE1BQU0sRUFBNkMsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRixPQUFPLEVBQUMsRUFBRSxJQUFJLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsWUFBWSxFQUFVLE1BQU0sTUFBTSxDQUFDO0FBQzNDLHdDQUF3QztBQUN4QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFReEMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFJL0Qsb0VBQW9FO0FBU3BFLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFDVSxNQUFjLEVBQ2dCLGdCQUFzQztRQURwRSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2dCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBc0I7UUFLckUsVUFBSyxHQUFHLE1BQU0sQ0FBQztRQUNmLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQix1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDMUIsZUFBVSxHQUFHLEdBQUcsQ0FBQztRQUNqQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsZ0JBQVcsR0FBRyxHQUFHLENBQUM7UUFFbkIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEMsV0FBTSxHQUFnQixFQUFFLENBQUM7UUFFekIseUNBQXlDO1FBQ2pDLDhCQUF5QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFqQnZELENBQUM7SUFtQkQsU0FBUyxDQUFDLFNBQW9CO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVc7UUFDckIsT0FBTyxJQUFJLE9BQU8sQ0FBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNqQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN2QztZQUNELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxHQUFHLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDOUIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNmLElBQUksQ0FBQyxNQUFNO2lCQUNSLFFBQVEsQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBRXpCO2lCQUNBLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzFELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUNyQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFlBQVksR0FBRyxHQUFHLENBQ25ELENBQUM7b0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzlCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO2lCQUNsQjtnQkFDRCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQVc7UUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQzlCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2lCQUMxQjtnQkFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNOLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQy9CO2dCQUNELE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQ1QsR0FBVyxFQUNYLE1BQWMsRUFDZCxNQUFjLEVBQ2QsU0FBb0I7UUFFcEIsT0FBTyxJQUFJLE9BQU8sQ0FBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTs7WUFDMUMsZ0VBQWdFO1lBQ2hFLE1BQU0sRUFBRSxHQUFVO2dCQUNoQixJQUFJLEVBQUUsU0FBUyxDQUFDLFNBQVM7Z0JBQ3pCLFNBQVMsRUFBRSxTQUFTLENBQUMsc0JBQTZCO2dCQUNsRCxXQUFXLFFBQUUsU0FBUyxDQUFDLGVBQWUsMENBQUUsV0FBVzthQUNwRCxDQUFDO1lBQ0YsRUFBRSxDQUFDLE1BQU0sR0FBRyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQy9CLGdDQUFnQztZQUNoQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDdEMsRUFBRSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQzFCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDekQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLFNBQVMsTUFBTSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDekI7aUJBQU07YUFDTjtZQUNELElBQUk7WUFDSixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFXLEVBQUUsSUFBWSxFQUFFLGNBQW1CLElBQUk7UUFDeEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDckMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2YsTUFBTSxFQUFFLEdBQUcsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN0QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFDLENBQUMsRUFBRTtZQUNyQyxrQ0FBa0M7WUFDbEMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMzQyxXQUFXLEVBQUUsV0FBVztTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsSUFBYTtRQUN0QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUMxRCxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRTtZQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDNUIsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUU7U0FDakM7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO2dCQUNoQyxLQUFLLENBQUMsWUFBWSxDQUNoQixPQUFPLEVBQ1A7Ozs7Ozs7S0FPTCxDQUNJLENBQUM7YUFDSDtTQUNGO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUE0QixDQUFDO1FBQzNELElBQUksRUFBRSxFQUFFO1lBQ04sTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDekQsSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQzNCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFrQixFQUFFLEtBQWEsRUFBRSxFQUFFO29CQUNoRCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQ2hFLENBQUMsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtJQUNILENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUNqRSxDQUFDLFNBQW9CLEVBQUUsRUFBRTtZQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFFBQVEsQ0FBQyxTQUFxQjs7UUFDcEMsUUFBUSxDQUFBO1FBQ1IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEMsT0FBTztTQUNSO1FBQ0QsSUFBSSxLQUFLLFNBQUcsU0FBUyxDQUFDLGVBQWUsMENBQUUsS0FBSyxDQUFDO1FBQzdDLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQzdCLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO2FBQ3RCO1NBQ0Y7YUFBTTtZQUNMLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxTQUFTLFNBQUcsU0FBUyxDQUFDLGVBQWUsMENBQUUsU0FBUyxDQUFDO1FBQ3JELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxTQUFTLEdBQUcsT0FBTyxDQUFDO1NBQ3JCO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDNUQsTUFBTSxVQUFVLEdBQWM7WUFDNUIsZUFBZSxvQkFBTSxTQUFTLENBQUMsZUFBZSxDQUFDO1lBQy9DLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxzQkFBc0I7WUFDeEQsR0FBRyxFQUFFLEtBQUs7WUFDVixNQUFNO1lBQ04sSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUUsSUFBSTtZQUNYLE1BQU07WUFDTixLQUFLO1lBQ0wsU0FBUztTQUNWLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7O1lBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsUUFBRSxVQUFVLENBQUMsZUFBZSwwQ0FBRSxXQUFXLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFNBQW9CO1FBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxTQUFvQixDQUFDO1FBQ3pCLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtZQUNYLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNoQyxVQUFVLENBQUMsR0FBRyxFQUFFOztnQkFDZCxNQUFNLGNBQWMsU0FBRyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsZUFBZSwwQ0FBRSxXQUFXLENBQUM7Z0JBQy9ELElBQUksU0FBUyxJQUFJLGNBQWMsRUFBRTtvQkFDL0IsVUFBVSxDQUFDLEdBQUcsRUFBRTs7d0JBQ2QsTUFBQSxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsZUFBZSwwQ0FBRSxXQUFXLEdBQUc7b0JBQzVDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDUjtZQUNILENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQyxDQUFDOzs7WUF2UEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxlQUFlO2dCQUN6QixzdkJBQStDO2dCQUUvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtnQkFDckMsU0FBUyxFQUFFLEVBQUU7O2FBQ2Q7OztZQXhCTyxNQUFNO1lBWU4sb0JBQW9CLHVCQWdCdkIsTUFBTSxTQUFDLG9CQUFvQjs7O3dCQUk3QixTQUFTLFNBQUMsV0FBVztvQkFDckIsS0FBSztvQkFDTCxLQUFLO29CQUNMLEtBQUs7MEJBQ0wsS0FBSzt1QkFDTCxLQUFLO2lDQUNMLEtBQUs7eUJBQ0wsS0FBSzt3QkFDTCxLQUFLOzBCQUNMLEtBQUs7NEJBQ0wsU0FBUyxTQUFDLGVBQWU7O0FBa081QixNQUFNLE9BQU8sZUFBZTtDQVEzQjtBQUVELE1BQU0sT0FBTyxTQUFTO0NBV3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgRWxlbWVudFJlZixcclxuICBPbkRlc3Ryb3ksXHJcbiAgVmlld0NoaWxkLCBJbmplY3QsIFRlbXBsYXRlUmVmLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7Um91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgUm91dGUsIFBhcmFtcywgQ2FuQWN0aXZhdGV9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHt2NCBhcyB1dWlkfSBmcm9tIFwidXVpZFwiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbiwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuLy8gaW1wb3J0IHsgS2V5VmFsdWVQYWlyIH0gZnJvbSBcIi4uLy4uXCI7XHJcbmltcG9ydCB7b3JkZXJCeX0gZnJvbSBcIm5hdHVyYWwtb3JkZXJieVwiO1xyXG5pbXBvcnQge1xyXG4gIHF1ZXJ5LFxyXG4gIHN0eWxlLFxyXG4gIGFuaW1hdGUsXHJcbiAgdHJpZ2dlcixcclxuICB0cmFuc2l0aW9uLFxyXG59IGZyb20gXCJAYW5ndWxhci9hbmltYXRpb25zXCI7XHJcbmltcG9ydCB7Tmd4U2lkZVBhbmVsc1NlcnZpY2V9IGZyb20gXCIuL25neC1zaWRlLXBhbmVscy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7S2V5VmFsdWV9IGZyb20gXCIuLi9zaGFyZWQvY29tbW9ucy9LZXlWYWx1ZVwiO1xyXG5pbXBvcnQge0NvbXBvbmVudFR5cGV9IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xyXG5cclxuLy8gaW1wb3J0IHsgQXV0aENvbXBvbmVudCB9IGZyb20gXCJzcmMvYXBwL2NvcmUvYXV0aC9hdXRoLmNvbXBvbmVudFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwibmd4U2lkZVBhbmVsc1wiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vbmd4LXNpZGUtcGFuZWxzLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL25neC1zaWRlLXBhbmVscy5jb21wb25lbnQuc2Nzc1wiXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFNpZGVQYW5lbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgQEluamVjdChOZ3hTaWRlUGFuZWxzU2VydmljZSkgcHJpdmF0ZSBzaWRlUGFuZWxTZXJ2aWNlOiBOZ3hTaWRlUGFuZWxzU2VydmljZSxcclxuICApIHtcclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJjb250YWluZXJcIikgY29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIHdpZHRoID0gXCIxMDAlXCI7XHJcbiAgQElucHV0KCkgdGl0bGUgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIGxhYmVsID0gXCJcIjtcclxuICBASW5wdXQoKSBzYXZlQ29uZmlybSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGp1c3RBdXRoID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2tpcExvY2F0aW9uQ2hhbmdlID0gdHJ1ZTtcclxuICBASW5wdXQoKSBmaXJzdFdpZHRoID0gMTgwO1xyXG4gIEBJbnB1dCgpIHN0ZXBXaWR0aCA9IDYwO1xyXG4gIEBJbnB1dCgpIHN0YXJ0WkluZGV4ID0gNTAwO1xyXG4gIEBWaWV3Q2hpbGQoXCJtYWluRGl2UGFuZWxzXCIpIG1haW5EaXZQYW5lbHM6IEVsZW1lbnRSZWY7XHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVyID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHBhbmVsczogU2lkZVBhbmVsW10gPSBbXTtcclxuICBwcml2YXRlIGFsbFJvdXRlczogUm91dGVbXTtcclxuICAvLyBwcml2YXRlIGFjdGl2YXRlUm91dGU6IEFjdGl2YXRlZFJvdXRlO1xyXG4gIHByaXZhdGUgc3ViU2lkZVBhbmVsQXV0aENvbXBvbmVudCA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgb3BlblBhbmVsKHNpZGVQYW5lbDogU2lkZVBhbmVsKTogdm9pZCB7XHJcbiAgICB0aGlzLnBvcHVsYXRlKHNpZGVQYW5lbCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2lkZVBhbmVsU3Vic2NyaXB0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBjbG9zZVdpbmRvdyhrZXk6IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChrZXkgLSAxID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5zaWRlUGFuZWxTZXJ2aWNlLmlzUG9wdXAgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBvYmogPSB7fTtcclxuICAgICAgY29uc3Qga2sgPSBgc2lkZVBhbmVsXyR7a2V5fWA7XHJcbiAgICAgIG9ialtra10gPSBudWxsO1xyXG4gICAgICB0aGlzLnJvdXRlclxyXG4gICAgICAgIC5uYXZpZ2F0ZShbe291dGxldHM6IG9ian1dLFxyXG4gICAgICAgICAgLy8ge3JlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVSb3V0ZX1cclxuICAgICAgICApXHJcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBhbmVscy5maW5kSW5kZXgoKHopID0+IHoua2V5ID09PSBrZXkpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSAmJiB0aGlzLmFsbFJvdXRlcykge1xyXG4gICAgICAgICAgICBjb25zdCBySW5kZXggPSB0aGlzLmFsbFJvdXRlcy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgKHopID0+IHoub3V0bGV0ICYmIHoub3V0bGV0ID09PSBcInNpZGVQYW5lbF9cIiArIGtleVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmFsbFJvdXRlcy5zcGxpY2UockluZGV4LCAxKTtcclxuICAgICAgICAgICAgdGhpcy5wYW5lbHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFuZWxzID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQ2xvc2VXaW5kb3coa2V5OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmNsb3NlV2luZG93KGtleSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFuZWxzID0gb3JkZXJCeSh0aGlzLnBhbmVscywgKHYpID0+IHYua2V5LCBcImRlc2NcIik7XHJcbiAgICAgICAgaWYgKHBhbmVscyAmJiBwYW5lbHNbMF0pIHtcclxuICAgICAgICAgIHBhbmVsc1swXS5oaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ0xhYmVsVG9wKCk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgaWYgKHRoaXMucGFuZWxzLmZpbHRlcigodykgPT4gdy5zaG93KS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlSHRtbE92ZXJGbG93KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25maWdSb3V0ZShcclxuICAgIGtleTogbnVtYmVyLFxyXG4gICAgbWFpbklkOiBzdHJpbmcsXHJcbiAgICB6SW5kZXg6IG51bWJlcixcclxuICAgIHNpZGVQYW5lbDogU2lkZVBhbmVsXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgLy8gaWYgKHNpZGVQYW5lbC5jb21wb25lbnRPclRlbXBsYXRlUmVmIGluc3RhbmNlb2YgIENvbXBvbmVudCkge1xyXG4gICAgICBjb25zdCBydDogUm91dGUgPSB7XHJcbiAgICAgICAgcGF0aDogc2lkZVBhbmVsLnJvdXRlUGF0aCxcclxuICAgICAgICBjb21wb25lbnQ6IHNpZGVQYW5lbC5jb21wb25lbnRPclRlbXBsYXRlUmVmIGFzIGFueSxcclxuICAgICAgICBjYW5BY3RpdmF0ZTogc2lkZVBhbmVsLnNpZGVQYW5lbENvbmZpZz8uY2FuQWN0aXZhdGVcclxuICAgICAgfTtcclxuICAgICAgcnQub3V0bGV0ID0gYHNpZGVQYW5lbF8ke2tleX1gO1xyXG4gICAgICAvLyBydC5jaGlsZHJlbiA9IHJvdXRlLmNoaWxkcmVuO1xyXG4gICAgICBjb25zdCBzZWdtZW50cyA9IHNpZGVQYW5lbC5yb3V0ZVBhdGguc3BsaXQoXCIvXCIpO1xyXG4gICAgICBzZWdtZW50c1swXSA9IGAke3NlZ21lbnRzWzBdfV8ke2tleX1gO1xyXG4gICAgICBydC5wYXRoID0gc2VnbWVudHMuam9pbihcIi9cIik7XHJcbiAgICAgIHNpZGVQYW5lbC5tYWluSWQgPSBtYWluSWQ7XHJcbiAgICAgIHNpZGVQYW5lbC56SW5kZXggPSB0aGlzLnNpZGVQYW5lbFNlcnZpY2UuekluZGV4ICsgekluZGV4O1xyXG4gICAgICB0aGlzLnNpZGVQYW5lbFNlcnZpY2UuekluZGV4ID0gdGhpcy5zaWRlUGFuZWxTZXJ2aWNlLnpJbmRleCArIHpJbmRleDtcclxuICAgICAgdGhpcy5zaWRlUGFuZWxTZXJ2aWNlLmNvbnRhaW5lciA9IGAjbWFpbl8ke21haW5JZH1gO1xyXG4gICAgICBpZiAoIXRoaXMuYWxsUm91dGVzLmZpbmQoKHopID0+IHoub3V0bGV0ID09PSBydC5vdXRsZXQpKSB7XHJcbiAgICAgICAgdGhpcy5hbGxSb3V0ZXMucHVzaChydCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICByZXNvbHZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJvdXRlVG8oa2V5OiBudW1iZXIsIHBhdGg6IHN0cmluZywgcXVlcnlQYXJhbXM6IGFueSA9IG51bGwpIHtcclxuICAgIHRoaXMuc2lkZVBhbmVsU2VydmljZS5pc1BvcHVwID0gdHJ1ZTtcclxuICAgIGNvbnN0IG9iaiA9IHt9O1xyXG4gICAgY29uc3Qga2sgPSBgc2lkZVBhbmVsXyR7a2V5fWA7XHJcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xyXG4gICAgc2VnbWVudHNbMF0gPSBgJHtzZWdtZW50c1swXX1fJHtrZXl9YDtcclxuICAgIG9ialtra10gPSBzZWdtZW50cztcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt7b3V0bGV0czogb2JqfV0sIHtcclxuICAgICAgLy8gcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZVJvdXRlLFxyXG4gICAgICBza2lwTG9jYXRpb25DaGFuZ2U6IHRoaXMuc2tpcExvY2F0aW9uQ2hhbmdlLFxyXG4gICAgICBxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hhbmdlSHRtbE92ZXJGbG93KHNob3c6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucXVlcnlTZWxlY3RvcihcImJvZHlcIik7XHJcbiAgICBjb25zdCBpbUJveCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYngtaW0tYmFyXCIpO1xyXG4gICAgaWYgKHNob3cpIHtcclxuICAgICAgYm9keS5jbGFzc0xpc3QucmVtb3ZlKFwibmd4LXNpZGUtcGFuZWwtZGlzYWJsZS1zY3JvbGxiYXJcIik7XHJcbiAgICAgIGltQm94Py5jbGFzc0xpc3QucmVtb3ZlKFwiYngtaW0tYmFyLWRlZmF1bHRcIik7XHJcbiAgICAgIGJvZHkuc3R5bGUucGFkZGluZ0xlZnQgPSBcIlwiO1xyXG4gICAgICBpbUJveD8ucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBib2R5LmNsYXNzTGlzdC5hZGQoXCJuZ3gtc2lkZS1wYW5lbC1kaXNhYmxlLXNjcm9sbGJhclwiKTtcclxuICAgICAgaWYgKGltQm94KSB7XHJcbiAgICAgICAgaW1Cb3guY2xhc3NMaXN0LmFkZChcImJ4LWltLWJhci1kZWZhdWx0XCIpO1xyXG4gICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ0xlZnQgPSBcIjExcHhcIjtcclxuICAgICAgICBpbUJveC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICBcInN0eWxlXCIsXHJcbiAgICAgICAgICBgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIHRvcDogMHB4O1xyXG4gICAgICAgIGxlZnQ6IDBweDtcclxuICAgICAgICB0cmFuc2l0aW9uOiBub25lIDBzIGVhc2UgMHM7XHJcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XHJcbiAgICAgICAgd2lkdGg6IDc2cHhcclxuICAgIGBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ0xhYmVsVG9wKCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLm1haW5EaXZQYW5lbHMubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChlbCkge1xyXG4gICAgICBjb25zdCBlbHMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiLm5neC1zaWRlLXBhbmVsLWxhYmVsXCIpO1xyXG4gICAgICBpZiAoZWxzKSB7XHJcbiAgICAgICAgY29uc3QgbGVuID0gZWxzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgZWxzLmZvckVhY2goKGxhYmVsOiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgbGFiZWwuc3R5bGUudG9wID0gKDIxICsgKGxlbiAtIGluZGV4KSAqIDUwKS50b1N0cmluZygpICsgXCJweFwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaWRlUGFuZWxTdWJzY3JpcHRpb24oKSB7XHJcbiAgICB0aGlzLnN1YnNjcmliZXIgPSB0aGlzLnNpZGVQYW5lbFNlcnZpY2Uuc2lkZVBhbmVsT2JzZXJ2ZXIuc3Vic2NyaWJlKFxyXG4gICAgICAoc2lkZVBhbmVsOiBTaWRlUGFuZWwpID0+IHtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlKHNpZGVQYW5lbCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBvcHVsYXRlKHNpZGVQYW5lbD86IFNpZGVQYW5lbCkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIHRoaXMuY2hhbmdlSHRtbE92ZXJGbG93KGZhbHNlKTtcclxuICAgIHRoaXMuYWxsUm91dGVzID0gdGhpcy5yb3V0ZXIuY29uZmlnO1xyXG4gICAgY29uc3QgY2xvc2VDdXJyZW50ID0gIXNpZGVQYW5lbDtcclxuICAgIGlmIChjbG9zZUN1cnJlbnQgJiYgdGhpcy5wYW5lbHMpIHtcclxuICAgICAgdGhpcy5jbG9zZUN1cnJlbnRQYW5lbChzaWRlUGFuZWwpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgd2lkdGggPSBzaWRlUGFuZWwuc2lkZVBhbmVsQ29uZmlnPy53aWR0aDtcclxuICAgIGlmICh3aWR0aCkge1xyXG4gICAgICBpZiAodHlwZW9mIHdpZHRoID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgd2lkdGggPSB3aWR0aCArIFwicHhcIjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgfVxyXG4gICAgbGV0IHJvdXRlUGF0aCA9IHNpZGVQYW5lbC5zaWRlUGFuZWxDb25maWc/LnJvdXRlUGF0aDtcclxuICAgIGlmICghcm91dGVQYXRoKSB7XHJcbiAgICAgIHJvdXRlUGF0aCA9ICdwYW5lbCc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtYWluSWQgPSB1dWlkKCk7XHJcbiAgICB0aGlzLnBhbmVscy5mb3JFYWNoKCh6KSA9PiAoei5oaWRkZW4gPSB0cnVlKSk7XHJcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucGFuZWxzLmxlbmd0aCArIDE7XHJcbiAgICBjb25zdCB6SW5kZXggPSB0aGlzLnBhbmVscy5maWx0ZXIoKHcpID0+IHcuc2hvdykubGVuZ3RoICsgMTtcclxuICAgIGNvbnN0IG5TaWRlUGFuZWw6IFNpZGVQYW5lbCA9IHtcclxuICAgICAgc2lkZVBhbmVsQ29uZmlnOiB7Li4uc2lkZVBhbmVsLnNpZGVQYW5lbENvbmZpZ30sXHJcbiAgICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IHNpZGVQYW5lbC5jb21wb25lbnRPclRlbXBsYXRlUmVmLFxyXG4gICAgICBrZXk6IGNvdW50LFxyXG4gICAgICBtYWluSWQsXHJcbiAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgIGlzTmV3OiB0cnVlLFxyXG4gICAgICB6SW5kZXgsXHJcbiAgICAgIHdpZHRoLFxyXG4gICAgICByb3V0ZVBhdGhcclxuICAgIH07XHJcbiAgICB0aGlzLnBhbmVscy5wdXNoKG5TaWRlUGFuZWwpO1xyXG4gICAgdGhpcy5jb25maWdSb3V0ZShjb3VudCwgbWFpbklkLCB6SW5kZXgsIG5TaWRlUGFuZWwpLnRoZW4oKCkgPT4ge1xyXG4gICAgICB0aGlzLnJvdXRlVG8oY291bnQsIHJvdXRlUGF0aCwgblNpZGVQYW5lbC5zaWRlUGFuZWxDb25maWc/LnF1ZXJ5UGFyYW1zKTtcclxuICAgIH0pO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY29uZmlnTGFiZWxUb3AoKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbG9zZUN1cnJlbnRQYW5lbChzaWRlUGFuZWw6IFNpZGVQYW5lbCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGVuID0gdGhpcy5wYW5lbHMubGVuZ3RoO1xyXG4gICAgdGhpcy5wYW5lbHNbbGVuIC0gMV0uc2hvdyA9IGZhbHNlO1xyXG4gICAgbGV0IHByZXZQYW5lbDogU2lkZVBhbmVsO1xyXG4gICAgaWYgKGxlbiA+IDEpIHtcclxuICAgICAgcHJldlBhbmVsID0gdGhpcy5wYW5lbHNbbGVuIC0gMl07XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uQ2xvc2VXaW5kb3cobGVuKS50aGVuKCgpID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGFzUmVmcmVzaFByZXYgPSBzaWRlUGFuZWw/LnNpZGVQYW5lbENvbmZpZz8ucmVmcmVzaFByZXY7XHJcbiAgICAgICAgaWYgKHByZXZQYW5lbCAmJiBoYXNSZWZyZXNoUHJldikge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHByZXZQYW5lbD8uc2lkZVBhbmVsQ29uZmlnPy5yZWZyZXNoRnVuYygpO1xyXG4gICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaWRlUGFuZWxTZXJ2aWNlLmlzUG9wdXAgPSBmYWxzZTtcclxuICAgIHRoaXMuc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zdWJTaWRlUGFuZWxBdXRoQ29tcG9uZW50LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2lkZVBhbmVsQ29uZmlnIHtcclxuICB3aWR0aD86IG51bWJlciB8IHN0cmluZztcclxuICByZWZyZXNoUHJldj86IGZhbHNlO1xyXG4gIHJlZnJlc2hGdW5jPzogKCkgPT4ge31cclxuICBxdWVyeVBhcmFtcz86IFBhcmFtcztcclxuICByb3V0ZVBhdGg/OiBzdHJpbmc7XHJcbiAgY2FuQWN0aXZhdGU/OiBbXTtcclxuICBwZXJtaXNzaW9uPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2lkZVBhbmVsIHtcclxuICBjb21wb25lbnRPclRlbXBsYXRlUmVmOiBDb21wb25lbnRUeXBlPGFueT4gfCBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHNpZGVQYW5lbENvbmZpZzogU2lkZVBhbmVsQ29uZmlnO1xyXG4gIGtleTogbnVtYmVyO1xyXG4gIGhpZGRlbj86IGJvb2xlYW47XHJcbiAgc2hvdz86IGJvb2xlYW47XHJcbiAgaXNOZXc/OiBib29sZWFuO1xyXG4gIG1haW5JZD86IHN0cmluZztcclxuICB6SW5kZXg/OiBudW1iZXI7XHJcbiAgd2lkdGg/OiBhbnk7XHJcbiAgcm91dGVQYXRoOiBzdHJpbmdcclxufVxyXG4iXX0=