UNPKG

ontimize-web-ngx

Version:
176 lines 25.7 kB
import { EventEmitter, Injectable, Injector } from '@angular/core'; import { NavigationStart, Router } from '@angular/router'; import { AppConfig } from '../config/app-config'; import { ObservableWrapper } from '../util/async'; import { Util } from '../util/util'; import { AuthService } from './auth.service'; import * as i0 from "@angular/core"; export class LocalStorageService { constructor(injector) { this.injector = injector; this.onRouteChange = new EventEmitter(); this.onSetLocalStorage = new EventEmitter(); this._config = this.injector.get(AppConfig).getConfiguration(); this._router = this.injector.get(Router); this.authService = this.injector.get(AuthService); const self = this; this._router.events.subscribe(event => { if (event instanceof NavigationStart) { ObservableWrapper.callEmit(self.onRouteChange, {}); } }); } getComponentStorage(comp, routeKey) { const componentKey = comp.getComponentKey(); let completeKey = componentKey; if (routeKey) { completeKey += '_' + routeKey; } return this.getAppComponentData(completeKey) || {}; } updateComponentStorage(comp, routeKey) { const dataToStore = comp.getDataToStore(); const componentKey = comp.getComponentKey(); if (!Util.isDefined(componentKey)) { return; } let completeKey = componentKey; if (routeKey) { completeKey += '_' + routeKey; } const storedObject = {}; for (const prop in dataToStore) { if (dataToStore.hasOwnProperty(prop)) { storedObject[prop] = dataToStore[prop]; } } this.updateAppComponentStorage(completeKey, storedObject); } getAppComponentData(key) { let componentData; const storedComponents = this.getSessionUserComponentsData() || {}; if (storedComponents[key]) { if (Object.keys(storedComponents[key]).length !== 0) { const decoded = atob((storedComponents[key])); try { componentData = JSON.parse(decoded); } catch (e) { componentData = undefined; } } } return componentData; } updateAppComponentStorage(componentKey, componentData) { let componentDataB64; try { componentDataB64 = btoa(Util.stringify(componentData)); } catch (e) { componentDataB64 = undefined; } this.storeComponentInSessionUser(componentKey, componentDataB64); } getSessionUserComponentsData() { let storedComponentsByUser = {}; const appData = this.getStoredData(); const session = appData[LocalStorageService.SESSION_STORAGE_KEY] || {}; const users = appData[LocalStorageService.USERS_STORAGE_KEY] || {}; storedComponentsByUser = (users[session.user] || {})[LocalStorageService.COMPONENTS_STORAGE_KEY] || {}; return storedComponentsByUser; } storeSessionUserComponentsData(componentsData) { const appData = this.getStoredData(); const session = appData[LocalStorageService.SESSION_STORAGE_KEY] || {}; if (!Util.isDefined(appData[LocalStorageService.USERS_STORAGE_KEY])) { appData[LocalStorageService.USERS_STORAGE_KEY] = {}; } const userData = appData[LocalStorageService.USERS_STORAGE_KEY][session.user] || {}; userData[LocalStorageService.COMPONENTS_STORAGE_KEY] = componentsData; appData[LocalStorageService.USERS_STORAGE_KEY][session.user] = userData; this.setLocalStorage(appData); } storeComponentInSessionUser(componentKey, componentDataB64) { const appData = this.getStoredData(); const session = appData[LocalStorageService.SESSION_STORAGE_KEY] || {}; if (!Util.isDefined(this.authService)) { this.authService = this.injector.get(AuthService); } const users = appData[LocalStorageService.USERS_STORAGE_KEY] || {}; const idUser = session.user || this.authService.getSessionInfo()?.user; if (!Util.isDefined(idUser)) { return; } const user = users[idUser] || {}; let componentsData = {}; if (users[idUser]) { componentsData = users[idUser][LocalStorageService.COMPONENTS_STORAGE_KEY] || {}; } componentsData[componentKey] = componentDataB64 || {}; user[LocalStorageService.COMPONENTS_STORAGE_KEY] = componentsData; users[idUser] = user; appData[LocalStorageService.USERS_STORAGE_KEY] = users; this.setLocalStorage(appData); } getStoredData() { let appData = {}; const appStoredData = localStorage.getItem(this._config.uuid); if (appStoredData) { try { appData = JSON.parse(appStoredData); } catch (e) { appData = {}; } } return appData; } setBackwardCompatibility() { const appData = this.getStoredData(); const session = appData[LocalStorageService.SESSION_STORAGE_KEY]; if (!Util.isDefined(session) || !Util.isDefined(session.user)) { return; } const componentsInfo = appData[LocalStorageService.COMPONENTS_STORAGE_KEY] || {}; let usersObject = {}; const existsUsersTag = Util.isDefined(appData[LocalStorageService.USERS_STORAGE_KEY]); let createUserInfo = existsUsersTag; if (existsUsersTag) { usersObject = appData[LocalStorageService.USERS_STORAGE_KEY]; createUserInfo = !Util.isDefined(appData[LocalStorageService.USERS_STORAGE_KEY][session.user]); } if (createUserInfo) { usersObject[session.user] = {}; usersObject[session.user][LocalStorageService.COMPONENTS_STORAGE_KEY] = componentsInfo; appData[LocalStorageService.USERS_STORAGE_KEY] = usersObject; try { localStorage.setItem(this._config.uuid, Util.stringify(appData)); } catch (e) { console.error("Cannot set new item in localStorage. Error: " + e); } } } setLocalStorage(appData) { this.onSetLocalStorage.emit(); try { localStorage.setItem(this._config.uuid, Util.stringify(appData)); } catch (e) { console.error("Cannot set new item in localStorage. Error: " + e); } } removeStoredData() { localStorage.removeItem(this._config.uuid); } } LocalStorageService.COMPONENTS_STORAGE_KEY = 'components'; LocalStorageService.USERS_STORAGE_KEY = 'users'; LocalStorageService.SESSION_STORAGE_KEY = 'session'; LocalStorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocalStorageService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); LocalStorageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocalStorageService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocalStorageService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFJakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUk3QyxNQUFNLE9BQU8sbUJBQW1CO0lBYTlCLFlBQXNCLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFSakMsa0JBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0RCxzQkFBaUIsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVEvRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFZLFNBQTRCLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQVMsTUFBc0IsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQWMsV0FBZ0MsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLE1B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QVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIEluamVjdG9yLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEFwcENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9hcHAtY29uZmlnJztcbmltcG9ydCB7IElMb2NhbFN0b3JhZ2VDb21wb25lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2xvY2FsLXN0b3JhZ2UtY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb25maWcudHlwZSc7XG5pbXBvcnQgeyBTZXNzaW9uSW5mbyB9IGZyb20gJy4uL3R5cGVzL3Nlc3Npb24taW5mby50eXBlJztcbmltcG9ydCB7IE9ic2VydmFibGVXcmFwcGVyIH0gZnJvbSAnLi4vdXRpbC9hc3luYyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUxvY2FsU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2xvY2FsLXNlcnZpY2UuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZVNlcnZpY2UgaW1wbGVtZW50cyBJTG9jYWxTdG9yYWdlU2VydmljZSB7XG4gIHN0YXRpYyBDT01QT05FTlRTX1NUT1JBR0VfS0VZOiBzdHJpbmcgPSAnY29tcG9uZW50cyc7XG4gIHN0YXRpYyBVU0VSU19TVE9SQUdFX0tFWTogc3RyaW5nID0gJ3VzZXJzJztcbiAgc3RhdGljIFNFU1NJT05fU1RPUkFHRV9LRVk6IHN0cmluZyA9ICdzZXNzaW9uJztcblxuICBwdWJsaWMgb25Sb3V0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBvblNldExvY2FsU3RvcmFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBDb25maWc7XG4gIHByaXZhdGUgX3JvdXRlcjogUm91dGVyO1xuICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZTtcblxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLmluamVjdG9yLmdldDxBcHBDb25maWc+KEFwcENvbmZpZyBhcyBUeXBlPEFwcENvbmZpZz4pLmdldENvbmZpZ3VyYXRpb24oKTtcbiAgICB0aGlzLl9yb3V0ZXIgPSB0aGlzLmluamVjdG9yLmdldDxSb3V0ZXI+KFJvdXRlciBhcyBUeXBlPFJvdXRlcj4pO1xuICAgIHRoaXMuYXV0aFNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxBdXRoU2VydmljZT4oQXV0aFNlcnZpY2UgYXMgVHlwZTxBdXRoU2VydmljZT4pO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3JvdXRlci5ldmVudHMuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdChzZWxmLm9uUm91dGVDaGFuZ2UsIHt9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbXBvbmVudFN0b3JhZ2UoY29tcDogSUxvY2FsU3RvcmFnZUNvbXBvbmVudCwgcm91dGVLZXk/OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGNvbXBvbmVudEtleSA9IGNvbXAuZ2V0Q29tcG9uZW50S2V5KCk7XG4gICAgbGV0IGNvbXBsZXRlS2V5ID0gY29tcG9uZW50S2V5O1xuICAgIGlmIChyb3V0ZUtleSkge1xuICAgICAgY29tcGxldGVLZXkgKz0gJ18nICsgcm91dGVLZXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudERhdGEoY29tcGxldGVLZXkpIHx8IHt9O1xuICB9XG5cbiAgdXBkYXRlQ29tcG9uZW50U3RvcmFnZShjb21wOiBJTG9jYWxTdG9yYWdlQ29tcG9uZW50LCByb3V0ZUtleT86IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGFUb1N0b3JlID0gY29tcC5nZXREYXRhVG9TdG9yZSgpO1xuICAgIGNvbnN0IGNvbXBvbmVudEtleSA9IGNvbXAuZ2V0Q29tcG9uZW50S2V5KCk7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChjb21wb25lbnRLZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBjb21wbGV0ZUtleSA9IGNvbXBvbmVudEtleTtcbiAgICBpZiAocm91dGVLZXkpIHtcbiAgICAgIGNvbXBsZXRlS2V5ICs9ICdfJyArIHJvdXRlS2V5O1xuICAgIH1cbiAgICBjb25zdCBzdG9yZWRPYmplY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gZGF0YVRvU3RvcmUpIHtcbiAgICAgIGlmIChkYXRhVG9TdG9yZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICBzdG9yZWRPYmplY3RbcHJvcF0gPSBkYXRhVG9TdG9yZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVBcHBDb21wb25lbnRTdG9yYWdlKGNvbXBsZXRlS2V5LCBzdG9yZWRPYmplY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBcHBDb21wb25lbnREYXRhKGtleTogc3RyaW5nKTogb2JqZWN0IHtcbiAgICBsZXQgY29tcG9uZW50RGF0YTtcbiAgICBjb25zdCBzdG9yZWRDb21wb25lbnRzOiBvYmplY3QgPSB0aGlzLmdldFNlc3Npb25Vc2VyQ29tcG9uZW50c0RhdGEoKSB8fCB7fTtcbiAgICBpZiAoc3RvcmVkQ29tcG9uZW50c1trZXldKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoc3RvcmVkQ29tcG9uZW50c1trZXldKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGF0b2IoKHN0b3JlZENvbXBvbmVudHNba2V5XSkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbXBvbmVudERhdGEgPSBKU09OLnBhcnNlKGRlY29kZWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29tcG9uZW50RGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudERhdGE7XG4gIH1cblxuICB1cGRhdGVBcHBDb21wb25lbnRTdG9yYWdlKGNvbXBvbmVudEtleTogc3RyaW5nLCBjb21wb25lbnREYXRhOiBvYmplY3QpIHtcbiAgICBsZXQgY29tcG9uZW50RGF0YUI2NDtcbiAgICB0cnkge1xuICAgICAgY29tcG9uZW50RGF0YUI2NCA9IGJ0b2EoVXRpbC5zdHJpbmdpZnkoY29tcG9uZW50RGF0YSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbXBvbmVudERhdGFCNjQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuc3RvcmVDb21wb25lbnRJblNlc3Npb25Vc2VyKGNvbXBvbmVudEtleSwgY29tcG9uZW50RGF0YUI2NCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2Vzc2lvblVzZXJDb21wb25lbnRzRGF0YSgpOiBvYmplY3Qge1xuICAgIGxldCBzdG9yZWRDb21wb25lbnRzQnlVc2VyID0ge307XG4gICAgY29uc3QgYXBwRGF0YSA9IHRoaXMuZ2V0U3RvcmVkRGF0YSgpO1xuICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb25JbmZvID0gYXBwRGF0YVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLlNFU1NJT05fU1RPUkFHRV9LRVldIHx8IHt9O1xuICAgIGNvbnN0IHVzZXJzID0gYXBwRGF0YVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLlVTRVJTX1NUT1JBR0VfS0VZXSB8fCB7fTtcbiAgICBzdG9yZWRDb21wb25lbnRzQnlVc2VyID0gKHVzZXJzW3Nlc3Npb24udXNlcl0gfHwge30pW0xvY2FsU3RvcmFnZVNlcnZpY2UuQ09NUE9ORU5UU19TVE9SQUdFX0tFWV0gfHwge307XG4gICAgcmV0dXJuIHN0b3JlZENvbXBvbmVudHNCeVVzZXI7XG4gIH1cblxuICBwdWJsaWMgc3RvcmVTZXNzaW9uVXNlckNvbXBvbmVudHNEYXRhKGNvbXBvbmVudHNEYXRhOiBvYmplY3QpIHtcbiAgICBjb25zdCBhcHBEYXRhID0gdGhpcy5nZXRTdG9yZWREYXRhKCk7XG4gICAgY29uc3Qgc2Vzc2lvbjogU2Vzc2lvbkluZm8gPSBhcHBEYXRhW0xvY2FsU3RvcmFnZVNlcnZpY2UuU0VTU0lPTl9TVE9SQUdFX0tFWV0gfHwge307XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChhcHBEYXRhW0xvY2FsU3RvcmFnZVNlcnZpY2UuVVNFUlNfU1RPUkFHRV9LRVldKSkge1xuICAgICAgYXBwRGF0YVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLlVTRVJTX1NUT1JBR0VfS0VZXSA9IHt9O1xuICAgIH1cbiAgICBjb25zdCB1c2VyRGF0YSA9IGFwcERhdGFbTG9jYWxTdG9yYWdlU2VydmljZS5VU0VSU19TVE9SQUdFX0tFWV1bc2Vzc2lvbi51c2VyXSB8fCB7fTtcbiAgICB1c2VyRGF0YVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLkNPTVBPTkVOVFNfU1RPUkFHRV9LRVldID0gY29tcG9uZW50c0RhdGE7XG4gICAgYXBwRGF0YVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLlVTRVJTX1NUT1JBR0VfS0VZXVtzZXNzaW9uLnVzZXJdID0gdXNlckRhdGE7XG4gICAgdGhpcy5zZXRMb2NhbFN0b3JhZ2UoYXBwRGF0YSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3JlQ29tcG9uZW50SW5TZXNzaW9uVXNlcihjb21wb25lbnRLZXksIGNvbXBvbmVudERhdGFCNjQpIHtcbiAgICBjb25zdCBhcHBEYXRhID0gdGhpcy5nZXRTdG9yZWREYXRhKCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGFwcERhdGFbTG9jYWxTdG9yYWdlU2VydmljZS5TRVNTSU9OX1NUT1JBR0VfS0VZXSB8fCB7fTsgLy8gdXVpZCAtPiBzZXNzaW9uXG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh0aGlzLmF1dGhTZXJ2aWNlKSkge1xuICAgICAgdGhpcy5hdXRoU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PEF1dGhTZXJ2aWNlPihBdXRoU2VydmljZSBhcyBUeXBlPEF1dGhTZXJ2aWNlPik7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJzID0gYXBwRGF0YVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLlVTRVJTX1NUT1JBR0VfS0VZXSB8fCB7fTsgLy8gdXVpZCAtPiB1c2Vyc1xuICAgIGNvbnN0IGlkVXNlciA9IHNlc3Npb24udXNlciB8fCB0aGlzLmF1dGhTZXJ2aWNlLmdldFNlc3Npb25JbmZvKCk/LnVzZXI7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChpZFVzZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVzZXIgPSB1c2Vyc1tpZFVzZXJdIHx8IHt9OyAvLyB1dWlkIC0+IHVzZXJzLT4gdXNlclxuXG4gICAgbGV0IGNvbXBvbmVudHNEYXRhID0ge307XG4gICAgaWYgKHVzZXJzW2lkVXNlcl0pIHtcbiAgICAgIGNvbXBvbmVudHNEYXRhID0gdXNlcnNbaWRVc2VyXVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLkNPTVBPTkVOVFNfU1RPUkFHRV9LRVldIHx8IHt9O1xuICAgIH1cbiAgICBjb21wb25lbnRzRGF0YVtjb21wb25lbnRLZXldID0gY29tcG9uZW50RGF0YUI2NCB8fCB7fTtcblxuICAgIHVzZXJbTG9jYWxTdG9yYWdlU2VydmljZS5DT01QT05FTlRTX1NUT1JBR0VfS0VZXSA9IGNvbXBvbmVudHNEYXRhO1xuICAgIHVzZXJzW2lkVXNlcl0gPSB1c2VyO1xuICAgIGFwcERhdGFbTG9jYWxTdG9yYWdlU2VydmljZS5VU0VSU19TVE9SQUdFX0tFWV0gPSB1c2VycztcblxuICAgIHRoaXMuc2V0TG9jYWxTdG9yYWdlKGFwcERhdGEpO1xuICB9XG5cbiAgcHVibGljIGdldFN0b3JlZERhdGEoKTogb2JqZWN0IHtcbiAgICBsZXQgYXBwRGF0YSA9IHt9O1xuICAgIGNvbnN0IGFwcFN0b3JlZERhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLl9jb25maWcudXVpZCk7XG4gICAgaWYgKGFwcFN0b3JlZERhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcERhdGEgPSBKU09OLnBhcnNlKGFwcFN0b3JlZERhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBhcHBEYXRhID0ge307XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcHBEYXRhO1xuICB9XG5cbiAgcHVibGljIHNldEJhY2t3YXJkQ29tcGF0aWJpbGl0eSgpIHtcbiAgICBjb25zdCBhcHBEYXRhID0gdGhpcy5nZXRTdG9yZWREYXRhKCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGFwcERhdGFbTG9jYWxTdG9yYWdlU2VydmljZS5TRVNTSU9OX1NUT1JBR0VfS0VZXTtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHNlc3Npb24pIHx8ICFVdGlsLmlzRGVmaW5lZChzZXNzaW9uLnVzZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbXBvbmVudHNJbmZvID0gYXBwRGF0YVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLkNPTVBPTkVOVFNfU1RPUkFHRV9LRVldIHx8IHt9O1xuICAgIGxldCB1c2Vyc09iamVjdCA9IHt9O1xuICAgIGNvbnN0IGV4aXN0c1VzZXJzVGFnID0gVXRpbC5pc0RlZmluZWQoYXBwRGF0YVtMb2NhbFN0b3JhZ2VTZXJ2aWNlLlVTRVJTX1NUT1JBR0VfS0VZXSk7XG4gICAgbGV0IGNyZWF0ZVVzZXJJbmZvID0gZXhpc3RzVXNlcnNUYWc7XG4gICAgaWYgKGV4aXN0c1VzZXJzVGFnKSB7XG4gICAgICB1c2Vyc09iamVjdCA9IGFwcERhdGFbTG9jYWxTdG9yYWdlU2VydmljZS5VU0VSU19TVE9SQUdFX0tFWV07XG4gICAgICBjcmVhdGVVc2VySW5mbyA9ICFVdGlsLmlzRGVmaW5lZChhcHBEYXRhW0xvY2FsU3RvcmFnZVNlcnZpY2UuVVNFUlNfU1RPUkFHRV9LRVldW3Nlc3Npb24udXNlcl0pO1xuICAgIH1cbiAgICBpZiAoY3JlYXRlVXNlckluZm8pIHtcbiAgICAgIHVzZXJzT2JqZWN0W3Nlc3Npb24udXNlcl0gPSB7fTtcbiAgICAgIHVzZXJzT2JqZWN0W3Nlc3Npb24udXNlcl1bTG9jYWxTdG9yYWdlU2VydmljZS5DT01QT05FTlRTX1NUT1JBR0VfS0VZXSA9IGNvbXBvbmVudHNJbmZvO1xuXG4gICAgICBhcHBEYXRhW0xvY2FsU3RvcmFnZVNlcnZpY2UuVVNFUlNfU1RPUkFHRV9LRVldID0gdXNlcnNPYmplY3Q7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLl9jb25maWcudXVpZCwgVXRpbC5zdHJpbmdpZnkoYXBwRGF0YSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNldCBuZXcgaXRlbSBpbiBsb2NhbFN0b3JhZ2UuIEVycm9yOiBcIiArIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldExvY2FsU3RvcmFnZShhcHBEYXRhOiBhbnkpIHtcbiAgICB0aGlzLm9uU2V0TG9jYWxTdG9yYWdlLmVtaXQoKTtcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5fY29uZmlnLnV1aWQsIFV0aWwuc3RyaW5naWZ5KGFwcERhdGEpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IHNldCBuZXcgaXRlbSBpbiBsb2NhbFN0b3JhZ2UuIEVycm9yOiBcIiArIGUpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVN0b3JlZERhdGEoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5fY29uZmlnLnV1aWQpO1xuICB9XG59XG4iXX0=