UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

497 lines (495 loc) 72.4 kB
/* MIT License Copyright (c) 2019 Temainfo Software 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 { Subject } from 'rxjs'; import { SmartFormConfiguration } from '../classes/modal-smart-form'; import { TlModal } from '../modal'; import { TlBackdrop } from '../../core/components/backdrop/backdrop'; import { ActionsModal } from '../../core/enums/actions-modal'; import { ModalResult } from '../../core/enums/modal-result'; import * as objectPath from 'object-path'; import * as i0 from "@angular/core"; import * as i1 from "../../i18n/i18n.service"; import * as i2 from "../addons/container-modal/container-modal.service"; import * as i3 from "./current-modal.service"; let lastZIndex = 500; export class ModalService { constructor(i18nService, containerModal, currentModalService) { this.i18nService = i18nService; this.containerModal = containerModal; this.currentModalService = currentModalService; this.componentList = []; this.changeModal = new Subject(); this.modalShow = new Subject(); this.visibleModals = []; } createModalDialog(component, factoryResolver, mdOptions) { this.view = this.containerModal.view; return new Promise((resolve) => { this.setComponentModal(component, factoryResolver, null, null, mdOptions); this.handleCallbackModal(resolve); }); } createModal(component, factoryOrConfig, identifier = '', properties, parentElement = null, mdOptions) { this.view = this.containerModal.view; return new Promise((resolve) => { this.setComponentModal(component, factoryOrConfig, identifier, parentElement, mdOptions, properties); this.handleCallbackModal(resolve); }); } createSmartFormModal(component, formConfig, mdOptions) { this.view = this.containerModal.view; this.modalConfiguration = Object.assign(new SmartFormConfiguration(), formConfig); return new Promise((resolve) => { this.setComponentModal(component, this.modalConfiguration, null, null, mdOptions); this.handleCallbackModal(resolve); }); } handleCallbackModal(resolve) { if (this.instanceComponent) { this.instanceComponent.eventCallback.subscribe((value) => { resolve(value); }); } } isConfigSmartForm(config) { return config instanceof SmartFormConfiguration; } setInjectedComponent(factory, component) { const factoryInject = factory.resolveComponentFactory(component); this.componentInjected = this.component.instance.body.createComponent(factoryInject); } createComponentWrapper(factory) { const componentFactory = factory.resolveComponentFactory(TlModal); this.component = this.view.createComponent(componentFactory); this.component.instance.setServiceControl(this); this.component.instance.setComponentRef(this.component); this.reallocateComponent(); } handleSmartFormTitle(config) { if (this.isConfigSmartForm(config)) { if (this.instanceComponent.smartForm.titleByAction) { const isActionInsert = this.instanceComponent.smartForm.isInsertAction(); this.replaceTitleModal(isActionInsert ? this.i18nService.getLocale().Modal.includingMessage : this.i18nService.getLocale().Modal.updatingMessage); } } } replaceTitleModal(value) { this.component.instance.title = `${value} ${this.component.instance.title}`; } setModalOptions(mdOptions) { this.modalOptions = null; this.modalOptions = Reflect.getOwnMetadata('annotations', Object.getPrototypeOf(this.componentInjected.instance).constructor); this.modalOptions = Object.assign(this.modalOptions[0], mdOptions); } setModalProperties(properties) { if (properties) { Object.keys(properties).forEach((value, index) => { (this.componentInjected.instance)[value] = properties[value]; }); } } setComponentWrapperProperties(config, identifier, parentElement) { this.component.instance.setOptions(this.modalOptions); this.component.instance.setIdentifier(this.isConfigSmartForm(config) ? config['identifier'] : identifier); this.component.instance.setParentElement(this.isConfigSmartForm(config) ? config['parentElement'] : parentElement); } setInstanceComponent(config) { this.instanceComponent = { id: this.component.instance.id, modal: this.component, componentInjected: this.componentInjected, modalOptions: this.modalOptions, eventCallback: new Subject(), smartForm: config }; } isModalExists(config) { return this.componentList.filter((value, index, array) => config.identifier === value.id)[0]; } isUniqueSmartForm(config) { return config.unique; } validateUnique(config) { return this.isConfigSmartForm(config) && this.isModalExists(config) && this.isUniqueSmartForm(config); } isSmartFormUpdateDeleteAction(config) { return this.isConfigSmartForm(config) && (this.isUpdateAction(config) || this.isDeleteAction(config)); } setComponentModal(component, config, identifier, parentElement, mdOptions, properties) { const factory = this.isConfigSmartForm(config) ? config['factory'] : config; if (this.isSmartFormUpdateDeleteAction(config) && !this.validateDataFormUpdate(config)) { return; } if (this.validateUnique(config) && !this.isDeleteAction(config)) { this.showModal(this.isModalExists(config).modal); return; } this.createComponentWrapper(factory); this.setInitialZIndex(); this.setInjectedComponent(factory, component); this.setModalOptions(mdOptions); this.setModalProperties(properties); this.handleBackDrop(factory); this.setComponentWrapperProperties(config, identifier, parentElement); this.setInstanceComponent(config); this.setActiveModal(this.component); this.addNewComponent(); this.handleSmartFormTitle(config); this.emitChangeListModals(); this.handleDeleteSmartForm(config); } addNewComponent() { this.componentList.push(this.instanceComponent); } emitChangeListModals() { this.changeModal.next(); } handleDeleteSmartForm(config) { if (this.isConfigSmartForm(config)) { if (this.isDeleteAction(config)) { this.confirmDelete(this.instanceComponent, config); } } else { if (this.instanceComponent.componentInjected.instance.constructor.name === 'TlDialogConfirmation') { if (this.referenceSmartForm) { this.removeOfList(this.referenceSmartForm.id); this.view.remove(this.view.indexOf(this.referenceSmartForm.modal.hostView)); } } } } isUpdateAction(component) { return component.executeAction === ActionsModal.UPDATE; } validateDataFormUpdate(config) { if (!config['dataForm']) { this.createModalDialog(window['TlDialogInfo'], config['factory'], { title: config['recordNotFoundMessage'] }); this.componentInjected.instance.message = config['recordNotFoundMessage']; return false; } return true; } close(id) { if (id) { const itemList = this.getComponentById(id); if (itemList) { this.removeOfView(itemList.modal); this.removeBackdrop(itemList.modal); this.removeOfList(id); } this.changeModal.next(); this.handleActiveWindow(); return; } if (this.selectedModal) { this.removeOfView(this.selectedModal.modal); this.removeBackdrop(this.selectedModal.modal); this.removeOfList(this.selectedModal.id); this.changeModal.next(); this.handleActiveWindow(); } } minimizeAll() { this.componentList.forEach((item) => { this.minimize(item.modal); }); } removeOfView(modal) { this.view.remove(this.view.indexOf(modal.hostView)); this.view.element.nativeElement.removeChild(modal.location.nativeElement); } closeAll() { if (this.view) { this.view.clear(); this.componentList = []; this.destroyBackdrop(); } } removeOfList(id) { this.componentList = this.componentList.filter((item) => item.id !== id); } getModal(identifier) { this.selectedModal = this.componentList.filter((item) => item.id === identifier)[0]; return this; } handleBackDrop(factory) { if (this.modalOptions.backdrop) { this.createBackdrop(TlBackdrop, factory); } } setInitialZIndex() { lastZIndex++; this.component.instance.modal.nativeElement.style.zIndex = lastZIndex; } setZIndex(componentRef) { const element = componentRef.instance.getElementModal(); const zIndex = this.getZIndexModals(); const maxIndex = []; for (let index = 0; index < zIndex.length; index++) { const item = parseInt(zIndex[index], 10); maxIndex.push(item); } lastZIndex = this.getHighestZIndexModals(this.getZIndexModals()); if (element.nativeElement.style.zIndex < Math.max(...maxIndex)) { element.nativeElement.style.zIndex = lastZIndex + 10; this.updateZIndexBackdrop(lastZIndex + 5, this.hasBackdrop(componentRef)); } } updateZIndexBackdrop(index, hasBackdrop) { if (this.backdrop && hasBackdrop) { this.backdrop.instance.setBackdropOptions({ 'zIndex': index }); } } getZIndexModals() { const maxZIndex = []; const modals = this.getVisibleModals(); for (let index = 0; index < modals.length; index++) { const element = modals[index]; maxZIndex.push(element.firstElementChild.style.zIndex); } return maxZIndex; } getHighestZIndexModals(arrayModals) { return Math.max.apply(Math, arrayModals); } hasBackdrop(componentRef) { const modalOptions = this.getCurrentModalOptions(componentRef); if (modalOptions.length > 0) { return modalOptions[0].modalOptions.backdrop; } return false; } setActiveModal(componentRef) { this.setZIndex(componentRef); this.activeModal = componentRef; this.currentModalService.setCurrentModal({ activeModal: this.activeModal }); } getCurrentModalOptions(compRef) { return this.componentList.filter((item, index, array) => item.modal === compRef); } createBackdrop(backdrop, factoryResolver) { if (!this.backdrop) { this.view = this.containerModal.view; const backdropFactory = factoryResolver.resolveComponentFactory(backdrop); this.backdrop = this.view.createComponent(backdropFactory); this.backdrop.instance.setBackdropOptions({ 'zIndex': lastZIndex - 1 }); this.reallocateBackdrop(); } } reallocateComponent() { this.view.element.nativeElement.insertAdjacentElement('afterbegin', (this.component.location.nativeElement)); } reallocateBackdrop() { this.view.element.nativeElement.insertAdjacentElement('afterbegin', this.backdrop.instance.backdrop.nativeElement); } showModal(item) { lastZIndex++; item.location.nativeElement.firstElementChild['style'].zIndex = lastZIndex; item.instance.element.nativeElement.style.display = 'block'; this.handleShowBackdrop(this.hasBackdrop(item)); this.setActiveModal(item); this.modalShow.next(); } minimize(component) { component.instance.element.nativeElement.style.display = 'none'; this.handleHideBackdrop(this.hasBackdrop(component)); this.handleActiveWindow(); } getVisibleHighestZIndex() { return this.getHighestZIndexModals(this.getZIndexModals()); } handleActiveWindow() { const highest = this.getVisibleHighestZIndex(); this.componentList.forEach((value) => { if (this.visibleModals.length === 0) { this.hideBackdrop(); return this.activeModal = null; } if (Number(value.modal.instance.modal.nativeElement.style.zIndex) === Number(highest)) { return this.setActiveModal(value.modal); } }); this.handleResetIndex(); } handleResetIndex() { if (this.componentList.length === 0) { this.resetZIndex(); } } resetZIndex() { lastZIndex = 500; } hideBackdrop() { if (this.backdrop) { this.backdrop.instance.hideBackdrop(); } } handleHideBackdrop(hasBackdrop) { if (this.backdrop && hasBackdrop) { this.backdrop.instance.hideBackdrop(); } } handleShowBackdrop(hasBackdrop) { if (this.backdrop && hasBackdrop) { this.backdrop.instance.showBackdrop(); } } getVisibleModals() { this.visibleModals = []; const modals = document.querySelectorAll('tl-modal'); for (let index = 0; index < modals.length; index++) { const element = modals[index]; if (element.style.display !== 'none') { this.visibleModals.push(modals[index]); } } return this.visibleModals; } removeBackdrop(compRef) { if (this.backdrop && this.hasBackdrop(compRef)) { this.destroyBackdrop(); } } destroyBackdrop() { if (this.backdrop) { this.backdrop.destroy(); this.view.element.nativeElement.removeChild(this.backdrop.location.nativeElement); this.backdrop = null; } } getComponentById(id) { return this.componentList.filter((item) => item.id === id)[0]; } execCallBack(result, id) { const componentModal = this.getComponentById(id); return new Promise((resolve) => { if (this.isResultUndefined(result.mdResult)) { return; } if (!(this.isMdResultEqualsOK(result.mdResult))) { this.close(id); this.handleRelativeDataSource(componentModal); } else if (componentModal.modalOptions.closeOnOK) { this.close(id); this.handleRelativeDataSource(componentModal); } this.resultCallback(componentModal, result); this.handleActiveWindow(); resolve(); }); } handleRelativeDataSource(componentModal) { if (componentModal && componentModal.smartForm && componentModal.smartForm['relativeDataSource']) { componentModal.smartForm['relativeDataSource'].setFocus(); } } resultCallback(component, result) { if (component && result) { component.eventCallback.next(result); this.handleSmartFormCallback(component, result); } } confirmDelete(component, config) { if (component.smartForm['executeAction'] === ActionsModal.DELETE) { this.referenceSmartForm = component; this.createModalDialog(window['TlDialogConfirmation'], this.referenceSmartForm.smartForm['factory'], { title: this.referenceSmartForm.smartForm['deleteTitleConfirmation'] }).then((value) => { if (value.mdResult === ModalResult.MRYES) { this.handleSmartFormCallback(this.referenceSmartForm, { formResult: this.referenceSmartForm.smartForm['dataForm'] }); } else { this.handleRelativeDataSource(component); } }); this.componentInjected.instance.message = `${this.referenceSmartForm.smartForm['deleteConfirmationMessage']} ${this.getInfoRecord()}`; return true; } return false; } isDeleteAction(component) { return component.executeAction === ActionsModal.DELETE; } getDataForm() { return this.referenceSmartForm.smartForm.dataForm; } getRecordConfig() { return this.referenceSmartForm.smartForm['recordConfig']; } getInfoRecord() { const recordConfig = this.getRecordConfig(); if (recordConfig.showOnDelete && recordConfig.keyFromDataForm) { return `<br><b>${objectPath.get(this.getDataForm(), recordConfig.keyFromDataForm)}</b>`; } return ''; } handleSmartFormCallback(component, result) { if (this.isResultNotAllowed(component.smartForm, result) || !this.isConfigSmartForm(component.smartForm)) { return; } if (this.mathActionsModal(component.smartForm).length === 0) { throw Error('The Action provided is not valid or is undefined'); } this.handleRelativeDataSource(component); this.executeAction(component.smartForm, result); } mathActionsModal(component) { return Object.keys(ActionsModal).filter((value, index, array) => ActionsModal[value] === component['executeAction']); } executeAction(smartForm, result) { const actions = { 'I': () => { smartForm['actions'].insertCall(result.formResult); }, 'U': () => { smartForm['actions'].updateCall(result.formResult); }, 'D': () => { smartForm['actions'].deleteCall(result.formResult); }, 'V': () => { smartForm['actions'].viewCall(); } }; return actions[smartForm['executeAction']](); } isResultNotAllowed(smartForm, result) { return result.mdResult === ModalResult.MRCANCEL || result.mdResult === ModalResult.MRCLOSE || !smartForm['actions']; } isResultUndefined(result) { return result === undefined; } isMdResultEqualsOK(result) { return Number(result) === Number(ModalResult.MROK); } ngOnDestroy() { lastZIndex = 1; } } /** @nocollapse */ ModalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ModalService, deps: [{ token: i1.I18nService }, { token: i2.ContainerModalService }, { token: i3.CurrentModalService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ ModalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ModalService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ModalService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.I18nService }, { type: i2.ContainerModalService }, { type: i3.CurrentModalService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL21vZGFsL3NlcnZpY2VzL21vZGFsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsT0FBTyxFQUtMLFVBQVUsR0FJWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBR25FLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFJMUQsT0FBTyxLQUFLLFVBQVUsTUFBTSxhQUFhLENBQUM7Ozs7O0FBRzFDLElBQUksVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUdyQixNQUFNLE9BQU8sWUFBWTtJQWdDdkIsWUFBb0IsV0FBd0IsRUFDeEIsY0FBcUMsRUFDckMsbUJBQXdDO1FBRnhDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBOUJyRCxrQkFBYSxHQUFvQixFQUFFLENBQUM7UUFFcEMsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBTTNCLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBZ0IxQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztJQVEzQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBb0IsRUFBRSxlQUFlLEVBQUUs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LFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQ1IsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELEdBQUcsRUFBRSxHQUFHLEVBQUU7Z0JBQ1IsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLENBQUM7U0FDRixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsU0FBNEQsRUFBRSxNQUFNO1FBQzdGLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxXQUFXLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssV0FBVyxDQUFDLE9BQU87ZUFDckYsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE1BQW1CO1FBQzNDLE9BQU8sTUFBTSxLQUFLLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBbUI7UUFDNUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsV0FBVztRQUNULFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQzs7NkhBL2lCVSxZQUFZO2lJQUFaLFlBQVk7NEZBQVosWUFBWTtrQkFEeEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gTUlUIExpY2Vuc2VcblxuIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiBTT0ZUV0FSRS5cbiAqL1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0YWJsZSxcbiAgT25EZXN0cm95LFxuICBUeXBlLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1NtYXJ0Rm9ybUNvbmZpZ3VyYXRpb259IGZyb20gJy4uL2NsYXNzZXMvbW9kYWwtc21hcnQtZm9ybSc7XG5pbXBvcnQge01vZGFsT3B0aW9uc30gZnJvbSAnLi4vaW50ZXJmYWNlcy9tb2RhbC1vcHRpb25zJztcbmltcG9ydCB7Q29udGFpbmVyTW9kYWxTZXJ2aWNlfSBmcm9tICcuLi9hZGRvbnMvY29udGFpbmVyLW1vZGFsL2NvbnRhaW5lci1tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7VGxNb2RhbH0gZnJvbSAnLi4vbW9kYWwnO1xuaW1wb3J0IHtUbEJhY2tkcm9wfSBmcm9tICcuLi8uLi9jb3JlL2NvbXBvbmVudHMvYmFja2Ryb3AvYmFja2Ryb3AnO1xuaW1wb3J0IHtBY3Rpb25zTW9kYWx9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvYWN0aW9ucy1tb2RhbCc7XG5pbXBvcnQge01vZGFsUmVzdWx0fSBmcm9tICcuLi8uLi9jb3JlL2VudW1zL21vZGFsLXJlc3VsdCc7XG5pbXBvcnQge01vZGFsRm9ybUNvbmZpZ30gZnJvbSAnLi4vaW50ZXJmYWNlcy9tb2RhbC1zbWFydC1mb3JtLWNvbmZpZyc7XG5pbXBvcnQge01vZGFsSW5zdGFuY2V9IGZyb20gJy4uL2ludGVyZmFjZXMvbW9kYWwtaW5zdGFuY2UnO1xuaW1wb3J0IHtJMThuU2VydmljZX0gZnJvbSAnLi4vLi4vaTE4bi9pMThuLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgb2JqZWN0UGF0aCBmcm9tICdvYmplY3QtcGF0aCc7XG5pbXBvcnQgeyBDdXJyZW50TW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi9jdXJyZW50LW1vZGFsLnNlcnZpY2UnO1xuXG5sZXQgbGFzdFpJbmRleCA9IDUwMDtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vZGFsU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIGluc3RhbmNlQ29tcG9uZW50OiBNb2RhbEluc3RhbmNlO1xuXG4gIHB1YmxpYyBjb21wb25lbnRMaXN0OiBNb2RhbEluc3RhbmNlW10gPSBbXTtcblxuICBwdWJsaWMgY2hhbmdlTW9kYWwgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBhY3RpdmVNb2RhbDogQ29tcG9uZW50UmVmPGFueT47XG5cbiAgcHVibGljIGNvbXBvbmVudEluamVjdGVkOiBDb21wb25lbnRSZWY8YW55PjtcblxuICBwcml2YXRlIG1vZGFsU2hvdyA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBjb21wb25lbnQ6IENvbXBvbmVudFJlZjxUbE1vZGFsPjtcblxuICBwcml2YXRlIHZpZXc6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgcHJpdmF0ZSBtb2RhbENvbmZpZ3VyYXRpb246IFNtYXJ0Rm9ybUNvbmZpZ3VyYXRpb247XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZE1vZGFsOiBNb2RhbEluc3RhbmNlO1xuXG4gIHByaXZhdGUgbW9kYWxPcHRpb25zOiBNb2RhbE9wdGlvbnM7XG5cbiAgcHJpdmF0ZSBiYWNrZHJvcDogQ29tcG9uZW50UmVmPFRsQmFja2Ryb3A+O1xuXG4gIHByaXZhdGUgZXZlbnRDYWxsYmFjazogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgcHJpdmF0ZSB2aXNpYmxlTW9kYWxzID0gW107XG5cbiAgcHJpdmF0ZSByZWZlcmVuY2VTbWFydEZvcm07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29udGFpbmVyTW9kYWw6IENvbnRhaW5lck1vZGFsU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjdXJyZW50TW9kYWxTZXJ2aWNlOiBDdXJyZW50TW9kYWxTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgY3JlYXRlTW9kYWxEaWFsb2coY29tcG9uZW50OiBUeXBlPGFueT4sIGZhY3RvcnlSZXNvbHZlciwgbWRPcHRpb25zPzogTW9kYWxPcHRpb25zKSB7XG4gICAgdGhpcy52aWV3ID0gdGhpcy5jb250YWluZXJNb2RhbC52aWV3O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zZXRDb21wb25lbnRNb2RhbChjb21wb25lbnQsIGZhY3RvcnlSZXNvbHZlciwgbnVsbCwgbnVsbCwgbWRPcHRpb25zKTtcbiAgICAgIHRoaXMuaGFuZGxlQ2FsbGJhY2tNb2RhbChyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZU1vZGFsKGNvbXBvbmVudDogVHlwZTxhbnk+LCBmYWN0b3J5T3JDb25maWc6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgICAgaWRlbnRpZmllcjogc3RyaW5nID0gJycsIHByb3BlcnRpZXM/OiB7fSwgcGFyZW50RWxlbWVudDogRWxlbWVudFJlZiA9IG51bGwsIG1kT3B0aW9ucz86IE1vZGFsT3B0aW9ucykge1xuICAgIHRoaXMudmlldyA9IHRoaXMuY29udGFpbmVyTW9kYWwudmlldztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc2V0Q29tcG9uZW50TW9kYWwoY29tcG9uZW50LCBmYWN0b3J5T3JDb25maWcsIGlkZW50aWZpZXIsIHBhcmVudEVsZW1lbnQsIG1kT3B0aW9ucywgcHJvcGVydGllcyk7XG4gICAgICB0aGlzLmhhbmRsZUNhbGxiYWNrTW9kYWwocmVzb2x2ZSk7XG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVTbWFydEZvcm1Nb2RhbChjb21wb25lbnQ6IFR5cGU8YW55PiwgZm9ybUNvbmZpZzogTW9kYWxGb3JtQ29uZmlnLCBtZE9wdGlvbnM/OiBNb2RhbE9wdGlvbnMpIHtcbiAgICB0aGlzLnZpZXcgPSB0aGlzLmNvbnRhaW5lck1vZGFsLnZpZXc7XG4gICAgdGhpcy5tb2RhbENvbmZpZ3VyYXRpb24gPSBPYmplY3QuYXNzaWduKG5ldyBTbWFydEZvcm1Db25maWd1cmF0aW9uKCksIGZvcm1Db25maWcpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zZXRDb21wb25lbnRNb2RhbChjb21wb25lbnQsIHRoaXMubW9kYWxDb25maWd1cmF0aW9uLCBudWxsLCBudWxsLCBtZE9wdGlvbnMpO1xuICAgICAgdGhpcy5oYW5kbGVDYWxsYmFja01vZGFsKHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYWxsYmFja01vZGFsKHJlc29sdmUpIHtcbiAgICBpZiAodGhpcy5pbnN0YW5jZ