ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
140 lines • 19.9 kB
JavaScript
import { Injectable, Injector } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
import { Subject } from 'rxjs';
import { AppConfig } from '../config/app-config';
import { Codes } from '../util/codes';
import { Util } from '../util/util';
import { PermissionsService } from './permissions/permissions.service';
import * as i0 from "@angular/core";
export class AppMenuService {
constructor(injector) {
this.injector = injector;
this.onClick = new Subject;
this.onPermissionMenuChanged = new Subject();
this._config = this.injector.get(AppConfig);
this.router = this.injector.get(Router);
this.router.events.subscribe((event) => {
if (event instanceof NavigationEnd) {
this.setActiveItem();
}
});
this.setMenuItemsByMenuConfiguration();
this.permissionsService = this.injector.get(PermissionsService);
this.permissionsService.onChangePermissions.subscribe(x => {
this.mergeMenuItemsWithPermissions();
this.onPermissionMenuChanged.next();
});
}
setMenuItemsByMenuConfiguration() {
const defaultMenuConfiguration = Util.cloneArray(this._config.getMenuConfiguration());
this.MENU_ROOTS = defaultMenuConfiguration;
this.ALL_MENU_ITEMS = [];
for (let i = 0, len = this.MENU_ROOTS.length; i < len; i++) {
const item = this.MENU_ROOTS[i];
this.ALL_MENU_ITEMS = this.ALL_MENU_ITEMS.concat(this.getMenuItems(item));
}
}
mergeMenuItemsWithPermissions() {
this.setMenuItemsByMenuConfiguration();
const permissionsMenu = this.permissionsService.getAllMenuPermissions();
if (Util.isDefined(permissionsMenu)) {
this.MENU_ROOTS = [...this.MENU_ROOTS.map(menu => {
const indexPermission = permissionsMenu.findIndex(permission => permission.attr === menu.id);
if (indexPermission > -1) {
menu.visible = permissionsMenu[indexPermission].visible;
}
return menu;
})];
this.ALL_MENU_ITEMS = [...this.ALL_MENU_ITEMS.map(menu => {
const indexPermission = permissionsMenu.findIndex(permission => permission.attr === menu.id);
if (indexPermission > -1) {
menu.visible = permissionsMenu[indexPermission].visible;
}
return menu;
})];
}
}
getMenuRoots() {
return this.MENU_ROOTS;
}
getMenuRootById(id) {
return this.MENU_ROOTS.find(c => c.id === id);
}
getAllMenuItems() {
return this.ALL_MENU_ITEMS;
}
getMenuItemById(id) {
return this.ALL_MENU_ITEMS.find(i => i.id === id);
}
getMenuItemType(item) {
let type;
switch (true) {
case (item.route === Codes.LOGIN_ROUTE):
type = 'logout';
break;
case (item.action !== undefined):
type = 'action';
break;
case (item.locale !== undefined):
type = 'locale';
break;
case (item.user !== undefined):
type = 'user-info';
break;
case (item.items !== undefined):
type = 'group';
break;
default:
type = 'default';
break;
}
return type;
}
isMenuGroup(item) {
return this.getMenuItemType(item) === 'group';
}
isMenuGroupRoute(item) {
return this.getMenuItemType(item) === 'group' && item.hasOwnProperty('route');
}
isItemActive(item) {
return this.activeItem && this.activeItem.route === item.route;
}
isRouteItem(item) {
return Util.isDefined(item.route);
}
isVisible(item) {
return !Util.isDefined(item.visible) || (Util.isDefined(item.visible) && item.visible);
}
getMenuItems(item) {
const menuGroup = item;
const items = menuGroup.items;
if (items !== undefined) {
if (this.isMenuGroupRoute(menuGroup)) {
return [item].concat(items);
}
return items;
}
return [item];
}
setActiveItem() {
let activeItem;
const routeItems = this.ALL_MENU_ITEMS.filter(item => this.isRouteItem(item));
const pathMatchFullItems = routeItems.filter(item => item.pathMatch === 'full');
if (pathMatchFullItems.length > 0) {
activeItem = pathMatchFullItems.find(item => item.route === this.router.url);
}
if (!activeItem) {
activeItem = routeItems.find(item => this.router.url.startsWith(item.route));
}
this.activeItem = activeItem;
}
}
AppMenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppMenuService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
AppMenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppMenuService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppMenuService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i0.Injector }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLW1lbnUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9zZXJ2aWNlcy9hcHAtbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFZakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOztBQUt2RSxNQUFNLE9BQU8sY0FBYztJQVl6QixZQUFzQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBSGpDLFlBQU8sR0FBa0IsSUFBSSxPQUFhLENBQUM7UUFDM0MsNEJBQXVCLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFHNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3JDLElBQUksS0FBSyxZQUFZLGFBQWEsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3RCO1FB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QUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNoRixJQUFJLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5RTtRQUNELElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUM5RTtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7OzRHQXpKVSxjQUFjO2dIQUFkLGNBQWMsY0FGYixNQUFNOzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFwcENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9hcHAtY29uZmlnJztcbmltcG9ydCB7XG4gIE1lbnVDb21tb25JdGVtLFxuICBNZW51R3JvdXAsXG4gIE1lbnVJdGVtLFxuICBNZW51SXRlbUFjdGlvbixcbiAgTWVudUl0ZW1Mb2NhbGUsXG4gIE1lbnVJdGVtTG9nb3V0LFxuICBNZW51SXRlbVJvdXRlLFxuICBNZW51SXRlbVVzZXJJbmZvXG59IGZyb20gJy4uL2ludGVyZmFjZXMvYXBwLW1lbnUuaW50ZXJmYWNlJztcbmltcG9ydCB7IE1lbnVSb290SXRlbSB9IGZyb20gJy4uL3R5cGVzL21lbnUtcm9vdC1pdGVtLnR5cGUnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuLi91dGlsL2NvZGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgUGVybWlzc2lvbnNTZXJ2aWNlIH0gZnJvbSAnLi9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXBwTWVudVNlcnZpY2Uge1xuXG4gIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcjtcbiAgcHJvdGVjdGVkIF9jb25maWc6IEFwcENvbmZpZztcbiAgcHJvdGVjdGVkIE1FTlVfUk9PVFM6IE1lbnVSb290SXRlbVtdO1xuICBwcm90ZWN0ZWQgQUxMX01FTlVfSVRFTVM6IE1lbnVSb290SXRlbVtdO1xuICBwcm90ZWN0ZWQgYWN0aXZlSXRlbTogTWVudUl0ZW1Sb3V0ZTtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zU2VydmljZTogUGVybWlzc2lvbnNTZXJ2aWNlO1xuXG4gIHB1YmxpYyBvbkNsaWNrOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD47XG4gIHB1YmxpYyBvblBlcm1pc3Npb25NZW51Q2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFwcENvbmZpZyk7XG4gICAgdGhpcy5yb3V0ZXIgPSB0aGlzLmluamVjdG9yLmdldChSb3V0ZXIpO1xuICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlSXRlbSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXRNZW51SXRlbXNCeU1lbnVDb25maWd1cmF0aW9uKCk7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25zU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KFBlcm1pc3Npb25zU2VydmljZSk7XG4gICAgdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2Uub25DaGFuZ2VQZXJtaXNzaW9ucy5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICB0aGlzLm1lcmdlTWVudUl0ZW1zV2l0aFBlcm1pc3Npb25zKCk7XG4gICAgICB0aGlzLm9uUGVybWlzc2lvbk1lbnVDaGFuZ2VkLm5leHQoKVxuICAgIH0pO1xuXG4gIH1cblxuICBzZXRNZW51SXRlbXNCeU1lbnVDb25maWd1cmF0aW9uKCkge1xuICAgIC8qXG4gICAgICBzcHJlYWQgb3BlcmF0b3IgKC4uLikgaW4gYXJyYXkgbXVsdGktbGV2ZWwgbm90IHdvcmtzXG4gICAgICBKU09OLnBhcnNlIGFuZCBKU09OLnN0cmluZ2lmeSBhcmUgdGhlIHNwZWNpZmljIG1ldGhvZHMgdXNlZCBmb3IgbXVsdGktbGV2ZWwgZGVlcCBjb3B5aW5nXG4gICAgKi9cbiAgICBjb25zdCBkZWZhdWx0TWVudUNvbmZpZ3VyYXRpb24gPSBVdGlsLmNsb25lQXJyYXkodGhpcy5fY29uZmlnLmdldE1lbnVDb25maWd1cmF0aW9uKCkpO1xuICAgIHRoaXMuTUVOVV9ST09UUyA9IGRlZmF1bHRNZW51Q29uZmlndXJhdGlvbjtcbiAgICB0aGlzLkFMTF9NRU5VX0lURU1TID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuTUVOVV9ST09UUy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgaXRlbTogTWVudVJvb3RJdGVtID0gdGhpcy5NRU5VX1JPT1RTW2ldO1xuICAgICAgdGhpcy5BTExfTUVOVV9JVEVNUyA9IHRoaXMuQUxMX01FTlVfSVRFTVMuY29uY2F0KHRoaXMuZ2V0TWVudUl0ZW1zKGl0ZW0pKTtcbiAgICB9XG4gIH1cblxuICBtZXJnZU1lbnVJdGVtc1dpdGhQZXJtaXNzaW9ucygpIHtcblxuICAgIHRoaXMuc2V0TWVudUl0ZW1zQnlNZW51Q29uZmlndXJhdGlvbigpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zTWVudSA9IHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlLmdldEFsbE1lbnVQZXJtaXNzaW9ucygpO1xuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHBlcm1pc3Npb25zTWVudSkpIHtcbiAgICAgIHRoaXMuTUVOVV9ST09UUyA9IFsuLi50aGlzLk1FTlVfUk9PVFMubWFwKG1lbnUgPT4ge1xuICAgICAgICBjb25zdCBpbmRleFBlcm1pc3Npb24gPSBwZXJtaXNzaW9uc01lbnUuZmluZEluZGV4KHBlcm1pc3Npb24gPT4gcGVybWlzc2lvbi5hdHRyID09PSBtZW51LmlkKTtcbiAgICAgICAgaWYgKGluZGV4UGVybWlzc2lvbiA+IC0xKSB7XG4gICAgICAgICAgbWVudS52aXNpYmxlID0gcGVybWlzc2lvbnNNZW51W2luZGV4UGVybWlzc2lvbl0udmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVudTtcbiAgICAgIH0pXTtcblxuICAgICAgdGhpcy5BTExfTUVOVV9JVEVNUyA9IFsuLi50aGlzLkFMTF9NRU5VX0lURU1TLm1hcChtZW51ID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhQZXJtaXNzaW9uID0gcGVybWlzc2lvbnNNZW51LmZpbmRJbmRleChwZXJtaXNzaW9uID0+IHBlcm1pc3Npb24uYXR0ciA9PT0gbWVudS5pZCk7XG4gICAgICAgIGlmIChpbmRleFBlcm1pc3Npb24gPiAtMSkge1xuICAgICAgICAgIG1lbnUudmlzaWJsZSA9IHBlcm1pc3Npb25zTWVudVtpbmRleFBlcm1pc3Npb25dLnZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbnU7XG4gICAgICB9KV07XG4gICAgfVxuICB9XG5cbiAgZ2V0TWVudVJvb3RzKCk6IE1lbnVSb290SXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5NRU5VX1JPT1RTO1xuICB9XG5cbiAgZ2V0TWVudVJvb3RCeUlkKGlkOiBzdHJpbmcpOiBNZW51Um9vdEl0ZW0ge1xuICAgIHJldHVybiB0aGlzLk1FTlVfUk9PVFMuZmluZChjID0+IGMuaWQgPT09IGlkKTtcbiAgfVxuXG4gIGdldEFsbE1lbnVJdGVtcygpOiBNZW51Um9vdEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuQUxMX01FTlVfSVRFTVM7XG4gIH1cblxuICBnZXRNZW51SXRlbUJ5SWQoaWQ6IHN0cmluZyk6IE1lbnVJdGVtIHwgTWVudUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5BTExfTUVOVV9JVEVNUy5maW5kKGkgPT4gaS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgZ2V0TWVudUl0ZW1UeXBlKGl0ZW06IE1lbnVSb290SXRlbSk6IHN0cmluZyB7XG4gICAgbGV0IHR5cGU6IHN0cmluZztcbiAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgIGNhc2UgKChpdGVtIGFzIE1lbnVJdGVtTG9nb3V0KS5yb3V0ZSA9PT0gQ29kZXMuTE9HSU5fUk9VVEUpOlxuICAgICAgICB0eXBlID0gJ2xvZ291dCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAoKGl0ZW0gYXMgTWVudUl0ZW1BY3Rpb24pLmFjdGlvbiAhPT0gdW5kZWZpbmVkKTpcbiAgICAgICAgdHlwZSA9ICdhY3Rpb24nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgKChpdGVtIGFzIE1lbnVJdGVtTG9jYWxlKS5sb2NhbGUgIT09IHVuZGVmaW5lZCk6XG4gICAgICAgIHR5cGUgPSAnbG9jYWxlJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICgoaXRlbSBhcyBNZW51SXRlbVVzZXJJbmZvKS51c2VyICE9PSB1bmRlZmluZWQpOlxuICAgICAgICB0eXBlID0gJ3VzZXItaW5mbyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAoKGl0ZW0gYXMgTWVudUdyb3VwKS5pdGVtcyAhPT0gdW5kZWZpbmVkKTpcbiAgICAgICAgdHlwZSA9ICdncm91cCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdHlwZSA9ICdkZWZhdWx0JztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgaXNNZW51R3JvdXAoaXRlbTogTWVudVJvb3RJdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWVudUl0ZW1UeXBlKGl0ZW0pID09PSAnZ3JvdXAnO1xuICB9XG5cbiAgaXNNZW51R3JvdXBSb3V0ZShpdGVtOiBNZW51Um9vdEl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNZW51SXRlbVR5cGUoaXRlbSkgPT09ICdncm91cCcgJiYgaXRlbS5oYXNPd25Qcm9wZXJ0eSgncm91dGUnKTtcbiAgfVxuXG4gIGlzSXRlbUFjdGl2ZShpdGVtOiBNZW51SXRlbVJvdXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlSXRlbSAmJiB0aGlzLmFjdGl2ZUl0ZW0ucm91dGUgPT09IGl0ZW0ucm91dGU7XG4gIH1cblxuICBpc1JvdXRlSXRlbShpdGVtOiBNZW51SXRlbVJvdXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKGl0ZW0ucm91dGUpO1xuICB9XG5cbiAgaXNWaXNpYmxlKGl0ZW06IE1lbnVDb21tb25JdGVtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFVdGlsLmlzRGVmaW5lZChpdGVtLnZpc2libGUpIHx8IChVdGlsLmlzRGVmaW5lZChpdGVtLnZpc2libGUpICYmIGl0ZW0udmlzaWJsZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE1lbnVJdGVtcyhpdGVtOiBNZW51Um9vdEl0ZW0pOiBNZW51Um9vdEl0ZW1bXSB7XG4gICAgY29uc3QgbWVudUdyb3VwID0gaXRlbSBhcyBNZW51R3JvdXA7XG4gICAgY29uc3QgaXRlbXMgPSBtZW51R3JvdXAuaXRlbXM7XG4gICAgaWYgKGl0ZW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzTWVudUdyb3VwUm91dGUobWVudUdyb3VwKSkge1xuICAgICAgICByZXR1cm4gW2l0ZW1dLmNvbmNhdChpdGVtcylcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG4gICAgcmV0dXJuIFtpdGVtXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlSXRlbSgpOiB2b2lkIHtcbiAgICBsZXQgYWN0aXZlSXRlbTogTWVudUl0ZW1Sb3V0ZTtcbiAgICBjb25zdCByb3V0ZUl0ZW1zOiBNZW51SXRlbVJvdXRlW10gPSB0aGlzLkFMTF9NRU5VX0lURU1TLmZpbHRlcihpdGVtID0+IHRoaXMuaXNSb3V0ZUl0ZW0oaXRlbSkpIGFzIE1lbnVJdGVtUm91dGVbXTtcbiAgICBjb25zdCBwYXRoTWF0Y2hGdWxsSXRlbXMgPSByb3V0ZUl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0ucGF0aE1hdGNoID09PSAnZnVsbCcpO1xuICAgIGlmIChwYXRoTWF0Y2hGdWxsSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgYWN0aXZlSXRlbSA9IHBhdGhNYXRjaEZ1bGxJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5yb3V0ZSA9PT0gdGhpcy5yb3V0ZXIudXJsKTtcbiAgICB9XG4gICAgaWYgKCFhY3RpdmVJdGVtKSB7XG4gICAgICBhY3RpdmVJdGVtID0gcm91dGVJdGVtcy5maW5kKGl0ZW0gPT4gdGhpcy5yb3V0ZXIudXJsLnN0YXJ0c1dpdGgoaXRlbS5yb3V0ZSkpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUl0ZW0gPSBhY3RpdmVJdGVtO1xuICB9XG5cbn1cbiJdfQ==