UNPKG

angular-auth-oidc-client

Version:
116 lines 20.7 kB
import { DOCUMENT } from '@angular/common'; import { Injectable, inject } from '@angular/core'; import { of, throwError } from 'rxjs'; import { catchError, switchMap, tap } from 'rxjs/operators'; import { AuthStateService } from '../../auth-state/auth-state.service'; import { LoggerService } from '../../logging/logger.service'; import { StoragePersistenceService } from '../../storage/storage-persistence.service'; import { ValidationResult } from '../../validation/validation-result'; import { FlowsDataService } from '../flows-data.service'; import { ResetAuthDataService } from '../reset-auth-data.service'; import { SigninKeyDataService } from '../signin-key-data.service'; import * as i0 from "@angular/core"; const JWT_KEYS = 'jwtKeys'; export class HistoryJwtKeysCallbackHandlerService { constructor() { this.loggerService = inject(LoggerService); this.authStateService = inject(AuthStateService); this.flowsDataService = inject(FlowsDataService); this.signInKeyDataService = inject(SigninKeyDataService); this.storagePersistenceService = inject(StoragePersistenceService); this.resetAuthDataService = inject(ResetAuthDataService); this.document = inject(DOCUMENT); } // STEP 3 Code Flow, STEP 2 Implicit Flow, STEP 3 Refresh Token callbackHistoryAndResetJwtKeys(callbackContext, config, allConfigs) { let toWrite = { ...callbackContext.authResult }; if (!this.responseHasIdToken(callbackContext)) { const existingIdToken = this.storagePersistenceService.getIdToken(config); toWrite = { ...toWrite, id_token: existingIdToken, }; } this.storagePersistenceService.write('authnResult', toWrite, config); if (config.allowUnsafeReuseRefreshToken && callbackContext.authResult?.refresh_token) { this.storagePersistenceService.write('reusable_refresh_token', callbackContext.authResult.refresh_token, config); } if (this.historyCleanUpTurnedOn(config) && !callbackContext.isRenewProcess) { this.resetBrowserHistory(); } else { this.loggerService.logDebug(config, 'history clean up inactive'); } if (callbackContext.authResult?.error) { const errorMessage = `AuthCallback AuthResult came with error: ${callbackContext.authResult.error}`; this.loggerService.logDebug(config, errorMessage); this.resetAuthDataService.resetAuthorizationData(config, allConfigs); this.flowsDataService.setNonce('', config); this.handleResultErrorFromCallback(callbackContext.authResult, callbackContext.isRenewProcess); return throwError(() => new Error(errorMessage)); } this.loggerService.logDebug(config, `AuthResult '${JSON.stringify(callbackContext.authResult, null, 2)}'. AuthCallback created, begin token validation`); return this.signInKeyDataService.getSigningKeys(config).pipe(tap((jwtKeys) => this.storeSigningKeys(jwtKeys, config)), catchError((err) => { // fallback: try to load jwtKeys from storage const storedJwtKeys = this.readSigningKeys(config); if (!!storedJwtKeys) { this.loggerService.logWarning(config, `Failed to retrieve signing keys, fallback to stored keys`); return of(storedJwtKeys); } return throwError(() => new Error(err)); }), switchMap((jwtKeys) => { if (jwtKeys) { callbackContext.jwtKeys = jwtKeys; return of(callbackContext); } const errorMessage = `Failed to retrieve signing key`; this.loggerService.logWarning(config, errorMessage); return throwError(() => new Error(errorMessage)); }), catchError((err) => { const errorMessage = `Failed to retrieve signing key with error: ${err}`; this.loggerService.logWarning(config, errorMessage); return throwError(() => new Error(errorMessage)); })); } responseHasIdToken(callbackContext) { return !!callbackContext?.authResult?.id_token; } handleResultErrorFromCallback(result, isRenewProcess) { let validationResult = ValidationResult.SecureTokenServerError; if (result && typeof result === 'object' && 'error' in result && result.error === 'login_required') { validationResult = ValidationResult.LoginRequired; } this.authStateService.updateAndPublishAuthState({ isAuthenticated: false, validationResult, isRenewProcess, }); } historyCleanUpTurnedOn(config) { const { historyCleanupOff } = config; return !historyCleanupOff; } resetBrowserHistory() { this.document.defaultView?.history.replaceState({}, this.document.title, this.document.defaultView.location.origin + this.document.defaultView.location.pathname); } storeSigningKeys(jwtKeys, config) { this.storagePersistenceService.write(JWT_KEYS, jwtKeys, config); } readSigningKeys(config) { return this.storagePersistenceService.read(JWT_KEYS, config); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: HistoryJwtKeysCallbackHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: HistoryJwtKeysCallbackHandlerService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: HistoryJwtKeysCallbackHandlerService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS1qd3Qta2V5cy1jYWxsYmFjay1oYW5kbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWF1dGgtb2lkYy1jbGllbnQvc3JjL2xpYi9mbG93cy9jYWxsYmFjay1oYW5kbGluZy9oaXN0b3J5LWp3dC1rZXlzLWNhbGxiYWNrLWhhbmRsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRXRGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVsRSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUM7QUFHM0IsTUFBTSxPQUFPLG9DQUFvQztJQURqRDtRQUVtQixrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0QyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMs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LElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0QsQ0FBQzs4R0F0S1Usb0NBQW9DO2tIQUFwQyxvQ0FBb0MsY0FEdkIsTUFBTTs7MkZBQ25CLG9DQUFvQztrQkFEaEQsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQXV0aFN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL2F1dGgtc3RhdGUvYXV0aC1zdGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3BlbklkQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uLy4uL2NvbmZpZy9vcGVuaWQtY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9sb2dnaW5nL2xvZ2dlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZSB9IGZyb20gJy4uLy4uL3N0b3JhZ2Uvc3RvcmFnZS1wZXJzaXN0ZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSnd0S2V5cyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRpb24vand0a2V5cyc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi92YWxpZGF0aW9uL3ZhbGlkYXRpb24tcmVzdWx0JztcclxuaW1wb3J0IHsgQ2FsbGJhY2tDb250ZXh0IH0gZnJvbSAnLi4vY2FsbGJhY2stY29udGV4dCc7XHJcbmltcG9ydCB7IEZsb3dzRGF0YVNlcnZpY2UgfSBmcm9tICcuLi9mbG93cy1kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXNldEF1dGhEYXRhU2VydmljZSB9IGZyb20gJy4uL3Jlc2V0LWF1dGgtZGF0YS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lnbmluS2V5RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9zaWduaW4ta2V5LWRhdGEuc2VydmljZSc7XHJcblxyXG5jb25zdCBKV1RfS0VZUyA9ICdqd3RLZXlzJztcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBIaXN0b3J5Snd0S2V5c0NhbGxiYWNrSGFuZGxlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyU2VydmljZSA9IGluamVjdChMb2dnZXJTZXJ2aWNlKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoU3RhdGVTZXJ2aWNlID0gaW5qZWN0KEF1dGhTdGF0ZVNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dzRGF0YVNlcnZpY2UgPSBpbmplY3QoRmxvd3NEYXRhU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbkluS2V5RGF0YVNlcnZpY2UgPSBpbmplY3QoU2lnbmluS2V5RGF0YVNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UgPSBpbmplY3QoXHJcbiAgICBTdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSByZXNldEF1dGhEYXRhU2VydmljZSA9IGluamVjdChSZXNldEF1dGhEYXRhU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xyXG5cclxuICAvLyBTVEVQIDMgQ29kZSBGbG93LCBTVEVQIDIgSW1wbGljaXQgRmxvdywgU1RFUCAzIFJlZnJlc2ggVG9rZW5cclxuICBjYWxsYmFja0hpc3RvcnlBbmRSZXNldEp3dEtleXMoXHJcbiAgICBjYWxsYmFja0NvbnRleHQ6IENhbGxiYWNrQ29udGV4dCxcclxuICAgIGNvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbixcclxuICAgIGFsbENvbmZpZ3M6IE9wZW5JZENvbmZpZ3VyYXRpb25bXVxyXG4gICk6IE9ic2VydmFibGU8Q2FsbGJhY2tDb250ZXh0PiB7XHJcbiAgICBsZXQgdG9Xcml0ZSA9IHsgLi4uY2FsbGJhY2tDb250ZXh0LmF1dGhSZXN1bHQgfTtcclxuXHJcbiAgICBpZiAoIXRoaXMucmVzcG9uc2VIYXNJZFRva2VuKGNhbGxiYWNrQ29udGV4dCkpIHtcclxuICAgICAgY29uc3QgZXhpc3RpbmdJZFRva2VuID0gdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLmdldElkVG9rZW4oY29uZmlnKTtcclxuXHJcbiAgICAgIHRvV3JpdGUgPSB7XHJcbiAgICAgICAgLi4udG9Xcml0ZSxcclxuICAgICAgICBpZF90b2tlbjogZXhpc3RpbmdJZFRva2VuLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS53cml0ZSgnYXV0aG5SZXN1bHQnLCB0b1dyaXRlLCBjb25maWcpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgY29uZmlnLmFsbG93VW5zYWZlUmV1c2VSZWZyZXNoVG9rZW4gJiZcclxuICAgICAgY2FsbGJhY2tDb250ZXh0LmF1dGhSZXN1bHQ/LnJlZnJlc2hfdG9rZW5cclxuICAgICkge1xyXG4gICAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2Uud3JpdGUoXHJcbiAgICAgICAgJ3JldXNhYmxlX3JlZnJlc2hfdG9rZW4nLFxyXG4gICAgICAgIGNhbGxiYWNrQ29udGV4dC5hdXRoUmVzdWx0LnJlZnJlc2hfdG9rZW4sXHJcbiAgICAgICAgY29uZmlnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmhpc3RvcnlDbGVhblVwVHVybmVkT24oY29uZmlnKSAmJlxyXG4gICAgICAhY2FsbGJhY2tDb250ZXh0LmlzUmVuZXdQcm9jZXNzXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5yZXNldEJyb3dzZXJIaXN0b3J5KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRGVidWcoY29uZmlnLCAnaGlzdG9yeSBjbGVhbiB1cCBpbmFjdGl2ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjYWxsYmFja0NvbnRleHQuYXV0aFJlc3VsdD8uZXJyb3IpIHtcclxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYEF1dGhDYWxsYmFjayBBdXRoUmVzdWx0IGNhbWUgd2l0aCBlcnJvcjogJHtjYWxsYmFja0NvbnRleHQuYXV0aFJlc3VsdC5lcnJvcn1gO1xyXG5cclxuICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKGNvbmZpZywgZXJyb3JNZXNzYWdlKTtcclxuICAgICAgdGhpcy5yZXNldEF1dGhEYXRhU2VydmljZS5yZXNldEF1dGhvcml6YXRpb25EYXRhKGNvbmZpZywgYWxsQ29uZmlncyk7XHJcbiAgICAgIHRoaXMuZmxvd3NEYXRhU2VydmljZS5zZXROb25jZSgnJywgY29uZmlnKTtcclxuICAgICAgdGhpcy5oYW5kbGVSZXN1bHRFcnJvckZyb21DYWxsYmFjayhcclxuICAgICAgICBjYWxsYmFja0NvbnRleHQuYXV0aFJlc3VsdCxcclxuICAgICAgICBjYWxsYmFja0NvbnRleHQuaXNSZW5ld1Byb2Nlc3NcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nRGVidWcoXHJcbiAgICAgIGNvbmZpZyxcclxuICAgICAgYEF1dGhSZXN1bHQgJyR7SlNPTi5zdHJpbmdpZnkoY2FsbGJhY2tDb250ZXh0LmF1dGhSZXN1bHQsIG51bGwsIDIpfScuXHJcbiAgICAgIEF1dGhDYWxsYmFjayBjcmVhdGVkLCBiZWdpbiB0b2tlbiB2YWxpZGF0aW9uYFxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5zaWduSW5LZXlEYXRhU2VydmljZS5nZXRTaWduaW5nS2V5cyhjb25maWcpLnBpcGUoXHJcbiAgICAgIHRhcCgoand0S2V5czogSnd0S2V5cykgPT4gdGhpcy5zdG9yZVNpZ25pbmdLZXlzKGp3dEtleXMsIGNvbmZpZykpLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICAvLyBmYWxsYmFjazogdHJ5IHRvIGxvYWQgand0S2V5cyBmcm9tIHN0b3JhZ2VcclxuICAgICAgICBjb25zdCBzdG9yZWRKd3RLZXlzID0gdGhpcy5yZWFkU2lnbmluZ0tleXMoY29uZmlnKTtcclxuXHJcbiAgICAgICAgaWYgKCEhc3RvcmVkSnd0S2V5cykge1xyXG4gICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ1dhcm5pbmcoXHJcbiAgICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgICAgYEZhaWxlZCB0byByZXRyaWV2ZSBzaWduaW5nIGtleXMsIGZhbGxiYWNrIHRvIHN0b3JlZCBrZXlzYFxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gb2Yoc3RvcmVkSnd0S2V5cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoZXJyKSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKGp3dEtleXMpID0+IHtcclxuICAgICAgICBpZiAoand0S2V5cykge1xyXG4gICAgICAgICAgY2FsbGJhY2tDb250ZXh0Lmp3dEtleXMgPSBqd3RLZXlzO1xyXG5cclxuICAgICAgICAgIHJldHVybiBvZihjYWxsYmFja0NvbnRleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYEZhaWxlZCB0byByZXRyaWV2ZSBzaWduaW5nIGtleWA7XHJcblxyXG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dXYXJuaW5nKGNvbmZpZywgZXJyb3JNZXNzYWdlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYEZhaWxlZCB0byByZXRyaWV2ZSBzaWduaW5nIGtleSB3aXRoIGVycm9yOiAke2Vycn1gO1xyXG5cclxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UubG9nV2FybmluZyhjb25maWcsIGVycm9yTWVzc2FnZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc3BvbnNlSGFzSWRUb2tlbihjYWxsYmFja0NvbnRleHQ6IENhbGxiYWNrQ29udGV4dCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhY2FsbGJhY2tDb250ZXh0Py5hdXRoUmVzdWx0Py5pZF90b2tlbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlUmVzdWx0RXJyb3JGcm9tQ2FsbGJhY2soXHJcbiAgICByZXN1bHQ6IHVua25vd24sXHJcbiAgICBpc1JlbmV3UHJvY2VzczogYm9vbGVhblxyXG4gICk6IHZvaWQge1xyXG4gICAgbGV0IHZhbGlkYXRpb25SZXN1bHQgPSBWYWxpZGF0aW9uUmVzdWx0LlNlY3VyZVRva2VuU2VydmVyRXJyb3I7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICByZXN1bHQgJiZcclxuICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgJ2Vycm9yJyBpbiByZXN1bHQgJiZcclxuICAgICAgKHJlc3VsdC5lcnJvciBhcyBzdHJpbmcpID09PSAnbG9naW5fcmVxdWlyZWQnXHJcbiAgICApIHtcclxuICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IFZhbGlkYXRpb25SZXN1bHQuTG9naW5SZXF1aXJlZDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmF1dGhTdGF0ZVNlcnZpY2UudXBkYXRlQW5kUHVibGlzaEF1dGhTdGF0ZSh7XHJcbiAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXHJcbiAgICAgIHZhbGlkYXRpb25SZXN1bHQsXHJcbiAgICAgIGlzUmVuZXdQcm9jZXNzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpc3RvcnlDbGVhblVwVHVybmVkT24oY29uZmlnOiBPcGVuSWRDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB7IGhpc3RvcnlDbGVhbnVwT2ZmIH0gPSBjb25maWc7XHJcblxyXG4gICAgcmV0dXJuICFoaXN0b3J5Q2xlYW51cE9mZjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRCcm93c2VySGlzdG9yeSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXc/Lmhpc3RvcnkucmVwbGFjZVN0YXRlKFxyXG4gICAgICB7fSxcclxuICAgICAgdGhpcy5kb2N1bWVudC50aXRsZSxcclxuICAgICAgdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5sb2NhdGlvbi5vcmlnaW4gK1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcubG9jYXRpb24ucGF0aG5hbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3JlU2lnbmluZ0tleXMoXHJcbiAgICBqd3RLZXlzOiBKd3RLZXlzLFxyXG4gICAgY29uZmlnOiBPcGVuSWRDb25maWd1cmF0aW9uXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2Uud3JpdGUoSldUX0tFWVMsIGp3dEtleXMsIGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRTaWduaW5nS2V5cyhjb25maWc6IE9wZW5JZENvbmZpZ3VyYXRpb24pOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS5yZWFkKEpXVF9LRVlTLCBjb25maWcpO1xyXG4gIH1cclxufVxyXG4iXX0=