UNPKG

angular-firebase-authorizator

Version:

Beta version of authorizator for angular linked to firebase, it creates a model in firestore to assign permissions to users an roles, and creates a view to update this permissions

162 lines 24.4 kB
import { __decorate, __extends, __metadata, __param } from "tslib"; import { Component, Inject, ViewChild } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatSelect } from '@angular/material/select'; import { AuthorizatorService } from '../../../services/authorizator.service'; import { BehaviorSubject } from 'rxjs'; import { DataSource } from '@angular/cdk/table'; var UsersDatabase = /** @class */ (function () { function UsersDatabase() { this.dataChange = new BehaviorSubject([]); } Object.defineProperty(UsersDatabase.prototype, "data", { get: function () { return this.dataChange.value; }, enumerable: true, configurable: true }); return UsersDatabase; }()); export { UsersDatabase }; var UsersDataSource = /** @class */ (function (_super) { __extends(UsersDataSource, _super); function UsersDataSource(usersDatabase) { var _this = _super.call(this) || this; _this.usersDatabase = usersDatabase; return _this; } UsersDataSource.prototype.connect = function () { return this.usersDatabase.dataChange; }; UsersDataSource.prototype.disconnect = function () { }; return UsersDataSource; }(DataSource)); export { UsersDataSource }; var UpsertRoleComponent = /** @class */ (function () { function UpsertRoleComponent(data, authorizatorservice, dialogRef) { this.data = data; this.authorizatorservice = authorizatorservice; this.dialogRef = dialogRef; this.displayedColumns = ['remove', 'user']; this.usersDatabase = new UsersDatabase(); this.users = []; this.roleUsers = []; this.roleForm = new FormGroup({ name: new FormControl(null, [Validators.required]), description: new FormControl(null), }); } UpsertRoleComponent.prototype.ngOnInit = function () { var _this = this; this.usersDataSource = new UsersDataSource(this.usersDatabase); this.authorizatorservice.getUsers(this.data.rootFirebasePath).then(function (users) { if (users) { _this.users = users.sort(function (prev, curr) { if (prev.data.name > curr.data.name) { return 1; } if (prev.data.name < curr.data.name) { return -1; } return 0; }); _this.roleUsers = _this.users.filter(function (user) { return _this.data && _this.data.role && _this.data.role.data.users.findIndex(function (usr) { return usr === user.id; }) > -1; }); if (_this.roleUsers) { _this.roleUsers = _this.roleUsers.sort(function (prev, curr) { if (prev.data.name > curr.data.name) { return 1; } if (prev.data.name < curr.data.name) { return -1; } return 0; }); _this.usersDatabase.dataChange.next(_this.roleUsers); } } }); if (this.data.role) { this.roleForm.controls.name.setValue(this.data.role.data.name); this.roleForm.controls.description.setValue(this.data.role.data.description); } }; UpsertRoleComponent.prototype.onAddUserToRole = function () { var _this = this; var existUser = this.roleUsers.findIndex(function (roleUser) { return roleUser.id === _this.selectUser.value; }); if (existUser === -1) { this.roleUsers.push(this.users.find(function (user) { return user.id === _this.selectUser.value; })); this.roleUsers = this.roleUsers.sort(function (prev, curr) { if (prev.data.name > curr.data.name) { return 1; } if (prev.data.name < curr.data.name) { return -1; } return 0; }); this.usersDatabase.dataChange.next(this.roleUsers); } }; UpsertRoleComponent.prototype.onRemoveUserFromRole = function (user) { var userIndex = this.roleUsers.findIndex(function (roleUser) { return roleUser.id === user.id; }); if (userIndex > -1) { this.roleUsers.splice(userIndex, 1); this.usersDatabase.dataChange.next(this.roleUsers); } }; UpsertRoleComponent.prototype.onSubmitRole = function () { var _this = this; if (this.roleForm.valid) { var roleToAdd_1 = { id: this.data.role ? this.data.role.id : null, data: { name: this.roleForm.controls.name.value, description: this.roleForm.controls.description.value, users: this.roleUsers.map(function (user) { return user.id; }), permissions: null } }; if (roleToAdd_1.id) { this.authorizatorservice.updateRole(this.data.rootFirebasePath, roleToAdd_1).then(function () { _this.dialogRef.close(roleToAdd_1); }).catch(function (error) { _this.roleForm.controls.name.setErrors({ defaulterror: true }); }); } else { this.authorizatorservice.addRole(this.data.rootFirebasePath, roleToAdd_1).then(function () { _this.dialogRef.close(roleToAdd_1); }).catch(function (error) { if (error.key === 'exists') { _this.roleForm.controls.name.setErrors({ exists: true }); } else { _this.roleForm.controls.name.setErrors({ defaulterror: true }); } }); } } }; UpsertRoleComponent.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] }, { type: AuthorizatorService }, { type: MatDialogRef } ]; }; __decorate([ ViewChild('selectUser'), __metadata("design:type", MatSelect) ], UpsertRoleComponent.prototype, "selectUser", void 0); UpsertRoleComponent = __decorate([ Component({ selector: 'lib-upsert-role', template: "<form [formGroup]=\"roleForm\" (ngSubmit)=\"onSubmitRole()\" method=\"post\">\n <h1 mat-dialog-title>{{data.role ? 'Edit Role' : 'Add Role'}}</h1>\n <div mat-dialog-content>\n <mat-form-field style=\"width: 100%;\">\n <input matInput cdkFocusInitial placeholder=\"Name\" formControlName=\"name\" maxlength=\"30\">\n <mat-error *ngIf=\"roleForm.controls['name'].hasError('required')\">Mandatory field</mat-error>\n <mat-error *ngIf=\"roleForm.controls['name'].hasError('exists')\">Email already exists</mat-error>\n <mat-error *ngIf=\"roleForm.controls['name'].hasError('defaulterror')\">Error updating role</mat-error>\n </mat-form-field>\n <mat-form-field style=\"width: 100%;\">\n <input matInput cdkFocusInitial placeholder=\"Description\" formControlName=\"description\" maxlength=\"150\">\n </mat-form-field>\n <table style=\"width: 100%;\">\n <tr>\n <th style=\"width: 100%;\">\n <mat-form-field style=\"width: 100%;\">\n <mat-label>User</mat-label>\n <mat-select #selectUser>\n <mat-option *ngFor=\"let user of users\" [value]=\"user.id\">\n {{user.data.name || user.data.email}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </th>\n <th>\n <button type=\"button\" [disabled]=\"!this.selectUser.value\" mat-raised-button (click)=\"onAddUserToRole()\">\n <mat-icon color=\"primary\">person_add</mat-icon> Add User\n </button>\n </th>\n </tr>\n </table>\n <table mat-table [dataSource]=\"usersDataSource\" style=\"width: 100%;\">\n \n <!-- Remove Column -->\n <ng-container matColumnDef=\"remove\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'icon-column'\"></th>\n <td mat-cell *matCellDef=\"let user\" [ngClass]=\"'icon-column'\">\n <button mat-icon-button (click)=\"onRemoveUserFromRole(user)\">\n <mat-icon color=\"primary\" aria-label=\"Remove user\">delete</mat-icon>\n </button>\n </td>\n </ng-container>\n \n <!-- User Column -->\n <ng-container matColumnDef=\"user\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'users-column'\"> User </th>\n <td mat-cell *matCellDef=\"let user\" [ngClass]=\"'users-column'\">\n <div>{{user.data.name}}</div>\n <div>{{user.data.email}}</div>\n </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n <div mat-dialog-actions>\n <button mat-button [mat-dialog-close]>Close</button>\n <button mat-raised-button color=\"primary\" type=\"submit\" [disabled]=\"!roleForm.valid\">{{data.role ? 'Update' : 'Add'}}</button>\n </div>\n</form>\n ", styles: [".mat-dialog-actions{-webkit-box-pack:end;justify-content:flex-end}"] }), __param(0, Inject(MAT_DIALOG_DATA)), __metadata("design:paramtypes", [Object, AuthorizatorService, MatDialogRef]) ], UpsertRoleComponent); return UpsertRoleComponent; }()); export { UpsertRoleComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBzZXJ0LXJvbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1maXJlYmFzZS1hdXRob3JpemF0b3IvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9yb2xlcy91cHNlcnQtcm9sZS91cHNlcnQtcm9sZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQU9oRDtJQUlFO1FBSEEsZUFBVSxHQUErQixJQUFJLGVBQWUsQ0FBWSxFQUFFLENBQUMsQ0FBQztJQUc1RCxDQUFDO0lBRmpCLHNCQUFJLCtCQUFJO2FBQVIsY0FBd0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBR3pELG9CQUFDO0FBQUQsQ0FBQyxBQUxELElBS0M7O0FBRUQ7SUFBcUMsbUNBQWU7SUFDbEQseUJBQW9CLGFBQTRCO1FBQWhELFlBQ0UsaUJBQU8sU0FDUjtRQUZtQixtQkFBYSxHQUFiLGFBQWEsQ0FBZTs7SUFFaEQsQ0FBQztJQUVELGlDQUFPLEdBQVA7UUFDRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxvQ0FBVSxH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QixTQUFTLENBQUMsWUFBWSxDQUFDO2tDQUFvQixTQUFTOzJEQUFDO0lBTjNDLG1CQUFtQjtRQUwvQixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLHEyRkFBMkM7O1NBRTVDLENBQUM7UUFjRyxXQUFBLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtpREFDSyxtQkFBbUI7WUFDOUIsWUFBWTtPQWZyQixtQkFBbUIsQ0E2Ry9CO0lBQUQsMEJBQUM7Q0FBQSxBQTdHRCxJQTZHQztTQTdHWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvbGVPYmogfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL3JvbGUtb2JqJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgQXV0aG9yaXphdG9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGhvcml6YXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVXNlck9iaiB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvdXNlci1vYmonO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90YWJsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nRGF0YSB7XG4gIHJvbGU6IFJvbGVPYmo7XG4gIHJvb3RGaXJlYmFzZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJzRGF0YWJhc2Uge1xuICBkYXRhQ2hhbmdlOiBCZWhhdmlvclN1YmplY3Q8VXNlck9ialtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlck9ialtdPihbXSk7XG4gIGdldCBkYXRhKCk6IFVzZXJPYmpbXSB7IHJldHVybiB0aGlzLmRhdGFDaGFuZ2UudmFsdWU7IH1cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuXG5leHBvcnQgY2xhc3MgVXNlcnNEYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZTxhbnk+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB1c2Vyc0RhdGFiYXNlOiBVc2Vyc0RhdGFiYXNlKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGNvbm5lY3QoKTogT2JzZXJ2YWJsZTxVc2VyT2JqW10+IHtcbiAgICByZXR1cm4gdGhpcy51c2Vyc0RhdGFiYXNlLmRhdGFDaGFuZ2U7XG4gIH1cblxuICBkaXNjb25uZWN0KCkge31cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXVwc2VydC1yb2xlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Vwc2VydC1yb2xlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXBzZXJ0LXJvbGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBVcHNlcnRSb2xlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIGRpc3BsYXllZENvbHVtbnMgPSBbJ3JlbW92ZScsICd1c2VyJ107XG4gIHByaXZhdGUgdXNlcnNEYXRhYmFzZSA9IG5ldyBVc2Vyc0RhdGFiYXNlKCk7XG4gIHB1YmxpYyB1c2Vyc0RhdGFTb3VyY2U6IFVzZXJzRGF0YVNvdXJjZSB8IG51bGw7XG4gIHB1YmxpYyB1c2VyczogVXNlck9ialtdID0gW107XG4gIHB1YmxpYyByb2xlVXNlcnM6IFVzZXJPYmpbXSA9IFtdO1xuICBAVmlld0NoaWxkKCdzZWxlY3RVc2VyJykgcHVibGljIHNlbGVjdFVzZXI6IE1hdFNlbGVjdDtcblxuICBwdWJsaWMgcm9sZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBuYW1lOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICBkZXNjcmlwdGlvbjogbmV3IEZvcm1Db250cm9sKG51bGwpLFxuICB9KTtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBEaWFsb2dEYXRhLFxuICAgIHByaXZhdGUgYXV0aG9yaXphdG9yc2VydmljZTogQXV0aG9yaXphdG9yU2VydmljZSxcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VXBzZXJ0Um9sZUNvbXBvbmVudD5cbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVzZXJzRGF0YVNvdXJjZSA9IG5ldyBVc2Vyc0RhdGFTb3VyY2UodGhpcy51c2Vyc0RhdGFiYXNlKTtcbiAgICB0aGlzLmF1dGhvcml6YXRvcnNlcnZpY2UuZ2V0VXNlcnModGhpcy5kYXRhLnJvb3RGaXJlYmFzZVBhdGgpLnRoZW4odXNlcnMgPT4ge1xuICAgICAgaWYgKHVzZXJzKSB7XG4gICAgICAgIHRoaXMudXNlcnMgPSB1c2Vycy5zb3J0KChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lID4gY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldi5kYXRhLm5hbWUgPCBjdXJyLmRhdGEubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm9sZVVzZXJzID0gdGhpcy51c2Vycy5maWx0ZXIoXG4gICAgICAgICAgdXNlciA9PiB0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLnJvbGUgJiYgdGhpcy5kYXRhLnJvbGUuZGF0YS51c2Vycy5maW5kSW5kZXgodXNyID0+IHVzciA9PT0gdXNlci5pZCkgPiAtMVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5yb2xlVXNlcnMpIHtcbiAgICAgICAgICB0aGlzLnJvbGVVc2VycyA9IHRoaXMucm9sZVVzZXJzLnNvcnQoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmV2LmRhdGEubmFtZSA+IGN1cnIuZGF0YS5uYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lIDwgY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51c2Vyc0RhdGFiYXNlLmRhdGFDaGFuZ2UubmV4dCh0aGlzLnJvbGVVc2Vycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5kYXRhLnJvbGUpIHtcbiAgICAgIHRoaXMucm9sZUZvcm0uY29udHJvbHMubmFtZS5zZXRWYWx1ZSh0aGlzLmRhdGEucm9sZS5kYXRhLm5hbWUpO1xuICAgICAgdGhpcy5yb2xlRm9ybS5jb250cm9scy5kZXNjcmlwdGlvbi5zZXRWYWx1ZSh0aGlzLmRhdGEucm9sZS5kYXRhLmRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICBvbkFkZFVzZXJUb1JvbGUoKSB7XG4gICAgY29uc3QgZXhpc3RVc2VyID0gdGhpcy5yb2xlVXNlcnMuZmluZEluZGV4KHJvbGVVc2VyID0+IHJvbGVVc2VyLmlkID09PSB0aGlzLnNlbGVjdFVzZXIudmFsdWUpO1xuICAgIGlmIChleGlzdFVzZXIgPT09IC0xKSB7XG4gICAgICB0aGlzLnJvbGVVc2Vycy5wdXNoKHRoaXMudXNlcnMuZmluZCh1c2VyID0+IHVzZXIuaWQgPT09IHRoaXMuc2VsZWN0VXNlci52YWx1ZSkpO1xuICAgICAgdGhpcy5yb2xlVXNlcnMgPSB0aGlzLnJvbGVVc2Vycy5zb3J0KChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgIGlmIChwcmV2LmRhdGEubmFtZSA+IGN1cnIuZGF0YS5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lIDwgY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudXNlcnNEYXRhYmFzZS5kYXRhQ2hhbmdlLm5leHQodGhpcy5yb2xlVXNlcnMpO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVtb3ZlVXNlckZyb21Sb2xlKHVzZXI6IFVzZXJPYmopIHtcbiAgICBjb25zdCB1c2VySW5kZXggPSB0aGlzLnJvbGVVc2Vycy5maW5kSW5kZXgocm9sZVVzZXIgPT4gcm9sZVVzZXIuaWQgPT09IHVzZXIuaWQpO1xuICAgIGlmICh1c2VySW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5yb2xlVXNlcnMuc3BsaWNlKHVzZXJJbmRleCwgMSk7XG4gICAgICB0aGlzLnVzZXJzRGF0YWJhc2UuZGF0YUNoYW5nZS5uZXh0KHRoaXMucm9sZVVzZXJzKTtcbiAgICB9XG4gIH1cblxuICBvblN1Ym1pdFJvbGUoKSB7XG4gICAgaWYgKHRoaXMucm9sZUZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IHJvbGVUb0FkZDogUm9sZU9iaiA9IHtcbiAgICAgICAgaWQ6IHRoaXMuZGF0YS5yb2xlID8gdGhpcy5kYXRhLnJvbGUuaWQgOiBudWxsLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbmFtZTogdGhpcy5yb2xlRm9ybS5jb250cm9scy5uYW1lLnZhbHVlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnJvbGVGb3JtLmNvbnRyb2xzLmRlc2NyaXB0aW9uLnZhbHVlLFxuICAgICAgICAgIHVzZXJzOiB0aGlzLnJvbGVVc2Vycy5tYXAodXNlciA9PiB1c2VyLmlkKSxcbiAgICAgICAgICBwZXJtaXNzaW9uczogbnVsbFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKHJvbGVUb0FkZC5pZCkge1xuICAgICAgICB0aGlzLmF1dGhvcml6YXRvcnNlcnZpY2UudXBkYXRlUm9sZSh0aGlzLmRhdGEucm9vdEZpcmViYXNlUGF0aCwgcm9sZVRvQWRkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyb2xlVG9BZGQpO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgdGhpcy5yb2xlRm9ybS5jb250cm9scy5uYW1lLnNldEVycm9ycyh7IGRlZmF1bHRlcnJvcjogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF1dGhvcml6YXRvcnNlcnZpY2UuYWRkUm9sZSh0aGlzLmRhdGEucm9vdEZpcmViYXNlUGF0aCwgcm9sZVRvQWRkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyb2xlVG9BZGQpO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yLmtleSA9PT0gJ2V4aXN0cycpIHtcbiAgICAgICAgICAgIHRoaXMucm9sZUZvcm0uY29udHJvbHMubmFtZS5zZXRFcnJvcnMoeyBleGlzdHM6IHRydWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucm9sZUZvcm0uY29udHJvbHMubmFtZS5zZXRFcnJvcnMoeyBkZWZhdWx0ZXJyb3I6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==