UNPKG

@knora/action

Version:
149 lines 20.1 kB
import * as tslib_1 from "tslib"; import { Component, EventEmitter, Inject, Input, Output } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ApiResponseData, ApiResponseError, KnoraApiConnection, LoginResponse, LogoutResponse } from '@knora/api'; import { KnoraApiConnectionToken, Session, SessionService } from '@knora/core'; var LoginFormComponent = /** @class */ (function () { function LoginFormComponent(knoraApiConnection, _session, _fb) { this.knoraApiConnection = knoraApiConnection; this._session = _session; this._fb = _fb; /** * Emits true when the login process was successful and false in case of error on login or false after logout process * * @param {EventEmitter<boolean>} status * */ this.status = new EventEmitter(); // show progress indicator this.loading = false; // specific error messages this.loginErrorUser = false; this.loginErrorPw = false; this.loginErrorServer = false; // labels for the login form // TODO: should be handled by translation service (i18n) this.formLabel = { title: 'Login here', name: 'Username', pw: 'Password', submit: 'Login', retry: 'Retry', logout: 'LOGOUT', remember: 'Remember me', forgot_pw: 'Forgot password?', error: { failed: 'Password or username is wrong', server: 'There\'s an error with the server connection. Try it again later or inform the Knora Team' } }; // error definitions for the following form fields this.formErrors = { 'username': '', 'password': '' }; // error messages for the form fields defined in formErrors this.validationMessages = { 'username': { 'required': 'user name is required.' }, 'password': { 'required': 'password is required' } }; } LoginFormComponent.prototype.ngOnInit = function () { // if session is valid (a user is logged-in) show a message, otherwise build the form if (this._session.validateSession()) { this.session = JSON.parse(localStorage.getItem('session')); } else { this.buildForm(); } }; LoginFormComponent.prototype.buildForm = function () { this.form = this._fb.group({ username: ['', Validators.required], password: ['', Validators.required] }); }; /** * @ignore * * Login and set session */ LoginFormComponent.prototype.login = function () { var _this = this; this.loading = true; // reset the error messages this.errorMessage = undefined; // Grab values from form var identifier = this.form.get('username').value; var password = this.form.get('password').value; var identifierType = (identifier.indexOf('@') > -1 ? 'email' : 'username'); this.knoraApiConnection.v2.auth.login(identifierType, identifier, password).subscribe(function (response) { _this._session.setSession(response.body.token, identifier, identifierType); setTimeout(function () { _this.status.emit(true); _this.loading = false; }, 2200); }, function (error) { // error handling _this.loginErrorUser = (error.status === 404); _this.loginErrorPw = (error.status === 401); _this.loginErrorServer = (error.status === 0); _this.errorMessage = error; _this.loading = false; // TODO: update error handling similar to the old method (see commented code below) }); }; /** * @ignore * * Logout and destroy session * */ LoginFormComponent.prototype.logout = function () { var _this = this; this.loading = true; this.knoraApiConnection.v2.auth.logout().subscribe(function (response) { _this.status.emit(response.body.status === 0); _this._session.destroySession(); _this.loading = false; }, function (error) { console.error(error); _this.loading = false; }); }; LoginFormComponent.ctorParameters = function () { return [ { type: KnoraApiConnection, decorators: [{ type: Inject, args: [KnoraApiConnectionToken,] }] }, { type: SessionService }, { type: FormBuilder } ]; }; tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], LoginFormComponent.prototype, "navigate", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], LoginFormComponent.prototype, "color", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], LoginFormComponent.prototype, "status", void 0); LoginFormComponent = tslib_1.__decorate([ Component({ selector: 'kui-login-form', template: "<div class=\"login-container\" *ngIf=\"!session\">\n\n <h2 class=\"login-form-title mat-title\">{{formLabel.title}}</h2>\n\n <!-- This is the login form -->\n <form [formGroup]=\"form\" (ngSubmit)=\"login()\" class=\"login-form\">\n\n <!-- Username -->\n <mat-form-field class=\"full-width login-field\">\n <!-- <mat-icon matPrefix>person</mat-icon> -->\n\n <input matInput autofocus [placeholder]=\"formLabel.name\" autocomplete=\"username\" formControlName=\"username\"\n #username cdkFocusInitial>\n\n </mat-form-field>\n\n <!-- Password -->\n <mat-form-field class=\"full-width login-field\">\n\n <!-- <mat-icon matPrefix>lock</mat-icon> -->\n\n <input matInput type=\"password\" [placeholder]=\"formLabel.pw\" autocomplete=\"current-password\"\n formControlName=\"password\">\n\n </mat-form-field>\n\n <br>\n\n <!-- Button: Login -->\n <button mat-raised-button type=\"submit\" [disabled]=\"!form.valid\" class=\"full-width submit-button\"\n [class.mat-primary]=\"!errorMessage\" [class.mat-warn]=\"errorMessage\">\n <kui-progress-indicator [color]=\"'white'\" [status]=\"0\" *ngIf=\"loading\" class=\"login-progress\">\n </kui-progress-indicator>\n <mat-icon *ngIf=\"errorMessage && !loading\">close</mat-icon>\n {{errorMessage ? formLabel.retry : formLabel.submit}}\n </button>\n\n <br><br>\n\n <!-- Error message as an answer from knora api request -->\n <p class=\"full-width login-error\" *ngIf=\"errorMessage\">\n {{loginErrorServer ? formLabel.error.server : formLabel.error.failed}}\n </p>\n </form>\n</div>\n\n\n<!-- a user is already logged in; show who it is and a logout button -->\n<div class=\"logout-container\" *ngIf=\"session\">\n <p>A user is already logged in:</p>\n <p>Username: <strong>{{session.user.name}}</strong></p>\n <br>\n <p>Please log out if it's not you.</p>\n <button mat-raised-button (click)=\"logout()\" class=\"full-width mat-warn logout-button\">\n <kui-progress-indicator [color]=\"'white'\" [status]=\"0\" *ngIf=\"loading\" class=\"login-progress\">\n </kui-progress-indicator>\n {{formLabel.logout}}\n </button>\n</div>\n", styles: [".full-width{width:100%}.login-form-title{text-align:center}.login-error{color:#ef5350;text-align:center}.login-progress{display:inline-block;margin-right:6px}.login-container,.logout-container{margin-left:auto;margin-right:auto;position:relative;width:280px}.logout-button,.submit-button{height:48px}.center{text-align:center}"] }), tslib_1.__param(0, Inject(KnoraApiConnectionToken)), tslib_1.__metadata("design:paramtypes", [KnoraApiConnection, SessionService, FormBuilder]) ], LoginFormComponent); return LoginFormComponent; }()); export { LoginFormComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa25vcmEvYWN0aW9uLyIsInNvdXJjZXMiOlsibGliL2xvZ2luLWZvcm0vbG9naW4tZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQU8vRTtJQTJFSSw0QkFDNkMsa0JBQXNDLEVBQ3ZFLFFBQXdCLEVBQ3hCLEdBQWdCO1FBRmlCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdkUsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQTlENUI7Ozs7O1dBS0c7UUFDTyxXQUFNLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFRdEUsMEJBQTBCO1FBQzFCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFLekIsMEJBQTBCO1FBQzFCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUV6Qiw0QkFBNEI7UUFDNUIsd0RBQXdEO1FBQ3hELGNBQVMsR0FBRztZQUNSLEtBQUssRUFBRSxZQUFZO1lBQ25CLElBQUksRUFBRSxVQUFVO1lBQ2hCLEVBQUUsRUFBRSxVQUFVO1lBQ2QsTUFBTSxFQUFFLE9BQU87WUFDZixL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Q0FBQSxBQWxLRCxJQWtLQztTQWxLWSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZURhdGEsIEFwaVJlc3BvbnNlRXJyb3IsIEtub3JhQXBpQ29ubmVjdGlvbiwgTG9naW5SZXNwb25zZSwgTG9nb3V0UmVzcG9uc2UgfSBmcm9tICdAa25vcmEvYXBpJztcbmltcG9ydCB7IEtub3JhQXBpQ29ubmVjdGlvblRva2VuLCBTZXNzaW9uLCBTZXNzaW9uU2VydmljZSB9IGZyb20gJ0Brbm9yYS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdrdWktbG9naW4tZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xvZ2luLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2xvZ2luLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBMb2dpbkZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlIHRvIHRoZSBkZWZpbmVkIHVybCAob3IgcGF0aCkgYWZ0ZXIgc3VjY2Vzc2Z1bCBsb2dpblxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBbbmF2aWdhdGVdXG4gICAgICovXG4gICAgQElucHV0KCkgbmF2aWdhdGU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgeW91ciB0aGVtZSBjb2xvciBoZXJlLFxuICAgICAqIGl0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcHJvZ3Jlc3MtaW5kaWNhdG9yIGFuZCB0aGUgYnV0dG9uc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcl1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBjb2xvcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHRydWUgd2hlbiB0aGUgbG9naW4gcHJvY2VzcyB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciBvbiBsb2dpbiBvciBmYWxzZSBhZnRlciBsb2dvdXQgcHJvY2Vzc1xuICAgICAqXG4gICAgICogQHBhcmFtICB7RXZlbnRFbWl0dGVyPGJvb2xlYW4+fSBzdGF0dXNcbiAgICAgKlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzdGF0dXM6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8vIGlzIHRoZXJlIGFscmVhZHkgYSB2YWxpZCBzZXNzaW9uP1xuICAgIHNlc3Npb246IFNlc3Npb247XG5cbiAgICAvLyBmb3JtXG4gICAgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgLy8gc2hvdyBwcm9ncmVzcyBpbmRpY2F0b3JcbiAgICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBnZW5lcmFsIGVycm9yIG1lc3NhZ2VcbiAgICBlcnJvck1lc3NhZ2U6IEFwaVJlc3BvbnNlRXJyb3I7XG5cbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlc1xuICAgIGxvZ2luRXJyb3JVc2VyID0gZmFsc2U7XG4gICAgbG9naW5FcnJvclB3ID0gZmFsc2U7XG4gICAgbG9naW5FcnJvclNlcnZlciA9IGZhbHNlO1xuXG4gICAgLy8gbGFiZWxzIGZvciB0aGUgbG9naW4gZm9ybVxuICAgIC8vIFRPRE86IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRyYW5zbGF0aW9uIHNlcnZpY2UgKGkxOG4pXG4gICAgZm9ybUxhYmVsID0ge1xuICAgICAgICB0aXRsZTogJ0xvZ2luIGhlcmUnLFxuICAgICAgICBuYW1lOiAnVXNlcm5hbWUnLFxuICAgICAgICBwdzogJ1Bhc3N3b3JkJyxcbiAgICAgICAgc3VibWl0OiAnTG9naW4nLFxuICAgICAgICByZXRyeTogJ1JldHJ5JyxcbiAgICAgICAgbG9nb3V0OiAnTE9HT1VUJyxcbiAgICAgICAgcmVtZW1iZXI6ICdSZW1lbWJlciBtZScsXG4gICAgICAgIGZvcmdvdF9wdzogJ0ZvcmdvdCBwYXNzd29yZD8nLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgZmFpbGVkOiAnUGFzc3dvcmQgb3IgdXNlcm5hbWUgaXMgd3JvbmcnLFxuICAgICAgICAgICAgc2VydmVyOiAnVGhlcmVcXCdzIGFuIGVycm9yIHdpdGggdGhlIHNlcnZlciBjb25uZWN0aW9uLiBUcnkgaXQgYWdhaW4gbGF0ZXIgb3IgaW5mb3JtIHRoZSBLbm9yYSBUZWFtJ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIGVycm9yIGRlZmluaXRpb25zIGZvciB0aGUgZm9sbG93aW5nIGZvcm0gZmllbGRzXG4gICAgZm9ybUVycm9ycyA9IHtcbiAgICAgICAgJ3VzZXJuYW1lJzogJycsXG4gICAgICAgICdwYXNzd29yZCc6ICcnXG4gICAgfTtcblxuICAgIC8vIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgZm9ybSBmaWVsZHMgZGVmaW5lZCBpbiBmb3JtRXJyb3JzXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VzID0ge1xuICAgICAgICAndXNlcm5hbWUnOiB7XG4gICAgICAgICAgICAncmVxdWlyZWQnOiAndXNlciBuYW1lIGlzIHJlcXVpcmVkLidcbiAgICAgICAgfSxcbiAgICAgICAgJ3Bhc3N3b3JkJzoge1xuICAgICAgICAgICAgJ3JlcXVpcmVkJzogJ3Bhc3N3b3JkIGlzIHJlcXVpcmVkJ1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoS25vcmFBcGlDb25uZWN0aW9uVG9rZW4pIHByaXZhdGUga25vcmFBcGlDb25uZWN0aW9uOiBLbm9yYUFwaUNvbm5lY3Rpb24sXG4gICAgICAgIHByaXZhdGUgX3Nlc3Npb246IFNlc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXJcbiAgICApIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIGlmIHNlc3Npb24gaXMgdmFsaWQgKGEgdXNlciBpcyBsb2dnZWQtaW4pIHNob3cgYSBtZXNzYWdlLCBvdGhlcndpc2UgYnVpbGQgdGhlIGZvcm1cbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb24udmFsaWRhdGVTZXNzaW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Nlc3Npb24nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGRGb3JtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLl9mYi5ncm91cCh7XG4gICAgICAgICAgICB1c2VybmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKlxuICAgICAqIExvZ2luIGFuZCBzZXQgc2Vzc2lvblxuICAgICAqL1xuICAgIGxvZ2luKCkge1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgLy8gcmVzZXQgdGhlIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEdyYWIgdmFsdWVzIGZyb20gZm9ybVxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5mb3JtLmdldCgndXNlcm5hbWUnKS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSB0aGlzLmZvcm0uZ2V0KCdwYXNzd29yZCcpLnZhbHVlO1xuXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXJUeXBlOiAnaXJpJyB8ICdlbWFpbCcgfCAndXNlcm5hbWUnID0gKGlkZW50aWZpZXIuaW5kZXhPZignQCcpID4gLTEgPyAnZW1haWwnIDogJ3VzZXJuYW1lJyk7XG5cbiAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24udjIuYXV0aC5sb2dpbihpZGVudGlmaWVyVHlwZSwgaWRlbnRpZmllciwgcGFzc3dvcmQpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPExvZ2luUmVzcG9uc2U+KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zZXNzaW9uLnNldFNlc3Npb24ocmVzcG9uc2UuYm9keS50b2tlbiwgaWRlbnRpZmllciwgaWRlbnRpZmllclR5cGUpO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzLmVtaXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sIDIyMDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcjogQXBpUmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yVXNlciA9IChlcnJvci5zdGF0dXMgPT09IDQwNCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yUHcgPSAoZXJyb3Iuc3RhdHVzID09PSA0MDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW5FcnJvclNlcnZlciA9IChlcnJvci5zdGF0dXMgPT09IDApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBlcnJvciBoYW5kbGluZyBzaW1pbGFyIHRvIHRoZSBvbGQgbWV0aG9kIChzZWUgY29tbWVudGVkIGNvZGUgYmVsb3cpXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogTG9nb3V0IGFuZCBkZXN0cm95IHNlc3Npb25cbiAgICAgKlxuICAgICAqL1xuICAgIGxvZ291dCgpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi52Mi5hdXRoLmxvZ291dCgpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPExvZ291dFJlc3BvbnNlPikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzLmVtaXQocmVzcG9uc2UuYm9keS5zdGF0dXMgPT09IDApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uZGVzdHJveVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgIH1cblxufVxuIl19