UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

327 lines (325 loc) 46.8 kB
/* MIT License Copyright (c) 2019 Temainfo Sistemas Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Input, Component, ViewChild, ElementRef, ViewContainerRef, } from '@angular/core'; import { SubMenuService } from './services/submenu.service'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "./services/submenu.service"; import * as i3 from "@angular/common"; export class TlMenu { constructor(renderer, router, subMenuService, viewRoot) { this.renderer = renderer; this.router = router; this.subMenuService = subMenuService; this.viewRoot = viewRoot; this.items = []; this.label = ''; this.icon = ''; this.subItem = ''; this.dockWidth = '40px'; this.width = '200px'; this.docked = false; this.charsToSearch = 2; this.group = ''; this.filterEmptyMessage = 'Nothing to Show'; this.maxHeight = '800px'; this.itemHeight = '30px'; this.topDislocation = 0; this.widthRootMenu = '250px'; this.outsideBorder = false; this.inputPlaceholder = 'Search...'; this.titleMenu = 'Main Menu'; this.operationMode = 'hover'; this.mode = 'simple'; this.link = ''; this.elements = []; this.indexSubMenu = 0; this.callBack = Function(); this.subscription = new Subscription(); } ngAfterContentInit() { this.initializeMenu(); this.listenWindowResize(); this.listenDocumentClick(); this.listenRouteChange(); } listenRouteChange() { this.subscription.add(this.router.events.subscribe(() => { this.elements.forEach((value, index, array) => { this.isRouterActive(value.item) ? this.renderer.addClass(value.element, 'router-active') : this.renderer.removeClass(value.element, 'router-active'); }); })); } createList() { const list = this.items; for (let item = 0; item < list.length; item++) { this.createElementList(list[item]); this.addRootClass(); this.handleDockedClass(); this.handleAlwaysActive(list[item]['alwaysActive']); this.insertListElementToList(); this.createElementIcon(list[item][this.icon]); this.createElementLabel(list[item][this.label]); this.orderElements(); this.createElementIconSubMenu(list[item][this.subItem]); this.handleListenerSubMenu(list[item][this.subItem]); this.handleSubItems(list[item]); } } addRootClass() { this.renderer.addClass(this.listElement.nativeElement, 'root-list'); } handleDockedClass() { if (this.docked) { this.renderer.addClass(this.listElement.nativeElement, 'docked'); this.renderer.setStyle(this.listElement.nativeElement, 'grid-template-columns', this.dockWidth); } } initializeMenu() { this.subMenuService.setRenderer(this.renderer); this.subMenuService.setRootMenu(this.menuList); this.subMenuService.setViewRootMenu(this.viewRoot); this.subMenuService.setViewSubMenu(this.menuList); this.createList(); } handleAlwaysActive(value) { if (value) { this.renderer.addClass(this.listElement.nativeElement, 'always-active'); } } handleSubItems(item) { if (item[this.subItem]) { if (this.mode === 'simple') { this.subMenuService.setAnchorRootElement(this.listElement.nativeElement); this.subMenuService.setSubMenuData(item[this.subItem], this); this.subMenuService.createSimpleSubMenu(); this.subMenuService.handleDockedMenu(); } else { this.subMenuService.setAnchorRootElement(this.menuList.element.nativeElement.children[0]); this.subMenuService.setSubMenuData(item[this.subItem], this); this.subMenuService.createAdvancedMenu(); this.subMenuService.handleDockedMenu(); } } } handleListenerSubMenu(item) { if (item) { this.listenClickListElement(); } } createElementList(item) { this.listElement = new ElementRef(this.renderer.createElement('li')); this.renderer.addClass(this.listElement.nativeElement, 'ui-menulist-item'); if (this.isRouterActive(item) && !item['alwaysActive']) { this.renderer.addClass(this.listElement.nativeElement, 'router-active'); } this.listenClickElementList(item); this.setStyleListElement(); this.elements.push({ item: item, element: this.listElement.nativeElement }); } listenDocumentClick() { this.subscription.add(this.renderer.listen(document, 'click', ($event) => { this.subMenuService.closeMenu(); })); } isRouterActive(item) { return this.router.isActive(item[this.link], false); } listenClickElementList(item) { this.subscription.add(this.renderer.listen(this.listElement.nativeElement, 'click', (MouseEvent) => { if (item[this.link]) { this.router.navigate([item[this.link]], { queryParams: item['queryParams'] }); this.subMenuService.closeMenu(); return; } if (item['callback']) { this.callBack = item['callback']; this.callBack(MouseEvent); this.subMenuService.closeMenu(); } })); } setStyleListElement() { this.renderer.setStyle(this.listElement.nativeElement, 'max-width', this.width); this.renderer.setStyle(this.listElement.nativeElement, 'height', this.itemHeight); this.renderer.setStyle(this.listElement.nativeElement, 'line-height', this.itemHeight); this.renderer.setStyle(this.listElement.nativeElement, 'grid-template-columns', this.dockWidth + ' 1fr ' + '25px'); } createElementIcon(icon) { this.iconElement = new ElementRef(this.renderer.createElement('i')); this.renderer.addClass(this.iconElement.nativeElement, icon); this.renderer.addClass(this.iconElement.nativeElement, 'icon'); this.renderer.addClass(this.iconElement.nativeElement, 'fa'); this.renderer.setStyle(this.iconElement.nativeElement, 'height', this.itemHeight); this.renderer.setStyle(this.iconElement.nativeElement, 'line-height', this.itemHeight); } createElementIconSubMenu(subItem) { if (!this.isDocked()) { this.iconSubElement = new ElementRef(this.renderer.createElement('i')); this.renderer.addClass(this.iconSubElement.nativeElement, 'icon'); this.renderer.appendChild(this.listElement.nativeElement, this.iconSubElement.nativeElement); if (subItem) { this.renderer.addClass(this.iconSubElement.nativeElement, 'ion-ios-arrow-forward'); } } } listenWindowResize() { this.subscription.add(this.renderer.listen(window, 'resize', () => { this.subMenuService.setRootHeightChange(this.maxHeight); })); } listenClickListElement() { if (this.mode === 'advanced') { this.subscription.add(this.renderer.listen(this.listElement.nativeElement, 'click', ($event) => { if (this.isTargetOnListElement($event)) { this.subMenuService.getListComponents()[0].instance.toggleVisibility(); this.handleVisibilitySubMenu(); } })); } } handleVisibilitySubMenu() { this.subMenuService.getListComponents().forEach((value, index) => { if ((index > 0) && (value.instance.visibilitySubMenu)) { value.instance.toggleVisibility(); } }); } isTargetOnListElement($event) { for (const item of $event.currentTarget.children) { if (item === $event.target) { return true; } } return false; } createElementLabel(label) { if (!this.isDocked()) { this.labelElement = new ElementRef(this.renderer.createElement('span')); this.renderer.addClass(this.labelElement.nativeElement, 'label'); this.renderer.setStyle(this.labelElement.nativeElement, 'height', this.itemHeight); this.renderer.setStyle(this.labelElement.nativeElement, 'line-height', this.itemHeight); this.labelElement.nativeElement.innerHTML = label; return; } this.labelElement = null; } isDocked() { return this.listElement.nativeElement.getAttribute('class').includes('docked'); } orderElements() { this.renderer.appendChild(this.listElement.nativeElement, this.iconElement.nativeElement); if (this.labelElement) { this.renderer.appendChild(this.listElement.nativeElement, this.labelElement.nativeElement); } } insertListElementToList() { this.renderer.appendChild(this.menuList.element.nativeElement, this.listElement.nativeElement); } resetList() { this.subMenuService.clearView(); this.menuList.element.nativeElement.innerHTML = ''; this.indexSubMenu = 0; } ngOnChanges(changes) { this.handleChangeDocked(changes); this.handleChangeItems(changes); this.handleChangeMode(changes); } handleChangeDocked(changes) { if (changes['docked']) { if (!changes['docked'].firstChange) { this.resetList(); this.initializeMenu(); } } } handleChangeItems(changes) { if (changes['items']) { if (!changes['items'].firstChange) { this.initializeMenu(); } } } handleChangeMode(changes) { if (changes['mode']) { if (!changes['mode'].firstChange) { this.resetList(); this.initializeMenu(); } } } ngOnDestroy() { this.subscription.unsubscribe(); } } /** @nocollapse */ TlMenu.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlMenu, deps: [{ token: i0.Renderer2 }, { token: i1.Router }, { token: i2.SubMenuService }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlMenu.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlMenu, selector: "tl-menu", inputs: { items: "items", label: "label", icon: "icon", subItem: "subItem", dockWidth: "dockWidth", width: "width", docked: "docked", charsToSearch: "charsToSearch", group: "group", filterEmptyMessage: "filterEmptyMessage", maxHeight: "maxHeight", itemHeight: "itemHeight", topDislocation: "topDislocation", widthRootMenu: "widthRootMenu", outsideBorder: "outsideBorder", inputPlaceholder: "inputPlaceholder", titleMenu: "titleMenu", operationMode: "operationMode", mode: "mode", link: "link" }, providers: [SubMenuService], viewQueries: [{ propertyName: "menuList", first: true, predicate: ["menuList"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<nav class=\"ui-wrapper-menulist\" [ngClass]=\"{'ui-menu-bordered': outsideBorder }\" (click)=\"$event.stopPropagation()\" [style.width]=\"!docked ? width : dockWidth\">\n <ul class=\"ui-menulist\" #menuList></ul>\n</nav>\n", styles: [".ui-wrapper-menulist{box-sizing:content-box;white-space:nowrap;transition:width .2s cubic-bezier(.69,.01,0,1)}.ui-wrapper-menulist .ui-menulist{font-family:Segoe UI,Lato,\"sans-serif\",Arial;list-style:none;margin:0;padding:0}.ui-wrapper-menulist .ui-menulist-item{position:relative;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;display:grid;height:50px;cursor:pointer;line-height:50px;text-decoration:none;grid-template-columns:50px;-webkit-user-select:none;user-select:none}.ui-wrapper-menulist .ui-menulist-item>.icon{text-align:center;font-size:16px}.ui-wrapper-menulist .ui-menulist-item>.label{padding:0;font-style:normal;font-size:1em;text-align:left;font-weight:400;height:50px;line-height:50px}.ui-wrapper-menulist .ui-menulist-item:hover>::ng-deep tl-simple-sub-menu{visibility:visible}.ui-hidden-icon{visibility:hidden}.ui-wrapper-menulist li:hover>ul{visibility:visible;display:grid;position:relative}.ui-wrapper-menulist li:hover li{float:none;font-size:12px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlMenu, decorators: [{ type: Component, args: [{ selector: 'tl-menu', providers: [SubMenuService], template: "<nav class=\"ui-wrapper-menulist\" [ngClass]=\"{'ui-menu-bordered': outsideBorder }\" (click)=\"$event.stopPropagation()\" [style.width]=\"!docked ? width : dockWidth\">\n <ul class=\"ui-menulist\" #menuList></ul>\n</nav>\n", styles: [".ui-wrapper-menulist{box-sizing:content-box;white-space:nowrap;transition:width .2s cubic-bezier(.69,.01,0,1)}.ui-wrapper-menulist .ui-menulist{font-family:Segoe UI,Lato,\"sans-serif\",Arial;list-style:none;margin:0;padding:0}.ui-wrapper-menulist .ui-menulist-item{position:relative;font-family:Segoe UI,Lato,\"sans-serif\",Arial;font-size:1em;display:grid;height:50px;cursor:pointer;line-height:50px;text-decoration:none;grid-template-columns:50px;-webkit-user-select:none;user-select:none}.ui-wrapper-menulist .ui-menulist-item>.icon{text-align:center;font-size:16px}.ui-wrapper-menulist .ui-menulist-item>.label{padding:0;font-style:normal;font-size:1em;text-align:left;font-weight:400;height:50px;line-height:50px}.ui-wrapper-menulist .ui-menulist-item:hover>::ng-deep tl-simple-sub-menu{visibility:visible}.ui-hidden-icon{visibility:hidden}.ui-wrapper-menulist li:hover>ul{visibility:visible;display:grid;position:relative}.ui-wrapper-menulist li:hover li{float:none;font-size:12px}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.Router }, { type: i2.SubMenuService }, { type: i0.ViewContainerRef }]; }, propDecorators: { items: [{ type: Input }], label: [{ type: Input }], icon: [{ type: Input }], subItem: [{ type: Input }], dockWidth: [{ type: Input }], width: [{ type: Input }], docked: [{ type: Input }], charsToSearch: [{ type: Input }], group: [{ type: Input }], filterEmptyMessage: [{ type: Input }], maxHeight: [{ type: Input }], itemHeight: [{ type: Input }], topDislocation: [{ type: Input }], widthRootMenu: [{ type: Input }], outsideBorder: [{ type: Input }], inputPlaceholder: [{ type: Input }], titleMenu: [{ type: Input }], operationMode: [{ type: Input }], mode: [{ type: Input }], link: [{ type: Input }], menuList: [{ type: ViewChild, args: ['menuList', { read: ViewContainerRef, static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL21lbnUvbWVudS50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL21lbnUvbWVudS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE9BQU8sRUFDTCxLQUFLLEVBQUUsU0FBUyxFQUNMLFNBQVMsRUFBRSxVQUFVLEVBQThDLGdCQUFnQixHQUMvRixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7QUFRcEMsTUFBTSxPQUFPLE1BQU07SUE0RGpCLFlBQXFCLFFBQW1CLEVBQ25CLE1BQWMsRUFDZCxjQUE4QixFQUM5QixRQUEwQjtRQUgxQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUE3RHRDLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUVWLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFFYixjQUFTLEdBQUcsTUFBTSxDQUFDO1FBRW5CLFVBQUssR0FBRyxPQUFPLENBQUM7UUFFaEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVmLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCx1QkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztRQUV2QyxjQUFTLEdBQUcsT0FBTyxDQUFDO1FBRXBCLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFF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QUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBNSVQgTGljZW5zZVxuXG4gQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNpc3RlbWFzXG5cbiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5pbXBvcnQge1xuICBJbnB1dCwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMiwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQsIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1Yk1lbnVTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zdWJtZW51LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoIHtcbiAgc2VsZWN0b3I6ICd0bC1tZW51JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnUuaHRtbCcsXG4gIHN0eWxlVXJsczogWyAnLi9tZW51LnNjc3MnIF0sXG4gIHByb3ZpZGVyczogWyBTdWJNZW51U2VydmljZSBdLFxufSApXG5leHBvcnQgY2xhc3MgVGxNZW51IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIGl0ZW1zID0gW107XG5cbiAgQElucHV0KCkgbGFiZWwgPSAnJztcblxuICBASW5wdXQoKSBpY29uID0gJyc7XG5cbiAgQElucHV0KCkgc3ViSXRlbSA9ICcnO1xuXG4gIEBJbnB1dCgpIGRvY2tXaWR0aCA9ICc0MHB4JztcblxuICBASW5wdXQoKSB3aWR0aCA9ICcyMDBweCc7XG5cbiAgQElucHV0KCkgZG9ja2VkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgY2hhcnNUb1NlYXJjaCA9IDI7XG5cbiAgQElucHV0KCkgZ3JvdXAgPSAnJztcblxuICBASW5wdXQoKSBmaWx0ZXJFbXB0eU1lc3NhZ2UgPSAnTm90aGluZyB0byBTaG93JztcblxuICBASW5wdXQoKSBtYXhIZWlnaHQgPSAnODAwcHgnO1xuXG4gIEBJbnB1dCgpIGl0ZW1IZWlnaHQgPSAnMzBweCc7XG5cbiAgQElucHV0KCkgdG9wRGlzbG9jYXRpb24gPSAwO1xuXG4gIEBJbnB1dCgpIHdpZHRoUm9vdE1lbnUgPSAnMjUwcHgnO1xuXG4gIEBJbnB1dCgpIG91dHNpZGVCb3JkZXIgPSBmYWxzZTtcblxuICBASW5wdXQoKSBpbnB1dFBsYWNlaG9sZGVyID0gJ1NlYXJjaC4uLic7XG5cbiAgQElucHV0KCkgdGl0bGVNZW51ID0gJ01haW4gTWVudSc7XG5cbiAgQElucHV0KCkgb3BlcmF0aW9uTW9kZTogJ2NsaWNrJyB8ICdob3ZlcicgPSAnaG92ZXInO1xuXG4gIEBJbnB1dCgpIG1vZGU6ICdzaW1wbGUnIHwgJ2FkdmFuY2VkJyA9ICdzaW1wbGUnO1xuXG4gIEBJbnB1dCgpIGxpbmsgPSAnJztcblxuICBAVmlld0NoaWxkKCAnbWVudUxpc3QnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9ICkgbWVudUxpc3Q6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgcHJpdmF0ZSBsaXN0RWxlbWVudDtcblxuICBwcml2YXRlIGljb25FbGVtZW50O1xuXG4gIHByaXZhdGUgbGFiZWxFbGVtZW50O1xuXG4gIHByaXZhdGUgaWNvblN1YkVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBlbGVtZW50cyA9ICBbXTtcblxuICBwcml2YXRlIGluZGV4U3ViTWVudSA9IDA7XG5cbiAgcHJpdmF0ZSBjYWxsQmFjayA9IEZ1bmN0aW9uKCk7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgICBwcml2YXRlIHN1Yk1lbnVTZXJ2aWNlOiBTdWJNZW51U2VydmljZSxcbiAgICAgICAgICAgICAgIHByaXZhdGUgdmlld1Jvb3Q6IFZpZXdDb250YWluZXJSZWYgKSB7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplTWVudSgpO1xuICAgIHRoaXMubGlzdGVuV2luZG93UmVzaXplKCk7XG4gICAgdGhpcy5saXN0ZW5Eb2N1bWVudENsaWNrKCk7XG4gICAgdGhpcy5saXN0ZW5Sb3V0ZUNoYW5nZSgpO1xuICB9XG5cbiAgbGlzdGVuUm91dGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgIHRoaXMuaXNSb3V0ZXJBY3RpdmUodmFsdWUuaXRlbSkgPyB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB2YWx1ZS5lbGVtZW50LCAncm91dGVyLWFjdGl2ZScpIDpcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHZhbHVlLmVsZW1lbnQsICdyb3V0ZXItYWN0aXZlJyk7XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH1cblxuICBjcmVhdGVMaXN0KCkge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLml0ZW1zO1xuICAgIGZvciAoIGxldCBpdGVtID0gMDsgaXRlbSA8IGxpc3QubGVuZ3RoOyBpdGVtKysgKSB7XG4gICAgICB0aGlzLmNyZWF0ZUVsZW1lbnRMaXN0KCBsaXN0WyBpdGVtIF0gKTtcbiAgICAgIHRoaXMuYWRkUm9vdENsYXNzKCk7XG4gICAgICB0aGlzLmhhbmRsZURvY2tlZENsYXNzKCk7XG4gICAgICB0aGlzLmhhbmRsZUFsd2F5c0FjdGl2ZSggbGlzdFsgaXRlbSBdWyAnYWx3YXlzQWN0aXZlJyBdICk7XG4gICAgICB0aGlzLmluc2VydExpc3RFbGVtZW50VG9MaXN0KCk7XG4gICAgICB0aGlzLmNyZWF0ZUVsZW1lbnRJY29uKCBsaXN0WyBpdGVtIF1bIHRoaXMuaWNvbiBdICk7XG4gICAgICB0aGlzLmNyZWF0ZUVsZW1lbnRMYWJlbCggbGlzdFsgaXRlbSBdWyB0aGlzLmxhYmVsIF0gKTtcbiAgICAgIHRoaXMub3JkZXJFbGVtZW50cygpO1xuICAgICAgdGhpcy5jcmVhdGVFbGVtZW50SWNvblN1Yk1lbnUoIGxpc3RbIGl0ZW0gXVsgdGhpcy5zdWJJdGVtIF0gKTtcbiAgICAgIHRoaXMuaGFuZGxlTGlzdGVuZXJTdWJNZW51KCBsaXN0WyBpdGVtIF1bIHRoaXMuc3ViSXRlbSBdICk7XG4gICAgICB0aGlzLmhhbmRsZVN1Ykl0ZW1zKCBsaXN0WyBpdGVtIF0gKTtcbiAgICB9XG4gIH1cblxuICBhZGRSb290Q2xhc3MoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5saXN0RWxlbWVudC5uYXRpdmVFbGVtZW50LCAncm9vdC1saXN0JyApO1xuICB9XG5cbiAgaGFuZGxlRG9ja2VkQ2xhc3MoKSB7XG4gICAgaWYgKCB0aGlzLmRvY2tlZCApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMubGlzdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2RvY2tlZCcgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoIHRoaXMubGlzdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsIHRoaXMuZG9ja1dpZHRoICk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZU1lbnUoKSB7XG4gICAgdGhpcy5zdWJNZW51U2VydmljZS5zZXRSZW5kZXJlciggdGhpcy5yZW5kZXJlciApO1xuICAgIHRoaXMuc3ViTWVudVNlcnZpY2Uuc2V0Um9vdE1lbnUoIHRoaXMubWVudUxpc3QgKTtcbiAgICB0aGlzLnN1Yk1lbnVTZXJ2aWNlLnNldFZpZXdSb290TWVudSggdGhpcy52aWV3Um9vdCApO1xuICAgIHRoaXMuc3ViTWVudVNlcnZpY2Uuc2V0Vmlld1N1Yk1lbnUoIHRoaXMubWVudUxpc3QgKTtcbiAgICB0aGlzLmNyZWF0ZUxpc3QoKTtcbiAgfVxuXG4gIGhhbmRsZUFsd2F5c0FjdGl2ZSggdmFsdWUgKSB7XG4gICAgaWYgKCB2YWx1ZSApIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMubGlzdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2Fsd2F5cy1hY3RpdmUnICk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU3ViSXRlbXMoIGl0ZW0gKSB7XG4gICAgaWYgKCBpdGVtWyB0aGlzLnN1Ykl0ZW0gXSApIHtcbiAgICAgIGlmICggdGhpcy5tb2RlID09PSAnc2ltcGxlJyApIHtcbiAgICAgICAgdGhpcy5zdWJNZW51U2VydmljZS5zZXRBbmNob3JSb290RWxlbWVudCggdGhpcy5saXN0RWxlbWVudC5uYXRpdmVFbGVtZW50ICk7XG4gICAgICAgIHRoaXMuc3ViTWVudVNlcnZpY2Uuc2V0U3ViTWVudURhdGEoIGl0ZW1bIHRoaXMuc3ViSXRlbSBdLCB0aGlzICk7XG4gICAgICAgIHRoaXMuc3ViTWVudVNlcnZpY2UuY3JlYXRlU2ltcGxlU3ViTWVudSgpO1xuICAgICAgICB0aGlzLnN1Yk1lbnVTZXJ2aWNlLmhhbmRsZURvY2tlZE1lbnUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3ViTWVudVNlcnZpY2Uuc2V0QW5jaG9yUm9vdEVsZW1lbnQoIHRoaXMubWVudUxpc3QuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWyAwIF0gKTtcbiAgICAgICAgdGhpcy5zdWJNZW51U2VydmljZS5zZXRTdWJNZW51RGF0YSggaXRlbVsgdGhpcy5zdWJJdGVtIF0sIHRoaXMgKTtcbiAgICAgICAgdGhpcy5zdWJNZW51U2VydmljZS5jcmVhdGVBZHZhbmNlZE1lbnUoKTtcbiAgICAgICAgdGhpcy5zdWJNZW51U2VydmljZS5oYW5kbGVEb2NrZWRNZW51KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTGlzdGVuZXJTdWJNZW51KCBpdGVtICkge1xuICAgIGlmICggaXRlbSApIHtcbiAgICAgIHRoaXMubGlzdGVuQ2xpY2tMaXN0RWxlbWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnRMaXN0KCBpdGVtICkge1xuICAgIHRoaXMubGlzdEVsZW1lbnQgPSBuZXcgRWxlbWVudFJlZiggdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCAnbGknICkgKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmxpc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd1aS1tZW51bGlzdC1pdGVtJyApO1xuICAgIGlmICh0aGlzLmlzUm91dGVyQWN0aXZlKGl0ZW0pICYmICFpdGVtWydhbHdheXNBY3RpdmUnXSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5saXN0RWxlbWVudC5uYXRpdmVFbGVtZW50LCAncm91dGVyLWFjdGl2ZScpO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlbkNsaWNrRWxlbWVudExpc3QoIGl0ZW0gKTtcbiAgICB0aGlzLnNldFN0eWxlTGlzdEVsZW1lbnQoKTtcbiAgICB0aGlzLmVsZW1lbnRzLnB1c2goeyBpdGVtOiBpdGVtLCBlbGVtZW50OiB0aGlzLmxpc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgfSk7XG4gIH1cblxuICBsaXN0ZW5Eb2N1bWVudENsaWNrKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnJlbmRlcmVyLmxpc3RlbiggZG9jdW1lbnQsICdjbGljaycsICggJGV2ZW50ICkgPT4ge1xuICAgICAgdGhpcy5zdWJNZW51U2VydmljZS5jbG9zZU1lbnUoKTtcbiAgICB9ICkpO1xuICB9XG5cbiAgaXNSb3V0ZXJBY3RpdmUoaXRlbSkge1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5pc0FjdGl2ZSggaXRlbVt0aGlzLmxpbmtdLCBmYWxzZSApO1xuICB9XG5cbiAgbGlzdGVuQ2xpY2tFbGVtZW50TGlzdCggaXRlbSApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMubGlzdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgKCBNb3VzZUV2ZW50ICkgPT4ge1xuICAgICAgaWYgKCBpdGVtWyB0aGlzLmxpbmsgXSApIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoIFsgaXRlbVsgdGhpcy5saW5rIF0gXSwgeyBxdWVyeVBhcmFtczogaXRlbVsncXVlcnlQYXJhbXMnXSB9ICk7XG4gICAgICAgIHRoaXMuc3ViTWVudVNlcnZpY2UuY2xvc2VNZW51KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICggaXRlbVsgJ2NhbGxiYWNrJyBdICkge1xuICAgICAgICB0aGlzLmNhbGxCYWNrID0gaXRlbVsgJ2NhbGxiYWNrJyBdO1xuICAgICAgICB0aGlzLmNhbGxCYWNrKCBNb3VzZUV2ZW50ICk7XG4gICAgICAgIHRoaXMuc3ViTWVudVNlcnZpY2UuY2xvc2VNZW51KCk7XG4gICAgICB9XG4gICAgfSApKTtcbiAgfVxuXG4gIHNldFN0eWxlTGlzdEVsZW1lbnQoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSggdGhpcy5saXN0RWxlbWVudC5uYXRpdmVFbGVtZW50LCAnbWF4LXdpZHRoJywgdGhpcy53aWR0aCApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoIHRoaXMubGlzdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIHRoaXMuaXRlbUhlaWdodCApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoIHRoaXMubGlzdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xpbmUtaGVpZ2h0JywgdGhpcy5pdGVtSGVpZ2h0ICk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSggdGhpcy5saXN0RWxlbWVudC5uYXRpdmVFbGVtZW50LCAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJyxcbiAgICAgIHRoaXMuZG9ja1dpZHRoICsgJyAxZnIgJyArICcyNXB4JyApO1xuICB9XG5cbiAgY3JlYXRlRWxlbWVudEljb24oIGljb24gKSB7XG4gICAgdGhpcy5pY29uRWxlbWVudCA9IG5ldyBFbGVtZW50UmVmKCB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoICdpJyApICk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5pY29uRWxlbWVudC5uYXRpdmVFbGVtZW50LCBpY29uICk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5pY29uRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnaWNvbicgKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKCB0aGlzLmljb25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdmYScgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKCB0aGlzLmljb25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCB0aGlzLml0ZW1IZWlnaHQgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKCB0aGlzLmljb25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdsaW5lLWhlaWdodCcsIHRoaXMuaXRlbUhlaWdodCApO1xuICB9XG5cbiAgY3JlYXRlRWxlbWVudEljb25TdWJNZW51KCBzdWJJdGVtICkge1xuICAgIGlmICggIXRoaXMuaXNEb2NrZWQoKSApIHtcbiAgICAgIHRoaXMuaWNvblN1YkVsZW1lbnQgPSBuZXcgRWxlbWVudFJlZiggdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCAnaScgKSApO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5pY29uU3ViRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnaWNvbicgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoIHRoaXMubGlzdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5pY29uU3ViRWxlbWVudC5uYXRpdmVFbGVtZW50ICk7XG4gICAgICBpZiAoIHN1Ykl0ZW0gKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoIHRoaXMuaWNvblN1YkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2lvbi1pb3MtYXJyb3ctZm9yd2FyZCcgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsaXN0ZW5XaW5kb3dSZXNpemUoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMucmVuZGVyZXIubGlzdGVuKCB3aW5kb3csICdyZXNpemUnLCAoKSA9PiB7XG4gICAgICB0aGlzLnN1Yk1lbnVTZXJ2aWNlLnNldFJvb3RIZWlnaHRDaGFuZ2UoIHRoaXMubWF4SGVpZ2h0ICk7XG4gICAgfSApKTtcbiAgfVxuXG4gIGxpc3RlbkNsaWNrTGlzdEVsZW1lbnQoKSB7XG4gICAgaWYgKCB0aGlzLm1vZGUgPT09ICdhZHZhbmNlZCcgKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMubGlzdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgKCAkZXZlbnQgKSA9PiB7XG4gICAgICAgIGlmICggdGhpcy5pc1RhcmdldE9uTGlzdEVsZW1lbnQoICRldmVudCApICkge1xuICAgICAgICAgIHRoaXMuc3ViTWVudVNlcnZpY2UuZ2V0TGlzdENvbXBvbmVudHMoKVsgMCBdLmluc3RhbmNlLnRvZ2dsZVZpc2liaWxpdHkoKTtcbiAgICAgICAgICB0aGlzLmhhbmRsZVZpc2liaWxpdHlTdWJNZW51KCk7XG4gICAgICAgIH1cbiAgICAgIH0gKSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVmlzaWJpbGl0eVN1Yk1lbnUoKSB7XG4gICAgdGhpcy5zdWJNZW51U2VydmljZS5nZXRMaXN0Q29tcG9uZW50cygpLmZvckVhY2goICggdmFsdWUsIGluZGV4ICkgPT4ge1xuICAgICAgaWYgKCAoaW5kZXggPiAwKSAmJiAodmFsdWUuaW5zdGFuY2UudmlzaWJpbGl0eVN1Yk1lbnUpICkge1xuICAgICAgICB2YWx1ZS5pbnN0YW5jZS50b2dnbGVWaXNpYmlsaXR5KCk7XG4gICAgICB9XG4gICAgfSApO1xuICB9XG5cbiAgaXNUYXJnZXRPbkxpc3RFbGVtZW50KCAkZXZlbnQgKSB7XG4gICAgZm9yICggY29uc3QgaXRlbSBvZiAkZXZlbnQuY3VycmVudFRhcmdldC5jaGlsZHJlbiApIHtcbiAgICAgIGlmICggaXRlbSA9PT0gJGV2ZW50LnRhcmdldCApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNyZWF0ZUVsZW1lbnRMYWJlbCggbGFiZWwgKSB7XG4gICAgaWYgKCAhdGhpcy5pc0RvY2tlZCgpICkge1xuICAgICAgdGhpcy5sYWJlbEVsZW1lbnQgPSBuZXcgRWxlbWVudFJlZiggdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCAnc3BhbicgKSApO1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyggdGhpcy5sYWJlbEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xhYmVsJyApO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSggdGhpcy5sYWJlbEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIHRoaXMuaXRlbUhlaWdodCApO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSggdGhpcy5sYWJlbEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xpbmUtaGVpZ2h0JywgdGhpcy5pdGVtSGVpZ2h0ICk7XG4gICAgICB0aGlzLmxhYmVsRWxlbWVudC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGxhYmVsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxhYmVsRWxlbWVudCA9IG51bGw7XG4gIH1cblxuICBpc0RvY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5saXN0RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSggJ2NsYXNzJyApLmluY2x1ZGVzKCAnZG9ja2VkJyApO1xuICB9XG5cbiAgb3JkZXJFbGVtZW50cygpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKCB0aGlzLmxpc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuaWNvbkVsZW1lbnQubmF0aXZlRWxlbWVudCApO1xuICAgIGlmICggdGhpcy5sYWJlbEVsZW1lbnQgKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKCB0aGlzLmxpc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMubGFiZWxFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgKTtcbiAgICB9XG4gIH1cblxuICBpbnNlcnRMaXN0RWxlbWVudFRvTGlzdCgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKCB0aGlzLm1lbnVMaXN0LmVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5saXN0RWxlbWVudC5uYXRpdmVFbGVtZW50ICk7XG4gIH1cblxuICByZXNldExpc3QoKSB7XG4gICAgdGhpcy5zdWJNZW51U2VydmljZS5jbGVhclZpZXcoKTtcbiAgICB0aGlzLm1lbnVMaXN0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmluZGV4U3ViTWVudSA9IDA7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyggY2hhbmdlczogU2ltcGxlQ2hhbmdlcyApIHtcbiAgICB0aGlzLmhhbmRsZUNoYW5nZURvY2tlZCggY2hhbmdlcyApO1xuICAgIHRoaXMuaGFuZGxlQ2hhbmdlSXRlbXMoIGNoYW5nZXMgKTtcbiAgICB0aGlzLmhhbmRsZUNoYW5nZU1vZGUoIGNoYW5nZXMgKTtcbiAgfVxuXG4gIGhhbmRsZUNoYW5nZURvY2tlZCggY2hhbmdlcyApIHtcbiAgICBpZiAoIGNoYW5nZXNbICdkb2NrZWQnIF0gKSB7XG4gICAgICBpZiAoICFjaGFuZ2VzWyAnZG9ja2VkJyBdLmZpcnN0Q2hhbmdlICkge1xuICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVNZW51KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2hhbmdlSXRlbXMoIGNoYW5nZXMgKSB7XG4gICAgaWYgKCBjaGFuZ2VzWyAnaXRlbXMnIF0gKSB7XG4gICAgICBpZiAoICFjaGFuZ2VzWyAnaXRlbXMnIF0uZmlyc3RDaGFuZ2UgKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU1lbnUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVDaGFuZ2VNb2RlKCBjaGFuZ2VzICkge1xuICAgIGlmICggY2hhbmdlc1sgJ21vZGUnIF0gKSB7XG4gICAgICBpZiAoICFjaGFuZ2VzWyAnbW9kZScgXS5maXJzdENoYW5nZSApIHtcbiAgICAgICAgdGhpcy5yZXNldExpc3QoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplTWVudSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxufVxuIiwiPG5hdiBjbGFzcz1cInVpLXdyYXBwZXItbWVudWxpc3RcIiBbbmdDbGFzc109XCJ7J3VpLW1lbnUtYm9yZGVyZWQnOiBvdXRzaWRlQm9yZGVyIH1cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgW3N0eWxlLndpZHRoXT1cIiFkb2NrZWQgPyB3aWR0aCA6IGRvY2tXaWR0aFwiPlxuICA8dWwgY2xhc3M9XCJ1aS1tZW51bGlzdFwiICNtZW51TGlzdD48L3VsPlxuPC9uYXY+XG4iXX0=