UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

131 lines (129 loc) 21.3 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 { Injectable } from '@angular/core'; import { RelativeWindowPosition } from '../../misc/relative-window-position.directive'; import { TlPopupMenuItem } from '../../popupmenu/parts/popupmenu-item'; import * as i0 from "@angular/core"; export class MenuService { constructor(componentResolver) { this.componentResolver = componentResolver; this.items = []; this.anchors = []; this.listeners = []; this.relativeWindowPosition = new RelativeWindowPosition(); this.callBack = Function(); this.created = false; } setMenuConfig(menuConfig, view, renderer) { this.label = menuConfig.label; this.subItem = menuConfig.subItem; this.icon = menuConfig.icon; this.items = menuConfig.items; this.menuList = view; this.renderer = renderer; } createList() { if (!this.mainList) { this.created = true; for (let item = 0; item < this.items.length; item++) { const factory = this.componentResolver.resolveComponentFactory(TlPopupMenuItem); this.mainList = this.menuList.createComponent(factory); this.setProperties(item, this.mainList, null); this.handleSubItems(item, this.mainList); } } } handleSubItems(item, componentSubItem, list) { const items = list ? list : this.items; if (items[item][this.subItem]) { this.renderer.setAttribute(componentSubItem.location.nativeElement, 'anchor', 'true'); const object = { 'anchor': componentSubItem, 'children': [] }; this.anchors.push(object); this.handleMouseHover(items, item, object); this.handleMouseLeave(object); } } handleMouseHover(items, item, object) { this.listeners.push(this.renderer.listen(object.anchor.location.nativeElement, 'mouseover', () => { if (object.children.length === 0) { this.createSubItemList(items[item][this.subItem], object); } })); } handleMouseLeave(componentSubItem) { this.listeners.push(this.renderer.listen(componentSubItem.anchor.location.nativeElement, 'mouseleave', () => { this.removeChildren(componentSubItem); })); } removeChildren(related) { related.children.forEach((item) => { this.menuList.remove(this.menuList.indexOf(item)); }); related.children = []; } createSubItemList(list, parentElement) { for (let index = 0; index < list.length; index++) { const factory = this.componentResolver.resolveComponentFactory(TlPopupMenuItem); const subItem = this.menuList.createComponent(factory); parentElement.children.push(subItem); this.renderer.appendChild(parentElement.anchor.location.nativeElement, subItem.location.nativeElement); this.setProperties(index, subItem, parentElement.anchor, list); this.handleSubItems(index, subItem, list); } } setProperties(index, subItem, parentElement, list) { const items = list ? list : this.items; this.setPositionChildElement(subItem, index, items.length - 1, parentElement); subItem.instance.label = items[index][this.label]; subItem.instance.icon = items[index][this.icon]; subItem.instance.subItem = items[index][this.subItem]; subItem.instance.callBack = items[index].callBack; } setPositionChildElement(subItem, index, lastIndex, anchor) { if (anchor) { subItem.instance.fitWidth(); subItem.instance.setBorders(index, lastIndex); this.setAnchorLeftPosition(subItem, anchor); this.setAnchorTopPosition(subItem, anchor, index); } } setAnchorLeftPosition(subItem, anchor) { this.relativeWindowPosition.setRenderer(this.renderer); this.relativeWindowPosition.anchorElement = anchor.location.nativeElement.firstElementChild; this.relativeWindowPosition.relativeElement = subItem.instance.wrapperItem.nativeElement; this.relativeWindowPosition.setPosition(); } setAnchorTopPosition(subItem, anchor, index) { this.renderer.setStyle(subItem.instance.wrapperItem.nativeElement, 'top', anchor.location.nativeElement.firstElementChild.getBoundingClientRect().top + anchor.location.nativeElement.firstElementChild.offsetHeight * index + 'px'); } resetMenu() { this.menuList.clear(); this.mainList = null; this.created = false; this.anchors = []; } } /** @nocollapse */ MenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuService, deps: [{ token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ MenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MenuService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvY29yZS9zZXJ2aWNlcy9tZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUE0QixVQUFVLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7QUFVdkUsTUFBTSxPQUFPLFdBQVc7SUEwQnRCLFlBQW9CLGlCQUEyQztRQUEzQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBaEJ2RCxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFJZiwyQkFBc0IsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFJdEQsYUFBUSxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBRXZCLFlBQU8sR0FBRyxLQUFLLENBQUM7SUFFMkMsQ0FBQztJQUVuRSxhQUFhLENBQUUsVUFBc0IsRUFBRSxJQUFzQixFQUFFLFFBQW1CO1FBQ2hGLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbEMsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lB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SUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQW1CLE9BQU8sQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQ3pGLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRztjQUN6RSxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDOzs0SEFoSVUsV0FBVztnSUFBWCxXQUFXOzRGQUFYLFdBQVc7a0JBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIE1JVCBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTkgVGVtYWluZm8gU2lzdGVtYXNcblxuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgSW5qZWN0YWJsZSwgUmVuZGVyZXIyLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWxhdGl2ZVdpbmRvd1Bvc2l0aW9uIH0gZnJvbSAnLi4vLi4vbWlzYy9yZWxhdGl2ZS13aW5kb3ctcG9zaXRpb24uZGlyZWN0aXZlJztcbmltcG9ydCB7IFRsUG9wdXBNZW51SXRlbSB9IGZyb20gJy4uLy4uL3BvcHVwbWVudS9wYXJ0cy9wb3B1cG1lbnUtaXRlbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVudUNvbmZpZyB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgc3ViSXRlbTogc3RyaW5nO1xuICBpdGVtczogQXJyYXk8YW55Pjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1lbnVTZXJ2aWNlIHtcblxuICBwcml2YXRlIG1haW5MaXN0O1xuXG4gIHByaXZhdGUgbGFiZWw7XG5cbiAgcHJpdmF0ZSBpY29uO1xuXG4gIHByaXZhdGUgc3ViSXRlbTtcblxuICBwcml2YXRlIGl0ZW1zID0gW107XG5cbiAgcHJpdmF0ZSBhbmNob3JzID0gW107XG5cbiAgcHJpdmF0ZSBsaXN0ZW5lcnMgPSBbXTtcblxuICBwcml2YXRlIG1lbnVMaXN0OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIHByaXZhdGUgcmVsYXRpdmVXaW5kb3dQb3NpdGlvbiA9IG5ldyBSZWxhdGl2ZVdpbmRvd1Bvc2l0aW9uKCk7XG5cbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyO1xuXG4gIHByaXZhdGUgY2FsbEJhY2sgPSBGdW5jdGlvbigpO1xuXG4gIHB1YmxpYyBjcmVhdGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wb25lbnRSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7fVxuXG4gIHNldE1lbnVDb25maWcoIG1lbnVDb25maWc6IE1lbnVDb25maWcsIHZpZXc6IFZpZXdDb250YWluZXJSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIgKSB7XG4gICAgdGhpcy5sYWJlbCA9IG1lbnVDb25maWcubGFiZWw7XG4gICAgdGhpcy5zdWJJdGVtID0gbWVudUNvbmZpZy5zdWJJdGVtO1xuICAgIHRoaXMuaWNvbiA9IG1lbnVDb25maWcuaWNvbjtcbiAgICB0aGlzLml0ZW1zID0gbWVudUNvbmZpZy5pdGVtcztcbiAgICB0aGlzLm1lbnVMaXN0ID0gdmlldztcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gIH1cblxuICBjcmVhdGVMaXN0KCkge1xuICAgIGlmICggIXRoaXMubWFpbkxpc3QgKSB7XG4gICAgICB0aGlzLmNyZWF0ZWQgPSB0cnVlO1xuICAgICAgZm9yICggbGV0IGl0ZW0gPSAwOyBpdGVtIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGl0ZW0rKyApIHtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuY29tcG9uZW50UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoIFRsUG9wdXBNZW51SXRlbSApO1xuICAgICAgICB0aGlzLm1haW5MaXN0ID0gdGhpcy5tZW51TGlzdC5jcmVhdGVDb21wb25lbnQoIGZhY3RvcnkgKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKCBpdGVtLCB0aGlzLm1haW5MaXN0LCBudWxsICk7XG4gICAgICAgIHRoaXMuaGFuZGxlU3ViSXRlbXMoIGl0ZW0sIHRoaXMubWFpbkxpc3QgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Ykl0ZW1zKCBpdGVtLCBjb21wb25lbnRTdWJJdGVtLCBsaXN0PyApIHtcbiAgICBjb25zdCBpdGVtcyA9IGxpc3QgPyBsaXN0IDogdGhpcy5pdGVtcztcbiAgICBpZiAoIGl0ZW1zWyBpdGVtIF1bIHRoaXMuc3ViSXRlbSBdICkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoIGNvbXBvbmVudFN1Ykl0ZW0ubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgJ2FuY2hvcicsICd0cnVlJyApO1xuICAgICAgY29uc3Qgb2JqZWN0ID0geyAnYW5jaG9yJzogY29tcG9uZW50U3ViSXRlbSwgJ2NoaWxkcmVuJzogW10gfTtcbiAgICAgIHRoaXMuYW5jaG9ycy5wdXNoKCBvYmplY3QgKTtcbiAgICAgIHRoaXMuaGFuZGxlTW91c2VIb3ZlciggaXRlbXMsIGl0ZW0sIG9iamVjdCApO1xuICAgICAgdGhpcy5oYW5kbGVNb3VzZUxlYXZlKCBvYmplY3QgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1vdXNlSG92ZXIoIGl0ZW1zLCBpdGVtLCBvYmplY3QgKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaCggdGhpcy5yZW5kZXJlci5saXN0ZW4oIG9iamVjdC5hbmNob3IubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgIGlmICggb2JqZWN0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCApIHtcbiAgICAgICAgdGhpcy5jcmVhdGVTdWJJdGVtTGlzdCggaXRlbXNbIGl0ZW0gXVsgdGhpcy5zdWJJdGVtIF0sIG9iamVjdCApO1xuICAgICAgfVxuICAgIH0gKSApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNb3VzZUxlYXZlKCBjb21wb25lbnRTdWJJdGVtICkge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goIHRoaXMucmVuZGVyZXIubGlzdGVuKCBjb21wb25lbnRTdWJJdGVtLmFuY2hvci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGRyZW4oIGNvbXBvbmVudFN1Ykl0ZW0gKTtcbiAgICB9ICkgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQ2hpbGRyZW4oIHJlbGF0ZWQgKSB7XG4gICAgcmVsYXRlZC5jaGlsZHJlbi5mb3JFYWNoKCAoIGl0ZW0gKSA9PiB7XG4gICAgICB0aGlzLm1lbnVMaXN0LnJlbW92ZSggdGhpcy5tZW51TGlzdC5pbmRleE9mKCBpdGVtICkgKTtcbiAgICB9ICk7XG4gICAgcmVsYXRlZC5jaGlsZHJlbiA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdWJJdGVtTGlzdCggbGlzdCwgcGFyZW50RWxlbWVudCApIHtcbiAgICBmb3IgKCBsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpc3QubGVuZ3RoOyBpbmRleCsrICkge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuY29tcG9uZW50UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoIFRsUG9wdXBNZW51SXRlbSApO1xuICAgICAgY29uc3Qgc3ViSXRlbSA9IHRoaXMubWVudUxpc3QuY3JlYXRlQ29tcG9uZW50KCBmYWN0b3J5ICk7XG4gICAgICBwYXJlbnRFbGVtZW50LmNoaWxkcmVuLnB1c2goIHN1Ykl0ZW0gKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoIHBhcmVudEVsZW1lbnQuYW5jaG9yLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIHN1Ykl0ZW0ubG9jYXRpb24ubmF0aXZlRWxlbWVudCApO1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKCBpbmRleCwgc3ViSXRlbSwgcGFyZW50RWxlbWVudC5hbmNob3IsIGxpc3QgKTtcbiAgICAgIHRoaXMuaGFuZGxlU3ViSXRlbXMoIGluZGV4LCBzdWJJdGVtLCBsaXN0ICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0aWVzKCBpbmRleCwgc3ViSXRlbSwgcGFyZW50RWxlbWVudCwgbGlzdD8gKSB7XG4gICAgY29uc3QgaXRlbXMgPSBsaXN0ID8gbGlzdCA6IHRoaXMuaXRlbXM7XG4gICAgdGhpcy5zZXRQb3NpdGlvbkNoaWxkRWxlbWVudCggc3ViSXRlbSwgaW5kZXgsIGl0ZW1zLmxlbmd0aCAtIDEsIHBhcmVudEVsZW1lbnQgKTtcbiAgICAoPFRsUG9wdXBNZW51SXRlbT5zdWJJdGVtLmluc3RhbmNlKS5sYWJlbCA9IGl0ZW1zWyBpbmRleCBdWyB0aGlzLmxhYmVsIF07XG4gICAgKDxUbFBvcHVwTWVudUl0ZW0+c3ViSXRlbS5pbnN0YW5jZSkuaWNvbiA9IGl0ZW1zWyBpbmRleCBdWyB0aGlzLmljb24gXTtcbiAgICAoPFRsUG9wdXBNZW51SXRlbT5zdWJJdGVtLmluc3RhbmNlKS5zdWJJdGVtID0gaXRlbXNbIGluZGV4IF1bIHRoaXMuc3ViSXRlbSBdO1xuICAgICg8VGxQb3B1cE1lbnVJdGVtPnN1Ykl0ZW0uaW5zdGFuY2UpLmNhbGxCYWNrID0gaXRlbXNbIGluZGV4IF0uY2FsbEJhY2s7XG4gIH1cblxuICBwcml2YXRlIHNldFBvc2l0aW9uQ2hpbGRFbGVtZW50KCBzdWJJdGVtLCBpbmRleCwgbGFzdEluZGV4LCBhbmNob3IgKSB7XG4gICAgaWYgKCBhbmNob3IgKSB7XG4gICAgICAoPFRsUG9wdXBNZW51SXRlbT5zdWJJdGVtLmluc3RhbmNlKS5maXRXaWR0aCgpO1xuICAgICAgKDxUbFBvcHVwTWVudUl0ZW0+c3ViSXRlbS5pbnN0YW5jZSkuc2V0Qm9yZGVycyggaW5kZXgsIGxhc3RJbmRleCApO1xuICAgICAgdGhpcy5zZXRBbmNob3JMZWZ0UG9zaXRpb24oc3ViSXRlbSwgYW5jaG9yKTtcbiAgICAgIHRoaXMuc2V0QW5jaG9yVG9wUG9zaXRpb24oc3ViSXRlbSwgYW5jaG9yLCBpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRBbmNob3JMZWZ0UG9zaXRpb24oc3ViSXRlbSwgYW5jaG9yKSB7XG4gICAgdGhpcy5yZWxhdGl2ZVdpbmRvd1Bvc2l0aW9uLnNldFJlbmRlcmVyKHRoaXMucmVuZGVyZXIpO1xuICAgIHRoaXMucmVsYXRpdmVXaW5kb3dQb3NpdGlvbi5hbmNob3JFbGVtZW50ID0gYW5jaG9yLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgdGhpcy5yZWxhdGl2ZVdpbmRvd1Bvc2l0aW9uLnJlbGF0aXZlRWxlbWVudCA9ICg8VGxQb3B1cE1lbnVJdGVtPnN1Ykl0ZW0uaW5zdGFuY2UpLndyYXBwZXJJdGVtLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZWxhdGl2ZVdpbmRvd1Bvc2l0aW9uLnNldFBvc2l0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHNldEFuY2hvclRvcFBvc2l0aW9uKHN1Ykl0ZW0sIGFuY2hvciwgaW5kZXgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKCg8VGxQb3B1cE1lbnVJdGVtPnN1Ykl0ZW0uaW5zdGFuY2UpLndyYXBwZXJJdGVtLm5hdGl2ZUVsZW1lbnQsICd0b3AnLFxuICAgICAgYW5jaG9yLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gICAgICArIGFuY2hvci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLm9mZnNldEhlaWdodCAqIGluZGV4ICsgJ3B4Jyk7XG4gIH1cblxuICByZXNldE1lbnUoKSB7XG4gICAgdGhpcy5tZW51TGlzdC5jbGVhcigpO1xuICAgIHRoaXMubWFpbkxpc3QgPSBudWxsO1xuICAgIHRoaXMuY3JlYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuYW5jaG9ycyA9IFtdO1xuICB9XG5cbn1cbiJdfQ==