@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
128 lines • 21.4 kB
JavaScript
import { Injectable } from '@angular/core';
import { AssignPolicy } from '../../task-content/model/policy';
import { PermissionType } from '../../process/permissions';
import * as i0 from "@angular/core";
import * as i1 from "../../user/services/user-comparator.service";
import * as i2 from "../../user/services/user.service";
export class PermissionService {
userComparator;
_userService;
constructor(userComparator, _userService) {
this.userComparator = userComparator;
this._userService = _userService;
}
hasTaskPermission(task, permission) {
if (!task) {
return false;
}
const rolePermValue = this.checkRolePerms(task.roles, permission);
const userPermValue = this.checkUserPerms(task.users, permission);
return this.resolvePermissions(rolePermValue, userPermValue);
}
hasCasePermission(case_, permission) {
if (!case_) {
return false;
}
const rolePermValue = this.checkRolePerms(case_.permissions, permission);
const userPermValue = this.checkUserPerms(case_.actors, permission);
return this.resolvePermissions(rolePermValue, userPermValue);
}
resolvePermissions(rolePermValue, userPermValue) {
return userPermValue === undefined ? (!!rolePermValue) : userPermValue;
}
hasNetPermission(action, net) {
if (!net
|| !net.permissions
|| !action
|| !(net.permissions instanceof Object)) {
return false;
}
if (Object.keys(net.permissions).some(role => this._userService.hasRoleById(role) ? net.permissions[role][action] === false : false)) {
return false;
}
return Object.keys(net.permissions).some(role => this._userService.hasRoleById(role) ? !!net.permissions[role][action] : false);
}
canAssign(task) {
return !!task
&& ((task.assignPolicy === AssignPolicy.manual
&& !task.assignee
&& this.hasTaskPermission(task, PermissionType.ASSIGN)));
}
canCancel(task) {
return !!task && !!task.assignee
&& this.hasTaskPermission(task, PermissionType.CANCEL)
&& ((task.assignedUserPolicy === undefined || task.assignedUserPolicy.cancel === undefined)
|| task.assignedUserPolicy.cancel);
}
canReassign(task) {
return !!task && !!task.assignee && this.userComparator.compareUsers(task.assignee.id)
&& this.hasTaskPermission(task, PermissionType.DELEGATE)
&& ((task.assignedUserPolicy === undefined || task.assignedUserPolicy.reassign === undefined)
|| task.assignedUserPolicy.reassign);
}
canFinish(task) {
return !!task
&& !!task.assignee
&& this.userComparator.compareUsers(task.assignee.id)
&& this.hasTaskPermission(task, PermissionType.FINISH);
}
canCollapse(task) {
return !!task
&& task.assignPolicy === AssignPolicy.manual;
}
checkRolePerms(roles, permission) {
let rolePermValue;
if (!!roles) {
Object.keys(roles).forEach(role => {
if (roles[role][permission] !== undefined && this._userService.hasRoleById(role)) {
rolePermValue = rolePermValue === undefined ? roles[role][permission] : rolePermValue && roles[role][permission];
}
});
}
return rolePermValue;
}
checkUserPerms(users, permission) {
let userPermValue;
if (!!users) {
const loggedUser = this._userService.user.getSelfOrImpersonated();
const processedActorIds = [];
Object.keys(users).forEach(actorId => {
if (userPermValue === false || processedActorIds.includes(actorId)
|| actorId !== loggedUser.id && !loggedUser.nextGroups?.includes(actorId)) {
return;
}
let currentUserPermission = this.getPermissionByUserOrGroup(users, permission, loggedUser);
if (currentUserPermission !== undefined) {
userPermValue = userPermValue === undefined ? currentUserPermission : userPermValue && currentUserPermission;
}
loggedUser.nextGroups !== undefined ? processedActorIds.push(actorId, ...loggedUser.nextGroups) : processedActorIds.push(actorId);
});
}
return userPermValue;
}
getPermissionByUserOrGroup(permissions, permission, loggedUser) {
let userPermValue;
if (permissions[loggedUser.id] !== undefined) {
userPermValue = permissions[loggedUser.id][permission];
}
if (loggedUser.nextGroups === undefined || loggedUser.nextGroups.length === 0 || userPermValue === false) {
return userPermValue;
}
loggedUser.nextGroups.forEach(function (groupId) {
if (permissions[groupId] !== undefined && permissions[groupId][permission] !== undefined) {
userPermValue = userPermValue === undefined ?
permissions[groupId][permission] : userPermValue && permissions[groupId][permission];
}
});
return userPermValue;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionService, deps: [{ token: i1.UserComparatorService }, { token: i2.UserService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PermissionService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.UserComparatorService }, { type: i2.UserService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9hdXRob3JpemF0aW9uL3Blcm1pc3Npb24vcGVybWlzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBSzdELE9BQU8sRUFBYyxjQUFjLEVBQWtCLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFNdkYsTUFBTSxPQUFPLGlCQUFpQjtJQUVKO0lBQWlEO0lBQXZFLFlBQXNCLGNBQXFDLEVBQVksWUFBeUI7UUFBMUUsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQVksaUJBQVksR0FBWixZQUFZLENBQWE7SUFDaEcsQ0FBQztJQUVNLGlCQUFpQixDQUFDLElBQXNCLEVBQUUsVUFBa0I7UUFDL0QsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEtBQXVCLEVBQUUsVUFBa0I7UUFDaEUsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNSLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENB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QyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksYUFBYSxLQUFLLEtBQUssRUFBRTtZQUN0RyxPQUFPLGFBQWEsQ0FBQztTQUN4QjtRQUNELFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVMsT0FBTztZQUMxQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDdEYsYUFBYSxHQUFHLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQztvQkFDekMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzVGO1FBQ0wsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO3dHQWxJUSxpQkFBaUI7NEdBQWpCLGlCQUFpQixjQUZkLE1BQU07OzRGQUVULGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtVc2VyQ29tcGFyYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3VzZXIvc2VydmljZXMvdXNlci1jb21wYXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtBc3NpZ25Qb2xpY3l9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC9wb2xpY3knO1xuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL3Rhc2snO1xuaW1wb3J0IHtVc2VyU2VydmljZX0gZnJvbSAnLi4vLi4vdXNlci9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xuaW1wb3J0IHtDYXNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2Nhc2UnO1xuaW1wb3J0IHtQZXRyaU5ldFJlZmVyZW5jZVdpdGhQZXJtaXNzaW9uc30gZnJvbSAnLi4vLi4vcHJvY2Vzcy9wZXRyaS1uZXQtcmVmZXJlbmNlLXdpdGgtcGVybWlzc2lvbnMnO1xuaW1wb3J0IHtQZXJtaXNzaW9ucywgUGVybWlzc2lvblR5cGUsIFVzZXJQZXJtaXNzaW9uc30gZnJvbSAnLi4vLi4vcHJvY2Vzcy9wZXJtaXNzaW9ucyc7XG5pbXBvcnQge1VzZXJ9IGZyb20gXCIuLi8uLi91c2VyL21vZGVscy91c2VyXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblNlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHVzZXJDb21wYXJhdG9yOiBVc2VyQ29tcGFyYXRvclNlcnZpY2UsIHByb3RlY3RlZCBfdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1Rhc2tQZXJtaXNzaW9uKHRhc2s6IFRhc2sgfCB1bmRlZmluZWQsIHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRhc2spIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvbGVQZXJtVmFsdWUgPSB0aGlzLmNoZWNrUm9sZVBlcm1zKHRhc2sucm9sZXMsIHBlcm1pc3Npb24pO1xuICAgICAgICBjb25zdCB1c2VyUGVybVZhbHVlID0gdGhpcy5jaGVja1VzZXJQZXJtcyh0YXNrLnVzZXJzLCBwZXJtaXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVBlcm1pc3Npb25zKHJvbGVQZXJtVmFsdWUsIHVzZXJQZXJtVmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNDYXNlUGVybWlzc2lvbihjYXNlXzogQ2FzZSB8IHVuZGVmaW5lZCwgcGVybWlzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghY2FzZV8pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvbGVQZXJtVmFsdWUgPSB0aGlzLmNoZWNrUm9sZVBlcm1zKGNhc2VfLnBlcm1pc3Npb25zLCBwZXJtaXNzaW9uKTtcbiAgICAgICAgY29uc3QgdXNlclBlcm1WYWx1ZSA9IHRoaXMuY2hlY2tVc2VyUGVybXMoY2FzZV8uYWN0b3JzLCBwZXJtaXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZVBlcm1pc3Npb25zKHJvbGVQZXJtVmFsdWUsIHVzZXJQZXJtVmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlUGVybWlzc2lvbnMocm9sZVBlcm1WYWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCwgdXNlclBlcm1WYWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdXNlclBlcm1WYWx1ZSA9PT0gdW5kZWZpbmVkID8gKCEhcm9sZVBlcm1WYWx1ZSkgOiB1c2VyUGVybVZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNOZXRQZXJtaXNzaW9uKGFjdGlvbjogc3RyaW5nLCBuZXQ6IFBldHJpTmV0UmVmZXJlbmNlV2l0aFBlcm1pc3Npb25zKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbmV0XG4gICAgICAgICAgICB8fCAhbmV0LnBlcm1pc3Npb25zXG4gICAgICAgICAgICB8fCAhYWN0aW9uXG4gICAgICAgICAgICB8fCAhKG5ldC5wZXJtaXNzaW9ucyBpbnN0YW5jZW9mIE9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG5ldC5wZXJtaXNzaW9ucykuc29tZShyb2xlID0+XG4gICAgICAgICAgICB0aGlzLl91c2VyU2VydmljZS5oYXNSb2xlQnlJZChyb2xlKSA/IG5ldC5wZXJtaXNzaW9uc1tyb2xlXVthY3Rpb25dID09PSBmYWxzZSA6IGZhbHNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhuZXQucGVybWlzc2lvbnMpLnNvbWUocm9sZSA9PlxuICAgICAgICAgICAgdGhpcy5fdXNlclNlcnZpY2UuaGFzUm9sZUJ5SWQocm9sZSkgPyAhIW5ldC5wZXJtaXNzaW9uc1tyb2xlXVthY3Rpb25dIDogZmFsc2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQXNzaWduKHRhc2s6IFRhc2sgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGFza1xuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgdGFzay5hc3NpZ25Qb2xpY3kgPT09IEFzc2lnblBvbGljeS5tYW51YWxcbiAgICAgICAgICAgICAgICAgICAgJiYgIXRhc2suYXNzaWduZWVcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5oYXNUYXNrUGVybWlzc2lvbih0YXNrLCBQZXJtaXNzaW9uVHlwZS5BU1NJR04pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQ2FuY2VsKHRhc2s6IFRhc2sgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGFzayAmJiAhIXRhc2suYXNzaWduZWVcbiAgICAgICAgICAgICYmIHRoaXMuaGFzVGFza1Blcm1pc3Npb24odGFzaywgUGVybWlzc2lvblR5cGUuQ0FOQ0VMKVxuICAgICAgICAgICAgJiYgKCh0YXNrLmFzc2lnbmVkVXNlclBvbGljeSA9PT0gdW5kZWZpbmVkIHx8IHRhc2suYXNzaWduZWRVc2VyUG9saWN5LmNhbmNlbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHx8IHRhc2suYXNzaWduZWRVc2VyUG9saWN5LmNhbmNlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNhblJlYXNzaWduKHRhc2s6IFRhc2sgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGFzayAmJiAhIXRhc2suYXNzaWduZWUgJiYgdGhpcy51c2VyQ29tcGFyYXRvci5jb21wYXJlVXNlcnModGFzay5hc3NpZ25lZS5pZClcbiAgICAgICAgICAgICYmIHRoaXMuaGFzVGFza1Blcm1pc3Npb24odGFzaywgUGVybWlzc2lvblR5cGUuREVMRUdBVEUpXG4gICAgICAgICAgICAmJiAoKHRhc2suYXNzaWduZWRVc2VyUG9saWN5ID09PSB1bmRlZmluZWQgfHwgdGFzay5hc3NpZ25lZFVzZXJQb2xpY3kucmVhc3NpZ24gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB8fCB0YXNrLmFzc2lnbmVkVXNlclBvbGljeS5yZWFzc2lnbik7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkZpbmlzaCh0YXNrOiBUYXNrIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRhc2tcbiAgICAgICAgICAgICYmICEhdGFzay5hc3NpZ25lZVxuICAgICAgICAgICAgJiYgdGhpcy51c2VyQ29tcGFyYXRvci5jb21wYXJlVXNlcnModGFzay5hc3NpZ25lZS5pZClcbiAgICAgICAgICAgICYmIHRoaXMuaGFzVGFza1Blcm1pc3Npb24odGFzaywgUGVybWlzc2lvblR5cGUuRklOSVNIKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQ29sbGFwc2UodGFzazogVGFzayB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0YXNrXG4gICAgICAgICAgICAmJiB0YXNrLmFzc2lnblBvbGljeSA9PT0gQXNzaWduUG9saWN5Lm1hbnVhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tSb2xlUGVybXMocm9sZXM6IFBlcm1pc3Npb25zLCBwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IHJvbGVQZXJtVmFsdWU6IGJvb2xlYW47XG4gICAgICAgIGlmICghIXJvbGVzKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhyb2xlcykuZm9yRWFjaChyb2xlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZXNbcm9sZV1bcGVybWlzc2lvbl0gIT09IHVuZGVmaW5lZCAmJiB0aGlzLl91c2VyU2VydmljZS5oYXNSb2xlQnlJZChyb2xlKSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlUGVybVZhbHVlID0gcm9sZVBlcm1WYWx1ZSA9PT0gdW5kZWZpbmVkID8gcm9sZXNbcm9sZV1bcGVybWlzc2lvbl0gOiByb2xlUGVybVZhbHVlICYmIHJvbGVzW3JvbGVdW3Blcm1pc3Npb25dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb2xlUGVybVZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGVja1VzZXJQZXJtcyh1c2VyczogVXNlclBlcm1pc3Npb25zLCBwZXJtaXNzaW9uKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCB1c2VyUGVybVZhbHVlOiBib29sZWFuO1xuICAgICAgICBpZiAoISF1c2Vycykge1xuICAgICAgICAgICAgY29uc3QgbG9nZ2VkVXNlcjogVXNlciA9IHRoaXMuX3VzZXJTZXJ2aWNlLnVzZXIuZ2V0U2VsZk9ySW1wZXJzb25hdGVkKCk7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRBY3RvcklkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgICAgICAgICAgT2JqZWN0LmtleXModXNlcnMpLmZvckVhY2goYWN0b3JJZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJQZXJtVmFsdWUgPT09IGZhbHNlIHx8IHByb2Nlc3NlZEFjdG9ySWRzLmluY2x1ZGVzKGFjdG9ySWQpXG4gICAgICAgICAgICAgICAgICAgIHx8IGFjdG9ySWQgIT09IGxvZ2dlZFVzZXIuaWQgJiYgIWxvZ2dlZFVzZXIubmV4dEdyb3Vwcz8uaW5jbHVkZXMoYWN0b3JJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFVzZXJQZXJtaXNzaW9uOiBib29sZWFuID0gdGhpcy5nZXRQZXJtaXNzaW9uQnlVc2VyT3JHcm91cCh1c2VycywgcGVybWlzc2lvbiwgbG9nZ2VkVXNlcik7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRVc2VyUGVybWlzc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJQZXJtVmFsdWUgPSB1c2VyUGVybVZhbHVlID09PSB1bmRlZmluZWQgPyBjdXJyZW50VXNlclBlcm1pc3Npb24gOiB1c2VyUGVybVZhbHVlICYmIGN1cnJlbnRVc2VyUGVybWlzc2lvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VkVXNlci5uZXh0R3JvdXBzICE9PSB1bmRlZmluZWQgPyBwcm9jZXNzZWRBY3Rvcklkcy5wdXNoKGFjdG9ySWQsIC4uLmxvZ2dlZFVzZXIubmV4dEdyb3VwcykgOiBwcm9jZXNzZWRBY3Rvcklkcy5wdXNoKGFjdG9ySWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVzZXJQZXJtVmFsdWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFBlcm1pc3Npb25CeVVzZXJPckdyb3VwKHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnMsIHBlcm1pc3Npb24sIGxvZ2dlZFVzZXI6IFVzZXIpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IHVzZXJQZXJtVmFsdWU6IGJvb2xlYW47XG4gICAgICAgIGlmIChwZXJtaXNzaW9uc1tsb2dnZWRVc2VyLmlkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1c2VyUGVybVZhbHVlID0gcGVybWlzc2lvbnNbbG9nZ2VkVXNlci5pZF1bcGVybWlzc2lvbl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvZ2dlZFVzZXIubmV4dEdyb3VwcyA9PT0gdW5kZWZpbmVkIHx8IGxvZ2dlZFVzZXIubmV4dEdyb3Vwcy5sZW5ndGggPT09IDAgfHwgdXNlclBlcm1WYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB1c2VyUGVybVZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlZFVzZXIubmV4dEdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGdyb3VwSWQpIHtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uc1tncm91cElkXSAhPT0gdW5kZWZpbmVkICYmIHBlcm1pc3Npb25zW2dyb3VwSWRdW3Blcm1pc3Npb25dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB1c2VyUGVybVZhbHVlID0gdXNlclBlcm1WYWx1ZSA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnNbZ3JvdXBJZF1bcGVybWlzc2lvbl0gOiB1c2VyUGVybVZhbHVlICYmIHBlcm1pc3Npb25zW2dyb3VwSWRdW3Blcm1pc3Npb25dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gdXNlclBlcm1WYWx1ZTtcbiAgICB9XG59XG4iXX0=