ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
176 lines • 25.7 kB
JavaScript
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=