@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
182 lines • 25.9 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject, throwError } from 'rxjs';
import { NullStorage } from '../null-storage';
import { HttpErrorResponse, HttpHeaders } from '@angular/common/http';
import { catchError, filter, map, take, tap } from 'rxjs/operators';
import { LoadingEmitter } from '../../../utility/loading-emitter';
import * as i0 from "@angular/core";
import * as i1 from "../../../configuration/configuration.service";
import * as i2 from "../../../logger/services/logger.service";
import * as i3 from "@angular/common/http";
import * as i4 from "./session-idle-timer.service";
export class SessionService {
_config;
_log;
_http;
idleTimerService;
static SESSION_TOKEN_STORAGE_KEY = 'naet';
static SESSION_BEARER_HEADER_DEFAULT = 'X-Auth-Token';
_session$;
_storage = new NullStorage();
_sessionHeader = null;
_verified;
_verifying;
_initialized;
constructor(_config, _log, _http, idleTimerService) {
this._config = _config;
this._log = _log;
this._http = _http;
this.idleTimerService = idleTimerService;
this._session$ = new BehaviorSubject(null);
this._verified = false;
this.idleTimerService.stopTimer();
this._verifying = new LoadingEmitter();
this._initialized = new LoadingEmitter(false);
setTimeout(() => {
this._config.loaded$
.pipe(filter(loaded => loaded), take(1))
.subscribe(() => {
this._storage = this.resolveStorage(this._config.get().providers.auth['sessionStore']);
this._sessionHeader = this._config.get().providers.auth.sessionBearer ?
this._config.get().providers.auth.sessionBearer : SessionService.SESSION_BEARER_HEADER_DEFAULT;
this.ensureConfigInitialized();
this.load();
});
});
}
ngOnDestroy() {
this._session$.complete();
this._verifying.complete();
}
get session$() {
return this._session$.asObservable();
}
set sessionToken(sessionToken) {
this._session$.next(sessionToken);
this._storage.setItem(SessionService.SESSION_TOKEN_STORAGE_KEY, btoa(SessionService.SESSION_TOKEN_STORAGE_KEY + ':' + sessionToken));
}
get sessionToken() {
return this._session$.getValue();
}
get sessionHeader() {
this.ensureConfigInitialized();
return this._sessionHeader;
}
get verified() {
return this._verified;
}
get verifying() {
return this._verifying.asObservable();
}
get isVerifying() {
return this._verifying.isActive;
}
get isInitialized() {
return this._initialized.isActive;
}
get initializing() {
return this._initialized.asObservable();
}
setVerifiedToken(sessionToken) {
this._log.warn('Session token without explicit verification was set');
this.idleTimerService.resetTimer();
this._verified = true;
this.sessionToken = sessionToken;
}
clear() {
this.idleTimerService.stopTimer();
this._verified = false;
this.sessionToken = '';
this._storage.removeItem(SessionService.SESSION_TOKEN_STORAGE_KEY);
}
verify(token) {
this.ensureConfigInitialized();
this._verifying.on();
token = !!token ? token : this.sessionToken;
const authConfig = this._config.get().providers.auth;
let url = authConfig.address;
url += authConfig.endpoints && authConfig.endpoints['verification'] ? authConfig.endpoints['verification'] :
(authConfig.endpoints && authConfig.endpoints['login'] ? authConfig.endpoints['login'] : '');
if (!url || url === authConfig.address) {
this.clear();
this._verifying.off();
this._initialized.on();
return throwError(new Error('Cannot verify session token. ' +
'Login URL is not defined in the config [nae.providers.auth.endpoints.login].'));
}
else {
return this._http.get(url, {
headers: new HttpHeaders().set(this.sessionHeader, token),
observe: 'response'
}).pipe(catchError(error => {
if (error instanceof HttpErrorResponse && error.status === 401) {
this._log.warn('Authentication token is invalid. Clearing session token');
this.clear();
}
this._verifying.off();
this.idleTimerService.stopTimer();
this._initialized.on();
return throwError(error);
}), map(response => {
this._log.debug(response.body.success);
this._verified = true;
this.idleTimerService.resetTimer();
this._initialized.on();
this.sessionToken = token;
return true;
}), tap(_ => this._verifying.off()));
}
}
load() {
this.ensureConfigInitialized();
let token = this._storage.getItem(SessionService.SESSION_TOKEN_STORAGE_KEY);
this._verified = false;
this.idleTimerService.stopTimer();
if (token) {
token = this.resolveToken(token);
this.sessionToken = token;
this.verify(token).pipe(take(1)).subscribe(ver => {
this._log.debug('Token ' + token + ' verified status: ' + ver);
});
}
else {
this._initialized.on();
}
return '';
}
ensureConfigInitialized() {
if (this._sessionHeader && !(this._storage instanceof NullStorage)) {
return;
}
const cfg = this._config.get();
const sessionStore = cfg.providers.auth['sessionStore'];
this._storage = this.resolveStorage(sessionStore);
this._sessionHeader = cfg.providers.auth.sessionBearer
? cfg.providers.auth.sessionBearer
: SessionService.SESSION_BEARER_HEADER_DEFAULT;
}
resolveToken(raw) {
return raw ? atob(raw).split(':')[1] : '';
}
resolveStorage(storage) {
switch (storage) {
case 'local':
return localStorage;
case 'session':
return sessionStorage;
case 'null':
return new NullStorage();
default:
return localStorage;
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SessionService, deps: [{ token: i1.ConfigurationService }, { token: i2.LoggerService }, { token: i3.HttpClient }, { token: i4.SessionIdleTimerService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SessionService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SessionService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.ConfigurationService }, { type: i2.LoggerService }, { type: i3.HttpClient }, { type: i4.SessionIdleTimerService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi9hdXRoZW50aWNhdGlvbi9zZXNzaW9uL3NlcnZpY2VzL3Nlc3Npb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBQyxlQUFlLEVBQWMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTdELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQWEsaUJBQWlCLEVBQUUsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFaEYsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0NBQWtDLENBQUM7Ozs7OztBQU9oRSxNQUFNLE9BQU8sY0FBYztJQVlIO0lBQ0E7SUFDQTtJQUNBO0lBYmIsTUFBTSxDQUFVLHlCQUF5QixHQUFHLE1BQU0sQ0FBQztJQUNuRCxNQUFNLENBQVUsNkJBQTZCLEdBQUcsY0FBYyxDQUFDO0lBRTlELFNBQVMsQ0FBMEI7SUFDbkMsUUFBUSxHQUEwQixJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3BELGNBQWMsR0FBa0IsSUFBSSxDQUFDO0lBQ3JDLFNBQVMsQ0FBVTtJQUNuQixVQUFVLENBQWlCO0lBQzNCLFlBQVksQ0FBaUI7SUFFckMsWUFBb0IsT0FBNkIsRUFDN0IsSUFBbUIsRUFDbkIsS0FBaUIsRUFDakIsZ0JBQXlDO1FBSHpDLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBQzdCLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIsVUFBSyxHQUFMLEtB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bnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtOdWxsU3RvcmFnZX0gZnJvbSAnLi4vbnVsbC1zdG9yYWdlJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIGZpbHRlciwgbWFwLCB0YWtlLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TWVzc2FnZVJlc291cmNlfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL21lc3NhZ2UtcmVzb3VyY2UnO1xuaW1wb3J0IHtMb2FkaW5nRW1pdHRlcn0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0eS9sb2FkaW5nLWVtaXR0ZXInO1xuaW1wb3J0IHtTZXNzaW9uSWRsZVRpbWVyU2VydmljZX0gZnJvbSBcIi4vc2Vzc2lvbi1pZGxlLXRpbWVyLnNlcnZpY2VcIjtcblxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlc3Npb25TZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VTU0lPTl9UT0tFTl9TVE9SQUdFX0tFWSA9ICduYWV0JztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNFU1NJT05fQkVBUkVSX0hFQURFUl9ERUZBVUxUID0gJ1gtQXV0aC1Ub2tlbic7XG5cbiAgICBwcml2YXRlIF9zZXNzaW9uJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47XG4gICAgcHJpdmF0ZSBfc3RvcmFnZTogU3RvcmFnZSB8IE51bGxTdG9yYWdlID0gbmV3IE51bGxTdG9yYWdlKCk7XG4gICAgcHJpdmF0ZSBfc2Vzc2lvbkhlYWRlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfdmVyaWZpZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfdmVyaWZ5aW5nOiBMb2FkaW5nRW1pdHRlcjtcbiAgICBwcml2YXRlIF9pbml0aWFsaXplZDogTG9hZGluZ0VtaXR0ZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb25maWc6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICAgIHByaXZhdGUgaWRsZVRpbWVyU2VydmljZTogU2Vzc2lvbklkbGVUaW1lclNlcnZpY2UpIHtcblxuICAgICAgICB0aGlzLl9zZXNzaW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihudWxsKTtcbiAgICAgICAgdGhpcy5fdmVyaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pZGxlVGltZXJTZXJ2aWNlLnN0b3BUaW1lcigpO1xuICAgICAgICB0aGlzLl92ZXJpZnlpbmcgPSBuZXcgTG9hZGluZ0VtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBuZXcgTG9hZGluZ0VtaXR0ZXIoZmFsc2UpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5sb2FkZWQkXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihsb2FkZWQgPT4gbG9hZGVkKSxcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZSA9IHRoaXMucmVzb2x2ZVN0b3JhZ2UodGhpcy5fY29uZmlnLmdldCgpLnByb3ZpZGVycy5hdXRoWydzZXNzaW9uU3RvcmUnXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nlc3Npb25IZWFkZXIgPSB0aGlzLl9jb25maWcuZ2V0KCkucHJvdmlkZXJzLmF1dGguc2Vzc2lvbkJlYXJlciA/XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25maWcuZ2V0KCkucHJvdmlkZXJzLmF1dGguc2Vzc2lvbkJlYXJlciA6IFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQkVBUkVSX0hFQURFUl9ERUZBVUxUO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUNvbmZpZ0luaXRpYWxpemVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbiQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fdmVyaWZ5aW5nLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHNlc3Npb24kKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBzZXQgc2Vzc2lvblRva2VuKHNlc3Npb25Ub2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3Nlc3Npb24kLm5leHQoc2Vzc2lvblRva2VuKTtcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5zZXRJdGVtKFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fVE9LRU5fU1RPUkFHRV9LRVksXG4gICAgICAgICAgICBidG9hKFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fVE9LRU5fU1RPUkFHRV9LRVkgKyAnOicgKyBzZXNzaW9uVG9rZW4pKTtcbiAgICB9XG5cbiAgICBnZXQgc2Vzc2lvblRva2VuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIGdldCBzZXNzaW9uSGVhZGVyKCk6IHN0cmluZyB7XG4gICAgICAgIHRoaXMuZW5zdXJlQ29uZmlnSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25IZWFkZXIhO1xuICAgIH1cblxuICAgIGdldCB2ZXJpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmaWVkO1xuICAgIH1cblxuICAgIGdldCB2ZXJpZnlpbmcoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJpZnlpbmcuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGlzVmVyaWZ5aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5aW5nLmlzQWN0aXZlO1xuICAgIH1cblxuICAgIGdldCBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQuaXNBY3RpdmU7XG4gICAgfVxuXG4gICAgZ2V0IGluaXRpYWxpemluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWZXJpZmllZFRva2VuKHNlc3Npb25Ub2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xvZy53YXJuKCdTZXNzaW9uIHRva2VuIHdpdGhvdXQgZXhwbGljaXQgdmVyaWZpY2F0aW9uIHdhcyBzZXQnKTtcbiAgICAgICAgdGhpcy5pZGxlVGltZXJTZXJ2aWNlLnJlc2V0VGltZXIoKTtcbiAgICAgICAgdGhpcy5fdmVyaWZpZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlc3Npb25Ub2tlbiA9IHNlc3Npb25Ub2tlbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaWRsZVRpbWVyU2VydmljZS5zdG9wVGltZXIoKTtcbiAgICAgICAgdGhpcy5fdmVyaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXNzaW9uVG9rZW4gPSAnJztcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fVE9LRU5fU1RPUkFHRV9LRVkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2ZXJpZnkodG9rZW4/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVDb25maWdJbml0aWFsaXplZCgpO1xuXG4gICAgICAgIHRoaXMuX3ZlcmlmeWluZy5vbigpO1xuICAgICAgICB0b2tlbiA9ICEhdG9rZW4gPyB0b2tlbiA6IHRoaXMuc2Vzc2lvblRva2VuO1xuXG4gICAgICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLl9jb25maWcuZ2V0KCkucHJvdmlkZXJzLmF1dGg7XG4gICAgICAgIGxldCB1cmwgPSBhdXRoQ29uZmlnLmFkZHJlc3M7XG4gICAgICAgIHVybCArPSBhdXRoQ29uZmlnLmVuZHBvaW50cyAmJiBhdXRoQ29uZmlnLmVuZHBvaW50c1sndmVyaWZpY2F0aW9uJ10gPyBhdXRoQ29uZmlnLmVuZHBvaW50c1sndmVyaWZpY2F0aW9uJ10gOlxuICAgICAgICAgICAgKGF1dGhDb25maWcuZW5kcG9pbnRzICYmIGF1dGhDb25maWcuZW5kcG9pbnRzWydsb2dpbiddID8gYXV0aENvbmZpZy5lbmRwb2ludHNbJ2xvZ2luJ10gOiAnJyk7XG4gICAgICAgIGlmICghdXJsIHx8IHVybCA9PT0gYXV0aENvbmZpZy5hZGRyZXNzKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLl92ZXJpZnlpbmcub2ZmKCk7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZC5vbigpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdDYW5ub3QgdmVyaWZ5IHNlc3Npb24gdG9rZW4uICcgK1xuICAgICAgICAgICAgICAgICdMb2dpbiBVUkwgaXMgbm90IGRlZmluZWQgaW4gdGhlIGNvbmZpZyBbbmFlLnByb3ZpZGVycy5hdXRoLmVuZHBvaW50cy5sb2dpbl0uJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PE1lc3NhZ2VSZXNvdXJjZT4odXJsLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KHRoaXMuc2Vzc2lvbkhlYWRlciwgdG9rZW4pLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlICYmIGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cud2FybignQXV0aGVudGljYXRpb24gdG9rZW4gaXMgaW52YWxpZC4gQ2xlYXJpbmcgc2Vzc2lvbiB0b2tlbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmeWluZy5vZmYoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZGxlVGltZXJTZXJ2aWNlLnN0b3BUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZC5vbigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKHJlc3BvbnNlLmJvZHkuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZlcmlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZGxlVGltZXJTZXJ2aWNlLnJlc2V0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQub24oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFwKF8gPT4gdGhpcy5fdmVyaWZ5aW5nLm9mZigpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBsb2FkKCk6IHN0cmluZyB7XG4gICAgICAgIHRoaXMuZW5zdXJlQ29uZmlnSW5pdGlhbGl6ZWQoKTtcblxuICAgICAgICBsZXQgdG9rZW4gPSB0aGlzLl9zdG9yYWdlLmdldEl0ZW0oU2Vzc2lvblNlcnZpY2UuU0VTU0lPTl9UT0tFTl9TVE9SQUdFX0tFWSk7XG4gICAgICAgIHRoaXMuX3ZlcmlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaWRsZVRpbWVyU2VydmljZS5zdG9wVGltZXIoKTtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICB0b2tlbiA9IHRoaXMucmVzb2x2ZVRva2VuKHRva2VuKTtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblRva2VuID0gdG9rZW47XG4gICAgICAgICAgICB0aGlzLnZlcmlmeSh0b2tlbikucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUodmVyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ1Rva2VuICcgKyB0b2tlbiArICcgdmVyaWZpZWQgc3RhdHVzOiAnICsgdmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQub24oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbnN1cmVDb25maWdJbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb25IZWFkZXIgJiYgISh0aGlzLl9zdG9yYWdlIGluc3RhbmNlb2YgTnVsbFN0b3JhZ2UpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2ZnID0gdGhpcy5fY29uZmlnLmdldCgpO1xuICAgICAgICBjb25zdCBzZXNzaW9uU3RvcmUgPSBjZmcucHJvdmlkZXJzLmF1dGhbJ3Nlc3Npb25TdG9yZSddO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gdGhpcy5yZXNvbHZlU3RvcmFnZShzZXNzaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLl9zZXNzaW9uSGVhZGVyID0gY2ZnLnByb3ZpZGVycy5hdXRoLnNlc3Npb25CZWFyZXJcbiAgICAgICAgICAgID8gY2ZnLnByb3ZpZGVycy5hdXRoLnNlc3Npb25CZWFyZXJcbiAgICAgICAgICAgIDogU2Vzc2lvblNlcnZpY2UuU0VTU0lPTl9CRUFSRVJfSEVBREVSX0RFRkFVTFQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlVG9rZW4ocmF3OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcmF3ID8gYXRvYihyYXcpLnNwbGl0KCc6JylbMV0gOiAnJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVTdG9yYWdlKHN0b3JhZ2U6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHN3aXRjaCAoc3RvcmFnZSkge1xuICAgICAgICAgICAgY2FzZSAnbG9jYWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XG4gICAgICAgICAgICBjYXNlICdzZXNzaW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7XG4gICAgICAgICAgICBjYXNlICdudWxsJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE51bGxTdG9yYWdlKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=