angular-auth-oidc-client
Version:
Angular Lib for OpenID Connect & OAuth2
145 lines • 21.1 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Injectable, inject } from '@angular/core';
import { Subject } from 'rxjs';
import { LoggerService } from '../../logging/logger.service';
import { StoragePersistenceService } from '../../storage/storage-persistence.service';
import * as i0 from "@angular/core";
export class PopUpService {
constructor() {
this.loggerService = inject(LoggerService);
this.storagePersistenceService = inject(StoragePersistenceService);
this.document = inject(DOCUMENT);
this.STORAGE_IDENTIFIER = 'popupauth';
this.popUp = null;
this.handle = -1;
this.resultInternal$ = new Subject();
}
get result$() {
return this.resultInternal$.asObservable();
}
get windowInternal() {
return this.document.defaultView;
}
isCurrentlyInPopup(config) {
if (this.canAccessSessionStorage()) {
const popup = this.storagePersistenceService.read(this.STORAGE_IDENTIFIER, config);
const windowIdentifier = this.windowInternal;
if (!windowIdentifier) {
return false;
}
return (Boolean(windowIdentifier.opener) &&
windowIdentifier.opener !== windowIdentifier &&
Boolean(popup));
}
return false;
}
openPopUp(url, popupOptions, config) {
const optionsToPass = this.getOptions(popupOptions);
this.storagePersistenceService.write(this.STORAGE_IDENTIFIER, 'true', config);
const windowIdentifier = this.windowInternal;
if (!windowIdentifier) {
return;
}
if (!url) {
this.loggerService.logError(config, 'Could not open popup, url is empty');
return;
}
this.popUp = windowIdentifier.open(url, '_blank', optionsToPass);
if (!this.popUp) {
this.storagePersistenceService.remove(this.STORAGE_IDENTIFIER, config);
this.loggerService.logError(config, 'Could not open popup');
return;
}
this.loggerService.logDebug(config, 'Opened popup with url ' + url);
const listener = (event) => {
if (!event?.data || typeof event.data !== 'string') {
if (config.disableCleaningPopupOnInvalidMessage) {
return;
}
this.cleanUp(listener, config);
return;
}
this.loggerService.logDebug(config, 'Received message from popup with url ' + event.data);
this.resultInternal$.next({ userClosed: false, receivedUrl: event.data });
this.cleanUp(listener, config);
};
windowIdentifier.addEventListener('message', listener, false);
this.handle = windowIdentifier.setInterval(() => {
if (this.popUp?.closed) {
this.resultInternal$.next({ userClosed: true, receivedUrl: '' });
this.cleanUp(listener, config);
}
}, 200);
}
sendMessageToMainWindow(url, config) {
const windowIdentifier = this.windowInternal;
if (!windowIdentifier) {
return;
}
if (windowIdentifier.opener) {
const href = windowIdentifier.location.href;
this.sendMessage(url, href, config);
}
}
cleanUp(listener, config) {
const windowIdentifier = this.windowInternal;
if (!windowIdentifier) {
return;
}
windowIdentifier.removeEventListener('message', listener, false);
windowIdentifier.clearInterval(this.handle);
if (this.popUp) {
this.storagePersistenceService.remove(this.STORAGE_IDENTIFIER, config);
this.popUp.close();
this.popUp = null;
}
}
sendMessage(url, href, config) {
const windowIdentifier = this.windowInternal;
if (!windowIdentifier) {
return;
}
if (!url) {
this.loggerService.logDebug(config, `Can not send message to parent, no url: '${url}'`);
return;
}
windowIdentifier.opener.postMessage(url, href);
}
getOptions(popupOptions) {
const popupDefaultOptions = {
width: 500,
height: 500,
left: 50,
top: 50,
};
const options = {
...popupDefaultOptions,
...(popupOptions || {}),
};
const windowIdentifier = this.windowInternal;
if (!windowIdentifier) {
return '';
}
const width = options.width || popupDefaultOptions.width;
const height = options.height || popupDefaultOptions.height;
const left = windowIdentifier.screenLeft + (windowIdentifier.outerWidth - width) / 2;
const top = windowIdentifier.screenTop + (windowIdentifier.outerHeight - height) / 2;
options.left = left;
options.top = top;
return Object.entries(options)
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
.join(',');
}
canAccessSessionStorage() {
return (typeof navigator !== 'undefined' &&
navigator.cookieEnabled &&
typeof Storage !== 'undefined');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: PopUpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: PopUpService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: PopUpService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYXV0aC1vaWRjLWNsaWVudC9zcmMvbGliL2xvZ2luL3BvcHVwL3BvcHVwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDOztBQUt0RixNQUFNLE9BQU8sWUFBWTtJQUR6QjtRQUVtQixrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0Qyw4QkFBeUIsR0FBRyxNQUFNLENBQ2pELHlCQUF5QixDQUMxQixDQUFDO1FBRWUsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1Qix1QkFBa0IsR0FBRyxXQUFXLENBQUM7UUFFMUMsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFFNUIsV0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRUgsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO0tBcU0vRDtJQW5NQyxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQVksY0FBYztRQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ25DLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxNQUEyQjtRQUM1QyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUM7WUFDbkMs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QUFDLENBQUM7UUFDMUUsTUFBTSxHQUFHLEdBQ1AsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzRSxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVsQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2FBQzNCLEdBQUcsQ0FDRixDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FDZixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzVEO2FBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixPQUFPLENBQ0wsT0FBTyxTQUFTLEtBQUssV0FBVztZQUNoQyxTQUFTLENBQUMsYUFBYTtZQUN2QixPQUFPLE9BQU8sS0FBSyxXQUFXLENBQy9CLENBQUM7SUFDSixDQUFDOzhHQW5OVSxZQUFZO2tIQUFaLFlBQVksY0FEQyxNQUFNOzsyRkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE9wZW5JZENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi9jb25maWcvb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy9sb2dnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zdG9yYWdlL3N0b3JhZ2UtcGVyc2lzdGVuY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvcHVwT3B0aW9ucyB9IGZyb20gJy4vcG9wdXAtb3B0aW9ucyc7XHJcbmltcG9ydCB7IFBvcHVwUmVzdWx0IH0gZnJvbSAnLi9wb3B1cC1yZXN1bHQnO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFBvcFVwU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXJTZXJ2aWNlID0gaW5qZWN0KExvZ2dlclNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UgPSBpbmplY3QoXHJcbiAgICBTdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgU1RPUkFHRV9JREVOVElGSUVSID0gJ3BvcHVwYXV0aCc7XHJcblxyXG4gIHByaXZhdGUgcG9wVXA6IFdpbmRvdyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGhhbmRsZSA9IC0xO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VsdEludGVybmFsJCA9IG5ldyBTdWJqZWN0PFBvcHVwUmVzdWx0PigpO1xyXG5cclxuICBnZXQgcmVzdWx0JCgpOiBPYnNlcnZhYmxlPFBvcHVwUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHRJbnRlcm5hbCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCB3aW5kb3dJbnRlcm5hbCgpOiBXaW5kb3cgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3O1xyXG4gIH1cclxuXHJcbiAgaXNDdXJyZW50bHlJblBvcHVwKGNvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuY2FuQWNjZXNzU2Vzc2lvblN0b3JhZ2UoKSkge1xyXG4gICAgICBjb25zdCBwb3B1cCA9IHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS5yZWFkKFxyXG4gICAgICAgIHRoaXMuU1RPUkFHRV9JREVOVElGSUVSLFxyXG4gICAgICAgIGNvbmZpZ1xyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3Qgd2luZG93SWRlbnRpZmllciA9IHRoaXMud2luZG93SW50ZXJuYWw7XHJcblxyXG4gICAgICBpZiAoIXdpbmRvd0lkZW50aWZpZXIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgQm9vbGVhbih3aW5kb3dJZGVudGlmaWVyLm9wZW5lcikgJiZcclxuICAgICAgICB3aW5kb3dJZGVudGlmaWVyLm9wZW5lciAhPT0gd2luZG93SWRlbnRpZmllciAmJlxyXG4gICAgICAgIEJvb2xlYW4ocG9wdXApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb3BlblBvcFVwKFxyXG4gICAgdXJsOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgcG9wdXBPcHRpb25zOiBQb3B1cE9wdGlvbnMgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IE9wZW5JZENvbmZpZ3VyYXRpb25cclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnNUb1Bhc3MgPSB0aGlzLmdldE9wdGlvbnMocG9wdXBPcHRpb25zKTtcclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2Uud3JpdGUoXHJcbiAgICAgIHRoaXMuU1RPUkFHRV9JREVOVElGSUVSLFxyXG4gICAgICAndHJ1ZScsXHJcbiAgICAgIGNvbmZpZ1xyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCB3aW5kb3dJZGVudGlmaWVyID0gdGhpcy53aW5kb3dJbnRlcm5hbDtcclxuXHJcbiAgICBpZiAoIXdpbmRvd0lkZW50aWZpZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dFcnJvcihjb25maWcsICdDb3VsZCBub3Qgb3BlbiBwb3B1cCwgdXJsIGlzIGVtcHR5Jyk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3BVcCA9IHdpbmRvd0lkZW50aWZpZXIub3Blbih1cmwsICdfYmxhbmsnLCBvcHRpb25zVG9QYXNzKTtcclxuXHJcbiAgICBpZiAoIXRoaXMucG9wVXApIHtcclxuICAgICAgdGhpcy5zdG9yYWdlUGVyc2lzdGVuY2VTZXJ2aWNlLnJlbW92ZSh0aGlzLlNUT1JBR0VfSURFTlRJRklFUiwgY29uZmlnKTtcclxuICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0Vycm9yKGNvbmZpZywgJ0NvdWxkIG5vdCBvcGVuIHBvcHVwJyk7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKGNvbmZpZywgJ09wZW5lZCBwb3B1cCB3aXRoIHVybCAnICsgdXJsKTtcclxuXHJcbiAgICBjb25zdCBsaXN0ZW5lciA9IChldmVudDogTWVzc2FnZUV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICAgIGlmICghZXZlbnQ/LmRhdGEgfHwgdHlwZW9mIGV2ZW50LmRhdGEgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5kaXNhYmxlQ2xlYW5pbmdQb3B1cE9uSW52YWxpZE1lc3NhZ2UpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbGVhblVwKGxpc3RlbmVyLCBjb25maWcpO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dEZWJ1ZyhcclxuICAgICAgICBjb25maWcsXHJcbiAgICAgICAgJ1JlY2VpdmVkIG1lc3NhZ2UgZnJvbSBwb3B1cCB3aXRoIHVybCAnICsgZXZlbnQuZGF0YVxyXG4gICAgICApO1xyXG5cclxuICAgICAgdGhpcy5yZXN1bHRJbnRlcm5hbCQubmV4dCh7IHVzZXJDbG9zZWQ6IGZhbHNlLCByZWNlaXZlZFVybDogZXZlbnQuZGF0YSB9KTtcclxuXHJcbiAgICAgIHRoaXMuY2xlYW5VcChsaXN0ZW5lciwgY29uZmlnKTtcclxuICAgIH07XHJcblxyXG4gICAgd2luZG93SWRlbnRpZmllci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLmhhbmRsZSA9IHdpbmRvd0lkZW50aWZpZXIuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wb3BVcD8uY2xvc2VkKSB7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRJbnRlcm5hbCQubmV4dCh7IHVzZXJDbG9zZWQ6IHRydWUsIHJlY2VpdmVkVXJsOiAnJyB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jbGVhblVwKGxpc3RlbmVyLCBjb25maWcpO1xyXG4gICAgICB9XHJcbiAgICB9LCAyMDApO1xyXG4gIH1cclxuXHJcbiAgc2VuZE1lc3NhZ2VUb01haW5XaW5kb3codXJsOiBzdHJpbmcsIGNvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3Qgd2luZG93SWRlbnRpZmllciA9IHRoaXMud2luZG93SW50ZXJuYWw7XHJcblxyXG4gICAgaWYgKCF3aW5kb3dJZGVudGlmaWVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93SWRlbnRpZmllci5vcGVuZXIpIHtcclxuICAgICAgY29uc3QgaHJlZiA9IHdpbmRvd0lkZW50aWZpZXIubG9jYXRpb24uaHJlZjtcclxuXHJcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UodXJsLCBocmVmLCBjb25maWcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhblVwKGxpc3RlbmVyOiBhbnksIGNvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbik6IHZvaWQge1xyXG4gICAgY29uc3Qgd2luZG93SWRlbnRpZmllciA9IHRoaXMud2luZG93SW50ZXJuYWw7XHJcblxyXG4gICAgaWYgKCF3aW5kb3dJZGVudGlmaWVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3dJZGVudGlmaWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xyXG4gICAgd2luZG93SWRlbnRpZmllci5jbGVhckludGVydmFsKHRoaXMuaGFuZGxlKTtcclxuXHJcbiAgICBpZiAodGhpcy5wb3BVcCkge1xyXG4gICAgICB0aGlzLnN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UucmVtb3ZlKHRoaXMuU1RPUkFHRV9JREVOVElGSUVSLCBjb25maWcpO1xyXG4gICAgICB0aGlzLnBvcFVwLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMucG9wVXAgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZW5kTWVzc2FnZShcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgaHJlZjogc3RyaW5nLFxyXG4gICAgY29uZmlnOiBPcGVuSWRDb25maWd1cmF0aW9uXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB3aW5kb3dJZGVudGlmaWVyID0gdGhpcy53aW5kb3dJbnRlcm5hbDtcclxuXHJcbiAgICBpZiAoIXdpbmRvd0lkZW50aWZpZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dEZWJ1ZyhcclxuICAgICAgICBjb25maWcsXHJcbiAgICAgICAgYENhbiBub3Qgc2VuZCBtZXNzYWdlIHRvIHBhcmVudCwgbm8gdXJsOiAnJHt1cmx9J2BcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB3aW5kb3dJZGVudGlmaWVyLm9wZW5lci5wb3N0TWVzc2FnZSh1cmwsIGhyZWYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPcHRpb25zKHBvcHVwT3B0aW9uczogUG9wdXBPcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBvcHVwRGVmYXVsdE9wdGlvbnMgPSB7XHJcbiAgICAgIHdpZHRoOiA1MDAsXHJcbiAgICAgIGhlaWdodDogNTAwLFxyXG4gICAgICBsZWZ0OiA1MCxcclxuICAgICAgdG9wOiA1MCxcclxuICAgIH07XHJcbiAgICBjb25zdCBvcHRpb25zOiBQb3B1cE9wdGlvbnMgPSB7XHJcbiAgICAgIC4uLnBvcHVwRGVmYXVsdE9wdGlvbnMsXHJcbiAgICAgIC4uLihwb3B1cE9wdGlvbnMgfHwge30pLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHdpbmRvd0lkZW50aWZpZXIgPSB0aGlzLndpbmRvd0ludGVybmFsO1xyXG5cclxuICAgIGlmICghd2luZG93SWRlbnRpZmllcikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgd2lkdGggPSBvcHRpb25zLndpZHRoIHx8IHBvcHVwRGVmYXVsdE9wdGlvbnMud2lkdGg7XHJcbiAgICBjb25zdCBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCBwb3B1cERlZmF1bHRPcHRpb25zLmhlaWdodDtcclxuXHJcbiAgICBjb25zdCBsZWZ0OiBudW1iZXIgPVxyXG4gICAgICB3aW5kb3dJZGVudGlmaWVyLnNjcmVlbkxlZnQgKyAod2luZG93SWRlbnRpZmllci5vdXRlcldpZHRoIC0gd2lkdGgpIC8gMjtcclxuICAgIGNvbnN0IHRvcDogbnVtYmVyID1cclxuICAgICAgd2luZG93SWRlbnRpZmllci5zY3JlZW5Ub3AgKyAod2luZG93SWRlbnRpZmllci5vdXRlckhlaWdodCAtIGhlaWdodCkgLyAyO1xyXG5cclxuICAgIG9wdGlvbnMubGVmdCA9IGxlZnQ7XHJcbiAgICBvcHRpb25zLnRvcCA9IHRvcDtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob3B0aW9ucylcclxuICAgICAgLm1hcChcclxuICAgICAgICAoW2tleSwgdmFsdWVdKSA9PlxyXG4gICAgICAgICAgYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKX1gXHJcbiAgICAgIClcclxuICAgICAgLmpvaW4oJywnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FuQWNjZXNzU2Vzc2lvblN0b3JhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgICBuYXZpZ2F0b3IuY29va2llRW5hYmxlZCAmJlxyXG4gICAgICB0eXBlb2YgU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCdcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==