UNPKG

@formio-tmt/angular

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.4.

197 lines 25.4 kB
import { EventEmitter, Injectable } from '@angular/core'; import { get, each } from 'lodash'; import { Formio } from '@formio-tmt/js'; import * as i0 from "@angular/core"; import * as i1 from "@formio-tmt/angular"; import * as i2 from "./auth.config"; class FormioAuthService { appConfig; config; user; authenticated = false; loginForm; onLogin; onLogout; registerForm; onRegister; onUser; onError; resetPassForm; onResetPass; ready; readyResolve; readyReject; projectReady; accessReady; userReady; formAccess = {}; submissionAccess = {}; roles; is = {}; constructor(appConfig, config) { this.appConfig = appConfig; this.config = config; this.user = null; if (this.appConfig && this.appConfig.appUrl) { Formio.setBaseUrl(this.appConfig.apiUrl); Formio.setProjectUrl(this.appConfig.appUrl); Formio.formOnly = !!this.appConfig.formOnly; } else { console.error('You must provide an AppConfig within your application!'); } this.loginForm = this.appConfig.appUrl + '/' + get(this.config, 'login.form', 'user/login'); this.registerForm = this.appConfig.appUrl + '/' + get(this.config, 'register.form', 'user/register'); this.resetPassForm = this.appConfig.appUrl + '/' + get(this.config, 'register.form', 'resetpass'); this.onLogin = new EventEmitter(); this.onLogout = new EventEmitter(); this.onRegister = new EventEmitter(); this.onUser = new EventEmitter(); this.onError = new EventEmitter(); this.ready = new Promise((resolve, reject) => { this.readyResolve = resolve; this.readyReject = reject; }); // Register for the core events. Formio.events.on('formio.badToken', () => this.logoutError()); Formio.events.on('formio.sessionExpired', () => this.logoutError()); if (!this.config.delayAuth) { this.init(); } } onLoginSubmit(submission) { this.setUser(submission); this.onLogin.emit(submission); } onRegisterSubmit(submission) { this.setUser(submission); this.onRegister.emit(submission); } onResetPassSubmit(submission) { this.onResetPass.emit(submission); } init() { this.projectReady = Formio.makeStaticRequest(this.appConfig.appUrl).then((project) => { each(project.access, (access) => { this.formAccess[access.type] = access.roles; }); }, () => { this.formAccess = {}; return null; }); // Get the access for this project. this.accessReady = Formio.makeStaticRequest(this.appConfig.appUrl + '/access') .then((access) => { each(access.forms, (form) => { this.submissionAccess[form.name] = {}; form.submissionAccess.forEach((subAccess) => { this.submissionAccess[form.name][subAccess.type] = subAccess.roles; }); }); this.roles = access.roles; return access; }) .catch((err) => { if (err === 'Token Expired' || err === 'Bad Token') { this.setUser(null); } this.roles = {}; return null; }); let currentUserPromise; if (this.config.oauth) { // Make a fix to the hash to remove starting "/" that angular might put there. if (window.location.hash && window.location.hash.match(/^#\/access_token/)) { history.pushState(null, null, window.location.hash.replace(/^#\/access_token/, '#access_token')); } // Initiate the SSO if they provide oauth settings. currentUserPromise = Formio.ssoInit(this.config.oauth.type, this.config.oauth.options); } else { currentUserPromise = Formio.currentUser(null, { ignoreCache: true }); } this.userReady = currentUserPromise.then((user) => { this.setUser(user); return user; }).catch((err) => { this.setUser(null); throw err; }); // Trigger we are redy when all promises have resolved. if (this.accessReady) { this.accessReady .then(() => this.projectReady) .then(() => this.userReady) .then(() => this.readyResolve(true)) .catch((err) => this.readyReject(err)); } } setUser(user) { const namespace = Formio.namespace || 'formio'; if (user) { this.user = user; localStorage.setItem(`${namespace}AppUser`, JSON.stringify(user)); this.setUserRoles(); Formio.setUser(user); } else { this.user = null; this.is = {}; localStorage.removeItem(`${namespace}AppUser`); Formio.clearCache(); Formio.setUser(null); } this.authenticated = !!Formio.getToken(); this.onUser.emit(this.user); } setUserRoles() { if (this.accessReady) { this.accessReady.then(() => { each(this.roles, (role, roleName) => { if (this.user.roles.indexOf(role._id) !== -1) { this.is[roleName] = true; } }); }); } } logoutError() { this.setUser(null); const namespace = Formio.namespace || 'formio'; localStorage.removeItem(`${namespace}Token`); this.onError.emit(); } logout() { this.setUser(null); const namespace = Formio.namespace || 'formio'; if (localStorage.getItem(`${namespace}LogoutAuthUrl`)) { window.open(localStorage.getItem(`${namespace}LogoutAuthUrl`), null, 'width=1020,height=618'); localStorage.removeItem(`${namespace}LogoutAuthUrl`); } this.handleLogout(namespace); } handleLogout(namespace) { localStorage.removeItem(`${namespace}Token`); Formio.logout() .then(() => this.onLogout.emit()) .catch(() => this.logoutError()); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioAuthService, deps: [{ token: i1.FormioAppConfig }, { token: i2.FormioAuthConfig }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioAuthService }); } export { FormioAuthService }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: FormioAuthService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.FormioAppConfig }, { type: i2.FormioAuthConfig }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1mb3JtaW8vYXV0aC9zcmMvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUV4QyxNQUNhLGlCQUFpQjtJQTZCbkI7SUFDQTtJQTdCRixJQUFJLENBQU07SUFDVixhQUFhLEdBQUcsS0FBSyxDQUFDO0lBRXRCLFNBQVMsQ0FBUztJQUNsQixPQUFPLENBQXVCO0lBQzlCLFFBQVEsQ0FBdUI7SUFFL0IsWUFBWSxDQUFTO0lBQ3JCLFVBQVUsQ0FBdUI7SUFDakMsTUFBTSxDQUF1QjtJQUM3QixPQUFPLENBQW9CO0lBRTNCLGFBQWEsQ0FBUztJQUN0QixXQUFXLENBQXVCO0lBRWxDLEtBQUssQ0FBbUI7SUFDeEIsWUFBWSxDQUFNO0lBQ2xCLFdBQVcsQ0FBTTtJQUVqQixZQUFZLENBQWdCO0lBQzVCLFdBQVcsQ0FBZ0I7SUFDM0IsU0FBUyxDQUFnQjtJQUN6QixVQUFVLEdBQVEsRUFBRSxDQUFDO0lBQ3JCLGdCQUFnQixHQUFRLEVBQUUsQ0FBQztJQUMzQixLQUFLLENBQU07SUFDWCxFQUFFLEdBQVEsRUFBRSxDQUFDO0lBRXBCLFlBQ1MsU0FBMEIsRUFDMUIsTUFBd0I7UUFEeEIsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFFL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFakIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzND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QUFZLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUFTO1FBQ3BCLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7YUFDWixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNoQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQzt1R0FoTlUsaUJBQWlCOzJHQUFqQixpQkFBaUI7O1NBQWpCLGlCQUFpQjsyRkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybWlvQXV0aENvbmZpZyB9IGZyb20gJy4vYXV0aC5jb25maWcnO1xyXG5pbXBvcnQgeyBGb3JtaW9BcHBDb25maWcgfSBmcm9tICdAZm9ybWlvLXRtdC9hbmd1bGFyJztcclxuaW1wb3J0IHsgZ2V0LCBlYWNoIH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgRm9ybWlvIH0gZnJvbSAnQGZvcm1pby10bXQvanMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRm9ybWlvQXV0aFNlcnZpY2Uge1xyXG4gIHB1YmxpYyB1c2VyOiBhbnk7XHJcbiAgcHVibGljIGF1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGxvZ2luRm9ybTogc3RyaW5nO1xyXG4gIHB1YmxpYyBvbkxvZ2luOiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcclxuICBwdWJsaWMgb25Mb2dvdXQ6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG5cclxuICBwdWJsaWMgcmVnaXN0ZXJGb3JtOiBzdHJpbmc7XHJcbiAgcHVibGljIG9uUmVnaXN0ZXI6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG4gIHB1YmxpYyBvblVzZXI6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG4gIHB1YmxpYyBvbkVycm9yOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHVibGljIHJlc2V0UGFzc0Zvcm06IHN0cmluZztcclxuICBwdWJsaWMgb25SZXNldFBhc3M6IEV2ZW50RW1pdHRlcjxvYmplY3Q+O1xyXG5cclxuICBwdWJsaWMgcmVhZHk6IFByb21pc2U8Ym9vbGVhbj47XHJcbiAgcHVibGljIHJlYWR5UmVzb2x2ZTogYW55O1xyXG4gIHB1YmxpYyByZWFkeVJlamVjdDogYW55O1xyXG5cclxuICBwdWJsaWMgcHJvamVjdFJlYWR5PzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyBhY2Nlc3NSZWFkeT86IFByb21pc2U8YW55PjtcclxuICBwdWJsaWMgdXNlclJlYWR5PzogUHJvbWlzZTxhbnk+O1xyXG4gIHB1YmxpYyBmb3JtQWNjZXNzOiBhbnkgPSB7fTtcclxuICBwdWJsaWMgc3VibWlzc2lvbkFjY2VzczogYW55ID0ge307XHJcbiAgcHVibGljIHJvbGVzOiBhbnk7XHJcbiAgcHVibGljIGlzOiBhbnkgPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgYXBwQ29uZmlnOiBGb3JtaW9BcHBDb25maWcsXHJcbiAgICBwdWJsaWMgY29uZmlnOiBGb3JtaW9BdXRoQ29uZmlnXHJcbiAgKSB7XHJcbiAgICB0aGlzLnVzZXIgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLmFwcENvbmZpZyAmJiB0aGlzLmFwcENvbmZpZy5hcHBVcmwpIHtcclxuICAgICAgRm9ybWlvLnNldEJhc2VVcmwodGhpcy5hcHBDb25maWcuYXBpVXJsKTtcclxuICAgICAgRm9ybWlvLnNldFByb2plY3RVcmwodGhpcy5hcHBDb25maWcuYXBwVXJsKTtcclxuICAgICAgRm9ybWlvLmZvcm1Pbmx5ID0gISF0aGlzLmFwcENvbmZpZy5mb3JtT25seTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYW4gQXBwQ29uZmlnIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9naW5Gb3JtID1cclxuICAgICAgdGhpcy5hcHBDb25maWcuYXBwVXJsICtcclxuICAgICAgJy8nICtcclxuICAgICAgZ2V0KHRoaXMuY29uZmlnLCAnbG9naW4uZm9ybScsICd1c2VyL2xvZ2luJyk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyRm9ybSA9XHJcbiAgICAgIHRoaXMuYXBwQ29uZmlnLmFwcFVybCArXHJcbiAgICAgICcvJyArXHJcbiAgICAgIGdldCh0aGlzLmNvbmZpZywgJ3JlZ2lzdGVyLmZvcm0nLCAndXNlci9yZWdpc3RlcicpO1xyXG4gICAgdGhpcy5yZXNldFBhc3NGb3JtID1cclxuICAgICAgdGhpcy5hcHBDb25maWcuYXBwVXJsICtcclxuICAgICAgJy8nICtcclxuICAgICAgZ2V0KHRoaXMuY29uZmlnLCAncmVnaXN0ZXIuZm9ybScsICdyZXNldHBhc3MnKTtcclxuICAgIHRoaXMub25Mb2dpbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMub25Mb2dvdXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLm9uUmVnaXN0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLm9uVXNlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMub25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICB0aGlzLnJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSwgcmVqZWN0OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZWFkeVJlc29sdmUgPSByZXNvbHZlO1xyXG4gICAgICB0aGlzLnJlYWR5UmVqZWN0ID0gcmVqZWN0O1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUmVnaXN0ZXIgZm9yIHRoZSBjb3JlIGV2ZW50cy5cclxuICAgIEZvcm1pby5ldmVudHMub24oJ2Zvcm1pby5iYWRUb2tlbicsICgpID0+IHRoaXMubG9nb3V0RXJyb3IoKSk7XHJcbiAgICBGb3JtaW8uZXZlbnRzLm9uKCdmb3JtaW8uc2Vzc2lvbkV4cGlyZWQnLCAoKSA9PiB0aGlzLmxvZ291dEVycm9yKCkpO1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5kZWxheUF1dGgpIHtcclxuICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkxvZ2luU3VibWl0KHN1Ym1pc3Npb246IG9iamVjdCkge1xyXG4gICAgdGhpcy5zZXRVc2VyKHN1Ym1pc3Npb24pO1xyXG4gICAgdGhpcy5vbkxvZ2luLmVtaXQoc3VibWlzc2lvbik7XHJcbiAgfVxyXG5cclxuICBvblJlZ2lzdGVyU3VibWl0KHN1Ym1pc3Npb246IG9iamVjdCkge1xyXG4gICAgdGhpcy5zZXRVc2VyKHN1Ym1pc3Npb24pO1xyXG4gICAgdGhpcy5vblJlZ2lzdGVyLmVtaXQoc3VibWlzc2lvbik7XHJcbiAgfVxyXG5cclxuICBvblJlc2V0UGFzc1N1Ym1pdChzdWJtaXNzaW9uOiBvYmplY3QpIHtcclxuICAgIHRoaXMub25SZXNldFBhc3MuZW1pdChzdWJtaXNzaW9uKTtcclxuICB9XHJcblxyXG4gIGluaXQoKSB7XHJcbiAgICB0aGlzLnByb2plY3RSZWFkeSA9IEZvcm1pby5tYWtlU3RhdGljUmVxdWVzdCh0aGlzLmFwcENvbmZpZy5hcHBVcmwpLnRoZW4oXHJcbiAgICAgIChwcm9qZWN0OiBhbnkpID0+IHtcclxuICAgICAgICBlYWNoKHByb2plY3QuYWNjZXNzLCAoYWNjZXNzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuZm9ybUFjY2Vzc1thY2Nlc3MudHlwZV0gPSBhY2Nlc3Mucm9sZXM7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgICgpOiBhbnkgPT4ge1xyXG4gICAgICAgIHRoaXMuZm9ybUFjY2VzcyA9IHt9O1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIC8vIEdldCB0aGUgYWNjZXNzIGZvciB0aGlzIHByb2plY3QuXHJcbiAgICB0aGlzLmFjY2Vzc1JlYWR5ID0gRm9ybWlvLm1ha2VTdGF0aWNSZXF1ZXN0KFxyXG4gICAgICB0aGlzLmFwcENvbmZpZy5hcHBVcmwgKyAnL2FjY2VzcydcclxuICAgIClcclxuICAgICAgLnRoZW4oKGFjY2VzczogYW55KSA9PiB7XHJcbiAgICAgICAgZWFjaChhY2Nlc3MuZm9ybXMsIChmb3JtOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3VibWlzc2lvbkFjY2Vzc1tmb3JtLm5hbWVdID0ge307XHJcbiAgICAgICAgICBmb3JtLnN1Ym1pc3Npb25BY2Nlc3MuZm9yRWFjaCgoc3ViQWNjZXNzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdWJtaXNzaW9uQWNjZXNzW2Zvcm0ubmFtZV1bc3ViQWNjZXNzLnR5cGVdID0gc3ViQWNjZXNzLnJvbGVzO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5yb2xlcyA9IGFjY2Vzcy5yb2xlcztcclxuICAgICAgICByZXR1cm4gYWNjZXNzO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycik6IGFueSA9PiB7XHJcbiAgICAgICAgaWYgKGVyciA9PT0gJ1Rva2VuIEV4cGlyZWQnIHx8IGVyciA9PT0gJ0JhZCBUb2tlbicpIHtcclxuICAgICAgICAgIHRoaXMuc2V0VXNlcihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yb2xlcyA9IHt9O1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9KVxyXG5cclxuICAgIGxldCBjdXJyZW50VXNlclByb21pc2U6IFByb21pc2U8YW55PjtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5vYXV0aCkge1xyXG4gICAgICAvLyBNYWtlIGEgZml4IHRvIHRoZSBoYXNoIHRvIHJlbW92ZSBzdGFydGluZyBcIi9cIiB0aGF0IGFuZ3VsYXIgbWlnaHQgcHV0IHRoZXJlLlxyXG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2gubWF0Y2goL14jXFwvYWNjZXNzX3Rva2VuLykpIHtcclxuICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCB3aW5kb3cubG9jYXRpb24uaGFzaC5yZXBsYWNlKC9eI1xcL2FjY2Vzc190b2tlbi8sICcjYWNjZXNzX3Rva2VuJykpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJbml0aWF0ZSB0aGUgU1NPIGlmIHRoZXkgcHJvdmlkZSBvYXV0aCBzZXR0aW5ncy5cclxuICAgICAgY3VycmVudFVzZXJQcm9taXNlID0gRm9ybWlvLnNzb0luaXQodGhpcy5jb25maWcub2F1dGgudHlwZSwgdGhpcy5jb25maWcub2F1dGgub3B0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjdXJyZW50VXNlclByb21pc2UgPSBGb3JtaW8uY3VycmVudFVzZXIobnVsbCwge1xyXG4gICAgICAgIGlnbm9yZUNhY2hlOiB0cnVlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlclJlYWR5ID0gY3VycmVudFVzZXJQcm9taXNlLnRoZW4oKHVzZXI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNldFVzZXIodXNlcik7XHJcbiAgICAgIHJldHVybiB1c2VyO1xyXG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICB0aGlzLnNldFVzZXIobnVsbCk7XHJcbiAgICAgIHRocm93IGVycjtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFRyaWdnZXIgd2UgYXJlIHJlZHkgd2hlbiBhbGwgcHJvbWlzZXMgaGF2ZSByZXNvbHZlZC5cclxuICAgIGlmICh0aGlzLmFjY2Vzc1JlYWR5KSB7XHJcbiAgICAgIHRoaXMuYWNjZXNzUmVhZHlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnByb2plY3RSZWFkeSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnVzZXJSZWFkeSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYWR5UmVzb2x2ZSh0cnVlKSlcclxuICAgICAgICAuY2F0Y2goKGVycjogYW55KSA9PiB0aGlzLnJlYWR5UmVqZWN0KGVycikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0VXNlcih1c2VyOiBhbnkpIHtcclxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IEZvcm1pby5uYW1lc3BhY2UgfHwgJ2Zvcm1pbyc7XHJcbiAgICBpZiAodXNlcikge1xyXG4gICAgICB0aGlzLnVzZXIgPSB1c2VyO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHtuYW1lc3BhY2V9QXBwVXNlcmAsIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgICAgdGhpcy5zZXRVc2VyUm9sZXMoKTtcclxuICAgICAgRm9ybWlvLnNldFVzZXIodXNlcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZXIgPSBudWxsO1xyXG4gICAgICB0aGlzLmlzID0ge307XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGAke25hbWVzcGFjZX1BcHBVc2VyYCk7XHJcbiAgICAgIEZvcm1pby5jbGVhckNhY2hlKCk7XHJcbiAgICAgIEZvcm1pby5zZXRVc2VyKG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXV0aGVudGljYXRlZCA9ICEhRm9ybWlvLmdldFRva2VuKCk7XHJcbiAgICB0aGlzLm9uVXNlci5lbWl0KHRoaXMudXNlcik7XHJcbiAgfVxyXG5cclxuICBzZXRVc2VyUm9sZXMoKSB7XHJcbiAgICBpZiAodGhpcy5hY2Nlc3NSZWFkeSkge1xyXG4gICAgICB0aGlzLmFjY2Vzc1JlYWR5LnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGVhY2godGhpcy5yb2xlcywgKHJvbGU6IGFueSwgcm9sZU5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMudXNlci5yb2xlcy5pbmRleE9mKHJvbGUuX2lkKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1tyb2xlTmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvZ291dEVycm9yKCkge1xyXG4gICAgdGhpcy5zZXRVc2VyKG51bGwpO1xyXG4gICAgY29uc3QgbmFtZXNwYWNlID0gRm9ybWlvLm5hbWVzcGFjZSB8fCAnZm9ybWlvJztcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGAke25hbWVzcGFjZX1Ub2tlbmApO1xyXG4gICAgdGhpcy5vbkVycm9yLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGxvZ291dCgpIHtcclxuICAgIHRoaXMuc2V0VXNlcihudWxsKTtcclxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IEZvcm1pby5uYW1lc3BhY2UgfHwgJ2Zvcm1pbyc7XHJcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7bmFtZXNwYWNlfUxvZ291dEF1dGhVcmxgKSkge1xyXG4gICAgICB3aW5kb3cub3Blbihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgJHtuYW1lc3BhY2V9TG9nb3V0QXV0aFVybGApLCBudWxsLCAnd2lkdGg9MTAyMCxoZWlnaHQ9NjE4Jyk7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGAke25hbWVzcGFjZX1Mb2dvdXRBdXRoVXJsYClcclxuICAgIH1cclxuICAgIHRoaXMuaGFuZGxlTG9nb3V0KG5hbWVzcGFjZSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVMb2dvdXQobmFtZXNwYWNlKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHtuYW1lc3BhY2V9VG9rZW5gKTtcclxuICAgIEZvcm1pby5sb2dvdXQoKVxyXG4gICAgICAudGhlbigoKSA9PiB0aGlzLm9uTG9nb3V0LmVtaXQoKSlcclxuICAgICAgLmNhdGNoKCgpID0+IHRoaXMubG9nb3V0RXJyb3IoKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==