UNPKG

@ecip/permission

Version:
404 lines 37.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild } from '@angular/core'; import { ModalHelper } from '@delon/theme'; import { STComponent } from '@delon/abc'; import { NzMessageService } from 'ng-zorro-antd'; import { PermissionRoleEditComponent } from "./edit/edit.component"; import { PermissionRoleViewComponent } from "./view/view.component"; import { TreeService } from "@ecip/shared"; import { PermissionRoleUserComponent } from "./user/role.user.component"; import { AppsService, ResourceService, RoleService } from "@ecip/service"; export class PermissionRoleComponent { /** * @param {?} modal * @param {?} msgSrv * @param {?} roleService * @param {?} resourceService * @param {?} treeService * @param {?} appsService */ constructor(modal, msgSrv, roleService, resourceService, treeService, appsService) { this.modal = modal; this.msgSrv = msgSrv; this.roleService = roleService; this.resourceService = resourceService; this.treeService = treeService; this.appsService = appsService; this.url = `api/v1/sysrRole/list`; this.searchSchema = { properties: { id: { type: 'string', title: '编号' } } }; this.columns = [ // { title: '编号', index: 'id' }, { title: '', index: 'id', type: 'radio' }, // { title: '应用系统', index: 'appId' }, { title: '角色名称', index: 'roleName' }, { title: '编码', index: 'code' }, { title: '角色状态', index: 'statusText' }, // { title: '排序', index: 'sortNum' }, // { title: '创建时间', type: 'date', index: 'createTime' }, { title: '操作', width: '100px', buttons: [ { text: '删除', type: 'del', click: (/** * @param {?} item * @return {?} */ (item) => { //删除 this.roleService.deleteById(item.id).subscribe((/** * @param {?} res * @return {?} */ res => { this.msgSrv.success('删除成功'); this.st.reload(); })); }), acl: { ability: ['permission:remove'] } }, { text: '', children: [ { text: '查看', type: 'static', component: PermissionRoleViewComponent, click: 'reload', acl: { ability: ['role:view'] } }, { text: '编辑', type: 'none', click: (/** * @param {?} record * @return {?} */ (record) => { this.modal .createStatic(PermissionRoleEditComponent, { appId: this.appId, record: record }) .subscribe((/** * @return {?} */ () => this.st.reload())); }), acl: { ability: ['role:edit'] } }, { text: '人员', type: 'static', component: PermissionRoleUserComponent, click: 'reload', acl: { ability: ['member:choose'] } } ], }, ] } ]; this.appId = -1; this.data = []; this.dataList = []; //所有节点数组 //所有节点数组 this.expandDataCache = {}; this.allChecked = false; this.indeterminate = false; this.listOfSelection = [ { text: '全选', onSelect: (/** * @return {?} */ () => { this.checkAll(true); }) }, { text: '全不选', onSelect: (/** * @return {?} */ () => { this.checkAll(false); }) } ]; } /** * @param {?=} $event * @return {?} */ refreshStatus($event) { if (!this.selectedRole) { this.msgSrv.warning('请选择角色'); return; } /** @type {?} */ const allChecked = this.dataList.every((/** * @param {?} value * @return {?} */ value => value.checked === true)); /** @type {?} */ const allUnChecked = this.dataList.every((/** * @param {?} value * @return {?} */ value => !value.checked)); this.allChecked = allChecked; this.indeterminate = (!allChecked) && (!allUnChecked); } /** * @param {?} value * @return {?} */ checkAll(value) { if (!this.selectedRole) { this.msgSrv.warning('请选择要授权的角色'); return; } this.dataList.forEach((/** * @param {?} data * @return {?} */ data => { if (!data.disabled) { data.checked = value; } })); this.refreshStatus(); } /** * @param {?} value * @return {?} */ expandAll(value) { this.dataList.forEach((/** * @param {?} data * @return {?} */ data => { data.expand = value; })); } /** * @return {?} */ ngOnInit() { this.st.req.params = { appId: this.appId }; this.appsService.getList().subscribe((/** * @param {?} appList * @return {?} */ appList => { this.appList = appList; })); this.appChange(); } /** * @return {?} */ appChange() { this.selectedRole = null; this.st.reload({ appId: this.appId }); this.resourceService.findTree({ appId: this.appId }).subscribe((/** * @param {?} res * @return {?} */ (res) => { this.data = res; this.data.forEach((/** * @param {?} item * @return {?} */ item => { this.expandDataCache[item.id] = TreeService.convertTreeToList(item); this.dataList = [...this.dataList, ...this.expandDataCache[item.id]]; })); })); } /** * @return {?} */ add() { this.modal .createStatic(PermissionRoleEditComponent, { appId: this.appId }) .subscribe((/** * @return {?} */ () => this.st.reload({ appId: this.appId }))); } /** * @param {?} item * @return {?} */ radioChange(item) { if (!item.radio) { return; } item = item.radio; this.selectedRole = item; this.roleService.findResource(item.id).subscribe((/** * @param {?} res * @return {?} */ (res) => { this.dataList.forEach((/** * @param {?} _item * @return {?} */ _item => { if (res.includes(_item.id)) { _item.assign = '已授权'; } else { _item.assign = '未授权'; } })); })); } /** * @return {?} */ assign() { if (!this.selectedRole) { this.msgSrv.warning('请选择要授权的角色'); return; } console.log('assign'); /** @type {?} */ let resourceIds = this.getCheckIds(); if (resourceIds.length == 0) { this.msgSrv.warning('请选择要授权的资源'); return; } this.roleService.saveResource(this.selectedRole.id, resourceIds).subscribe((/** * @param {?} res * @return {?} */ res => { this.msgSrv.success('授权成功'); // this.dataList.filter(item => item.).checked = true; this.dataList.forEach((/** * @param {?} item * @return {?} */ item => { if (item.checked === true) { item.assign = '已授权'; } })); })); } /** * @return {?} */ cancel() { if (!this.selectedRole) { this.msgSrv.warning('请选择要取消授权的角色'); return; } console.log('cancel'); /** @type {?} */ let resourceIds = this.getCheckIds(); if (resourceIds.length == 0) { this.msgSrv.warning('请选择要取消授权的资源'); return; } this.roleService.deleteResource(this.selectedRole.id, resourceIds).subscribe((/** * @param {?} res * @return {?} */ res => { this.msgSrv.success('取消授权成功'); // this.dataList.filter(item => item.).checked = true; this.dataList.forEach((/** * @param {?} item * @return {?} */ item => { if (item.checked === true) { item.assign = '未授权'; } })); })); } /** * @return {?} */ getCheckIds() { /** @type {?} */ let checkIds = []; this.dataList.forEach((/** * @param {?} item * @return {?} */ item => { if (item.checked === true) { checkIds.push(item.id); } })); return checkIds; } } PermissionRoleComponent.decorators = [ { type: Component, args: [{ selector: 'app-permission-role', template: "<page-header [action]=\"phPhAction\">\r\n <ng-template #phPhAction>\r\n <button acl [acl-ability]=\"'role:add'\" (click)=\"add()\" nz-button nzType=\"primary\">\u65B0\u5EFA</button>\r\n </ng-template>\r\n</page-header>\r\n<nz-card>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <!--<sf mode=\"search\" [schema]=\"searchSchema\" (formSubmit)=\"st.reset($event)\" (formReset)=\"st.reset($event)\"></sf>-->\r\n <nz-affix [nzOffsetTop]=\"80\">\r\n <form nz-form [nzLayout]=\"'inline'\">\r\n <!--<nz-form-item> <nz-col class=\"ant-form-item-control-wrapper\"> <div class=\"ant-form-item-control\"> <button nz-popconfirm nzTitle=\"\u786E\u8BA4\u6388\u6743\u5417?\" (nzOnConfirm)=\"assign()\" nz-button nzType=\"primary\">\u6388\u6743</button> <button nz-popconfirm nzTitle=\"\u786E\u8BA4\u53D6\u6D88\u6388\u6743\u5417?\" (nzOnConfirm)=\"cancel()\" nz-button nzType=\"warning\">\u53D6\u6D88\u6388\u6743</button> </div> </nz-col> </nz-form-item>-->\r\n <nz-form-item>\r\n <nz-form-label>\u7CFB\u7EDF</nz-form-label>\r\n <nz-col class=\"ant-form-item-control-wrapper\">\r\n <div class=\"ant-form-item-control\">\r\n <nz-select style=\"width: 240px\" name=\"appId\" nzShowSearch [(ngModel)]=\"appId\" (ngModelChange)=\"appChange()\">\r\n <nz-option *ngFor=\"let option of appList\" [nzLabel]=\"option.appName\" [nzValue]=\"option.appId\"></nz-option>\r\n </nz-select>\r\n </div>\r\n </nz-col>\r\n </nz-form-item>\r\n </form>\r\n </nz-affix>\r\n <st #st [data]=\"url\" [columns]=\"columns\" (change)=\"radioChange($event)\"></st>\r\n </div>\r\n <div nz-col nzSpan=\"11\" nzOffset=\"1\">\r\n <nz-affix [nzOffsetTop]=\"80\">\r\n <form nz-form [nzLayout]=\"'inline'\">\r\n <nz-form-item>\r\n <nz-col class=\"ant-form-item-control-wrapper\">\r\n <div class=\"ant-form-item-control\">\r\n <button acl [acl-ability]=\"'permission:add'\" nz-popconfirm nzTitle=\"\u786E\u8BA4\u6388\u6743\u5417?\" (nzOnConfirm)=\"assign()\" nz-button nzType=\"primary\">\u6388\u6743</button>\r\n <button acl [acl-ability]=\"'permission:remove'\" nz-popconfirm nzTitle=\"\u786E\u8BA4\u53D6\u6D88\u6388\u6743\u5417?\" (nzOnConfirm)=\"cancel()\" nz-button nzType=\"warning\">\u53D6\u6D88\u6388\u6743</button>\r\n </div>\r\n </nz-col>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-col class=\"ant-form-item-control-wrapper\">\r\n <div class=\"ant-form-item-control\">\r\n <nz-dropdown>\r\n <button nz-button nz-dropdown>\r\n \u64CD\u4F5C\r\n <i class=\"anticon anticon-down\"></i>\r\n </button>\r\n <ul nz-menu>\r\n <li (click)=\"expandAll(true)\" nz-menu-item>\r\n <a>\u5C55\u5F00\u6240\u6709</a>\r\n </li>\r\n <li (click)=\"expandAll(false)\" nz-menu-item>\r\n <a>\u6536\u8D77\u6240\u6709</a>\r\n </li>\r\n </ul>\r\n </nz-dropdown>\r\n </div>\r\n </nz-col>\r\n </nz-form-item>\r\n </form>\r\n </nz-affix>\r\n <nz-table #nzTable [nzData]=\"data\" [nzShowPagination]=\"false\" [nzFrontPagination]=\"false\" [nzBordered]=\"true\">\r\n <thead>\r\n <tr>\r\n <th nzShowCheckbox [(nzChecked)]=\"allChecked\" [nzIndeterminate]=\"indeterminate\" nzShowRowSelection [nzSelections]=\"listOfSelection\" (nzCheckedChange)=\"checkAll($event)\"></th>\r\n <th>\u8D44\u6E90\u540D\u79F0</th>\r\n <!--<th nzWidth=\"30%\">\u6743\u9650\u6807\u5FD7</th>-->\r\n <th>\u542F\u7528\u72B6\u6001</th>\r\n <th>\u6388\u6743\u72B6\u6001</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-template ngFor let-data [ngForOf]=\"nzTable.data\">\r\n <ng-template ngFor let-item [ngForOf]=\"expandDataCache[data.id]\">\r\n <tr *ngIf=\"(item.parent&&item.parent.expand)||!(item.parent)\">\r\n <td nzShowCheckbox [(nzChecked)]=\"item.checked\" (nzCheckedChange)=\"refreshStatus($event)\"></td>\r\n <td [nzIndentSize]=\"item.level*20\" [nzShowExpand]=\"!!item.children\" [(nzExpand)]=\"item.expand\" (nzExpandChange)=\"treeService.collapse(expandDataCache[data.id],item,$event)\">{{item.rsrcName}}</td>\r\n <!--<td>{{item.permission}}</td>-->\r\n <td>{{item.rsrcStatusText}}</td>\r\n <td>{{item.assign}}</td>\r\n </tr>\r\n </ng-template>\r\n </ng-template>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n </div>\r\n</nz-card>", styles: [":host ::ng-deep .ant-table-wrapper{margin-top:16px}"] }] } ]; /** @nocollapse */ PermissionRoleComponent.ctorParameters = () => [ { type: ModalHelper }, { type: NzMessageService }, { type: RoleService }, { type: ResourceService }, { type: TreeService }, { type: AppsService } ]; PermissionRoleComponent.propDecorators = { st: [{ type: ViewChild, args: ['st',] }] }; if (false) { /** @type {?} */ PermissionRoleComponent.prototype.url; /** @type {?} */ PermissionRoleComponent.prototype.searchSchema; /** @type {?} */ PermissionRoleComponent.prototype.st; /** @type {?} */ PermissionRoleComponent.prototype.columns; /** @type {?} */ PermissionRoleComponent.prototype.appId; /** @type {?} */ PermissionRoleComponent.prototype.appList; /** @type {?} */ PermissionRoleComponent.prototype.selectedRole; /** @type {?} */ PermissionRoleComponent.prototype.data; /** @type {?} */ PermissionRoleComponent.prototype.dataList; /** @type {?} */ PermissionRoleComponent.prototype.expandDataCache; /** @type {?} */ PermissionRoleComponent.prototype.allChecked; /** @type {?} */ PermissionRoleComponent.prototype.indeterminate; /** @type {?} */ PermissionRoleComponent.prototype.listOfSelection; /** * @type {?} * @private */ PermissionRoleComponent.prototype.modal; /** * @type {?} * @private */ PermissionRoleComponent.prototype.msgSrv; /** @type {?} */ PermissionRoleComponent.prototype.roleService; /** @type {?} */ PermissionRoleComponent.prototype.resourceService; /** @type {?} */ PermissionRoleComponent.prototype.treeService; /** @type {?} */ PermissionRoleComponent.prototype.appsService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZWNpcC9wZXJtaXNzaW9uLyIsInNvdXJjZXMiOlsic3JjL3JvbGUvcm9sZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hELE9BQU8sRUFBWSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDdkUsT0FBTyxFQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBT3hFLE1BQU0sT0FBTyx1QkFBdUI7Ozs7Ozs7OztJQTRHbEMsWUFBb0IsS0FBa0IsRUFBVSxNQUF3QixFQUNyRCxXQUF3QixFQUFTLGVBQWdDLEVBQ2pFLFdBQXdCLEVBQVMsV0FBd0I7UUFGeEQsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBQ3JELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2pFLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUE3RzVFLFFBQUcsR0FBRyxzQkFBc0IsQ0FBQztRQUM3QixpQkFBWSxHQUFhO1lBQ3ZCLFVBQVUsRUFBRTtnQkFDVixFQUFFLEVB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Qjs7SUFDbkIsZ0RBQXNCOztJQUN0QixrREFhRTs7Ozs7SUFpQ1Usd0NBQTBCOzs7OztJQUFFLHlDQUFnQzs7SUFDNUQsOENBQStCOztJQUFFLGtEQUF1Qzs7SUFDeEUsOENBQStCOztJQUFFLDhDQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgX0h0dHBDbGllbnQsIE1vZGFsSGVscGVyIH0gZnJvbSAnQGRlbG9uL3RoZW1lJztcclxuaW1wb3J0IHsgU1RDb2x1bW4sIFNUQ29tcG9uZW50IH0gZnJvbSAnQGRlbG9uL2FiYyc7XHJcbmltcG9ydCB7IFNGU2NoZW1hIH0gZnJvbSAnQGRlbG9uL2Zvcm0nO1xyXG5pbXBvcnQge056TWVzc2FnZVNlcnZpY2V9IGZyb20gJ25nLXpvcnJvLWFudGQnO1xyXG5pbXBvcnQge1Blcm1pc3Npb25Sb2xlRWRpdENvbXBvbmVudH0gZnJvbSBcIi4vZWRpdC9lZGl0LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1Blcm1pc3Npb25Sb2xlVmlld0NvbXBvbmVudH0gZnJvbSBcIi4vdmlldy92aWV3LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1RyZWVTZXJ2aWNlfSBmcm9tIFwiQGVjaXAvc2hhcmVkXCI7XHJcbmltcG9ydCB7UGVybWlzc2lvblJvbGVVc2VyQ29tcG9uZW50fSBmcm9tIFwiLi91c2VyL3JvbGUudXNlci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtBcHBzU2VydmljZSwgUmVzb3VyY2VTZXJ2aWNlLCBSb2xlU2VydmljZX0gZnJvbSBcIkBlY2lwL3NlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXBlcm1pc3Npb24tcm9sZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3JvbGUuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblJvbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHVybCA9IGBhcGkvdjEvc3lzclJvbGUvbGlzdGA7XHJcbiAgc2VhcmNoU2NoZW1hOiBTRlNjaGVtYSA9IHtcclxuICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgaWQ6IHtcclxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcclxuICAgICAgICB0aXRsZTogJ+e8luWPtydcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcbiAgQFZpZXdDaGlsZCgnc3QnKSBzdDogU1RDb21wb25lbnQ7XHJcbiAgY29sdW1uczogU1RDb2x1bW5bXSA9IFtcclxuICAgIC8vIHsgdGl0bGU6ICfnvJblj7cnLCBpbmRleDogJ2lkJyB9LFxyXG4gICAgeyB0aXRsZTogJycsIGluZGV4OiAnaWQnLCB0eXBlOiAncmFkaW8nIH0sXHJcbiAgICAvLyB7IHRpdGxlOiAn5bqU55So57O757ufJywgaW5kZXg6ICdhcHBJZCcgfSxcclxuICAgIHsgdGl0bGU6ICfop5LoibLlkI3np7AnLCBpbmRleDogJ3JvbGVOYW1lJyB9LFxyXG4gICAgeyB0aXRsZTogJ+e8lueggScsIGluZGV4OiAnY29kZScgfSxcclxuICAgIHsgdGl0bGU6ICfop5LoibLnirbmgIEnLCBpbmRleDogJ3N0YXR1c1RleHQnIH0sXHJcbiAgICAvLyB7IHRpdGxlOiAn5o6S5bqPJywgaW5kZXg6ICdzb3J0TnVtJyB9LFxyXG4gICAgLy8geyB0aXRsZTogJ+WIm+W7uuaXtumXtCcsIHR5cGU6ICdkYXRlJywgaW5kZXg6ICdjcmVhdGVUaW1lJyB9LFxyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ+aTjeS9nCcsXHJcbiAgICAgIHdpZHRoOiAnMTAwcHgnLFxyXG4gICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgeyB0ZXh0OiAn5Yig6ZmkJywgdHlwZTogJ2RlbCcsIGNsaWNrOiAoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIC8v5Yig6ZmkXHJcbiAgICAgICAgICAgIHRoaXMucm9sZVNlcnZpY2UuZGVsZXRlQnlJZChpdGVtLmlkKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLm1zZ1Nydi5zdWNjZXNzKCfliKDpmaTmiJDlip8nKTtcclxuICAgICAgICAgICAgICB0aGlzLnN0LnJlbG9hZCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBhY2w6IHsgYWJpbGl0eTogWydwZXJtaXNzaW9uOnJlbW92ZSddIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRleHQ6ICcnLFxyXG4gICAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAgeyB0ZXh0OiAn5p+l55yLJywgdHlwZTogJ3N0YXRpYycsIGNvbXBvbmVudDogUGVybWlzc2lvblJvbGVWaWV3Q29tcG9uZW50LCBjbGljazogJ3JlbG9hZCcsIGFjbDogeyBhYmlsaXR5OiBbJ3JvbGU6dmlldyddIH0gfSxcclxuICAgICAgICAgICAgeyB0ZXh0OiAn57yW6L6RJywgdHlwZTogJ25vbmUnLFxyXG4gICAgICAgICAgICAgIGNsaWNrOiAocmVjb3JkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWxcclxuICAgICAgICAgICAgICAgICAgLmNyZWF0ZVN0YXRpYyhQZXJtaXNzaW9uUm9sZUVkaXRDb21wb25lbnQsIHthcHBJZDogdGhpcy5hcHBJZCwgcmVjb3JkOiByZWNvcmR9KVxyXG4gICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3QucmVsb2FkKCkpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgYWNsOiB7IGFiaWxpdHk6IFsncm9sZTplZGl0J10gfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7IHRleHQ6ICfkurrlkZgnLCB0eXBlOiAnc3RhdGljJywgY29tcG9uZW50OiBQZXJtaXNzaW9uUm9sZVVzZXJDb21wb25lbnQsIGNsaWNrOiAncmVsb2FkJywgYWNsOiB7IGFiaWxpdHk6IFsnbWVtYmVyOmNob29zZSddIH0gfVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9LFxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgXTtcclxuXHJcbiAgYXBwSWQgPSAtMTtcclxuICBhcHBMaXN0O1xyXG5cclxuICBzZWxlY3RlZFJvbGU6IGFueTtcclxuICBkYXRhOmFueSA9IFtdO1xyXG4gIGRhdGFMaXN0OmFueSA9IFtdOyAvL+aJgOacieiKgueCueaVsOe7hFxyXG4gIGV4cGFuZERhdGFDYWNoZSA9IHt9O1xyXG5cclxuICBhbGxDaGVja2VkID0gZmFsc2U7XHJcbiAgaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gIGxpc3RPZlNlbGVjdGlvbiA9IFtcclxuICAgIHtcclxuICAgICAgdGV4dCAgICA6ICflhajpgIknLFxyXG4gICAgICBvblNlbGVjdDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hlY2tBbGwodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHRleHQgICAgOiAn5YWo5LiN6YCJJyxcclxuICAgICAgb25TZWxlY3Q6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNoZWNrQWxsKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIF07XHJcblxyXG4gIHJlZnJlc2hTdGF0dXMoJGV2ZW50ID86IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm9sZSkge1xyXG4gICAgICB0aGlzLm1zZ1Nydi53YXJuaW5nKCfor7fpgInmi6nop5LoibInKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFsbENoZWNrZWQgPSB0aGlzLmRhdGFMaXN0LmV2ZXJ5KHZhbHVlID0+IHZhbHVlLmNoZWNrZWQgPT09IHRydWUpO1xyXG4gICAgY29uc3QgYWxsVW5DaGVja2VkID0gdGhpcy5kYXRhTGlzdC5ldmVyeSh2YWx1ZSA9PiAhdmFsdWUuY2hlY2tlZCk7XHJcbiAgICB0aGlzLmFsbENoZWNrZWQgPSBhbGxDaGVja2VkO1xyXG4gICAgdGhpcy5pbmRldGVybWluYXRlID0gKCFhbGxDaGVja2VkKSAmJiAoIWFsbFVuQ2hlY2tlZCk7XHJcbiAgfVxyXG5cclxuICBjaGVja0FsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm9sZSkge1xyXG4gICAgICB0aGlzLm1zZ1Nydi53YXJuaW5nKCfor7fpgInmi6nopoHmjojmnYPnmoTop5LoibInKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICBpZiAoIWRhdGEuZGlzYWJsZWQpIHtcclxuICAgICAgICBkYXRhLmNoZWNrZWQgPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlZnJlc2hTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIGV4cGFuZEFsbCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICBkYXRhLmV4cGFuZCA9IHZhbHVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGFsOiBNb2RhbEhlbHBlciwgcHJpdmF0ZSBtc2dTcnY6IE56TWVzc2FnZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHVibGljIHJvbGVTZXJ2aWNlOiBSb2xlU2VydmljZSwgcHVibGljIHJlc291cmNlU2VydmljZTogUmVzb3VyY2VTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHB1YmxpYyB0cmVlU2VydmljZTogVHJlZVNlcnZpY2UsIHB1YmxpYyBhcHBzU2VydmljZTogQXBwc1NlcnZpY2UsICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zdC5yZXEucGFyYW1zID0ge2FwcElkOiB0aGlzLmFwcElkfTtcclxuICAgIHRoaXMuYXBwc1NlcnZpY2UuZ2V0TGlzdCgpLnN1YnNjcmliZShhcHBMaXN0ID0+IHtcclxuICAgICAgdGhpcy5hcHBMaXN0ID0gYXBwTGlzdDtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hcHBDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIGFwcENoYW5nZSgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRSb2xlID0gbnVsbDtcclxuICAgIHRoaXMuc3QucmVsb2FkKHthcHBJZDogdGhpcy5hcHBJZH0pO1xyXG4gICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZmluZFRyZWUoe2FwcElkOiB0aGlzLmFwcElkfSkuc3Vic2NyaWJlKChyZXM6YW55KSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YSA9IHJlcztcclxuICAgICAgdGhpcy5kYXRhLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgdGhpcy5leHBhbmREYXRhQ2FjaGVbIGl0ZW0uaWQgXSA9IFRyZWVTZXJ2aWNlLmNvbnZlcnRUcmVlVG9MaXN0KGl0ZW0pO1xyXG4gICAgICAgIHRoaXMuZGF0YUxpc3QgPSBbLi4udGhpcy5kYXRhTGlzdCwgLi4udGhpcy5leHBhbmREYXRhQ2FjaGVbaXRlbS5pZF1dO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkKCkge1xyXG4gICAgdGhpcy5tb2RhbFxyXG4gICAgICAuY3JlYXRlU3RhdGljKFBlcm1pc3Npb25Sb2xlRWRpdENvbXBvbmVudCwge2FwcElkOiB0aGlzLmFwcElkfSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN0LnJlbG9hZCh7YXBwSWQ6IHRoaXMuYXBwSWR9KSk7XHJcbiAgfVxyXG5cclxuICByYWRpb0NoYW5nZShpdGVtOiBhbnkpIHtcclxuICAgIGlmICghaXRlbS5yYWRpbykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpdGVtID0gaXRlbS5yYWRpbztcclxuICAgIHRoaXMuc2VsZWN0ZWRSb2xlID0gaXRlbTtcclxuICAgIHRoaXMucm9sZVNlcnZpY2UuZmluZFJlc291cmNlKGl0ZW0uaWQpLnN1YnNjcmliZSgocmVzOnN0cmluZ1tdKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YUxpc3QuZm9yRWFjaChfaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5pbmNsdWRlcyhfaXRlbS5pZCkpIHtcclxuICAgICAgICAgIF9pdGVtLmFzc2lnbiA9ICflt7LmjojmnYMnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBfaXRlbS5hc3NpZ24gPSAn5pyq5o6I5p2DJztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3NpZ24oKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSb2xlKSB7XHJcbiAgICAgIHRoaXMubXNnU3J2Lndhcm5pbmcoJ+ivt+mAieaLqeimgeaOiOadg+eahOinkuiJsicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnYXNzaWduJyk7XHJcbiAgICBsZXQgcmVzb3VyY2VJZHMgPSB0aGlzLmdldENoZWNrSWRzKCk7XHJcbiAgICBpZiAocmVzb3VyY2VJZHMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5tc2dTcnYud2FybmluZygn6K+36YCJ5oup6KaB5o6I5p2D55qE6LWE5rqQJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucm9sZVNlcnZpY2Uuc2F2ZVJlc291cmNlKHRoaXMuc2VsZWN0ZWRSb2xlLmlkLCByZXNvdXJjZUlkcykuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMubXNnU3J2LnN1Y2Nlc3MoJ+aOiOadg+aIkOWKnycpO1xyXG4gICAgICAvLyB0aGlzLmRhdGFMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uKS5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmNoZWNrZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgIGl0ZW0uYXNzaWduID0gJ+W3suaOiOadgyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm9sZSkge1xyXG4gICAgICB0aGlzLm1zZ1Nydi53YXJuaW5nKCfor7fpgInmi6nopoHlj5bmtojmjojmnYPnmoTop5LoibInKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coJ2NhbmNlbCcpO1xyXG4gICAgbGV0IHJlc291cmNlSWRzID0gdGhpcy5nZXRDaGVja0lkcygpO1xyXG4gICAgaWYgKHJlc291cmNlSWRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgIHRoaXMubXNnU3J2Lndhcm5pbmcoJ+ivt+mAieaLqeimgeWPlua2iOaOiOadg+eahOi1hOa6kCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvbGVTZXJ2aWNlLmRlbGV0ZVJlc291cmNlKHRoaXMuc2VsZWN0ZWRSb2xlLmlkLCByZXNvdXJjZUlkcykuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMubXNnU3J2LnN1Y2Nlc3MoJ+WPlua2iOaOiOadg+aIkOWKnycpO1xyXG4gICAgICAvLyB0aGlzLmRhdGFMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uKS5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmIChpdGVtLmNoZWNrZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgIGl0ZW0uYXNzaWduID0gJ+acquaOiOadgyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2hlY2tJZHMoKTpzdHJpbmdbXSB7XHJcbiAgICBsZXQgY2hlY2tJZHMgPSBbXTtcclxuICAgIHRoaXMuZGF0YUxpc3QuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgaWYgKGl0ZW0uY2hlY2tlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGNoZWNrSWRzLnB1c2goaXRlbS5pZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNoZWNrSWRzO1xyXG4gIH1cclxuXHJcbn1cclxuIl19