Repository URL to install this package:
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { process } from '@progress/kendo-data-query';
import { Component, ViewChild, Renderer2, NgZone } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import { UsersService, GroupsService, RolesService, PermissionsService, CacheService } from '@wa-motif-open-api/auth-access-control-service';
import { UsersService as PlatformUsersService, AdminsService as PlatformAdminsService, ClientsService as PlatformClientsService } from '@wa-motif-open-api/user-mgr-service';
import * as _ from 'lodash';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { NewUserDialogComponent } from './dialogs/user/new-user-dialog';
import { NewAclEntityDialogComponent } from './dialogs/acl/entities/new-acl-entity-dialog';
import { DialogType, EntityType } from './editors/acl-editor-context';
import { ReplaySubject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { UsersListComponent } from './users-list/users-list.component';
import { AclRelationsDialogComponent } from './dialogs/acl/relations/acl-relations-dialog';
import { RowCommandType } from './editors/acl-editor-context';
import { PasswordChangeDialogComponent } from './dialogs/password/password-change-dialog';
import { MotifACLService } from 'web-console-motif-acl';
import { forkJoin } from 'rxjs/observable/forkJoin';
import { ConfirmationDialogComponent } from '../../../components/ConfirmationDialog/confirmation-dialog-component';
/** @type {?} */
var LOG_TAG = '[AccessControlSection]';
/** @type {?} */
var BIT_LOAD_USERS = 1;
/** @type {?} */
var BIT_LOAD_GROUPS = 8;
/** @type {?} */
var BIT_LOAD_ROLES = 16;
/** @type {?} */
var BIT_LOAD_PERMISSIONS = 32;
/** @type {?} */
var BIT_LOAD_ALL = BIT_LOAD_USERS | BIT_LOAD_GROUPS | BIT_LOAD_ROLES | BIT_LOAD_PERMISSIONS;
var AccessControlSectionComponent = /** @class */ (function () {
function AccessControlSectionComponent(logger, motifACLService, platformUsersService, platformAdminsService, platformClientsService, usersService, groupsService, rolesService, permissionsService, cacheService, notificationCenter, renderer, zone) {
var _this = this;
this.logger = logger;
this.motifACLService = motifACLService;
this.platformUsersService = platformUsersService;
this.platformAdminsService = platformAdminsService;
this.platformClientsService = platformClientsService;
this.usersService = usersService;
this.groupsService = groupsService;
this.rolesService = rolesService;
this.permissionsService = permissionsService;
this.cacheService = cacheService;
this.notificationCenter = notificationCenter;
this.renderer = renderer;
this.zone = zone;
this.adminsLoading = false;
this.clientsLoading = false;
this.groupsLoading = false;
this.rolesLoading = false;
this.permissionsLoading = false;
this.size = '450px';
this.height = '330';
this.destroy = new ReplaySubject(1);
this.userCommands = [
{
cssClass: 'k-icon',
commandIcon: 'wa-ico-house-key',
commandId: RowCommandType.ChangePassword,
title: 'Change Password'
},
{
cssClass: 'k-icon',
commandIcon: 'wa-ico-relations-links',
commandId: RowCommandType.Relations,
title: 'Relations'
},
{
cssClass: 'k-icon',
commandIcon: 'wa-ico-edit',
commandId: RowCommandType.Edit,
title: 'Edit'
},
{
cssClass: 'k-icon',
commandIcon: 'wa-ico-no',
commandId: RowCommandType.Delete,
title: 'Delete',
hasConfirmation: true,
confirmationTitle: 'Delete?'
}
];
this.commands = [
{
cssClass: 'k-icon',
commandIcon: 'wa-ico-relations-links',
commandId: RowCommandType.Relations,
title: 'Relations'
},
{
cssClass: 'k-icon',
commandIcon: 'wa-ico-edit',
commandId: RowCommandType.Edit,
title: 'Edit'
},
{
cssClass: 'k-icon',
commandIcon: 'wa-ico-no',
commandId: RowCommandType.Delete,
title: 'Delete',
hasConfirmation: true,
confirmationTitle: 'Delete?'
}
];
this.dropDownButtonItems = [{
text: 'User',
disabled: true
}, {
text: 'Admin',
disabled: true
}, {
text: 'Client',
disabled: true
}, {
text: 'Group',
disabled: true
}, {
text: 'Role',
disabled: false
}];
this.usersTabSelected = true;
this.userSelection = [];
this.adminSelection = [];
this.clientSelection = [];
this.groupSelection = [];
this.roleSelection = [];
this.rolesDataState = {
filter: {
logic: 'and',
filters: []
}
};
this.permissionsDataState = {
skip: 0,
take: 10,
sort: [],
filter: {
logic: 'and',
filters: []
}
};
this.selectableSettings = {
checkboxOnly: false,
mode: 'single'
};
this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.AcsApi:CREATE:createRole')
.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
_this.dropDownButtonItems[4].disabled = !canDoIt;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.warn('cannot load permissions: ' + error);
}));
this.logger.debug(LOG_TAG, 'Opening...');
}
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'Initializing...');
this.loadGrids(BIT_LOAD_ROLES | BIT_LOAD_PERMISSIONS);
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.logger.debug(LOG_TAG, 'ngOnDestroy');
this.destroy.next(null);
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
};
/**
* @param {?} state
* @return {?}
*/
AccessControlSectionComponent.prototype.onRolesDataStateChange = /**
* @param {?} state
* @return {?}
*/
function (state) {
this.rolesDataState = state;
this.loadRoles();
};
/**
* @private
* @return {?}
*/
AccessControlSectionComponent.prototype.loadRoles = /**
* @private
* @return {?}
*/
function () {
this.rolesGridView = process(this.rolesData, this.rolesDataState);
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.permissionsPageChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.permissionsDataState.skip = event.skip;
this.loadPermissions();
};
/**
* @param {?} state
* @return {?}
*/
AccessControlSectionComponent.prototype.onPermissionsDataStateChange = /**
* @param {?} state
* @return {?}
*/
function (state) {
this.permissionsDataState = state;
this.loadPermissions();
};
/**
* @private
* @return {?}
*/
AccessControlSectionComponent.prototype.loadPermissions = /**
* @private
* @return {?}
*/
function () {
this.permissionsGridView = process(this.permissionsData, this.permissionsDataState);
};
/**
* @param {?} e
* @return {?}
*/
AccessControlSectionComponent.prototype.onUserSelectionChange = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (this.userSelection.length === 1 || this.adminSelection.length === 1 || this.clientSelection.length === 1) {
this.groupSelection.length = this.roleSelection.length = 0;
this.loadGrids(BIT_LOAD_GROUPS | BIT_LOAD_ROLES | BIT_LOAD_PERMISSIONS);
}
else {
this.clearAllGridSelections();
this.loadGrids(BIT_LOAD_GROUPS | BIT_LOAD_ROLES | BIT_LOAD_PERMISSIONS);
}
};
/**
* @param {?} e
* @return {?}
*/
AccessControlSectionComponent.prototype.onGroupSelectionChange = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (this.groupSelection.length === 1) {
this.roleSelection.length = 0;
this.loadGrids(BIT_LOAD_ROLES | BIT_LOAD_PERMISSIONS);
}
else {
this.clearAllGridSelections();
this.loadGrids(BIT_LOAD_ROLES | BIT_LOAD_PERMISSIONS);
}
};
/**
* @param {?} e
* @return {?}
*/
AccessControlSectionComponent.prototype.onRoleSelectionChange = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (this.roleSelection.length === 1) {
this.loadGrids(BIT_LOAD_PERMISSIONS);
}
else {
this.clearAllGridSelections();
this.loadGrids(BIT_LOAD_PERMISSIONS);
}
};
/**
* @param {?} domain
* @return {?}
*/
AccessControlSectionComponent.prototype.onDomainSelected = /**
* @param {?} domain
* @return {?}
*/
function (domain) {
this.selectedDomain = domain ? domain.name : null;
this.clearAllGridSelections();
this.loadGrids(BIT_LOAD_USERS | BIT_LOAD_GROUPS | BIT_LOAD_ROLES | BIT_LOAD_PERMISSIONS);
this.enableDropDownItems(domain != null);
};
/**
* @param {?} enabled
* @return {?}
*/
AccessControlSectionComponent.prototype.enableDropDownItems = /**
* @param {?} enabled
* @return {?}
*/
function (enabled) {
var _this = this;
if (!enabled) {
this.disableAllDropDownItems();
}
else {
forkJoin(this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.UserMgrApi:CREATE:createUser'), this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.UserMgrApi:CREATE:createAdminUser'), this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.UserMgrApi:CREATE:createClientUser'), this.motifACLService.can('com.vipera.osgi.core.platform.api.rest.AcsApi:CREATE:createGroup'))
.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} canDoIt
* @return {?}
*/
function (canDoIt) {
_this.dropDownButtonItems[0].disabled = !canDoIt[0];
_this.dropDownButtonItems[1].disabled = !canDoIt[1];
_this.dropDownButtonItems[2].disabled = !canDoIt[2];
_this.dropDownButtonItems[3].disabled = !canDoIt[3];
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.disableAllDropDownItems();
_this.logger.warn('cannot load permissions: ' + error);
}));
}
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.disableAllDropDownItems = /**
* @return {?}
*/
function () {
this.dropDownButtonItems[0].disabled =
this.dropDownButtonItems[1].disabled =
this.dropDownButtonItems[2].disabled =
this.dropDownButtonItems[3].disabled = true;
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.clearAllGridSelections = /**
* @return {?}
*/
function () {
this.userSelection.length = this.adminSelection.length = this.clientSelection.length = this.groupSelection.length =
this.roleSelection.length = 0;
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.clearAllGridData = /**
* @return {?}
*/
function () {
this.usersData = this.adminsData = this.clientsData = this.groupsData = this.rolesData = this.permissionsData = null;
};
/**
* @param {?} gridsToLoadBitfield
* @return {?}
*/
AccessControlSectionComponent.prototype.loadGrids = /**
* @param {?} gridsToLoadBitfield
* @return {?}
*/
function (gridsToLoadBitfield) {
var _this = this;
/** @type {?} */
var getGroups;
/** @type {?} */
var getRoles;
/** @type {?} */
var getPermissions;
/** @type {?} */
var selectedUser = this.userSelection.length === 1 ? this.userSelection[0] : null;
if (!selectedUser) {
selectedUser = this.adminSelection.length === 1 ? this.adminSelection[0] : null;
}
if (!selectedUser) {
selectedUser = this.clientSelection.length === 1 ? this.clientSelection[0] : null;
}
/** @type {?} */
var selectedGroup = this.groupSelection.length === 1 ? this.groupSelection[0] : null;
/** @type {?} */
var selectedRole = this.roleSelection.length === 1 ? this.roleSelection[0] : null;
if (!this.selectedDomain) {
this.userSelection.length = this.adminSelection.length = this.clientSelection.length = this.groupSelection.length = 0;
this.usersData = this.adminsData = this.clientsData = this.groupsData = null;
}
else {
// Load users if required
if (BIT_LOAD_USERS & gridsToLoadBitfield) {
this._usersListGrid.refreshData();
this.adminsLoading = true;
this.platformAdminsService.getAdminUsersList(this.selectedDomain).pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.adminsData = response;
_.forEach(_this.adminsData, (/**
* @param {?} element
* @return {?}
*/
function (element) {
element.created = new Date(element.created);
element.lastLogin = new Date(element.lastLogin);
}));
_this.adminsLoading = false;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.warn(LOG_TAG, 'Error loading admins: ', error);
_this.adminsLoading = false;
}));
this.clientsLoading = true;
this.platformClientsService.getClientUsersList(this.selectedDomain).pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.clientsData = response;
_.forEach(_this.clientsData, (/**
* @param {?} element
* @return {?}
*/
function (element) {
element.created = new Date(element.created);
element.lastLogin = new Date(element.lastLogin);
}));
_this.clientsLoading = false;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.warn(LOG_TAG, 'Error loading clients: ', error);
_this.clientsLoading = false;
}));
}
// Groups
if (selectedUser) {
getGroups = this.usersService.getUserGroups(this.selectedDomain, selectedUser);
}
else {
getGroups = this.groupsService.getDomainGroups(this.selectedDomain);
}
if (BIT_LOAD_GROUPS & gridsToLoadBitfield) {
this.groupsLoading = true;
getGroups.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.groupsData = response;
_this.groupsLoading = false;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.warn(LOG_TAG, 'Error loading groups: ', error);
_this.groupsLoading = false;
}));
}
}
// Roles
if (selectedGroup) {
getRoles = this.groupsService.getGroupRoles(this.selectedDomain, selectedGroup);
}
else if (selectedUser) {
getRoles = this.usersService.getUserRoles(this.selectedDomain, selectedUser);
}
else {
getRoles = this.rolesService.getRoles();
}
// Permissions
if (selectedRole) {
getPermissions = this.rolesService.getRolePermissions(selectedRole);
}
else if (selectedGroup) {
getPermissions = this.groupsService.getGroupPermissions(this.selectedDomain, selectedGroup);
}
else if (selectedUser) {
getPermissions = this.usersService.getUserPermissions(this.selectedDomain, selectedUser);
}
else {
getPermissions = this.permissionsService.getPermissions();
}
if (BIT_LOAD_ROLES & gridsToLoadBitfield) {
this.rolesLoading = true;
getRoles.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.rolesData = response;
_this.loadRoles();
_this.rolesLoading = false;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.warn(LOG_TAG, 'Error loading roles: ', error);
_this.rolesLoading = false;
}));
}
if (BIT_LOAD_PERMISSIONS & gridsToLoadBitfield) {
this.permissionsLoading = true;
getPermissions.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.permissionsData = response;
_this.permissionsDataState.skip = 0;
_this.loadPermissions();
_this.permissionsLoading = false;
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.warn(LOG_TAG, 'Error loading permissions: ', error);
_this.permissionsLoading = false;
}));
}
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.onResetClicked = /**
* @return {?}
*/
function () {
this.clearAllGridSelections();
this.loadGrids(BIT_LOAD_ALL);
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.onInvalidateCacheClicked = /**
* @return {?}
*/
function () {
this.confirmationDialog.open('Cache Invalidation',
// tslint:disable-next-line:max-line-length
'Attention: invalidating Access Control cache might have a performance overhead when running in a production environment.\n\nDo you want to continue?', { 'action': 'discardChanges' });
};
/**
* @param {?} userData
* @return {?}
*/
AccessControlSectionComponent.prototype.onInvalidationCancel = /**
* @param {?} userData
* @return {?}
*/
function (userData) {
this.logger.debug(LOG_TAG, 'onInvalidationCancel for:', userData);
};
/**
* @param {?} userData
* @return {?}
*/
AccessControlSectionComponent.prototype.onInvalidationOK = /**
* @param {?} userData
* @return {?}
*/
function (userData) {
var _this = this;
this.logger.debug(LOG_TAG, 'onInvalidationOK for:', userData);
this.cacheService.invalidateCache().subscribe((/**
* @param {?} value
* @return {?}
*/
function (value) {
_this.onResetClicked();
_this.logger.info(LOG_TAG, 'ACS Cache invalidation succeeded');
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.warn(LOG_TAG, 'ACS Cache invalidation failed: ' + error);
}));
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.onLayoutChange = /**
* @return {?}
*/
function () {
console.log('layout changed: ' + this.size);
/** @type {?} */
var intHeight = (parseInt(this.size.replace(/px/, '')) - 120);
this.height = '' + intHeight;
this.permissionsDataState.take = Math.ceil(intHeight / 35) * 3;
this.loadPermissions();
};
/**
* @param {?} touched
* @return {?}
*/
AccessControlSectionComponent.prototype.onDialogClose = /**
* @param {?} touched
* @return {?}
*/
function (touched) {
if (touched) {
this.loadGrids(BIT_LOAD_ALL);
}
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onAdminCommandClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.id === RowCommandType.ChangePassword) {
this._passwordChangeDialog.show(EntityType.Admin, event.rowData.dataItem);
}
else if (event.id === RowCommandType.Edit) {
this._newUserDialog.show(DialogType.Edit, EntityType.Admin, event.rowData.dataItem);
}
else {
this.selectedEntity = this.adminSelection[0];
this._aclRelationsDialog.show(EntityType.Admin, event.rowData.dataItem);
}
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onClientCommandClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.id === RowCommandType.ChangePassword) {
this._passwordChangeDialog.show(EntityType.Client, event.rowData.dataItem);
}
else if (event.id === RowCommandType.Edit) {
this._newUserDialog.show(DialogType.Edit, EntityType.Client, event.rowData.dataItem);
}
else {
this.selectedEntity = this.clientSelection[0];
this._aclRelationsDialog.show(EntityType.Client, event.rowData.dataItem);
}
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onGroupCommandClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.id === RowCommandType.Edit) {
this._newAclEntityDialog.show(DialogType.Edit, EntityType.Group, event.rowData.dataItem);
}
else {
this.selectedEntity = this.groupSelection[0];
this._aclRelationsDialog.show(EntityType.Group, event.rowData.dataItem);
}
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onRoleCommandClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.id === RowCommandType.Edit) {
this._newAclEntityDialog.show(DialogType.Edit, EntityType.Role, event.rowData.dataItem);
}
else {
this.selectedEntity = this.roleSelection[0];
this._aclRelationsDialog.show(EntityType.Role, event.rowData.dataItem);
}
};
/**
* @param {?} dataItem
* @return {?}
*/
AccessControlSectionComponent.prototype.onAdminCommandConfirm = /**
* @param {?} dataItem
* @return {?}
*/
function (dataItem) {
this.deleteEntity(EntityType.Admin, dataItem);
};
/**
* @param {?} dataItem
* @return {?}
*/
AccessControlSectionComponent.prototype.onClientCommandConfirm = /**
* @param {?} dataItem
* @return {?}
*/
function (dataItem) {
this.deleteEntity(EntityType.Client, dataItem);
};
/**
* @param {?} dataItem
* @return {?}
*/
AccessControlSectionComponent.prototype.onGroupCommandConfirm = /**
* @param {?} dataItem
* @return {?}
*/
function (dataItem) {
this.deleteEntity(EntityType.Group, dataItem);
};
/**
* @param {?} dataItem
* @return {?}
*/
AccessControlSectionComponent.prototype.onRoleCommandConfirm = /**
* @param {?} dataItem
* @return {?}
*/
function (dataItem) {
this.deleteEntity(EntityType.Role, dataItem);
};
/**
* @param {?} dataItem
* @return {?}
*/
AccessControlSectionComponent.prototype.onPermissionCommandConfirm = /**
* @param {?} dataItem
* @return {?}
*/
function (dataItem) {
this.deleteEntity(EntityType.Permission, dataItem);
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onUserRowCommandClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.commandType === RowCommandType.ChangePassword) {
this._passwordChangeDialog.show(EntityType.User, event.dataItem);
}
else if (event.commandType === RowCommandType.Relations) {
this._aclRelationsDialog.show(EntityType.User, event.dataItem);
}
if (event.commandType === RowCommandType.Edit) {
this._newUserDialog.show(DialogType.Edit, EntityType.User, event.dataItem);
}
else if (event.commandType === RowCommandType.Delete) {
this.deleteEntity(EntityType.User, event.dataItem);
}
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onAddButtonItemClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.text === 'User') {
this._newUserDialog.show(DialogType.Create, EntityType.User);
}
else if (event.text === 'Admin') {
this._newUserDialog.show(DialogType.Create, EntityType.Admin);
}
else if (event.text === 'Client') {
this._newUserDialog.show(DialogType.Create, EntityType.Client);
}
else if (event.text === 'Group') {
this._newAclEntityDialog.show(DialogType.Create, EntityType.Group);
}
else if (event.text === 'Role') {
this._newAclEntityDialog.show(DialogType.Create, EntityType.Role);
}
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onNewAclEntityConfirm = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.createOrUpdateEntity(event.dialogType, event.entityType, { name: event.name, description: event.description });
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onNewUserConfirm = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.createOrUpdateEntity(event.dialogType, event.entityType, { userId: event.userId, userIdInt: event.userIdInt, state: event.state });
};
/**
* @param {?} event
* @return {?}
*/
AccessControlSectionComponent.prototype.onPasswordChangeConfirm = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.changePassword(event.entityType, event.userId, event.newPassword, event.verifyPassword);
};
/**
* @return {?}
*/
AccessControlSectionComponent.prototype.onTabChange = /**
* @return {?}
*/
function () {
this.onResetClicked();
};
/**
* @private
* @param {?} entityType
* @param {?} data
* @return {?}
*/
AccessControlSectionComponent.prototype.deleteEntity = /**
* @private
* @param {?} entityType
* @param {?} data
* @return {?}
*/
function (entityType, data) {
var _this = this;
/** @type {?} */
var deleteEntity;
/** @type {?} */
var whatToReload;
/** @type {?} */
var entity;
switch (entityType) {
case EntityType.User:
deleteEntity = this.platformUsersService.deleteUser(this.selectedDomain, data.rowData.dataItem.userId);
entity = 'User';
whatToReload = BIT_LOAD_USERS;
break;
case EntityType.Admin:
deleteEntity = this.platformAdminsService.deleteAdminUser(this.selectedDomain, data.rowData.dataItem.userId);
entity = 'Admin';
whatToReload = BIT_LOAD_USERS;
break;
case EntityType.Client:
deleteEntity = this.platformClientsService.deleteClientUser(this.selectedDomain, data.rowData.dataItem.userId);
entity = 'Client';
whatToReload = BIT_LOAD_USERS;
break;
case EntityType.Group:
deleteEntity = this.groupsService.deleteGroup(this.selectedDomain, data.rowData.dataItem.name);
entity = 'Group';
whatToReload = BIT_LOAD_GROUPS;
break;
case EntityType.Role:
deleteEntity = this.rolesService.deleteRole(data.rowData.dataItem.name);
entity = 'Role';
whatToReload = BIT_LOAD_ROLES;
break;
case EntityType.Permission:
deleteEntity = this.permissionsService.deletePermission(data.rowData.dataItem.component, data.rowData.dataItem.action, data.rowData.dataItem.target);
entity = 'Permission';
whatToReload = BIT_LOAD_PERMISSIONS;
break;
}
deleteEntity.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} any
* @return {?}
*/
function (any) {
_this.logger.debug(LOG_TAG, entity, ' deleted. ');
_this.onResetClicked();
_this.notificationCenter.post({
name: 'Delete' + entity + 'Entity',
title: 'Deleted ' + entity + ' Entity',
message: entity + ' deleted successfully.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, 'Delete ' + entity + ' error: ', error);
_this.notificationCenter.post({
name: 'Delete' + entity + 'Error',
title: 'Delete ' + entity,
message: 'Error deleting ' + entity + ':',
type: NotificationType.Error,
error: error,
closable: true
});
}));
};
/**
* @private
* @param {?} dialogType
* @param {?} entityType
* @param {?} data
* @return {?}
*/
AccessControlSectionComponent.prototype.createOrUpdateEntity = /**
* @private
* @param {?} dialogType
* @param {?} entityType
* @param {?} data
* @return {?}
*/
function (dialogType, entityType, data) {
var _this = this;
this.logger.debug(LOG_TAG, 'createOrUpdateAclEntity called for: ', data);
/** @type {?} */
var whatToReload;
/** @type {?} */
var action;
/** @type {?} */
var entity;
switch (entityType) {
case EntityType.User:
if (dialogType === DialogType.Create) {
/** @type {?} */
var uc = {
userId: data.userId,
userIdInt: (data.userIdInt && data.userIdInt.length) > 0 ? data.userIdInt : undefined,
state: data.state
};
action = this.platformUsersService.createUser(this.selectedDomain, uc);
}
else {
/** @type {?} */
var uu = {
userIdInt: (data.userIdInt && data.userIdInt.length) > 0 ? data.userIdInt : undefined,
state: data.state
};
action = this.platformUsersService.updateUser(this.selectedDomain, data.userId, uu);
}
entity = 'User';
whatToReload = BIT_LOAD_USERS;
break;
case EntityType.Admin:
if (dialogType === DialogType.Create) {
/** @type {?} */
var adc = {
userId: data.userId
};
action = this.platformAdminsService.createAdminUser(this.selectedDomain, adc);
}
else {
/** @type {?} */
var adu = {
email: data.email,
firstName: data.firstName,
lastName: data.lastName,
state: data.state
};
action = this.platformAdminsService.updateAdminUser(this.selectedDomain, data.userId, adu);
}
entity = 'Admin';
whatToReload = BIT_LOAD_USERS;
break;
case EntityType.Client:
if (dialogType === DialogType.Create) {
/** @type {?} */
var cc = {
userId: data.userId
};
action = this.platformClientsService.createClientUser(this.selectedDomain, cc);
}
else {
/** @type {?} */
var cu = {
state: data.state,
email: data.email
};
action = this.platformClientsService.updateClientUser(this.selectedDomain, data.userId, cu);
}
entity = 'Client';
whatToReload = BIT_LOAD_USERS;
break;
case EntityType.Group:
if (dialogType === DialogType.Create) {
/** @type {?} */
var gc = {
name: data.name,
description: data.description.length > 0 ? data.description : undefined
};
action = this.groupsService.createGroup(this.selectedDomain, gc);
}
else {
/** @type {?} */
var gu = {
description: data.description.length > 0 ? data.description : undefined
};
action = this.groupsService.updateGroup(this.selectedDomain, data.name, gu);
}
entity = 'Group';
whatToReload = BIT_LOAD_GROUPS;
break;
case EntityType.Role:
if (dialogType === DialogType.Create) {
/** @type {?} */
var rc = {
name: data.name,
description: data.description.length > 0 ? data.description : undefined
};
action = this.rolesService.createRole(rc);
}
else {
/** @type {?} */
var ru = {
description: data.description.length > 0 ? data.description : undefined
};
action = this.rolesService.updateRole(data.name, ru);
}
entity = 'Role';
whatToReload = BIT_LOAD_ROLES;
break;
}
action.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} newEntity
* @return {?}
*/
function (newEntity) {
_this.logger.debug(LOG_TAG, dialogType + ' ', entity, ' completed', newEntity ? (': ' + newEntity) : '');
_this.loadGrids(whatToReload);
_this.notificationCenter.post({
name: dialogType + entity + 'Entity',
title: dialogType + ' ' + entity + ' Entity',
message: dialogType + ' ' + entity + ' successful.',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
_this.logger.error(LOG_TAG, dialogType + entity + ' error: ', error);
_this.notificationCenter.post({
name: dialogType + entity + 'Error',
title: dialogType + ' ' + entity,
message: 'Error during ' + dialogType + ' of entity:',
type: NotificationType.Error,
error: error,
closable: true
});
}));
};
/**
* @private
* @param {?} entityType
* @param {?} userId
* @param {?} newPassword
* @param {?} verifyPassword
* @return {?}
*/
AccessControlSectionComponent.prototype.changePassword = /**
* @private
* @param {?} entityType
* @param {?} userId
* @param {?} newPassword
* @param {?} verifyPassword
* @return {?}
*/
function (entityType, userId, newPassword, verifyPassword) {
var _this = this;
/** @type {?} */
var cc = {
password: newPassword,
passwordVerify: verifyPassword
};
switch (entityType) {
case EntityType.User:
this.platformUsersService.createUserCredentials(this.selectedDomain, userId, cc)
.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) { return _this.passwordChangeSuccessHandler(result); }), (/**
* @param {?} error
* @return {?}
*/
function (error) { return _this.passwordChangeErrorHandler(error); }));
break;
case EntityType.Admin:
this.platformAdminsService.createAdminUserCredentials(this.selectedDomain, userId, cc)
.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) { return _this.passwordChangeSuccessHandler(result); }), (/**
* @param {?} error
* @return {?}
*/
function (error) { return _this.passwordChangeErrorHandler(error); }));
break;
case EntityType.Client:
this.platformClientsService.createClientUserCredentials(this.selectedDomain, userId, cc)
.pipe(takeUntil(this.destroy)).subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) { return _this.passwordChangeSuccessHandler(result); }), (/**
* @param {?} error
* @return {?}
*/
function (error) { return _this.passwordChangeErrorHandler(error); }));
break;
}
};
/**
* @private
* @param {?} error
* @return {?}
*/
AccessControlSectionComponent.prototype.passwordChangeSuccessHandler = /**
* @private
* @param {?} error
* @return {?}
*/
function (error) {
this.notificationCenter.post({
name: 'PasswordChanged',
title: 'Password Changed',
message: 'Password changed successfully.',
type: NotificationType.Success
});
};
/**
* @private
* @param {?} error
* @return {?}
*/
AccessControlSectionComponent.prototype.passwordChangeErrorHandler = /**
* @private
* @param {?} error
* @return {?}
*/
function (error) {
this.logger.error(LOG_TAG, 'Error changing password: ', error);
this.notificationCenter.post({
name: 'PasswordChangeError',
title: 'Password Change Error',
message: 'Error setting new password:',
type: NotificationType.Error,
error: error,
closable: true
});
};
AccessControlSectionComponent.decorators = [
{ type: Component, args: [{
selector: 'wa-access-control-section',
template: "<wc-dashboard-header [title]=\"'Access Control'\"></wc-dashboard-header>\n\n<wa-access-control-section-new-acl-entity-dialog #newAclEntityDialog (confirm)='onNewAclEntityConfirm($event)'></wa-access-control-section-new-acl-entity-dialog>\n<wa-access-control-section-new-user-dialog #newUserDialog (confirm)='onNewUserConfirm($event)'></wa-access-control-section-new-user-dialog>\n<wa-access-control-section-acl-relations-dialog #aclRelationsDialog (dialogClose)='onDialogClose($event)'></wa-access-control-section-acl-relations-dialog>\n<wa-access-control-section-password-change-dialog #passwordChangeDialog (confirm)='onPasswordChangeConfirm($event)'></wa-access-control-section-password-change-dialog>\n<wc-confirmation-dialog (cancel)=\"onInvalidationCancel($event)\" (confirm)=\"onInvalidationOK($event)\"></wc-confirmation-dialog>\n\n<div class=\"row spread\">\n <div class=\"flex-toolbar\" style=\"display:flex;flex-direction: row;align-items: flex-start;\">\n <div style=\"margin-right:10px;width:60%;max-width: 400px;min-width: 250px;\">\n <label>Domain</label>\n <wc-domain-selector-combobox #domainSelector (domainSelected)=\"onDomainSelected($event)\"\n (selectionCancelled)=\"onDomainSelected(null)\"></wc-domain-selector-combobox>\n </div>\n <div class=\"row add-button\">\n <kendo-dropdownbutton [data]=\"dropDownButtonItems\" [icon]=\"'plus'\" (itemClick)=\"onAddButtonItemClick($event)\">\n Add...\n </kendo-dropdownbutton>\n </div>\n <div class=\"row fill refresh-button\">\n <kendo-buttongroup look=\"flat\">\n <button kendoButton [toggleable]=\"false\" [icon]=\"'refresh'\" (click)=\"onResetClicked()\">\n Reset Selections\n </button>\n </kendo-buttongroup>\n </div>\n <div class=\"row delete-button\">\n <button kendoButton look=\"flat\" \n [toggleable]=\"false\" \n [icon]=\"'delete'\" \n (click)=\"onInvalidateCacheClicked()\"\n motif-acl=\"com.vipera.osgi.core.platform.api.rest.AcsApi:CREATE:invalidateCache\">\n Invalidate Cache\n </button>\n </div>\n </div>\n</div>\n\n<div class=\"row fill\" style=\"height: 100%;\">\n <kendo-splitter orientation=\"vertical\" (layoutChange)=\"onLayoutChange()\">\n <kendo-splitter-pane [collapsible]=\"false\" [resizable]=\"true\" [scrollable]=\"false\">\n <kendo-splitter orientation=\"horizontal\">\n <kendo-splitter-pane [collapsible]=\"false\" [scrollable]=\"false\">\n <div class=\"pane-content\" style=\"height: 100%;\">\n <input type=\"radio\" [checked]=\"usersTabSelected\" (click)=\"onTabChange()\" name=\"tabs\" id=\"tab-1-cmd\" checked=\"\">\n <input type=\"radio\" [checked]=\"adminsTabSelected\" (click)=\"onTabChange()\" name=\"tabs\" id=\"tab-2-cmd\">\n <input type=\"radio\" [checked]=\"clientsTabSelected\" (click)=\"onTabChange()\" name=\"tabs\" id=\"tab-3-cmd\">\n\n <div class=\"tabs\">\n <label for=\"tab-1-cmd\">\n <div class=\"tab-title\">Users</div>\n </label>\n <label for=\"tab-2-cmd\">\n <div class=\"tab-title\">Admins</div>\n </label>\n <label for=\"tab-3-cmd\">\n <div class=\"tab-title\">Clients</div>\n </label>\n </div>\n\n <div class=\"tab\" id=\"tab-1\">\n <wa-access-control-section-users-list #usersListGrid class=\"users-list\" [selectedDomain]=\"selectedDomain\"\n (selectionChange)=\"onUserSelectionChange($event)\" [selection]=\"userSelection\"\n (rowCommandClick)=\"onUserRowCommandClick($event)\"></wa-access-control-section-users-list>\n </div>\n\n\n <div class=\"tab\" id=\"tab-2\">\n <wc-loading-overlay [visible]=\"adminsLoading\"></wc-loading-overlay>\n <kendo-grid [data]=\"adminsData\" [kendoGridSelectBy]=\"'userId'\" [selectedKeys]=\"adminSelection\"\n (selectedKeysChange)=\"onUserSelectionChange($event)\" [selectable]=\"selectableSettings\">\n <kendo-grid-column field=\"userId\" title=\"UserID\" width=\"30\">\n </kendo-grid-column>\n <kendo-grid-column field=\"created\" title=\"Created\" format=\"{0:dd/MM/yyyy HH:mm:ss}\" width=\"40\">\n </kendo-grid-column>\n <kendo-grid-column field=\"state\" title=\"State\" width=\"30\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\"\n let-column=\"column\">\n <span class=\"badge badge-status user-status-{{dataItem[column.field]}}\">\n {{dataItem[column.field]}}\n </span>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"email\" title=\"Email\" width=\"30\">\n </kendo-grid-column>\n <kendo-grid-column field=\"lastLogin\" title=\"Last Login\" format=\"{0:dd/MM/yyyy HH:mm:ss}\" width=\"30\">\n </kendo-grid-column>\n <kendo-grid-column title=\"\" width=\"50\" minResizableWidth=\"40\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\"\n let-column=\"column\">\n <wc-grid-editor-commands-group \n [motif-acl]=\"['com.vipera.osgi.core.platform.api.rest.UserMgrApi:CREATE:createAdminUserCredentials',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:DELETE:removeGroupFromUser',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:CREATE:assignGroupToUser',\n 'com.vipera.osgi.core.platform.api.rest.UserMgrApi:UPDATE:updateUser',\n 'com.vipera.osgi.core.platform.api.rest.UserMgrApi:DELETE:deleteUser']\"\n motif-acl-hidden=\"true\"\n [commands]=\"userCommands\" [alignMode]=\"'end'\" [rowIndex]=\"rowIndex\"\n [columnIndex]=\"columnIndex\" [column]=\"column\" [value]=\"dataItem[column.field]\" [dataItem]=\"dataItem\"\n (commandConfirm)=\"onAdminCommandConfirm($event)\" (commandClick)=\"onAdminCommandClick($event)\">\n </wc-grid-editor-commands-group>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n\n <div class=\"tab\" id=\"tab-3\">\n <wc-loading-overlay [visible]=\"clientsLoading\"></wc-loading-overlay>\n <kendo-grid [data]=\"clientsData\" [kendoGridSelectBy]=\"'userId'\" [selectedKeys]=\"clientSelection\"\n (selectedKeysChange)=\"onUserSelectionChange($event)\" [selectable]=\"selectableSettings\">\n <kendo-grid-column field=\"userId\" title=\"UserID\" width=\"100\">\n </kendo-grid-column>\n <kendo-grid-column field=\"created\" title=\"Created\" format=\"{0:dd/MM/yyyy HH:mm:ss}\" width=\"150\">\n </kendo-grid-column>\n <kendo-grid-column field=\"state\" title=\"State\" width=\"30\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\"\n let-column=\"column\">\n <span class=\"badge badge-status user-status-{{dataItem[column.field]}}\">\n {{dataItem[column.field]}}\n </span>\n </ng-template>\n </kendo-grid-column>\n <kendo-grid-column field=\"lastLogin\" title=\"Last Login\" format=\"{0:dd/MM/yyyy HH:mm:ss}\" width=\"30\">\n </kendo-grid-column>\n <kendo-grid-column title=\"\" width=\"50\" minResizableWidth=\"40\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\"\n let-column=\"column\">\n <wc-grid-editor-commands-group\n [motif-acl]=\"['com.vipera.osgi.core.platform.api.rest.UserMgrApi:CREATE:createClientUserCredentials',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:DELETE:removeGroupFromUser',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:CREATE:assignGroupToUser',\n 'com.vipera.osgi.core.platform.api.rest.UserMgrApi:UPDATE:updateUser',\n 'com.vipera.osgi.core.platform.api.rest.UserMgrApi:DELETE:deleteUser']\"\n motif-acl-hidden=\"true\"\n [commands]=\"userCommands\" [alignMode]=\"'end'\" [rowIndex]=\"rowIndex\"\n [columnIndex]=\"columnIndex\" [column]=\"column\" [value]=\"dataItem[column.field]\" [dataItem]=\"dataItem\"\n (commandConfirm)=\"onClientCommandConfirm($event)\" (commandClick)=\"onClientCommandClick($event)\">\n </wc-grid-editor-commands-group>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n </div>\n </kendo-splitter-pane>\n\n <kendo-splitter-pane [collapsible]=\"false\" size=\"30%\" [scrollable]=\"false\">\n <label class=\"acl-label\">GROUPS</label>\n <div class=\"pane-content\">\n <wc-loading-overlay [visible]=\"groupsLoading\"></wc-loading-overlay>\n <kendo-grid [data]=\"groupsData\" [kendoGridSelectBy]=\"'name'\" [selectedKeys]=\"groupSelection\"\n (selectedKeysChange)=\"onGroupSelectionChange($event)\" [selectable]=\"selectableSettings\">\n <kendo-grid-column field=\"name\" title=\"Name\" width=\"100\">\n </kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\" width=\"150\">\n </kendo-grid-column>\n <kendo-grid-column title=\"\" width=\"50\" minResizableWidth=\"40\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\"\n let-column=\"column\">\n <wc-grid-editor-commands-group \n [motif-acl]=\"['com.vipera.osgi.core.platform.api.rest.AcsApi:DELETE:removeRoleFromGroup',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:CREATE:assignRoleToGroup',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:UPDATE:updateGroup',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:DELETE:deleteGroup']\"\n motif-acl-hidden=\"true\"\n [commands]=\"commands\" [alignMode]=\"'end'\" [rowIndex]=\"rowIndex\"\n [columnIndex]=\"columnIndex\" [column]=\"column\" [value]=\"dataItem[column.field]\" [dataItem]=\"dataItem\"\n (commandConfirm)=\"onGroupCommandConfirm($event)\" (commandClick)=\"onGroupCommandClick($event)\">\n </wc-grid-editor-commands-group>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </kendo-splitter-pane>\n\n <kendo-splitter-pane [collapsible]=\"false\" [(size)]=\"size\" [resizable]=\"true\" min=\"150px\" [scrollable]=\"false\">\n <kendo-splitter>\n <kendo-splitter-pane [collapsible]=\"false\" size=\"26%\">\n <label class=\"acl-label\">ROLES</label>\n <div class=\"pane-content\">\n <wc-loading-overlay [visible]=\"rolesLoading\"></wc-loading-overlay>\n <kendo-grid [data]=\"rolesGridView\" [kendoGridSelectBy]=\"'name'\" [height]=\"height\" [selectedKeys]=\"roleSelection\"\n (selectedKeysChange)=\"onRoleSelectionChange($event)\" [selectable]=\"selectableSettings\" [filterable]=\"true\"\n [filter]=\"rolesDataState.filter\" (dataStateChange)=\"onRolesDataStateChange($event)\">\n <kendo-grid-column field=\"name\" title=\"Name\" width=\"30\">\n </kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\" width=\"50\">\n </kendo-grid-column>\n <kendo-grid-column title=\"\" width=\"25\" minResizableWidth=\"25\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\"\n let-column=\"column\">\n <wc-grid-editor-commands-group \n [motif-acl]=\"['com.vipera.osgi.core.platform.api.rest.AcsApi:DELETE:removePermissionFromRole',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:CREATE:assignPermissionToRole',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:UPDATE:updateRole',\n 'com.vipera.osgi.core.platform.api.rest.AcsApi:DELETE:deleteRole']\"\n motif-acl-hidden=\"true\"\n [commands]=\"commands\" [alignMode]=\"'end'\" [rowIndex]=\"rowIndex\"\n [columnIndex]=\"columnIndex\" [column]=\"column\" [value]=\"dataItem[column.field]\" [dataItem]=\"dataItem\"\n (commandConfirm)=\"onRoleCommandConfirm($event)\" (commandClick)=\"onRoleCommandClick($event)\">\n </wc-grid-editor-commands-group>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n </kendo-splitter-pane>\n\n <kendo-splitter-pane [collapsible]=\"false\" [scrollable]=\"false\">\n <label class=\"acl-label\">PERMISSIONS</label>\n <div class=\"pane-content selectable-permissions\">\n <wc-loading-overlay [visible]=\"permissionsLoading\"></wc-loading-overlay>\n <kendo-grid id=\"permissionsGrid\" [data]=\"permissionsGridView\" \n [selectable]=\"false\" [skip]=\"permissionsDataState.skip\" [pageSize]=\"permissionsDataState.take\"\n [scrollable]=\"'virtual'\" [rowHeight]=\"35\" [height]=\"height\" (pageChange)=\"permissionsPageChange($event)\"\n [filterable]=\"true\" [filter]=\"permissionsDataState.filter\" (dataStateChange)=\"onPermissionsDataStateChange($event)\"\n [resizable]=\"true\"\n [sortable]=\"{\n allowUnsort: false,\n mode: 'single'\n }\"\n [sort]=\"permissionsDataState.sort\">\n <kendo-grid-column field=\"component\" title=\"Component\" width=\"90\">\n </kendo-grid-column>\n <kendo-grid-column field=\"action\" title=\"Action\" width=\"28\" [sortable]=\"false\">\n </kendo-grid-column>\n <kendo-grid-column field=\"target\" title=\"Target\" width=\"48\">\n </kendo-grid-column>\n <kendo-grid-column field=\"description\" title=\"Description\" width=\"100\">\n </kendo-grid-column>\n\n <kendo-grid-column title=\"\" width=\"25\" minResizableWidth=\"25\" [filterable]=\"false\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\"\n let-column=\"column\">\n <wc-grid-editor-command \n motif-acl=\"com.vipera.osgi.core.platform.api.rest.AcsApi:DELETE:deletePermission\"\n motif-acl-hidden=\"true\"\n [alignMode]=\"'end'\" [hasConfirmation]=\"true\" [confirmationTitle]=\"'Delete?'\"\n [rowIndex]=\"rowIndex\" [columnIndex]=\"columnIndex\" [column]=\"column\" [commandIcon]=\"'wa-ico-no'\"\n [dataItem]=\"dataItem\" (commandConfirm)=\"onPermissionCommandConfirm($event)\">\n </wc-grid-editor-command>\n </ng-template>\n </kendo-grid-column>\n </kendo-grid>\n </div>\n </kendo-splitter-pane>\n </kendo-splitter>\n </kendo-splitter-pane>\n </kendo-splitter>\n</div>",
styles: [":host{height:100%}.tabs{margin-top:0}.tab{height:calc(100% - 2.3rem)}.acl-label{margin:10px}.users-list{height:100%}.add-button,.delete-button,.refresh-button{padding-top:13px}.k-grid tr.dragging{background-color:#f45c42}.selectable-permissions{-webkit-touch-callout:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}"]
}] }
];
/** @nocollapse */
AccessControlSectionComponent.ctorParameters = function () { return [
{ type: NGXLogger },
{ type: MotifACLService },
{ type: PlatformUsersService },
{ type: PlatformAdminsService },
{ type: PlatformClientsService },
{ type: UsersService },
{ type: GroupsService },
{ type: RolesService },
{ type: PermissionsService },
{ type: CacheService },
{ type: WCNotificationCenter },
{ type: Renderer2 },
{ type: NgZone }
]; };
AccessControlSectionComponent.propDecorators = {
_newAclEntityDialog: [{ type: ViewChild, args: ['newAclEntityDialog',] }],
_newUserDialog: [{ type: ViewChild, args: ['newUserDialog',] }],
_aclRelationsDialog: [{ type: ViewChild, args: ['aclRelationsDialog',] }],
_passwordChangeDialog: [{ type: ViewChild, args: ['passwordChangeDialog',] }],
_usersListGrid: [{ type: ViewChild, args: ['usersListGrid',] }],
confirmationDialog: [{ type: ViewChild, args: [ConfirmationDialogComponent,] }]
};
AccessControlSectionComponent = tslib_1.__decorate([
PluginView('AccessControl', {
iconName: 'wa-ico-users',
userData: {
acl: {
permissions: ['com.vipera.osgi.core.platform.api.rest.PlatformApi:READ:getDomains',
'com.vipera.osgi.core.platform.api.rest.UserMgrApi:READ:getUsersList',
'com.vipera.osgi.core.platform.api.rest.UserMgrApi:READ:getAdminUsersList',
'com.vipera.osgi.core.platform.api.rest.UserMgrApi:READ:getClientUsersList',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getGroups',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getRoles',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getPermissions',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getUserGroups',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getUserRoles',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getUserPermissions',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getGroupRoles',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getGroupPermissions',
'com.vipera.osgi.core.platform.api.rest.AcsApi:READ:getRolePermissions']
}
}
}),
tslib_1.__metadata("design:paramtypes", [NGXLogger,
MotifACLService,
PlatformUsersService,
PlatformAdminsService,
PlatformClientsService,
UsersService,
GroupsService,
RolesService,
PermissionsService,
CacheService,
WCNotificationCenter,
Renderer2,
NgZone])
], AccessControlSectionComponent);
return AccessControlSectionComponent;
}());
export { AccessControlSectionComponent };
if (false) {
/** @type {?} */
AccessControlSectionComponent.prototype.adminsLoading;
/** @type {?} */
AccessControlSectionComponent.prototype.clientsLoading;
/** @type {?} */
AccessControlSectionComponent.prototype.groupsLoading;
/** @type {?} */
AccessControlSectionComponent.prototype.rolesLoading;
/** @type {?} */
AccessControlSectionComponent.prototype.permissionsLoading;
/** @type {?} */
AccessControlSectionComponent.prototype.size;
/** @type {?} */
AccessControlSectionComponent.prototype.height;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.destroy;
/** @type {?} */
AccessControlSectionComponent.prototype._newAclEntityDialog;
/** @type {?} */
AccessControlSectionComponent.prototype._newUserDialog;
/** @type {?} */
AccessControlSectionComponent.prototype._aclRelationsDialog;
/** @type {?} */
AccessControlSectionComponent.prototype._passwordChangeDialog;
/** @type {?} */
AccessControlSectionComponent.prototype._usersListGrid;
/** @type {?} */
AccessControlSectionComponent.prototype.confirmationDialog;
/** @type {?} */
AccessControlSectionComponent.prototype.userCommands;
/** @type {?} */
AccessControlSectionComponent.prototype.commands;
/** @type {?} */
AccessControlSectionComponent.prototype.dropDownButtonItems;
/** @type {?} */
AccessControlSectionComponent.prototype.selectedDomain;
/** @type {?} */
AccessControlSectionComponent.prototype.selectedEntity;
/** @type {?} */
AccessControlSectionComponent.prototype.usersTabSelected;
/** @type {?} */
AccessControlSectionComponent.prototype.adminsTabSelected;
/** @type {?} */
AccessControlSectionComponent.prototype.clientsTabSelected;
/** @type {?} */
AccessControlSectionComponent.prototype.userSelection;
/** @type {?} */
AccessControlSectionComponent.prototype.adminSelection;
/** @type {?} */
AccessControlSectionComponent.prototype.clientSelection;
/** @type {?} */
AccessControlSectionComponent.prototype.groupSelection;
/** @type {?} */
AccessControlSectionComponent.prototype.roleSelection;
/** @type {?} */
AccessControlSectionComponent.prototype.rolesGridView;
/** @type {?} */
AccessControlSectionComponent.prototype.rolesDataState;
/** @type {?} */
AccessControlSectionComponent.prototype.permissionsGridView;
/** @type {?} */
AccessControlSectionComponent.prototype.permissionsDataState;
/** @type {?} */
AccessControlSectionComponent.prototype.usersData;
/** @type {?} */
AccessControlSectionComponent.prototype.adminsData;
/** @type {?} */
AccessControlSectionComponent.prototype.clientsData;
/** @type {?} */
AccessControlSectionComponent.prototype.groupsData;
/** @type {?} */
AccessControlSectionComponent.prototype.rolesData;
/** @type {?} */
AccessControlSectionComponent.prototype.permissionsData;
/** @type {?} */
AccessControlSectionComponent.prototype.selectableSettings;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.logger;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.motifACLService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.platformUsersService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.platformAdminsService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.platformClientsService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.usersService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.groupsService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.rolesService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.permissionsService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.cacheService;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.notificationCenter;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
AccessControlSectionComponent.prototype.zone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wtc2VjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tb3RpZi13ZWItYWRtaW4tY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zZWN0aW9ucy9BY2Nlc3NDb250cm9sL2NvbXBvbmVudHMvYWNjZXNzLWNvbnRyb2wtc2VjdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFTLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUk3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQ1osWUFBWSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFL0gsT0FBTyxFQUFFLFlBQVksSUFBSSxvQkFBb0IsRUFBRSxhQUFhLElBQUkscUJBQXFCLEVBQ25GLGNBQWMsSUFBSSxzQkFBc0IsRUFDYyxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BHLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxnQkFBZ0IsRUFBMkQsTUFBTSxvQkFBb0IsQ0FBQztBQUNySSxPQUFPLEVBQUUsc0JBQXNCLEVBQW9CLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUYsT0FBTyxFQUFFLDJCQUEyQixFQUFrQyxNQUFNLDhDQUE4QyxDQUFDO0FBQzNILE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdEUsT0FBTyxFQUE0QixhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNB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QUM3Qix1REFBOEI7O0lBQzlCLHNEQUE2Qjs7SUFDN0IscURBQTRCOztJQUM1QiwyREFBa0M7O0lBRWxDLDZDQUFzQjs7SUFDdEIsK0NBQXNCOzs7OztJQUV0QixnREFBZ0U7O0lBRWhFLDREQUFrRjs7SUFDbEYsdURBQW1FOztJQUNuRSw0REFBa0Y7O0lBQ2xGLDhEQUF3Rjs7SUFDeEYsdURBQStEOztJQUMvRCwyREFBd0Y7O0lBRXhGLHFEQTJCRTs7SUFFRixpREFxQkU7O0lBRUYsNERBZUc7O0lBRUgsdURBQThCOztJQUM5Qix1REFBOEI7O0lBQzlCLHlEQUErQjs7SUFDL0IsMERBQWtDOztJQUNsQywyREFBbUM7O0lBRW5DLHNEQUFvQzs7SUFDcEMsdURBQXFDOztJQUNyQyx3REFBc0M7O0lBQ3RDLHVEQUFxQzs7SUFDckMsc0RBQW9DOztJQUVwQyxzREFBcUM7O0lBQ3JDLHVEQUtFOztJQUNGLDREQUEyQzs7SUFDM0MsNkRBVUU7O0lBRUYsa0RBQXlCOztJQUN6QixtREFBK0I7O0lBQy9CLG9EQUFpQzs7SUFDakMsbURBQTJCOztJQUMzQixrREFBeUI7O0lBQ3pCLHdEQUFxQzs7SUFDckMsMkRBR0U7Ozs7O0lBRVUsK0NBQXlCOzs7OztJQUNuQyx3REFBd0M7Ozs7O0lBQ3hDLDZEQUFrRDs7Ozs7SUFDbEQsOERBQW9EOzs7OztJQUNwRCwrREFBc0Q7Ozs7O0lBQ3RELHFEQUFrQzs7Ozs7SUFDbEMsc0RBQW9DOzs7OztJQUNwQyxxREFBa0M7Ozs7O0lBQ2xDLDJEQUE4Qzs7Ozs7SUFDOUMscURBQWtDOzs7OztJQUNsQywyREFBZ0Q7Ozs7O0lBQ2hELGlEQUEyQjs7Ozs7SUFDM0IsNkNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvY2VzcywgU3RhdGUgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZGF0YS1xdWVyeSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBSZW5kZXJlcjIsIE5nWm9uZSwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbHVnaW5WaWV3IH0gZnJvbSAnd2ViLWNvbnNvbGUtY29yZSc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IFNlbGVjdGFibGVTZXR0aW5ncywgU2VsZWN0aW9uRXZlbnQsIFJvd0FyZ3MsIFBhZ2VDaGFuZ2VFdmVudCwgR3JpZERhdGFSZXN1bHQsXG4gIERhdGFTdGF0ZUNoYW5nZUV2ZW50LFxuICBSb3dDbGFzc0FyZ3N9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWQnO1xuaW1wb3J0IHsgVXNlcnNTZXJ2aWNlLCBHcm91cHNTZXJ2aWNlLCBSb2xlc1NlcnZpY2UsIFBlcm1pc3Npb25zU2VydmljZSwgR3JvdXAsIFBlcm1pc3Npb24sXG4gIFJvbGUsIEdyb3VwQ3JlYXRlLCBSb2xlQ3JlYXRlLCBHcm91cFVwZGF0ZSwgUm9sZVVwZGF0ZSwgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnQHdhLW1vdGlmLW9wZW4tYXBpL2F1dGgtYWNjZXNzLWNvbnRyb2wtc2VydmljZSc7XG5pbXBvcnQgeyBEb21haW4gfSBmcm9tICdAd2EtbW90aWYtb3Blbi1hcGkvcGxhdGZvcm0tc2VydmljZSc7XG5pbXBvcnQgeyBVc2Vyc1NlcnZpY2UgYXMgUGxhdGZvcm1Vc2Vyc1NlcnZpY2UsIEFkbWluc1NlcnZpY2UgYXMgUGxhdGZvcm1BZG1pbnNTZXJ2aWNlLFxuICBDbGllbnRzU2VydmljZSBhcyBQbGF0Zm9ybUNsaWVudHNTZXJ2aWNlLCBVc2VyLCBBZG1pblVzZXIsIENsaWVudFVzZXIsIFVzZXJDcmVhdGUsIEFkbWluVXNlckNyZWF0ZSwgQ2xpZW50VXNlckNyZWF0ZSwgVXNlclVwZGF0ZSxcbiAgQWRtaW5Vc2VyVXBkYXRlLCBDbGllbnRVc2VyVXBkYXRlLCBDcmVkZW50aWFsc0NyZWF0ZSB9IGZyb20gJ0B3YS1tb3RpZi1vcGVuLWFwaS91c2VyLW1nci1zZXJ2aWNlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFdDTm90aWZpY2F0aW9uQ2VudGVyLCBOb3RpZmljYXRpb25UeXBlLCBXQ0dyaWRFZGl0b3JDb21tYW5kc0NvbmZpZywgV0NDb25maXJtYXRpb25UaXRsZVByb3ZpZGVyIH0gZnJvbSAnd2ViLWNvbnNvbGUtdWkta2l0JztcbmltcG9ydCB7IE5ld1VzZXJEaWFsb2dDb21wb25lbnQsIFVzZXJEaWFsb2dSZXN1bHQgfSBmcm9tICcuL2RpYWxvZ3MvdXNlci9uZXctdXNlci1kaWFsb2cnO1xuaW1wb3J0IHsgTmV3QWNsRW50aXR5RGlhbG9nQ29tcG9uZW50LCBEaWFsb2dSZXN1bHQgYXMgQWNsRGlhbG9nUmVzdWx0fSBmcm9tICcuL2RpYWxvZ3MvYWNsL2VudGl0aWVzL25ldy1hY2wtZW50aXR5LWRpYWxvZyc7XG5pbXBvcnQgeyBEaWFsb2dUeXBlLCBFbnRpdHlUeXBlIH0gZnJvbSAnLi9lZGl0b3JzL2FjbC1lZGl0b3ItY29udGV4dCc7XG5pbXBvcnQgeyBXQ1N1YnNjcmlwdGlvbkhhbmRsZXIgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NvbW1vbnMvd2Mtc3Vic2NyaXB0aW9uLWhhbmRsZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBVc2Vyc0xpc3RDb21wb25lbnQgfSBmcm9tICcuL3VzZXJzLWxpc3QvdXNlcnMtbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWNsUmVsYXRpb25zRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9kaWFsb2dzL2FjbC9yZWxhdGlvbnMvYWNsLXJlbGF0aW9ucy1kaWFsb2cnO1xuaW1wb3J0IHsgUm93Q29tbWFuZFR5cGUgfSBmcm9tICcuL2VkaXRvcnMvYWNsLWVkaXRvci1jb250ZXh0JztcbmltcG9ydCB7IFBhc3N3b3JkQ2hhbmdlRGlhbG9nUmVzdWx0LCBQYXNzd29yZENoYW5nZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9ncy9wYXNzd29yZC9wYXNzd29yZC1jaGFuZ2UtZGlhbG9nJztcbmltcG9ydCB7IE1vdGlmQUNMU2VydmljZSB9IGZyb20gJ3dlYi1jb25zb2xlLW1vdGlmLWFjbCc7XG5pbXBvcnQgeyBmb3JrSm9pbiB9IGZyb20gJ3J4anMvb2JzZXJ2YWJsZS9mb3JrSm9pbic7XG5pbXBvcnQgeyBDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NvbmZpcm1hdGlvbkRpYWxvZy9jb25maXJtYXRpb24tZGlhbG9nLWNvbXBvbmVudCc7XG5cbmNvbnN0IExPR19UQUcgPSAnW0FjY2Vzc0NvbnRyb2xTZWN0aW9uXSc7XG5jb25zdCBCSVRfTE9BRF9VU0VSUyA9IDE7XG5jb25zdCBCSVRfTE9BRF9HUk9VUFMgPSA4O1xuY29uc3QgQklUX0xPQURfUk9MRVMgPSAxNjtcbmNvbnN0IEJJVF9MT0FEX1BFUk1JU1NJT05TID0gMzI7XG5jb25zdCBCSVRfTE9BRF9BTEwgPSBCSVRfTE9BRF9VU0VSUyB8IEJJVF9MT0FEX0dST1VQUyB8IEJJVF9MT0FEX1JPTEVTIHwgQklUX0xPQURfUEVSTUlTU0lPTlM7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dhLWFjY2Vzcy1jb250cm9sLXNlY3Rpb24nLFxuICBzdHlsZVVybHM6IFsnLi9hY2Nlc3MtY29udHJvbC1zZWN0aW9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi9hY2Nlc3MtY29udHJvbC1zZWN0aW9uLmNvbXBvbmVudC5odG1sJ1xufSlcbkBQbHVnaW5WaWV3KCdBY2Nlc3NDb250cm9sJywge1xuICBpY29uTmFtZTogJ3dhLWljby11c2VycycsXG4gIHVzZXJEYXRhOiB7XG4gICAgICBhY2w6IHtcbiAgICAgICAgICBwZXJtaXNzaW9uczogWydjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5QbGF0Zm9ybUFwaTpSRUFEOmdldERvbWFpbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbS52aXBlcmEub3NnaS5jb3JlLnBsYXRmb3JtLmFwaS5yZXN0LlVzZXJNZ3JBcGk6UkVBRDpnZXRVc2Vyc0xpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbS52aXBlcmEub3NnaS5jb3JlLnBsYXRmb3JtLmFwaS5yZXN0LlVzZXJNZ3JBcGk6UkVBRDpnZXRBZG1pblVzZXJzTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuVXNlck1nckFwaTpSRUFEOmdldENsaWVudFVzZXJzTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuQWNzQXBpOlJFQUQ6Z2V0R3JvdXBzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5BY3NBcGk6UkVBRDpnZXRSb2xlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuQWNzQXBpOlJFQUQ6Z2V0UGVybWlzc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbS52aXBlcmEub3NnaS5jb3JlLnBsYXRmb3JtLmFwaS5yZXN0LkFjc0FwaTpSRUFEOmdldFVzZXJHcm91cHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbS52aXBlcmEub3NnaS5jb3JlLnBsYXRmb3JtLmFwaS5yZXN0LkFjc0FwaTpSRUFEOmdldFVzZXJSb2xlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuQWNzQXBpOlJFQUQ6Z2V0VXNlclBlcm1pc3Npb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5BY3NBcGk6UkVBRDpnZXRHcm91cFJvbGVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5BY3NBcGk6UkVBRDpnZXRHcm91cFBlcm1pc3Npb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5BY3NBcGk6UkVBRDpnZXRSb2xlUGVybWlzc2lvbnMnXVxuICAgICAgfVxuICB9XG59KVxuZXhwb3J0IGNsYXNzIEFjY2Vzc0NvbnRyb2xTZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kgIHtcblxuICBwdWJsaWMgYWRtaW5zTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgY2xpZW50c0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIGdyb3Vwc0xvYWRpbmcgPSBmYWxzZTtcbiAgcHVibGljIHJvbGVzTG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgcGVybWlzc2lvbnNMb2FkaW5nID0gZmFsc2U7XG5cbiAgcHVibGljIHNpemUgPSAnNDUwcHgnO1xuICBwdWJsaWMgaGVpZ2h0ID0gJzMzMCc7XG5cbiAgcHJpdmF0ZSBkZXN0cm95OiBSZXBsYXlTdWJqZWN0PGFueT4gPSBuZXcgUmVwbGF5U3ViamVjdDxhbnk+KDEpO1xuXG4gIEBWaWV3Q2hpbGQoJ25ld0FjbEVudGl0eURpYWxvZycpIF9uZXdBY2xFbnRpdHlEaWFsb2c6IE5ld0FjbEVudGl0eURpYWxvZ0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnbmV3VXNlckRpYWxvZycpIF9uZXdVc2VyRGlhbG9nOiBOZXdVc2VyRGlhbG9nQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdhY2xSZWxhdGlvbnNEaWFsb2cnKSBfYWNsUmVsYXRpb25zRGlhbG9nOiBBY2xSZWxhdGlvbnNEaWFsb2dDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3Bhc3N3b3JkQ2hhbmdlRGlhbG9nJykgX3Bhc3N3b3JkQ2hhbmdlRGlhbG9nOiBQYXNzd29yZENoYW5nZURpYWxvZ0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgndXNlcnNMaXN0R3JpZCcpIF91c2Vyc0xpc3RHcmlkOiBVc2Vyc0xpc3RDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50KSBjb25maXJtYXRpb25EaWFsb2c6IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudDtcblxuICB1c2VyQ29tbWFuZHM6IFdDR3JpZEVkaXRvckNvbW1hbmRzQ29uZmlnID0gW1xuICAgIHtcbiAgICAgIGNzc0NsYXNzOiAnay1pY29uJyxcbiAgICAgIGNvbW1hbmRJY29uOiAnd2EtaWNvLWhvdXNlLWtleScsXG4gICAgICBjb21tYW5kSWQ6IFJvd0NvbW1hbmRUeXBlLkNoYW5nZVBhc3N3b3JkLFxuICAgICAgdGl0bGU6ICdDaGFuZ2UgUGFzc3dvcmQnXG4gICAgfSxcbiAgICB7XG4gICAgICBjc3NDbGFzczogJ2staWNvbicsXG4gICAgICBjb21tYW5kSWNvbjogJ3dhLWljby1yZWxhdGlvbnMtbGlua3MnLFxuICAgICAgY29tbWFuZElkOiBSb3dDb21tYW5kVHlwZS5SZWxhdGlvbnMsXG4gICAgICB0aXRsZTogJ1JlbGF0aW9ucydcbiAgICB9LFxuICAgIHtcbiAgICAgIGNzc0NsYXNzOiAnay1pY29uJyxcbiAgICAgIGNvbW1hbmRJY29uOiAnd2EtaWNvLWVkaXQnLFxuICAgICAgY29tbWFuZElkOiBSb3dDb21tYW5kVHlwZS5FZGl0LFxuICAgICAgdGl0bGU6ICdFZGl0J1xuICAgIH0sXG4gICAge1xuICAgICAgY3NzQ2xhc3M6ICdrLWljb24nLFxuICAgICAgY29tbWFuZEljb246ICd3YS1pY28tbm8nLFxuICAgICAgY29tbWFuZElkOiBSb3dDb21tYW5kVHlwZS5EZWxldGUsXG4gICAgICB0aXRsZTogJ0RlbGV0ZScsXG4gICAgICBoYXNDb25maXJtYXRpb246IHRydWUsXG4gICAgICBjb25maXJtYXRpb25UaXRsZTogJ0RlbGV0ZT8nXG4gICAgfVxuICBdO1xuXG4gIGNvbW1hbmRzOiBXQ0dyaWRFZGl0b3JDb21tYW5kc0NvbmZpZyA9IFtcbiAgICB7XG4gICAgICBjc3NDbGFzczogJ2staWNvbicsXG4gICAgICBjb21tYW5kSWNvbjogJ3dhLWljby1yZWxhdGlvbnMtbGlua3MnLFxuICAgICAgY29tbWFuZElkOiBSb3dDb21tYW5kVHlwZS5SZWxhdGlvbnMsXG4gICAgICB0aXRsZTogJ1JlbGF0aW9ucydcbiAgICB9LFxuICAgIHtcbiAgICAgIGNzc0NsYXNzOiAnay1pY29uJyxcbiAgICAgIGNvbW1hbmRJY29uOiAnd2EtaWNvLWVkaXQnLFxuICAgICAgY29tbWFuZElkOiBSb3dDb21tYW5kVHlwZS5FZGl0LFxuICAgICAgdGl0bGU6ICdFZGl0J1xuICAgIH0sXG4gICAge1xuICAgICAgY3NzQ2xhc3M6ICdrLWljb24nLFxuICAgICAgY29tbWFuZEljb246ICd3YS1pY28tbm8nLFxuICAgICAgY29tbWFuZElkOiBSb3dDb21tYW5kVHlwZS5EZWxldGUsXG4gICAgICB0aXRsZTogJ0RlbGV0ZScsXG4gICAgICBoYXNDb25maXJtYXRpb246IHRydWUsXG4gICAgICBjb25maXJtYXRpb25UaXRsZTogJ0RlbGV0ZT8nXG4gICAgfVxuICBdO1xuXG4gIGRyb3BEb3duQnV0dG9uSXRlbXM6IEFycmF5PGFueT4gPSBbe1xuICAgIHRleHQ6ICdVc2VyJyxcbiAgICBkaXNhYmxlZDogdHJ1ZVxuICB9LCB7XG4gICAgdGV4dDogJ0FkbWluJyxcbiAgICBkaXNhYmxlZDogdHJ1ZVxuICB9LCB7XG4gICAgdGV4dDogJ0NsaWVudCcsXG4gICAgZGlzYWJsZWQ6IHRydWVcbiAgfSwge1xuICAgIHRleHQ6ICdHcm91cCcsXG4gICAgZGlzYWJsZWQ6IHRydWVcbiAgfSwge1xuICAgIHRleHQ6ICdSb2xlJyxcbiAgICBkaXNhYmxlZDogZmFsc2VcbiAgfV07XG5cbiAgcHVibGljIHNlbGVjdGVkRG9tYWluOiBzdHJpbmc7XG4gIHB1YmxpYyBzZWxlY3RlZEVudGl0eTogc3RyaW5nO1xuICBwdWJsaWMgdXNlcnNUYWJTZWxlY3RlZCA9IHRydWU7XG4gIHB1YmxpYyBhZG1pbnNUYWJTZWxlY3RlZDogYm9vbGVhbjtcbiAgcHVibGljIGNsaWVudHNUYWJTZWxlY3RlZDogYm9vbGVhbjtcblxuICBwdWJsaWMgdXNlclNlbGVjdGlvbjogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIGFkbWluU2VsZWN0aW9uOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgY2xpZW50U2VsZWN0aW9uOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgZ3JvdXBTZWxlY3Rpb246IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyByb2xlU2VsZWN0aW9uOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyByb2xlc0dyaWRWaWV3OiBHcmlkRGF0YVJlc3VsdDtcbiAgcHVibGljIHJvbGVzRGF0YVN0YXRlOiBTdGF0ZSA9IHtcbiAgICBmaWx0ZXI6IHtcbiAgICAgIGxvZ2ljOiAnYW5kJyxcbiAgICAgIGZpbHRlcnM6IFtdXG4gICAgfVxuICB9O1xuICBwdWJsaWMgcGVybWlzc2lvbnNHcmlkVmlldzogR3JpZERhdGFSZXN1bHQ7XG4gIHB1YmxpYyBwZXJtaXNzaW9uc0RhdGFTdGF0ZTogU3RhdGUgPSB7XG4gICAgc2tpcDogMCxcbiAgICB0YWtlOiAxMCxcblxuICAgIHNvcnQ6IFtdLFxuXG4gICAgZmlsdGVyOiB7XG4gICAgICBsb2dpYzogJ2FuZCcsXG4gICAgICBmaWx0ZXJzOiBbXVxuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgdXNlcnNEYXRhOiBVc2VyW107XG4gIHB1YmxpYyBhZG1pbnNEYXRhOiBBZG1pblVzZXJbXTtcbiAgcHVibGljIGNsaWVudHNEYXRhOiBDbGllbnRVc2VyW107XG4gIHB1YmxpYyBncm91cHNEYXRhOiBHcm91cFtdO1xuICBwdWJsaWMgcm9sZXNEYXRhOiBSb2xlW107XG4gIHB1YmxpYyBwZXJtaXNzaW9uc0RhdGE6IFBlcm1pc3Npb25bXTtcbiAgcHVibGljIHNlbGVjdGFibGVTZXR0aW5nczogU2VsZWN0YWJsZVNldHRpbmdzID0ge1xuICAgIGNoZWNrYm94T25seTogZmFsc2UsXG4gICAgbW9kZTogJ3NpbmdsZSdcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgIHByaXZhdGUgbW90aWZBQ0xTZXJ2aWNlOiBNb3RpZkFDTFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybVVzZXJzU2VydmljZTogUGxhdGZvcm1Vc2Vyc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybUFkbWluc1NlcnZpY2U6IFBsYXRmb3JtQWRtaW5zU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtQ2xpZW50c1NlcnZpY2U6IFBsYXRmb3JtQ2xpZW50c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2Vyc1NlcnZpY2U6IFVzZXJzU2VydmljZSxcbiAgICBwcml2YXRlIGdyb3Vwc1NlcnZpY2U6IEdyb3Vwc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb2xlc1NlcnZpY2U6IFJvbGVzU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zU2VydmljZTogUGVybWlzc2lvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25DZW50ZXI6IFdDTm90aWZpY2F0aW9uQ2VudGVyLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZVxuICApIHtcblxuICAgIHRoaXMubW90aWZBQ0xTZXJ2aWNlLmNhbignY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuQWNzQXBpOkNSRUFURTpjcmVhdGVSb2xlJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoKGNhbkRvSXQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgdGhpcy5kcm9wRG93bkJ1dHRvbkl0ZW1zWzRdLmRpc2FibGVkID0gIWNhbkRvSXQ7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIud2FybignY2Fubm90IGxvYWQgcGVybWlzc2lvbnM6ICcgKyBlcnJvcik7XG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnT3BlbmluZy4uLicpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ0luaXRpYWxpemluZy4uLicpO1xuXG4gICAgdGhpcy5sb2FkR3JpZHMoQklUX0xPQURfUk9MRVMgfCBCSVRfTE9BRF9QRVJNSVNTSU9OUyk7XG5cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnbmdPbkRlc3Ryb3knKTtcbiAgICB0aGlzLmRlc3Ryb3kubmV4dChudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgb25Sb2xlc0RhdGFTdGF0ZUNoYW5nZShzdGF0ZTogRGF0YVN0YXRlQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnJvbGVzRGF0YVN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2FkUm9sZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFJvbGVzKCk6IHZvaWQge1xuICAgIHRoaXMucm9sZXNHcmlkVmlldyA9IHByb2Nlc3ModGhpcy5yb2xlc0RhdGEsIHRoaXMucm9sZXNEYXRhU3RhdGUpO1xuICB9XG5cbiAgcHVibGljIHBlcm1pc3Npb25zUGFnZUNoYW5nZShldmVudDogUGFnZUNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5wZXJtaXNzaW9uc0RhdGFTdGF0ZS5za2lwID0gZXZlbnQuc2tpcDtcbiAgICB0aGlzLmxvYWRQZXJtaXNzaW9ucygpO1xuICB9XG5cbiAgcHVibGljIG9uUGVybWlzc2lvbnNEYXRhU3RhdGVDaGFuZ2Uoc3RhdGU6IERhdGFTdGF0ZUNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5wZXJtaXNzaW9uc0RhdGFTdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9hZFBlcm1pc3Npb25zKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRQZXJtaXNzaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnBlcm1pc3Npb25zR3JpZFZpZXcgPSBwcm9jZXNzKHRoaXMucGVybWlzc2lvbnNEYXRhLCB0aGlzLnBlcm1pc3Npb25zRGF0YVN0YXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJTZWxlY3Rpb25DaGFuZ2UoZTogU2VsZWN0aW9uRXZlbnQpIHtcbiAgICBpZiAodGhpcy51c2VyU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSB8fCB0aGlzLmFkbWluU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSB8fCB0aGlzLmNsaWVudFNlbGVjdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuZ3JvdXBTZWxlY3Rpb24ubGVuZ3RoID0gdGhpcy5yb2xlU2VsZWN0aW9uLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmxvYWRHcmlkcyhCSVRfTE9BRF9HUk9VUFMgfCBCSVRfTE9BRF9ST0xFUyB8IEJJVF9MT0FEX1BFUk1JU1NJT05TKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckFsbEdyaWRTZWxlY3Rpb25zKCk7XG4gICAgICB0aGlzLmxvYWRHcmlkcyhCSVRfTE9BRF9HUk9VUFMgfCBCSVRfTE9BRF9ST0xFUyB8IEJJVF9MT0FEX1BFUk1JU1NJT05TKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Hcm91cFNlbGVjdGlvbkNoYW5nZShlOiBTZWxlY3Rpb25FdmVudCkge1xuICAgIGlmICh0aGlzLmdyb3VwU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5yb2xlU2VsZWN0aW9uLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLmxvYWRHcmlkcyhCSVRfTE9BRF9ST0xFUyB8IEJJVF9MT0FEX1BFUk1JU1NJT05TKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckFsbEdyaWRTZWxlY3Rpb25zKCk7XG4gICAgICB0aGlzLmxvYWRHcmlkcyhCSVRfTE9BRF9ST0xFUyB8IEJJVF9MT0FEX1BFUk1JU1NJT05TKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Sb2xlU2VsZWN0aW9uQ2hhbmdlKGU6IFNlbGVjdGlvbkV2ZW50KSB7XG4gICAgaWYgKHRoaXMucm9sZVNlbGVjdGlvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMubG9hZEdyaWRzKEJJVF9MT0FEX1BFUk1JU1NJT05TKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckFsbEdyaWRTZWxlY3Rpb25zKCk7XG4gICAgICB0aGlzLmxvYWRHcmlkcyhCSVRfTE9BRF9QRVJNSVNTSU9OUyk7XG4gICAgfVxuICB9XG5cbiAgb25Eb21haW5TZWxlY3RlZChkb21haW46IERvbWFpbikge1xuICAgIHRoaXMuc2VsZWN0ZWREb21haW4gPSBkb21haW4gPyBkb21haW4ubmFtZSA6IG51bGw7XG4gICAgdGhpcy5jbGVhckFsbEdyaWRTZWxlY3Rpb25zKCk7XG4gICAgdGhpcy5sb2FkR3JpZHMoQklUX0xPQURfVVNFUlMgfCBCSVRfTE9BRF9HUk9VUFMgfCBCSVRfTE9BRF9ST0xFUyB8IEJJVF9MT0FEX1BFUk1JU1NJT05TKTtcbiAgICB0aGlzLmVuYWJsZURyb3BEb3duSXRlbXMoZG9tYWluICE9IG51bGwpO1xuICB9XG5cbiAgZW5hYmxlRHJvcERvd25JdGVtcyhlbmFibGVkOiBCb29sZWFuKSB7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICB0aGlzLmRpc2FibGVBbGxEcm9wRG93bkl0ZW1zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcmtKb2luKHRoaXMubW90aWZBQ0xTZXJ2aWNlLmNhbignY29tLnZpcGVyYS5vc2dpLmNvcmUucGxhdGZvcm0uYXBpLnJlc3QuVXNlck1nckFwaTpDUkVBVEU6Y3JlYXRlVXNlcicpLFxuICAgICAgICAgICAgICB0aGlzLm1vdGlmQUNMU2VydmljZS5jYW4oJ2NvbS52aXBlcmEub3NnaS5jb3JlLnBsYXRmb3JtLmFwaS5yZXN0LlVzZXJNZ3JBcGk6Q1JFQVRFOmNyZWF0ZUFkbWluVXNlcicpLFxuICAgICAgICAgICAgICB0aGlzLm1vdGlmQUNMU2VydmljZS5jYW4oJ2NvbS52aXBlcmEub3NnaS5jb3JlLnBsYXRmb3JtLmFwaS5yZXN0LlVzZXJNZ3JBcGk6Q1JFQVRFOmNyZWF0ZUNsaWVudFVzZXInKSxcbiAgICAgICAgICAgICAgdGhpcy5tb3RpZkFDTFNlcnZpY2UuY2FuKCdjb20udmlwZXJhLm9zZ2kuY29yZS5wbGF0Zm9ybS5hcGkucmVzdC5BY3NBcGk6Q1JFQVRFOmNyZWF0ZUdyb3VwJykpXG4gICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoKGNhbkRvSXQ6IEFycmF5PGJvb2xlYW4+KSA9PiB7XG4gICAgICAgIHRoaXMuZHJvcERvd25CdXR0b25JdGVtc1swXS5kaXNhYmxlZCA9ICFjYW5Eb0l0WzBdO1xuICAgICAgICB0aGlzLmRyb3BEb3duQnV0dG9uSXRlbXNbMV0uZGlzYWJsZWQgPSAhY2FuRG9JdFsxXTtcbiAgICAgICAgdGhpcy5kcm9wRG93bkJ1dHRvbkl0ZW1zWzJdLmRpc2FibGVkID0gIWNhbkRvSXRbMl07XG4gICAgICAgIHRoaXMuZHJvcERvd25CdXR0b25JdGVtc1szXS5kaXNhYmxlZCA9ICFjYW5Eb0l0WzNdO1xuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmRpc2FibGVBbGxEcm9wRG93bkl0ZW1zKCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ2Nhbm5vdCBsb2FkIHBlcm1pc3Npb25zOiAnICsgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZUFsbERyb3BEb3duSXRlbXMoKSB7XG4gICAgdGhpcy5kcm9wRG93bkJ1dHRvbkl0ZW1zWzBdLmRpc2FibGVkID1cbiAgICAgIHRoaXMuZHJvcERvd25CdXR0b25JdGVtc1sxXS5kaXNhYmxlZCA9XG4gICAgICB0aGlzLmRyb3BEb3duQnV0dG9uSXRlbXNbMl0uZGlzYWJsZWQgPVxuICAgICAgdGhpcy5kcm9wRG93bkJ1dHRvbkl0ZW1zWzNdLmRpc2FibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNsZWFyQWxsR3JpZFNlbGVjdGlvbnMoKSB7XG4gICAgdGhpcy51c2VyU2VsZWN0aW9uLmxlbmd0aCA9IHRoaXMuYWRtaW5TZWxlY3Rpb24ubGVuZ3RoID0gdGhpcy5jbGllbnRTZWxlY3Rpb24ubGVuZ3RoID0gdGhpcy5ncm91cFNlbGVjdGlvbi5sZW5ndGggPVxuICAgICAgdGhpcy5yb2xlU2VsZWN0aW9uLmxlbmd0aCA9IDA7XG4gIH1cblxuICBjbGVhckFsbEdyaWREYXRhKCkge1xuICAgIHRoaXMudXNlcnNEYXRhID0gdGhpcy5hZG1pbnNEYXRhID0gdGhpcy5jbGllbnRzRGF0YSA9IHRoaXMuZ3JvdXBzRGF0YSA9IHRoaXMucm9sZXNEYXRhID0gdGhpcy5wZXJtaXNzaW9uc0RhdGEgPSBudWxsO1xuICB9XG5cbiAgbG9hZEdyaWRzKGdyaWRzVG9Mb2FkQml0ZmllbGQ6IG51bWJlcikge1xuICAgIGxldCBnZXRHcm91cHMsIGdldFJvbGVzLCBnZXRQZXJtaXNzaW9ucztcbiAgICBsZXQgc2VsZWN0ZWRVc2VyOiBzdHJpbmcgPSB0aGlzLnVzZXJTZWxlY3Rpb24ubGVuZ3RoID09PSAxID8gdGhpcy51c2VyU2VsZWN0aW9uWzBdIDogbnVsbDtcbiAgICBpZiAoIXNlbGVjdGVkVXNlcikge1xuICAgICAgc2VsZWN0ZWRVc2VyID0gdGhpcy5hZG1pblNlbGVjdGlvbi5sZW5ndGggPT09IDEgPyB0aGlzLmFkbWluU2VsZWN0aW9uWzBdIDogbnVsbDtcbiAgICB9XG4gICAgaWYgKCFzZWxlY3RlZFVzZXIpIHtcbiAgICAgIHNlbGVjdGVkVXNlciA9IHRoaXMuY2xpZW50U2VsZWN0aW9uLmxlbmd0aCA9PT0gMSA/IHRoaXMuY2xpZW50U2VsZWN0aW9uWzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwOiBzdHJpbmcgPSB0aGlzLmdyb3VwU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSA/IHRoaXMuZ3JvdXBTZWxlY3Rpb25bMF0gOiBudWxsO1xuICAgIGNvbnN0IHNlbGVjdGVkUm9sZTogc3RyaW5nID0gdGhpcy5yb2xlU2VsZWN0aW9uLmxlbmd0aCA9PT0gMSA/IHRoaXMucm9sZVNlbGVjdGlvblswXSA6IG51bGw7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREb21haW4pIHtcbiAgICAgIHRoaXMudXNlclNlbGVjdGlvbi5sZW5ndGggPSB0aGlzLmFkbWluU2VsZWN0aW9uLmxlbmd0aCA9IHRoaXMuY2xpZW50U2VsZWN0aW9uLmxlbmd0aCA9IHRoaXMuZ3JvdXBTZWxlY3Rpb24ubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMudXNlcnNEYXRhID0gdGhpcy5hZG1pbnNEYXRhID0gdGhpcy5jbGllbnRzRGF0YSA9IHRoaXMuZ3JvdXBzRGF0YSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExvYWQgdXNlcnMgaWYgcmVxdWlyZWRcbiAgICAgIGlmIChCSVRfTE9BRF9VU0VSUyAmIGdyaWRzVG9Mb2FkQml0ZmllbGQpIHtcbiAgICAgICAgdGhpcy5fdXNlcnNMaXN0R3JpZC5yZWZyZXNoRGF0YSgpO1xuICAgICAgICB0aGlzLmFkbWluc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnBsYXRmb3JtQWRtaW5zU2VydmljZS5nZXRBZG1pblVzZXJzTGlzdCh0aGlzLnNlbGVjdGVkRG9tYWluKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHRoaXMuYWRtaW5zRGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmFkbWluc0RhdGEsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuY3JlYXRlZCA9IG5ldyBEYXRlKGVsZW1lbnQuY3JlYXRlZCk7XG4gICAgICAgICAgICBlbGVtZW50Lmxhc3RMb2dpbiA9IG5ldyBEYXRlKGVsZW1lbnQubGFzdExvZ2luKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFkbWluc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oTE9HX1RBRywgJ0Vycm9yIGxvYWRpbmcgYWRtaW5zOiAnLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5hZG1pbnNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsaWVudHNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybUNsaWVudHNTZXJ2aWNlLmdldENsaWVudFVzZXJzTGlzdCh0aGlzLnNlbGVjdGVkRG9tYWluKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHRoaXMuY2xpZW50c0RhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICBfLmZvckVhY2godGhpcy5jbGllbnRzRGF0YSwgZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5jcmVhdGVkID0gbmV3IERhdGUoZWxlbWVudC5jcmVhdGVkKTtcbiAgICAgICAgICAgIGVsZW1lbnQubGFzdExvZ2luID0gbmV3IERhdGUoZWxlbWVudC5sYXN0TG9naW4pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY2xpZW50c0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oTE9HX1RBRywgJ0Vycm9yIGxvYWRpbmcgY2xpZW50czogJywgZXJyb3IpO1xuICAgICAgICAgIHRoaXMuY2xpZW50c0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdyb3Vwc1xuICAgICAgaWYgKHNlbGVjdGVkVXNlcikge1xuICAgICAgICBnZXRHcm91cHMgPSB0aGlzLnVzZXJzU2VydmljZS5nZXRVc2VyR3JvdXBzKHRoaXMuc2VsZWN0ZWREb21haW4sIHNlbGVjdGVkVXNlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRHcm91cHMgPSB0aGlzLmdyb3Vwc1NlcnZpY2UuZ2V0RG9tYWluR3JvdXBzKHRoaXMuc2VsZWN0ZWREb21haW4pO1xuICAgICAgfVxuXG4gICAgICBpZiAoQklUX0xPQURfR1JPVVBTICYgZ3JpZHNUb0xvYWRCaXRmaWVsZCkge1xuICAgICAgICB0aGlzLmdyb3Vwc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICBnZXRHcm91cHMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLmdyb3Vwc0RhdGEgPSByZXNwb25zZTtcbiAgICAgICAgICB0aGlzLmdyb3Vwc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oTE9HX1RBRywgJ0Vycm9yIGxvYWRpbmcgZ3JvdXBzOiAnLCBlcnJvcik7XG4gICAgICAgICAgdGhpcy5ncm91cHNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJvbGVzXG4gICAgaWYgKHNlbGVjdGVkR3JvdXApIHtcbiAgICAgIGdldFJvbGVzID0gdGhpcy5ncm91cHNTZXJ2aWNlLmdldEdyb3VwUm9sZXModGhpcy5zZWxlY3RlZERvbWFpbiwgc2VsZWN0ZWRHcm91cCk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZFVzZXIpIHtcbiAgICAgIGdldFJvbGVzID0gdGhpcy51c2Vyc1NlcnZpY2UuZ2V0VXNlclJvbGVzKHRoaXMuc2VsZWN0ZWREb21haW4sIHNlbGVjdGVkVXNlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFJvbGVzID0gdGhpcy5yb2xlc1NlcnZpY2UuZ2V0Um9sZXMoKTtcbiAgICB9XG5cbiAgICAvLyBQZXJtaXNzaW9uc1xuICAgIGlmIChzZWxlY3RlZFJvbGUpIHtcbiAgICAgIGdldFBlcm1pc3Npb25zID0gdGhpcy5yb2xlc1NlcnZpY2UuZ2V0Um9sZVBlcm1pc3Npb25zKHNlbGVjdGVkUm9sZSk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZEdyb3VwKSB7XG4gICAgICBnZXRQZXJtaXNzaW9ucyA9IHRoaXMuZ3JvdXBzU2VydmljZS5nZXRHcm91cFBlcm1pc3Npb25zKHRoaXMuc2VsZWN0ZWREb21haW4sIHNlbGVjdGVkR3JvdXApO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRVc2VyKSB7XG4gICAgICBnZXRQZXJtaXNzaW9ucyA9IHRoaXMudXNlcnNTZXJ2aWNlLmdldFVzZXJQZXJtaXNzaW9ucyh0aGlzLnNlbGVjdGVkRG9tYWluLCBzZWxlY3RlZFVzZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXRQZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlLmdldFBlcm1pc3Npb25zKCk7XG4gICAgfVxuXG4gICAgaWYgKEJJVF9MT0FEX1JPTEVTICYgZ3JpZHNUb0xvYWRCaXRmaWVsZCkge1xuICAgICAgdGhpcy5yb2xlc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgZ2V0Um9sZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5yb2xlc0RhdGEgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2FkUm9sZXMoKTtcbiAgICAgICAgdGhpcy5yb2xlc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihMT0dfVEFHLCAnRXJyb3IgbG9hZGluZyByb2xlczogJywgZXJyb3IpO1xuICAgICAgICB0aGlzLnJvbGVzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKEJJVF9MT0FEX1BFUk1JU1NJT05TICYgZ3JpZHNUb0xvYWRCaXRmaWVsZCkge1xuICAgICAgdGhpcy5wZXJtaXNzaW9uc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgZ2V0UGVybWlzc2lvbnMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uc0RhdGEgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uc0RhdGFTdGF0ZS5za2lwID0gMDtcbiAgICAgICAgdGhpcy5sb2FkUGVybWlzc2lvbnMoKTtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihMT0dfVEFHLCAnRXJyb3IgbG9hZGluZyBwZXJtaXNzaW9uczogJywgZXJyb3IpO1xuICAgICAgICB0aGlzLnBlcm1pc3Npb25zTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZXNldENsaWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckFsbEdyaWRTZWxlY3Rpb25zKCk7XG4gICAgdGhpcy5sb2FkR3JpZHMoQklUX0xPQURfQUxMKTtcbiAgfVxuXG4gIG9uSW52YWxpZGF0ZUNhY2hlQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpcm1hdGlvbkRpYWxvZy5vcGVuKCdDYWNoZSBJbnZhbGlkYXRpb24nLFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAnQXR0ZW50aW9uOiBpbnZhbGlkYXRpbmcgQWNjZXNzIENvbnRyb2wgY2FjaGUgbWlnaHQgaGF2ZSBhIHBlcmZvcm1hbmNlIG92ZXJoZWFkIHdoZW4gcnVubmluZyBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXFxuXFxuRG8geW91IHdhbnQgdG8gY29udGludWU/JyxcbiAgICB7ICdhY3Rpb24nIDogJ2Rpc2NhcmRDaGFuZ2VzJyB9KTtcbiAgfVxuXG4gIG9uSW52YWxpZGF0aW9uQ2FuY2VsKHVzZXJEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRyAsICdvbkludmFsaWRhdGlvbkNhbmNlbCBmb3I6JywgdXNlckRhdGEpO1xuICB9XG5cbiAgb25JbnZhbGlkYXRpb25PSyh1c2VyRGF0YSk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnb25JbnZhbGlkYXRpb25PSyBmb3I6JywgdXNlckRhdGEpO1xuXG4gICAgdGhpcy5jYWNoZVNlcnZpY2UuaW52YWxpZGF0ZUNhY2hlKCkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIHRoaXMub25SZXNldENsaWNrZWQoKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oTE9HX1RBRyAsICdBQ1MgQ2FjaGUgaW52YWxpZGF0aW9uIHN1Y2NlZWRlZCcpO1xuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oTE9HX1RBRyAsICdBQ1MgQ2FjaGUgaW52YWxpZGF0aW9uIGZhaWxlZDogJyArIGVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uTGF5b3V0Q2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdsYXlvdXQgY2hhbmdlZDogJyArIHRoaXMuc2l6ZSk7XG4gICAgY29uc3QgaW50SGVpZ2h0OiBudW1iZXIgPSAocGFyc2VJbnQodGhpcy5zaXplLnJlcGxhY2UoL3B4LywgJycpKSAtIDEyMCk7XG4gICAgdGhpcy5oZWlnaHQgPSAnJyArIGludEhlaWdodDtcbiAgICB0aGlzLnBlcm1pc3Npb25zRGF0YVN0YXRlLnRha2UgPSBNYXRoLmNlaWwoaW50SGVpZ2h0IC8gMzUpICogMztcbiAgICB0aGlzLmxvYWRQZXJtaXNzaW9ucygpO1xuICB9XG5cbiAgb25EaWFsb2dDbG9zZSh0b3VjaGVkOiBCb29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRvdWNoZWQpIHtcbiAgICAgIHRoaXMubG9hZEdyaWRzKEJJVF9MT0FEX0FMTCk7XG4gICAgfVxuICB9XG5cbiAgb25BZG1pbkNvbW1hbmRDbGljayhldmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5pZCA9PT0gUm93Q29tbWFuZFR5cGUuQ2hhbmdlUGFzc3dvcmQpIHtcbiAgICAgIHRoaXMuX3Bhc3N3b3JkQ2hhbmdlRGlhbG9nLnNob3coRW50aXR5VHlwZS5BZG1pbiwgZXZlbnQucm93RGF0YS5kYXRhSXRlbSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5pZCA9PT0gUm93Q29tbWFuZFR5cGUuRWRpdCkge1xuICAgICAgdGhpcy5fbmV3VXNlckRpYWxvZy5zaG93KERpYWxvZ1R5cGUuRWRpdCwgRW50aXR5VHlwZS5BZG1pbiwgZXZlbnQucm93RGF0YS5kYXRhSXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbnRpdHkgPSB0aGlzLmFkbWluU2VsZWN0aW9uWzBdO1xuICAgICAgdGhpcy5fYWNsUmVsYXRpb25zRGlhbG9nLnNob3coRW50aXR5VHlwZS5BZG1pbiwgZXZlbnQucm93RGF0YS5kYXRhSXRlbSk7XG4gICAgfVxuICB9XG5cbiAgb25DbGllbnRDb21tYW5kQ2xpY2soZXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuaWQgPT09IFJvd0NvbW1hbmRUeXBlLkNoYW5nZVBhc3N3b3JkKSB7XG4gICAgICB0aGlzLl9wYXNzd29yZENoYW5nZURpYWxvZy5zaG93KEVudGl0eVR5cGUuQ2xpZW50LCBldmVudC5yb3dEYXRhLmRhdGFJdGVtKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmlkID09PSBSb3dDb21tYW5kVHlwZS5FZGl0KSB7XG4gICAgICB0aGlzLl9uZXdVc2VyRGlhbG9nLnNob3coRGlhbG9nVHlwZS5FZGl0LCBFbnRpdHlUeXBlLkNsaWVudCwgZXZlbnQucm93RGF0YS5kYXRhSXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbnRpdHkgPSB0aGlzLmNsaWVudFNlbGVjdGlvblswXTtcbiAgICAgIHRoaXMuX2FjbFJlbGF0aW9uc0RpYWxvZy5zaG93KEVudGl0eVR5cGUuQ2xpZW50LCBldmVudC5yb3dEYXRhLmRhdGFJdGVtKTtcbiAgICB9XG4gIH1cblxuICBvbkdyb3VwQ29tbWFuZENsaWNrKGV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmlkID09PSBSb3dDb21tYW5kVHlwZS5FZGl0KSB7XG4gICAgICB0aGlzLl9uZXdBY2xFbnRpdHlEaWFsb2cuc2hvdyhEaWFsb2dUeXBlLkVkaXQsIEVudGl0eVR5cGUuR3JvdXAsIGV2ZW50LnJvd0RhdGEuZGF0YUl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRW50aXR5ID0gdGhpcy5ncm91cFNlbGVjdGlvblswXTtcbiAgICAgIHRoaXMuX2FjbFJlbGF0aW9uc0RpYWxvZy5zaG93KEVudGl0eVR5cGUuR3JvdXAsIGV2ZW50LnJvd0RhdGEuZGF0YUl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUm9sZUNvbW1hbmRDbGljayhldmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5pZCA9PT0gUm93Q29tbWFuZFR5cGUuRWRpdCkge1xuICAgICAgdGhpcy5fbmV3QWNsRW50aXR5RGlhbG9nLnNob3coRGlhbG9nVHlwZS5FZGl0LCBFbnRpdHlUeXBlLlJvbGUsIGV2ZW50LnJvd0RhdGEuZGF0YUl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRW50aXR5ID0gdGhpcy5yb2xlU2VsZWN0aW9uWzBdO1xuICAgICAgdGhpcy5fYWNsUmVsYXRpb25zRGlhbG9nLnNob3coRW50aXR5VHlwZS5Sb2xlLCBldmVudC5yb3dEYXRhLmRhdGFJdGVtKTtcbiAgICB9XG4gIH1cblxuICBvbkFkbWluQ29tbWFuZENvbmZpcm0oZGF0YUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZUVudGl0eShFbnRpdHlUeXBlLkFkbWluLCBkYXRhSXRlbSk7XG4gIH1cblxuICBvbkNsaWVudENvbW1hbmRDb25maXJtKGRhdGFJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVFbnRpdHkoRW50aXR5VHlwZS5DbGllbnQsIGRhdGFJdGVtKTtcbiAgfVxuXG4gIG9uR3JvdXBDb21tYW5kQ29uZmlybShkYXRhSXRlbSk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlRW50aXR5KEVudGl0eVR5cGUuR3JvdXAsIGRhdGFJdGVtKTtcbiAgfVxuXG4gIG9uUm9sZUNvbW1hbmRDb25maXJtKGRhdGFJdGVtKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVFbnRpdHkoRW50aXR5VHlwZS5Sb2xlLCBkYXRhSXRlbSk7XG4gIH1cblxuICBvblBlcm1pc3Npb25Db21tYW5kQ29uZmlybShkYXRhSXRlbSk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlRW50aXR5KEVudGl0eVR5cGUuUGVybWlzc2lvbiwgZGF0YUl0ZW0pO1xuICB9XG5cbiAgb25Vc2VyUm93Q29tbWFuZENsaWNrKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuY29tbWFuZFR5cGUgPT09IFJvd0NvbW1hbmRUeXBlLkNoYW5nZVBhc3N3b3JkKSB7XG4gICAgICB0aGlzLl9wYXNzd29yZENoYW5nZURpYWxvZy5zaG93KEVudGl0eVR5cGUuVXNlciwgZXZlbnQuZGF0YUl0ZW0pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuY29tbWFuZFR5cGUgPT09IFJvd0NvbW1hbmRUeXBlLlJlbGF0aW9ucykge1xuICAgICAgdGhpcy5fYWNsUmVsYXRpb25zRGlhbG9nLnNob3coRW50aXR5VHlwZS5Vc2VyLCBldmVudC5kYXRhSXRlbSk7XG4gICAgfSBpZiAoZXZlbnQuY29tbWFuZFR5cGUgPT09IFJvd0NvbW1hbmRUeXBlLkVkaXQpIHtcbiAgICAgIHRoaXMuX25ld1VzZXJEaWFsb2cuc2hvdyhEaWFsb2dUeXBlLkVkaXQsIEVudGl0eVR5cGUuVXNlciwgZXZlbnQuZGF0YUl0ZW0pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuY29tbWFuZFR5cGUgPT09IFJvd0NvbW1hbmRUeXBlLkRlbGV0ZSkge1xuICAgICAgdGhpcy5kZWxldGVFbnRpdHkoRW50aXR5VHlwZS5Vc2VyLCBldmVudC5kYXRhSXRlbSk7XG4gICAgfVxuICB9XG5cbiAgb25BZGRCdXR0b25JdGVtQ2xpY2soZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudC50ZXh0ID09PSAnVXNlcicpIHtcbiAgICAgIHRoaXMuX25ld1VzZXJEaWFsb2cuc2hvdyhEaWFsb2dUeXBlLkNyZWF0ZSwgRW50aXR5VHlwZS5Vc2VyKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRleHQgPT09ICdBZG1pbicpIHtcbiAgICAgIHRoaXMuX25ld1VzZXJEaWFsb2cuc2hvdyhEaWFsb2dUeXBlLkNyZWF0ZSwgRW50aXR5VHlwZS5BZG1pbik7XG4gICAgfSBlbHNlIGlmIChldmVudC50ZXh0ID09PSAnQ2xpZW50Jykge1xuICAgICAgdGhpcy5fbmV3VXNlckRpYWxvZy5zaG93KERpYWxvZ1R5cGUuQ3JlYXRlLCBFbnRpdHlUeXBlLkNsaWVudCk7XG4gICAgfSBlbHNlIGlmIChldmVudC50ZXh0ID09PSAnR3JvdXAnKSB7XG4gICAgICB0aGlzLl9uZXdBY2xFbnRpdHlEaWFsb2cuc2hvdyhEaWFsb2dUeXBlLkNyZWF0ZSwgRW50aXR5VHlwZS5Hcm91cCk7XG4gICAgfSBlbHNlIGlmIChldmVudC50ZXh0ID09PSAnUm9sZScpIHtcbiAgICAgIHRoaXMuX25ld0FjbEVudGl0eURpYWxvZy5zaG93KERpYWxvZ1R5cGUuQ3JlYXRlLCBFbnRpdHlUeXBlLlJvbGUpO1xuICAgIH1cbiAgfVxuXG4gIG9uTmV3QWNsRW50aXR5Q29uZmlybShldmVudDogQWNsRGlhbG9nUmVzdWx0KTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVPclVwZGF0ZUVudGl0eShldmVudC5kaWFsb2dUeXBlLCBldmVudC5lbnRpdHlUeXBlLCB7IG5hbWU6IGV2ZW50Lm5hbWUsIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbiB9KTtcbiAgfVxuXG4gIG9uTmV3VXNlckNvbmZpcm0oZXZlbnQ6IFVzZXJEaWFsb2dSZXN1bHQpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZU9yVXBkYXRlRW50aXR5KGV2ZW50LmRpYWxvZ1R5cGUsIGV2ZW50LmVudGl0eVR5cGUsIHsgdXNlcklkOiBldmVudC51c2VySWQsIHVzZXJJZEludDogZXZlbnQudXNlcklkSW50LCBzdGF0ZTogZXZlbnQuc3RhdGUgfSk7XG4gIH1cblxuICBvblBhc3N3b3JkQ2hhbmdlQ29uZmlybShldmVudDogUGFzc3dvcmRDaGFuZ2VEaWFsb2dSZXN1bHQpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZVBhc3N3b3JkKGV2ZW50LmVudGl0eVR5cGUsIGV2ZW50LnVzZXJJZCwgZXZlbnQubmV3UGFzc3dvcmQsIGV2ZW50LnZlcmlmeVBhc3N3b3JkKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMub25SZXNldENsaWNrZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlRW50aXR5KGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIGxldCBkZWxldGVFbnRpdHk6IE9ic2VydmFibGU8YW55PjtcbiAgICBsZXQgd2hhdFRvUmVsb2FkOiBudW1iZXI7XG5cbiAgICBsZXQgZW50aXR5OiBzdHJpbmc7XG5cbiAgICBzd2l0Y2ggKGVudGl0eVR5cGUpIHtcbiAgICAgIGNhc2UgRW50aXR5VHlwZS5Vc2VyOlxuICAgICAgICBkZWxldGVFbnRpdHkgPSB0aGlzLnBsYXRmb3JtVXNlcnNTZXJ2aWNlLmRlbGV0ZVVzZXIodGhpcy5zZWxlY3RlZERvbWFpbiwgZGF0YS5yb3dEYXRhLmRhdGFJdGVtLnVzZXJJZCk7XG4gICAgICAgIGVudGl0eSA9ICdVc2VyJztcbiAgICAgICAgd2hhdFRvUmVsb2FkID0gQklUX0xPQURfVVNFUlM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFbnRpdHlUeXBlLkFkbWluOlxuICAgICAgICBkZWxldGVFbnRpdHkgPSB0aGlzLnBsYXRmb3JtQWRtaW5zU2VydmljZS5kZWxldGVBZG1pblVzZXIodGhpcy5zZWxlY3RlZERvbWFpbiwgZGF0YS5yb3dEYXRhLmRhdGFJdGVtLnVzZXJJZCk7XG4gICAgICAgIGVudGl0eSA9ICdBZG1pbic7XG4gICAgICAgIHdoYXRUb1JlbG9hZCA9IEJJVF9MT0FEX1VTRVJTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRW50aXR5VHlwZS5DbGllbnQ6XG4gICAgICAgIGRlbGV0ZUVudGl0eSA9IHRoaXMucGxhdGZvcm1DbGllbnRzU2VydmljZS5kZWxldGVDbGllbnRVc2VyKHRoaXMuc2VsZWN0ZWREb21haW4sIGRhdGEucm93RGF0YS5kYXRhSXRlbS51c2VySWQpO1xuICAgICAgICBlbnRpdHkgPSAnQ2xpZW50JztcbiAgICAgICAgd2hhdFRvUmVsb2FkID0gQklUX0xPQURfVVNFUlM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFbnRpdHlUeXBlLkdyb3VwOlxuICAgICAgICBkZWxldGVFbnRpdHkgPSB0aGlzLmdyb3Vwc1NlcnZpY2UuZGVsZXRlR3JvdXAodGhpcy5zZWxlY3RlZERvbWFpbiwgZGF0YS5yb3dEYXRhLmRhdGFJdGVtLm5hbWUpO1xuICAgICAgICBlbnRpdHkgPSAnR3JvdXAnO1xuICAgICAgICB3aGF0VG9SZWxvYWQgPSBCSVRfTE9BRF9HUk9VUFM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFbnRpdHlUeXBlLlJvbGU6XG4gICAgICAgIGRlbGV0ZUVudGl0eSA9IHRoaXMucm9sZXNTZXJ2aWNlLmRlbGV0ZVJvbGUoZGF0YS5yb3dEYXRhLmRhdGFJdGVtLm5hbWUpO1xuICAgICAgICBlbnRpdHkgPSAnUm9sZSc7XG4gICAgICAgIHdoYXRUb1JlbG9hZCA9IEJJVF9MT0FEX1JPTEVTO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRW50aXR5VHlwZS5QZXJtaXNzaW9uOlxuICAgICAgICBkZWxldGVFbnRpdHkgPSB0aGlzLnBlcm1pc3Npb25zU2VydmljZS5kZWxldGVQZXJtaXNzaW9uKGRhdGEucm93RGF0YS5kYXRhSXRlbS5jb21wb25lbnQsIGRhdGEucm93RGF0YS5kYXRhSXRlbS5hY3Rpb24sXG4gICAgICAgICAgZGF0YS5yb3dEYXRhLmRhdGFJdGVtLnRhcmdldCk7XG4gICAgICAgIGVudGl0eSA9ICdQZXJtaXNzaW9uJztcbiAgICAgICAgd2hhdFRvUmVsb2FkID0gQklUX0xPQURfUEVSTUlTU0lPTlM7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRlbGV0ZUVudGl0eS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoYW55ID0+IHtcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgZW50aXR5LCAnIGRlbGV0ZWQuICcpO1xuXG4gICAgICB0aGlzLm9uUmVzZXRDbGlja2VkKCk7XG5cbiAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICBuYW1lOiAnRGVsZXRlJyArIGVudGl0eSArICdFbnRpdHknLFxuICAgICAgICB0aXRsZTogJ0RlbGV0ZWQgJyArIGVudGl0eSArICcgRW50aXR5JyxcbiAgICAgICAgbWVzc2FnZTogZW50aXR5ICsgJyBkZWxldGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcbiAgICAgIH0pO1xuXG4gICAgfSwgKGVycm9yKSA9PiB7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsICdEZWxldGUgJyArIGVudGl0eSArICcgZXJyb3I6ICcsIGVycm9yKTtcblxuICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgIG5hbWU6ICdEZWxldGUnICsgZW50aXR5ICsgJ0Vycm9yJyxcbiAgICAgICAgdGl0bGU6ICdEZWxldGUgJyArIGVudGl0eSxcbiAgICAgICAgbWVzc2FnZTogJ0Vycm9yIGRlbGV0aW5nICcgKyBlbnRpdHkgKyAnOicsXG4gICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuRXJyb3IsXG4gICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9yVXBkYXRlRW50aXR5KGRpYWxvZ1R5cGU6IERpYWxvZ1R5cGUsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUsIGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdjcmVhdGVPclVwZGF0ZUFjbEVudGl0eSBjYWxsZWQgZm9yOiAnLCBkYXRhKTtcblxuICAgIGxldCB3aGF0VG9SZWxvYWQ6IG51bWJlcjtcbiAgICBsZXQgYWN0aW9uOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgICBsZXQgZW50aXR5OiBzdHJpbmc7XG4gICAgc3dpdGNoIChlbnRpdHlUeXBlKSB7XG4gICAgICBjYXNlIEVudGl0eVR5cGUuVXNlcjpcbiAgICAgICAgaWYgKGRpYWxvZ1R5cGUgPT09IERpYWxvZ1R5cGUuQ3JlYXRlKSB7XG4gICAgICAgICAgY29uc3QgdWM6IFVzZXJDcmVhdGUgPSB7XG4gICAgICAgICAgICB1c2VySWQ6IGRhdGEudXNlcklkLFxuICAgICAgICAgICAgdXNlcklkSW50OlxuICAgICAgICAgICAgICAoZGF0YS51c2VySWRJbnQgJiYgZGF0YS51c2VySWRJbnQubGVuZ3RoKSA+IDAgPyBkYXRhLnVzZXJJZEludCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXRlOiBkYXRhLnN0YXRlXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhY3Rpb24gPSB0aGlzLnBsYXRmb3JtVXNlcnNTZXJ2aWNlLmNyZWF0ZVVzZXIoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRG9tYWluLFxuICAgICAgICAgICAgdWNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHV1OiBVc2VyVXBkYXRlID0ge1xuICAgICAgICAgICAgdXNlcklkSW50OlxuICAgICAgICAgICAgKGRhdGEudXNlcklkSW50ICYmIGRhdGEudXNlcklkSW50Lmxlbmd0aCkgPiAwID8gZGF0YS51c2VySWRJbnQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGF0ZTogZGF0YS5zdGF0ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgYWN0aW9uID0gdGhpcy5wbGF0Zm9ybVVzZXJzU2VydmljZS51cGRhdGVVc2VyKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERvbWFpbixcbiAgICAgICAgICAgIGRhdGEudXNlcklkLFxuICAgICAgICAgICAgdXVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVudGl0eSA9ICdVc2VyJztcbiAgICAgICAgd2hhdFRvUmVsb2FkID0gQklUX0xPQURfVVNFUlM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFbnRpdHlUeXBlLkFkbWluOlxuICAgICAgICBpZiAoZGlhbG9nVHlwZSA9PT0gRGlhbG9nVHlwZS5DcmVhdGUpIHtcbiAgICAgICAgICBjb25zdCBhZGM6IEFkbWluVXNlckNyZWF0ZSA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogZGF0YS51c2VySWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGFjdGlvbiA9IHRoaXMucGxhdGZvcm1BZG1pbnNTZXJ2aWNlLmNyZWF0ZUFkbWluVXNlcihcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREb21haW4sXG4gICAgICAgICAgICBhZGNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFkdTogQWRtaW5Vc2VyVXBkYXRlID0ge1xuICAgICAgICAgICAgZW1haWw6IGRhdGEuZW1haWwsXG4gICAgICAgICAgICBmaXJzdE5hbWU6IGRhdGEuZmlyc3ROYW1lLFxuICAgICAgICAgICAgbGFzdE5hbWU6IGRhdGEubGFzdE5hbWUsXG4gICAgICAgICAgICBzdGF0ZTogZGF0YS5zdGF0ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgYWN0aW9uID0gdGhpcy5wbGF0Zm9ybUFkbWluc1NlcnZpY2UudXBkYXRlQWRtaW5Vc2VyKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERvbWFpbixcbiAgICAgICAgICAgIGRhdGEudXNlcklkLFxuICAgICAgICAgICAgYWR1XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbnRpdHkgPSAnQWRtaW4nO1xuICAgICAgICB3aGF0VG9SZWxvYWQgPSBCSVRfTE9BRF9VU0VSUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVudGl0eVR5cGUuQ2xpZW50OlxuICAgICAgICBpZiAoZGlhbG9nVHlwZSA9PT0gRGlhbG9nVHlwZS5DcmVhdGUpIHtcbiAgICAgICAgICBjb25zdCBjYzogQ2xpZW50VXNlckNyZWF0ZSA9IHtcbiAgICAgICAgICAgIHVzZXJJZDogZGF0YS51c2VySWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGFjdGlvbiA9IHRoaXMucGxhdGZvcm1DbGllbnRzU2VydmljZS5jcmVhdGVDbGllbnRVc2VyKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERvbWFpbixcbiAgICAgICAgICAgIGNjXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjdTogQ2xpZW50VXNlclVwZGF0ZSA9IHtcbiAgICAgICAgICAgIHN0YXRlOiBkYXRhLnN0YXRlLFxuICAgICAgICAgICAgZW1haWw6IGRhdGEuZW1haWxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGFjdGlvbiA9IHRoaXMucGxhdGZvcm1DbGllbnRzU2VydmljZS51cGRhdGVDbGllbnRVc2VyKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERvbWFpbixcbiAgICAgICAgICAgIGRhdGEudXNlcklkLFxuICAgICAgICAgICAgY3VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVudGl0eSA9ICdDbGllbnQnO1xuICAgICAgICB3aGF0VG9SZWxvYWQgPSBCSVRfTE9BRF9VU0VSUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVudGl0eVR5cGUuR3JvdXA6XG4gICAgICAgIGlmIChkaWFsb2dUeXBlID09PSBEaWFsb2dUeXBlLkNyZWF0ZSkge1xuICAgICAgICAgIGNvbnN0IGdjOiBHcm91cENyZWF0ZSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBkYXRhLmRlc2NyaXB0aW9uLmxlbmd0aCA+IDAgPyBkYXRhLmRlc2NyaXB0aW9uIDogdW5kZWZpbmVkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhY3Rpb24gPSB0aGlzLmdyb3Vwc1NlcnZpY2UuY3JlYXRlR3JvdXAodGhpcy5zZWxlY3RlZERvbWFpbiwgZ2MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGd1OiBHcm91cFVwZGF0ZSA9IHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBkYXRhLmRlc2NyaXB0aW9uLmxlbmd0aCA+IDAgPyBkYXRhLmRlc2NyaXB0aW9uIDogdW5kZWZpbmVkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhY3Rpb24gPSB0aGlzLmdyb3Vwc1NlcnZpY2UudXBkYXRlR3JvdXAoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRG9tYWluLFxuICAgICAgICAgICAgZGF0YS5uYW1lLFxuICAgICAgICAgICAgZ3VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVudGl0eSA9ICdHcm91cCc7XG4gICAgICAgIHdoYXRUb1JlbG9hZCA9IEJJVF9MT0FEX0dST1VQUztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVudGl0eVR5cGUuUm9sZTpcbiAgICAgICAgaWYgKGRpYWxvZ1R5cGUgPT09IERpYWxvZ1R5cGUuQ3JlYXRlKSB7XG4gICAgICAgICAgY29uc3QgcmM6IFJvbGVDcmVhdGUgPSB7XG4gICAgICAgICAgICBuYW1lOiBkYXRhLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgZGF0YS5kZXNjcmlwdGlvbi5sZW5ndGggPiAwID8gZGF0YS5kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZFxuICAgICAgICAgIH07XG4gICAgICAgICAgYWN0aW9uID0gdGhpcy5yb2xlc1NlcnZpY2UuY3JlYXRlUm9sZShyYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcnU6IFJvbGVVcGRhdGUgPSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgZGF0YS5kZXNjcmlwdGlvbi5sZW5ndGggPiAwID8gZGF0YS5kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZFxuICAgICAgICAgIH07XG4gICAgICAgICAgYWN0aW9uID0gdGhpcy5yb2xlc1NlcnZpY2UudXBkYXRlUm9sZShkYXRhLm5hbWUsIHJ1KTtcbiAgICAgICAgfVxuICAgICAgICBlbnRpdHkgPSAnUm9sZSc7XG4gICAgICAgIHdoYXRUb1JlbG9hZCA9IEJJVF9MT0FEX1JPTEVTO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhY3Rpb24ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKChuZXdFbnRpdHk6IGFueSkgPT4ge1xuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCBkaWFsb2dUeXBlICsgJyAnLCBlbnRpdHksICcgY29tcGxldGVkJywgbmV3RW50aXR5ID8gKCc6ICcgKyBuZXdFbnRpdHkpIDogJycpO1xuXG4gICAgICB0aGlzLmxvYWRHcmlkcyh3aGF0VG9SZWxvYWQpO1xuXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgbmFtZTogZGlhbG9nVHlwZSArIGVudGl0eSArICdFbnRpdHknLFxuICAgICAgICB0aXRsZTogZGlhbG9nVHlwZSArICcgJyArIGVudGl0eSArICcgRW50aXR5JyxcbiAgICAgICAgbWVzc2FnZTogZGlhbG9nVHlwZSArICcgJyArIGVudGl0eSArICcgc3VjY2Vzc2Z1bC4nLFxuICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcbiAgICAgIH0pO1xuXG4gICAgfSwgKGVycm9yKSA9PiB7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsIGRpYWxvZ1R5cGUgKyBlbnRpdHkgKyAnIGVycm9yOiAnLCBlcnJvcik7XG5cbiAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICBuYW1lOiBkaWFsb2dUeXBlICsgZW50aXR5ICsgJ0Vycm9yJyxcbiAgICAgICAgdGl0bGU6IGRpYWxvZ1R5cGUgKyAnICcgKyBlbnRpdHksXG4gICAgICAgIG1lc3NhZ2U6ICdFcnJvciBkdXJpbmcgJyArIGRpYWxvZ1R5cGUgKyAnIG9mIGVudGl0eTonLFxuICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgIGNsb3NhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VQYXNzd29yZChlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCB1c2VySWQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZywgdmVyaWZ5UGFzc3dvcmQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNjOiBDcmVkZW50aWFsc0NyZWF0ZSA9IHtcbiAgICAgIHBhc3N3b3JkOiBuZXdQYXNzd29yZCxcbiAgICAgIHBhc3N3b3JkVmVyaWZ5OiB2ZXJpZnlQYXNzd29yZFxuICAgIH07XG4gICAgc3dpdGNoIChlbnRpdHlUeXBlKSB7XG4gICAgICBjYXNlIEVudGl0eVR5cGUuVXNlcjpcbiAgICAgICAgdGhpcy5wbGF0Zm9ybVVzZXJzU2VydmljZS5jcmVhdGVVc2VyQ3JlZGVudGlhbHModGhpcy5zZWxlY3RlZERvbWFpbiwgdXNlcklkLCBjYylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIHJlc3VsdCA9PiB0aGlzLnBhc3N3b3JkQ2hhbmdlU3VjY2Vzc0hhbmRsZXIocmVzdWx0KSxcbiAgICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5wYXNzd29yZENoYW5nZUVycm9ySGFuZGxlcihlcnJvcikpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRW50aXR5VHlwZS5BZG1pbjpcbiAgICAgICAgdGhpcy5wbGF0Zm9ybUFkbWluc1NlcnZpY2UuY3JlYXRlQWRtaW5Vc2VyQ3JlZGVudGlhbHModGhpcy5zZWxlY3RlZERvbWFpbiwgdXNlcklkLCBjYylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIHJlc3VsdCA9PiB0aGlzLnBhc3N3b3JkQ2hhbmdlU3VjY2Vzc0hhbmRsZXIocmVzdWx0KSxcbiAgICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5wYXNzd29yZENoYW5nZUVycm9ySGFuZGxlcihlcnJvcikpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRW50aXR5VHlwZS5DbGllbnQ6XG4gICAgICAgIHRoaXMucGxhdGZvcm1DbGllbnRzU2VydmljZS5jcmVhdGVDbGllbnRVc2VyQ3JlZGVudGlhbHModGhpcy5zZWxlY3RlZERvbWFpbiwgdXNlcklkLCBjYylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIHJlc3VsdCA9PiB0aGlzLnBhc3N3b3JkQ2hhbmdlU3VjY2Vzc0hhbmRsZXIocmVzdWx0KSxcbiAgICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5wYXNzd29yZENoYW5nZUVycm9ySGFuZGxlcihlcnJvcikpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhc3N3b3JkQ2hhbmdlU3VjY2Vzc0hhbmRsZXIoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgbmFtZTogJ1Bhc3N3b3JkQ2hhbmdlZCcsXG4gICAgICB0aXRsZTogJ1Bhc3N3b3JkIENoYW5nZWQnLFxuICAgICAgbWVzc2FnZTogJ1Bhc3N3b3JkIGNoYW5nZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGFzc3dvcmRDaGFuZ2VFcnJvckhhbmRsZXIoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmVycm9yKExPR19UQUcsICdFcnJvciBjaGFuZ2luZyBwYXNzd29yZDogJywgZXJyb3IpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgbmFtZTogJ1Bhc3N3b3JkQ2hhbmdlRXJyb3InLFxuICAgICAgdGl0bGU6ICdQYXNzd29yZCBDaGFuZ2UgRXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0Vycm9yIHNldHRpbmcgbmV3IHBhc3N3b3JkOicsXG4gICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLkVycm9yLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgY2xvc2FibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuIl19