UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

100 lines 13.8 kB
/** * @packageDocumentation * @module authorization */ import { HttpClient } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; import { EMPTY, of, catchError, map, shareReplay, switchMap, tap, timer, fromEvent, merge, timeout, } from 'rxjs'; import { publishRef, getGlobalEnvironments, TRUE, skipError, catchPromise, } from '../core/public-api'; import { attachAuthorizationHeader, getAuthorizationState, logout, logoutAudit, } from './authorization'; import { TOKEN_INFO_API, LOADING_CACHE, TOKEN_REFRESH_API } from './constants'; import { HEARTBEAT_POLLING } from './session-manage.service'; import { readStorageAliveRecord, readStorageToken, refreshStorageAliveRecord, writeStorageToken, } from './storage-token'; import * as i0 from "@angular/core"; export class AuthorizationStateService { constructor() { this.http = inject(HttpClient); this.state$ = this.http .get(TOKEN_INFO_API, { headers: attachAuthorizationHeader(), }) .pipe(skipError(null), tap(info => { if (!info) { logout(true); } this.payloadSnapshot = info; }), map(info => ({ ...getAuthorizationState(), info, })), shareReplay(1)); this.checkTokenCache$ = null; this.logout = logout; if (getGlobalEnvironments('CLOSE_BROWSER_END_SESSION') === TRUE) { this.state$ .pipe(switchMap(state => { const aliveRecord = readStorageAliveRecord(); if (!aliveRecord || Date.now() - aliveRecord > HEARTBEAT_POLLING + LOADING_CACHE) { this.logoutWithAudit(); return EMPTY; } return of(state); }), switchMap(() => { return merge(timer(0, HEARTBEAT_POLLING), fromEvent(window, 'beforeunload')); })) .subscribe(refreshStorageAliveRecord); } } logoutWithAudit() { catchPromise(logoutAudit()) .pipe(timeout(1000), map(res => res?.logout_redirect_url)) .subscribe(redirectUrl => logout(redirectUrl)); } refreshToken() { if (this.refreshTokenCache$) { return this.refreshTokenCache$; } this.refreshTokenCache$ = this.http .get(TOKEN_REFRESH_API) .pipe(tap(({ id_token: idToken }) => { writeStorageToken(idToken); this.refreshTokenCache$ = null; }), catchError(() => { logout(true); return EMPTY; }), publishRef()); return this.refreshTokenCache$; } checkToken() { if (!this.checkTokenCache$) { this.checkTokenCache$ = this.http.get(TOKEN_INFO_API).pipe(tap({ next: () => { this.checkTokenCache$ = null; }, error: () => { this.checkTokenCache$ = null; }, }), publishRef()); } return this.checkTokenCache$; } getTokenPayload() { return this.state$.pipe(map(state => state.info)); } getAccountInfo() { if (this.payloadSnapshot) { return of(this.payloadSnapshot); } return this.state$.pipe(map(state => state.info || {})); } getTokenByStorage() { return readStorageToken(); } static { this.ɵfac = function AuthorizationStateService_Factory(t) { return new (t || AuthorizationStateService)(); }; } static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AuthorizationStateService, factory: AuthorizationStateService.ɵfac, providedIn: 'root' }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthorizationStateService, [{ type: Injectable, args: [{ providedIn: 'root' }] }], () => [], null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9hdXRob3JpemF0aW9uL3N0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFDTCxLQUFLLEVBRUwsRUFBRSxFQUNGLFVBQVUsRUFDVixHQUFHLEVBQ0gsV0FBVyxFQUNYLFNBQVMsRUFDVCxHQUFHLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxHQUNSLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUNMLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsSUFBSSxFQUNKLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUc1QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHFCQUFxQixFQUNyQixNQUFNLEVBQ04sV0FBVyxHQUVaLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDOztBQUd6QixNQUFNLE9BQU8seUJBQXlCO0lBOEJwQztRQTdCaUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQixXQUFNLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDaEMsR0FBRyxDQUFjLGNBQWMsRUFBRTtZQUNoQyxPQUFPLEVBQUUseUJBQXlCLEVBQUU7U0FDckMsQ0FBQzthQUNELElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNmLENBQUM7WUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1gsR0FBRyxxQkFBcUIsRUFBRTtZQUMxQixJQUFJO1NBQ0wsQ0FBQyxDQUFDLEVBQ0gsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7UUFFSSxxQkFBZ0IsR0FBd0IsSUFBSSxDQUFDO1FBS3JELFdBQU0sR0FBRyxNQUFNLENBQUM7UUFHZCxJQUFJLHFCQUFxQixDQUFDLDJCQUEyQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDaEUsSUFBSSxDQUFDLE1BQU07aUJBQ1IsSUFBSSxDQUNILFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDaEIsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztnQkFDN0MsSUFDRSxDQUFDLFdBQVc7b0JBQ1osSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsR0FBRyxpQkFBaUIsR0FBRyxhQUFhLEVBQzVELENBQUM7b0JBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN2QixPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2dCQUNELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsT0FBTyxLQUFLLENBQ1YsS0FBSyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUMzQixTQUFTLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUNsQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQ0g7aUJBQ0EsU0FBUyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3hCLElBQUksQ0FDSCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQ2IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQ3JDO2FBQ0EsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDaEMsR0FBRyxDQUFnQixpQkFBaUIsQ0FBQzthQUNyQyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtZQUM1QixpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDYixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxFQUNGLFVBQVUsRUFBRSxDQUNiLENBQUM7UUFFSixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUN4RCxHQUFHLENBQUM7Z0JBQ0YsSUFBSSxFQUFFLEdBQUcsRUFBRTtvQkFDVCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUMvQixDQUFDO2dCQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztnQkFDL0IsQ0FBQzthQUNGLENBQUMsRUFDRixVQUFVLEVBQUUsQ0FDYixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBUyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDOzBGQXJIVSx5QkFBeUI7dUVBQXpCLHlCQUF5QixXQUF6Qix5QkFBeUIsbUJBRFosTUFBTTs7aUZBQ25CLHlCQUF5QjtjQURyQyxVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBtb2R1bGUgYXV0aG9yaXphdGlvblxuICovXG5cbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEVNUFRZLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgY2F0Y2hFcnJvcixcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG4gIHRpbWVyLFxuICBmcm9tRXZlbnQsXG4gIG1lcmdlLFxuICB0aW1lb3V0LFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgcHVibGlzaFJlZixcbiAgZ2V0R2xvYmFsRW52aXJvbm1lbnRzLFxuICBUUlVFLFxuICBza2lwRXJyb3IsXG4gIGNhdGNoUHJvbWlzZSxcbn0gZnJvbSAnLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEFjY291bnRJbmZvIH0gZnJvbSAnLi4vcGFnZS1zY2FmZm9sZC9wdWJsaWMtYXBpJztcblxuaW1wb3J0IHtcbiAgYXR0YWNoQXV0aG9yaXphdGlvbkhlYWRlcixcbiAgZ2V0QXV0aG9yaXphdGlvblN0YXRlLFxuICBsb2dvdXQsXG4gIGxvZ291dEF1ZGl0LFxuICBUb2tlblJlc3BvbnNlLFxufSBmcm9tICcuL2F1dGhvcml6YXRpb24nO1xuaW1wb3J0IHsgVE9LRU5fSU5GT19BUEksIExPQURJTkdfQ0FDSEUsIFRPS0VOX1JFRlJFU0hfQVBJIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSEVBUlRCRUFUX1BPTExJTkcgfSBmcm9tICcuL3Nlc3Npb24tbWFuYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgcmVhZFN0b3JhZ2VBbGl2ZVJlY29yZCxcbiAgcmVhZFN0b3JhZ2VUb2tlbixcbiAgcmVmcmVzaFN0b3JhZ2VBbGl2ZVJlY29yZCxcbiAgd3JpdGVTdG9yYWdlVG9rZW4sXG59IGZyb20gJy4vc3RvcmFnZS10b2tlbic7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXV0aG9yaXphdGlvblN0YXRlU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlJCA9IHRoaXMuaHR0cFxuICAgIC5nZXQ8QWNjb3VudEluZm8+KFRPS0VOX0lORk9fQVBJLCB7XG4gICAgICBoZWFkZXJzOiBhdHRhY2hBdXRob3JpemF0aW9uSGVhZGVyKCksXG4gICAgfSlcbiAgICAucGlwZShcbiAgICAgIHNraXBFcnJvcihudWxsKSxcbiAgICAgIHRhcChpbmZvID0+IHtcbiAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgbG9nb3V0KHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXlsb2FkU25hcHNob3QgPSBpbmZvO1xuICAgICAgfSksXG4gICAgICBtYXAoaW5mbyA9PiAoe1xuICAgICAgICAuLi5nZXRBdXRob3JpemF0aW9uU3RhdGUoKSxcbiAgICAgICAgaW5mbyxcbiAgICAgIH0pKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICk7XG5cbiAgcHJpdmF0ZSBjaGVja1Rva2VuQ2FjaGUkOiBPYnNlcnZhYmxlPHVua25vd24+ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW5DYWNoZSQ6IE9ic2VydmFibGU8VG9rZW5SZXNwb25zZT47XG5cbiAgcGF5bG9hZFNuYXBzaG90OiBBY2NvdW50SW5mbztcblxuICBsb2dvdXQgPSBsb2dvdXQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKGdldEdsb2JhbEVudmlyb25tZW50cygnQ0xPU0VfQlJPV1NFUl9FTkRfU0VTU0lPTicpID09PSBUUlVFKSB7XG4gICAgICB0aGlzLnN0YXRlJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoc3RhdGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxpdmVSZWNvcmQgPSByZWFkU3RvcmFnZUFsaXZlUmVjb3JkKCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFhbGl2ZVJlY29yZCB8fFxuICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gYWxpdmVSZWNvcmQgPiBIRUFSVEJFQVRfUE9MTElORyArIExPQURJTkdfQ0FDSEVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmxvZ291dFdpdGhBdWRpdCgpO1xuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2Yoc3RhdGUpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgIHRpbWVyKDAsIEhFQVJUQkVBVF9QT0xMSU5HKSxcbiAgICAgICAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ2JlZm9yZXVubG9hZCcpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHJlZnJlc2hTdG9yYWdlQWxpdmVSZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ291dFdpdGhBdWRpdCgpIHtcbiAgICBjYXRjaFByb21pc2UobG9nb3V0QXVkaXQoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0aW1lb3V0KDEwMDApLFxuICAgICAgICBtYXAocmVzID0+IHJlcz8ubG9nb3V0X3JlZGlyZWN0X3VybCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlZGlyZWN0VXJsID0+IGxvZ291dChyZWRpcmVjdFVybCkpO1xuICB9XG5cbiAgcmVmcmVzaFRva2VuKCkge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbkNhY2hlJCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuQ2FjaGUkO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFRva2VuQ2FjaGUkID0gdGhpcy5odHRwXG4gICAgICAuZ2V0PFRva2VuUmVzcG9uc2U+KFRPS0VOX1JFRlJFU0hfQVBJKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoeyBpZF90b2tlbjogaWRUb2tlbiB9KSA9PiB7XG4gICAgICAgICAgd3JpdGVTdG9yYWdlVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5DYWNoZSQgPSBudWxsO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgICAgbG9nb3V0KHRydWUpO1xuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfSksXG4gICAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW5DYWNoZSQ7XG4gIH1cblxuICBjaGVja1Rva2VuKCkge1xuICAgIGlmICghdGhpcy5jaGVja1Rva2VuQ2FjaGUkKSB7XG4gICAgICB0aGlzLmNoZWNrVG9rZW5DYWNoZSQgPSB0aGlzLmh0dHAuZ2V0KFRPS0VOX0lORk9fQVBJKS5waXBlKFxuICAgICAgICB0YXAoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUb2tlbkNhY2hlJCA9IG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja1Rva2VuQ2FjaGUkID0gbnVsbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgcHVibGlzaFJlZigpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tUb2tlbkNhY2hlJDtcbiAgfVxuXG4gIGdldFRva2VuUGF5bG9hZDxUPigpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSQucGlwZShtYXAoc3RhdGUgPT4gc3RhdGUuaW5mbyBhcyBUKSk7XG4gIH1cblxuICBnZXRBY2NvdW50SW5mbygpIHtcbiAgICBpZiAodGhpcy5wYXlsb2FkU25hcHNob3QpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLnBheWxvYWRTbmFwc2hvdCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5pbmZvIHx8IHt9KSk7XG4gIH1cblxuICBnZXRUb2tlbkJ5U3RvcmFnZSgpIHtcbiAgICByZXR1cm4gcmVhZFN0b3JhZ2VUb2tlbigpO1xuICB9XG59XG4iXX0=