UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

114 lines 15.4 kB
import { Injectable } from '@angular/core'; import { map, take } from 'rxjs/operators'; import { groupBy } from 'lodash-es'; import { VersionService } from './version.service'; import { AppStateService } from '../common/ui-state.service'; import { ApplicationService, ApplicationType } from '@c8y/client'; import * as i0 from "@angular/core"; import * as i1 from "./version.service"; import * as i2 from "../common/ui-state.service"; import * as i3 from "@c8y/client"; export class PlatformDetailsService { constructor(version, appState, apps) { this.version = version; this.appState = appState; this.apps = apps; } async getPlatformDetailsObject() { const currentUser = this.appState.currentUser.value; const userId = currentUser?.id; const userPermissions = this.getUserPermissions(currentUser); const [hookedVersions, microserviceVersions] = await Promise.all([ this.getVersions(), this.getMicroserviceVersions(userId) ]); const versions = [...hookedVersions, ...microserviceVersions]; const groupedVersions = groupBy(versions, 'type'); const tenantId = this.appState.currentTenant.value?.name; // useful as `domainName` might be pointing to a custom domain // self link should still allow to identify the actual environment of the tenant const tenantSelfLink = this.appState.currentTenant.value?.self; const tenantDomainName = this.appState.currentTenant.value?.domainName; const applicationKey = this.appState.currentApplication.value?.key; const applicationId = this.appState.currentApplication.value?.id; const time = new Date().toISOString(); const url = document.URL; const obj = { time, tenantId, tenantSelfLink, tenantDomainName, url, userId, userPermissions, applicationId, applicationKey, versions: groupedVersions }; return obj; } async getVersions() { const versions = await this.version.items$ .pipe(take(1), map(versions => this.version.cleanUpVersions(versions))) .toPromise(); return versions; } async getMicroserviceVersions(userId) { try { const { data: apps } = await this.apps.listByUser(userId, { pageSize: 2000, dropOverwrittenApps: true, noPaging: true }); return apps .filter(app => !!app.manifest?.version && app.type === ApplicationType.MICROSERVICE) .map(app => { return { label: app.name, version: app.manifest.version, type: app.type, custom: { owner: app.owner?.tenant?.id, provider: app.manifest?.provider } }; }); } catch (e) { console.warn(e); return []; } } getUserPermissions(user) { if (!user) { return null; } const userPermissions = this.getDirectPermissionsOfUser(user); const groupPermissions = this.getPermissionsOfAssignedGroups(user); return { user: userPermissions, groups: groupPermissions }; } getDirectPermissionsOfUser(user) { const userChangedType = user; const userRoleReferences = userChangedType.roles?.references || []; return userRoleReferences.map(ref => ref.role.id); } getPermissionsOfAssignedGroups(user) { const groups = user.groups?.references || []; return groups.map(ref => { const roleReferences = ref.group?.roles?.references || []; const permissions = roleReferences.map(ref => ref.role.id); return { id: ref.group.id, name: ref.group.name, permissions }; }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformDetailsService, deps: [{ token: i1.VersionService }, { token: i2.AppStateService }, { token: i3.ApplicationService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformDetailsService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PlatformDetailsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.VersionService }, { type: i2.AppStateService }, { type: i3.ApplicationService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tZGV0YWlscy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS92ZXJzaW9uL3BsYXRmb3JtLWRldGFpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQXVCLE1BQU0sYUFBYSxDQUFDOzs7OztBQUd2RixNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ1UsT0FBdUIsRUFDdkIsUUFBeUIsRUFDekIsSUFBd0I7UUFGeEIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsU0FBSSxHQUFKLElBQUksQ0FBb0I7SUFDL0IsQ0FBQztJQUVKLEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDL0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxjQUFjLEVBQUUsb0JBQW9CLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDL0QsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1NBQ3JDLENBQUMsQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxjQUFjLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlELE1BQU0sZUFBZSxHQUF3QyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDekQsOERBQThEO1FBQzlELGdGQUFnRjtRQUNoRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQztRQUN2RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDbkUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUN6QixNQUFNLEdBQUcsR0FBRztZQUNWLElBQUk7WUFDSixRQUFRO1lBQ1IsY0FBYztZQUNkLGdCQUFnQjtZQUNoQixHQUFHO1lBQ0gsTUFBTTtZQUNOLGVBQWU7WUFDZixhQUFhO1lBQ2IsY0FBYztZQUNkLFFBQVEsRUFBRSxlQUFlO1NBQzFCLENBQUM7UUFDRixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFUyxLQUFLLENBQUMsV0FBVztRQUN6QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTthQUN2QyxJQUFJLENBQ0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3hEO2FBQ0EsU0FBUyxFQUFFLENBQUM7UUFDZixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRVMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE1BQWM7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDeEQsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsbUJBQW1CLEVBQUUsSUFBSTtnQkFDekIsUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7WUFDSCxPQUFPLElBQUk7aUJBQ1IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLFlBQVksQ0FBQztpQkFDbkYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNULE9BQU87b0JBQ0wsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJO29CQUNmLE9BQU8sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU87b0JBQzdCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtvQkFDZCxNQUFNLEVBQUU7d0JBQ04sS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7d0JBQzVCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVE7cUJBQ2pDO2lCQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRVMsa0JBQWtCLENBQUMsSUFBeUI7UUFDcEQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25FLE9BQU8sRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFFUywwQkFBMEIsQ0FBQyxJQUFrQjtRQUNyRCxNQUFNLGVBQWUsR0FBRyxJQUFhLENBQUM7UUFDdEMsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDbkUsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyw4QkFBOEIsQ0FDdEMsSUFBa0I7UUFFbEIsTUFBTSxNQUFNLEdBQWdCLElBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUVsRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsTUFBTSxjQUFjLEdBQWUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQztZQUN0RSxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzRCxPQUFPO2dCQUNMLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ3BCLFdBQVc7YUFDWixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTFHVSxzQkFBc0I7bUhBQXRCLHNCQUFzQixjQURULE1BQU07OzRGQUNuQixzQkFBc0I7a0JBRGxDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ3JvdXBCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBWZXJzaW9uU2VydmljZSB9IGZyb20gJy4vdmVyc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENsZWFuZWRWZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLm1vZGVsJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uU2VydmljZSwgQXBwbGljYXRpb25UeXBlLCBJQ3VycmVudFVzZXIsIElVc2VyIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtRGV0YWlsc1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZlcnNpb246IFZlcnNpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGFwcHM6IEFwcGxpY2F0aW9uU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgZ2V0UGxhdGZvcm1EZXRhaWxzT2JqZWN0KCkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gdGhpcy5hcHBTdGF0ZS5jdXJyZW50VXNlci52YWx1ZTtcbiAgICBjb25zdCB1c2VySWQgPSBjdXJyZW50VXNlcj8uaWQ7XG4gICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdGhpcy5nZXRVc2VyUGVybWlzc2lvbnMoY3VycmVudFVzZXIpO1xuICAgIGNvbnN0IFtob29rZWRWZXJzaW9ucywgbWljcm9zZXJ2aWNlVmVyc2lvbnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXRWZXJzaW9ucygpLFxuICAgICAgdGhpcy5nZXRNaWNyb3NlcnZpY2VWZXJzaW9ucyh1c2VySWQpXG4gICAgXSk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBbLi4uaG9va2VkVmVyc2lvbnMsIC4uLm1pY3Jvc2VydmljZVZlcnNpb25zXTtcbiAgICBjb25zdCBncm91cGVkVmVyc2lvbnM6IHsgW2tleTogc3RyaW5nXTogQ2xlYW5lZFZlcnNpb25bXSB9ID0gZ3JvdXBCeSh2ZXJzaW9ucywgJ3R5cGUnKTtcbiAgICBjb25zdCB0ZW5hbnRJZCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC52YWx1ZT8ubmFtZTtcbiAgICAvLyB1c2VmdWwgYXMgYGRvbWFpbk5hbWVgIG1pZ2h0IGJlIHBvaW50aW5nIHRvIGEgY3VzdG9tIGRvbWFpblxuICAgIC8vIHNlbGYgbGluayBzaG91bGQgc3RpbGwgYWxsb3cgdG8gaWRlbnRpZnkgdGhlIGFjdHVhbCBlbnZpcm9ubWVudCBvZiB0aGUgdGVuYW50XG4gICAgY29uc3QgdGVuYW50U2VsZkxpbmsgPSB0aGlzLmFwcFN0YXRlLmN1cnJlbnRUZW5hbnQudmFsdWU/LnNlbGY7XG4gICAgY29uc3QgdGVuYW50RG9tYWluTmFtZSA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC52YWx1ZT8uZG9tYWluTmFtZTtcbiAgICBjb25zdCBhcHBsaWNhdGlvbktleSA9IHRoaXMuYXBwU3RhdGUuY3VycmVudEFwcGxpY2F0aW9uLnZhbHVlPy5rZXk7XG4gICAgY29uc3QgYXBwbGljYXRpb25JZCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudEFwcGxpY2F0aW9uLnZhbHVlPy5pZDtcbiAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LlVSTDtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICB0aW1lLFxuICAgICAgdGVuYW50SWQsXG4gICAgICB0ZW5hbnRTZWxmTGluayxcbiAgICAgIHRlbmFudERvbWFpbk5hbWUsXG4gICAgICB1cmwsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyUGVybWlzc2lvbnMsXG4gICAgICBhcHBsaWNhdGlvbklkLFxuICAgICAgYXBwbGljYXRpb25LZXksXG4gICAgICB2ZXJzaW9uczogZ3JvdXBlZFZlcnNpb25zXG4gICAgfTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFZlcnNpb25zKCk6IFByb21pc2U8Q2xlYW5lZFZlcnNpb25bXT4ge1xuICAgIGNvbnN0IHZlcnNpb25zID0gYXdhaXQgdGhpcy52ZXJzaW9uLml0ZW1zJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1hcCh2ZXJzaW9ucyA9PiB0aGlzLnZlcnNpb24uY2xlYW5VcFZlcnNpb25zKHZlcnNpb25zKSlcbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgICByZXR1cm4gdmVyc2lvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0TWljcm9zZXJ2aWNlVmVyc2lvbnModXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPENsZWFuZWRWZXJzaW9uW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBkYXRhOiBhcHBzIH0gPSBhd2FpdCB0aGlzLmFwcHMubGlzdEJ5VXNlcih1c2VySWQsIHtcbiAgICAgICAgcGFnZVNpemU6IDIwMDAsXG4gICAgICAgIGRyb3BPdmVyd3JpdHRlbkFwcHM6IHRydWUsXG4gICAgICAgIG5vUGFnaW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhcHBzXG4gICAgICAgIC5maWx0ZXIoYXBwID0+ICEhYXBwLm1hbmlmZXN0Py52ZXJzaW9uICYmIGFwcC50eXBlID09PSBBcHBsaWNhdGlvblR5cGUuTUlDUk9TRVJWSUNFKVxuICAgICAgICAubWFwKGFwcCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsOiBhcHAubmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IGFwcC5tYW5pZmVzdC52ZXJzaW9uLFxuICAgICAgICAgICAgdHlwZTogYXBwLnR5cGUsXG4gICAgICAgICAgICBjdXN0b206IHtcbiAgICAgICAgICAgICAgb3duZXI6IGFwcC5vd25lcj8udGVuYW50Py5pZCxcbiAgICAgICAgICAgICAgcHJvdmlkZXI6IGFwcC5tYW5pZmVzdD8ucHJvdmlkZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oZSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFVzZXJQZXJtaXNzaW9ucyh1c2VyOiBJQ3VycmVudFVzZXIgfCBudWxsKSB7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdGhpcy5nZXREaXJlY3RQZXJtaXNzaW9uc09mVXNlcih1c2VyKTtcbiAgICBjb25zdCBncm91cFBlcm1pc3Npb25zID0gdGhpcy5nZXRQZXJtaXNzaW9uc09mQXNzaWduZWRHcm91cHModXNlcik7XG4gICAgcmV0dXJuIHsgdXNlcjogdXNlclBlcm1pc3Npb25zLCBncm91cHM6IGdyb3VwUGVybWlzc2lvbnMgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREaXJlY3RQZXJtaXNzaW9uc09mVXNlcih1c2VyOiBJQ3VycmVudFVzZXIpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdXNlckNoYW5nZWRUeXBlID0gdXNlciBhcyBJVXNlcjtcbiAgICBjb25zdCB1c2VyUm9sZVJlZmVyZW5jZXMgPSB1c2VyQ2hhbmdlZFR5cGUucm9sZXM/LnJlZmVyZW5jZXMgfHwgW107XG4gICAgcmV0dXJuIHVzZXJSb2xlUmVmZXJlbmNlcy5tYXAocmVmID0+IHJlZi5yb2xlLmlkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRQZXJtaXNzaW9uc09mQXNzaWduZWRHcm91cHMoXG4gICAgdXNlcjogSUN1cnJlbnRVc2VyXG4gICk6IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBwZXJtaXNzaW9uczogc3RyaW5nW10gfVtdIHtcbiAgICBjb25zdCBncm91cHM6IEFycmF5PGFueT4gPSAodXNlciBhcyBhbnkpLmdyb3Vwcz8ucmVmZXJlbmNlcyB8fCBbXTtcblxuICAgIHJldHVybiBncm91cHMubWFwKHJlZiA9PiB7XG4gICAgICBjb25zdCByb2xlUmVmZXJlbmNlczogQXJyYXk8YW55PiA9IHJlZi5ncm91cD8ucm9sZXM/LnJlZmVyZW5jZXMgfHwgW107XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHJvbGVSZWZlcmVuY2VzLm1hcChyZWYgPT4gcmVmLnJvbGUuaWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHJlZi5ncm91cC5pZCxcbiAgICAgICAgbmFtZTogcmVmLmdyb3VwLm5hbWUsXG4gICAgICAgIHBlcm1pc3Npb25zXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=