@jamarsto/kiunzi-micro-frontend-tools
Version:
Kiunzi framework Micro-frontend scaffolding
122 lines • 16.5 kB
JavaScript
import { Injectable } from '@angular/core';
import { of } from 'rxjs';
import { map, mergeMap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "angular-auth-oidc-client";
import * as i2 from "@angular/router";
export class AutoLoginPartialRoutesWithRoleGuard {
constructor(oidcSecurityService, router, autoLoginPartialRoutesGuard) {
this.oidcSecurityService = oidcSecurityService;
this.router = router;
this.autoLoginPartialRoutesGuard = autoLoginPartialRoutesGuard;
}
canActivate(next, state) {
return this
.autoLoginPartialRoutesGuard
.canActivate(next, state)
.pipe(mergeMap(result => this.checkRoleForActivate(result, next)));
}
canActivateChild(next, state) {
return this
.autoLoginPartialRoutesGuard
.canActivateChild(next, state)
.pipe(mergeMap(result => this.checkRoleForActivateChild(result, next)));
}
canLoad(route, url) {
return this
.autoLoginPartialRoutesGuard
.canLoad()
.pipe(mergeMap(result => this.checkRoleForLoad(result, route, url)));
}
checkRoleForActivate(isAuthenticated, next) {
if (typeof isAuthenticated !== 'boolean' || isAuthenticated !== true) {
return of(isAuthenticated);
}
return this
.isInRole(next.data['role'])
.pipe(map(isInRole => {
if (isInRole === true) {
return true;
}
return this.router.parseUrl('/unauthorized');
}));
}
checkRoleForActivateChild(isAuthenticated, next) {
if (typeof isAuthenticated !== 'boolean' || isAuthenticated !== true) {
return of(isAuthenticated);
}
const data = next.parent != null ? next.parent.data : next.data;
return this
.isInRole(data['role'])
.pipe(map(isInRole => {
if (isInRole === true) {
return true;
}
return this.router.parseUrl('/unauthorized');
}));
}
checkRoleForLoad(isAuthenticated, next, url) {
if (typeof isAuthenticated !== 'boolean' || isAuthenticated !== true || typeof next.data === 'undefined') {
return of(isAuthenticated);
}
return this
.isInRole(next.data['role'])
.pipe(map(isInRole => {
if (isInRole === true) {
return true;
}
return this.router.parseUrl('/unauthorized');
}));
}
isInRole(role) {
if (typeof role === 'object') {
return this.isInRoleArray(role);
}
return this.isInRoleString(role);
}
isInRoleArray(role) {
if (role.length === 0) {
return of(true);
}
return this
.oidcSecurityService
.userData$
.pipe(map(({ userData }) => {
const roles = userData.roles;
if (typeof roles !== 'undefined' && roles != null) {
var matchedAll = true;
role.forEach((strRole) => {
if (!(typeof strRole === 'undefined' || strRole === null || strRole.trim() === '' || roles.indexOf(strRole) >= 0)) {
matchedAll = false;
}
});
return matchedAll;
}
return false;
}));
}
isInRoleString(role) {
if (typeof role === 'undefined' || role === null || role.trim() === '') {
return of(true);
}
return this
.oidcSecurityService
.userData$
.pipe(map(({ userData }) => {
const roles = userData.roles;
if (typeof roles !== 'undefined' && roles != null && roles.indexOf(role) >= 0) {
return true;
}
return false;
}));
}
}
AutoLoginPartialRoutesWithRoleGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.10", ngImport: i0, type: AutoLoginPartialRoutesWithRoleGuard, deps: [{ token: i1.OidcSecurityService }, { token: i2.Router }, { token: i1.AutoLoginPartialRoutesGuard }], target: i0.ɵɵFactoryTarget.Injectable });
AutoLoginPartialRoutesWithRoleGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.10", ngImport: i0, type: AutoLoginPartialRoutesWithRoleGuard, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.10", ngImport: i0, type: AutoLoginPartialRoutesWithRoleGuard, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i1.OidcSecurityService }, { type: i2.Router }, { type: i1.AutoLoginPartialRoutesGuard }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydGlhbC1yb3V0ZXMtZ3VhcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdW56aS1taWNyby1mcm9udGVuZC10b29scy9zcmMvbGliL3NlcnZpY2UvcGFydGlhbC1yb3V0ZXMtZ3VhcmQvcGFydGlhbC1yb3V0ZXMtZ3VhcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU0vQyxNQUFNLE9BQU8sbUNBQW1DO0lBQzlDLFlBQ1UsbUJBQXdDLEVBQ3hDLE1BQWMsRUFDZCwyQkFBd0Q7UUFGeEQsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZ0NBQTJCLEdBQTNCLDJCQUEyQixDQUE2QjtJQUM5RCxDQUFDO0lBRUwsV0FBVyxDQUNQLElBQTRCLEVBQzVCLEtBQTBCO1FBQzVCLE9BQU8sSUFBSTthQUNOLDJCQUEyQjthQUMzQixXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGdCQUFnQixDQUNkLElBQTRCLEVBQzVCLEtBQTBCO1FBQzFCLE9BQU8sSUFBSTthQUNOLDJCQUEyQjthQUMzQixnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO2FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQVksRUFBRSxHQUFpQjtRQUNyQyxPQUFPLElBQUk7YUFDTiwyQkFBMkI7YUFDM0IsT0FBTyxFQUFFO2FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRU8sb0JBQW9CLENBQUMsZUFBa0MsRUFBRSxJQUE0QjtRQUMzRixJQUFHLE9BQU8sZUFBZSxLQUFLLFNBQVMsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQ25FLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJO2FBQ04sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuQixJQUFHLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRU8seUJBQXlCLENBQUMsZUFBa0MsRUFBRSxJQUE0QjtRQUNoRyxJQUFHLE9BQU8sZUFBZSxLQUFLLFNBQVMsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQ25FLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2hFLE9BQU8sSUFBSTthQUNOLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuQixJQUFHLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsZUFBa0MsRUFBRSxJQUFXLEVBQUUsR0FBaUI7UUFDekYsSUFBRyxPQUFPLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQ3ZHLE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxJQUFJO2FBQ04sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuQixJQUFHLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRU8sUUFBUSxDQUFDLElBQXVCO1FBQ3RDLElBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQWM7UUFDbEMsSUFBRyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQjtRQUNELE9BQU8sSUFBSTthQUNOLG1CQUFtQjthQUNuQixTQUFTO2FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtZQUN6QixNQUFNLEtBQUssR0FBYSxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLElBQUcsT0FBTyxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ2hELElBQUksVUFBVSxHQUFZLElBQUksQ0FBQztnQkFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUN2QixJQUFHLENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7d0JBQ2hILFVBQVUsR0FBRyxLQUFLLENBQUM7cUJBQ3BCO2dCQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sVUFBVSxDQUFDO2FBQ25CO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVPLGNBQWMsQ0FBQyxJQUFZO1FBQ2pDLElBQUcsT0FBTyxJQUFJLEtBQUssV0FBVyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNyRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQjtRQUNELE9BQU8sSUFBSTthQUNOLG1CQUFtQjthQUNuQixTQUFTO2FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtZQUN6QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzdCLElBQUcsT0FBTyxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzVFLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDVixDQUFDOztpSUF0SFUsbUNBQW1DO3FJQUFuQyxtQ0FBbUMsY0FGbEMsTUFBTTs0RkFFUCxtQ0FBbUM7a0JBSC9DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQsIENhbkxvYWQsIFJvdXRlLCBSb3V0ZXIsIFJvdXRlclN0YXRlU25hcHNob3QsIFVybFNlZ21lbnQsIFVybFRyZWUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPaWRjU2VjdXJpdHlTZXJ2aWNlLCBBdXRvTG9naW5QYXJ0aWFsUm91dGVzR3VhcmQgfSBmcm9tICdhbmd1bGFyLWF1dGgtb2lkYy1jbGllbnQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBdXRvTG9naW5QYXJ0aWFsUm91dGVzV2l0aFJvbGVHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkLCBDYW5Mb2FkIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvaWRjU2VjdXJpdHlTZXJ2aWNlOiBPaWRjU2VjdXJpdHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhdXRvTG9naW5QYXJ0aWFsUm91dGVzR3VhcmQ6IEF1dG9Mb2dpblBhcnRpYWxSb3V0ZXNHdWFyZCxcbiAgKSB7IH1cblxuICBjYW5BY3RpdmF0ZShcbiAgICAgIG5leHQ6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsXG4gICAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHwgUHJvbWlzZTxib29sZWFuIHwgVXJsVHJlZT4gfCBib29sZWFuIHwgVXJsVHJlZSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgICAgLmF1dG9Mb2dpblBhcnRpYWxSb3V0ZXNHdWFyZFxuICAgICAgICAuY2FuQWN0aXZhdGUobmV4dCwgc3RhdGUpXG4gICAgICAgIC5waXBlKG1lcmdlTWFwKHJlc3VsdCA9PiB0aGlzLmNoZWNrUm9sZUZvckFjdGl2YXRlKHJlc3VsdCwgbmV4dCkpKTtcbiAgfVxuXG4gIGNhbkFjdGl2YXRlQ2hpbGQoXG4gICAgbmV4dDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHwgUHJvbWlzZTxib29sZWFuIHwgVXJsVHJlZT4gfCBib29sZWFuIHwgVXJsVHJlZSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgICAgLmF1dG9Mb2dpblBhcnRpYWxSb3V0ZXNHdWFyZFxuICAgICAgICAuY2FuQWN0aXZhdGVDaGlsZChuZXh0LCBzdGF0ZSlcbiAgICAgICAgLnBpcGUobWVyZ2VNYXAocmVzdWx0ID0+IHRoaXMuY2hlY2tSb2xlRm9yQWN0aXZhdGVDaGlsZChyZXN1bHQsIG5leHQpKSk7XG4gIH1cblxuICBjYW5Mb2FkKHJvdXRlOiBSb3V0ZSwgdXJsOiBVcmxTZWdtZW50W10pOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBVcmxUcmVlPiB8IFByb21pc2U8Ym9vbGVhbiB8IFVybFRyZWU+IHwgYm9vbGVhbiB8IFVybFRyZWUge1xuICAgIHJldHVybiB0aGlzXG4gICAgICAgIC5hdXRvTG9naW5QYXJ0aWFsUm91dGVzR3VhcmRcbiAgICAgICAgLmNhbkxvYWQoKVxuICAgICAgICAucGlwZShtZXJnZU1hcChyZXN1bHQgPT4gdGhpcy5jaGVja1JvbGVGb3JMb2FkKHJlc3VsdCwgcm91dGUsIHVybCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tSb2xlRm9yQWN0aXZhdGUoaXNBdXRoZW50aWNhdGVkOiBib29sZWFuIHwgVXJsVHJlZSwgbmV4dDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbiB8IFVybFRyZWU+IHtcbiAgICBpZih0eXBlb2YgaXNBdXRoZW50aWNhdGVkICE9PSAnYm9vbGVhbicgfHwgaXNBdXRoZW50aWNhdGVkICE9PSB0cnVlKSB7XG4gICAgICByZXR1cm4gb2YoaXNBdXRoZW50aWNhdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgICAgLmlzSW5Sb2xlKG5leHQuZGF0YVsncm9sZSddKVxuICAgICAgICAucGlwZShtYXAoaXNJblJvbGUgPT4ge1xuICAgICAgICAgIGlmKGlzSW5Sb2xlID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLnBhcnNlVXJsKCcvdW5hdXRob3JpemVkJyk7XG4gICAgICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tSb2xlRm9yQWN0aXZhdGVDaGlsZChpc0F1dGhlbnRpY2F0ZWQ6IGJvb2xlYW4gfCBVcmxUcmVlLCBuZXh0OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIGlmKHR5cGVvZiBpc0F1dGhlbnRpY2F0ZWQgIT09ICdib29sZWFuJyB8fCBpc0F1dGhlbnRpY2F0ZWQgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiBvZihpc0F1dGhlbnRpY2F0ZWQpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gbmV4dC5wYXJlbnQgIT0gbnVsbCA/IG5leHQucGFyZW50LmRhdGEgOiBuZXh0LmRhdGE7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgICAgLmlzSW5Sb2xlKGRhdGFbJ3JvbGUnXSlcbiAgICAgICAgLnBpcGUobWFwKGlzSW5Sb2xlID0+IHtcbiAgICAgICAgICBpZihpc0luUm9sZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5wYXJzZVVybCgnL3VuYXV0aG9yaXplZCcpO1xuICAgICAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUm9sZUZvckxvYWQoaXNBdXRoZW50aWNhdGVkOiBib29sZWFuIHwgVXJsVHJlZSwgbmV4dDogUm91dGUsIHVybDogVXJsU2VnbWVudFtdKTogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT4ge1xuICAgIGlmKHR5cGVvZiBpc0F1dGhlbnRpY2F0ZWQgIT09ICdib29sZWFuJyB8fCBpc0F1dGhlbnRpY2F0ZWQgIT09IHRydWUgfHwgdHlwZW9mIG5leHQuZGF0YSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBvZihpc0F1dGhlbnRpY2F0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICAgICAgICAuaXNJblJvbGUobmV4dC5kYXRhWydyb2xlJ10pXG4gICAgICAgIC5waXBlKG1hcChpc0luUm9sZSA9PiB7XG4gICAgICAgICAgaWYoaXNJblJvbGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIucGFyc2VVcmwoJy91bmF1dGhvcml6ZWQnKTtcbiAgICAgICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luUm9sZShyb2xlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmKHR5cGVvZiByb2xlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNJblJvbGVBcnJheShyb2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNJblJvbGVTdHJpbmcocm9sZSk7XG4gIH1cblxuICBwcml2YXRlIGlzSW5Sb2xlQXJyYXkocm9sZTogc3RyaW5nW10pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBpZihyb2xlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICAgICAgICAub2lkY1NlY3VyaXR5U2VydmljZVxuICAgICAgICAudXNlckRhdGEkXG4gICAgICAgIC5waXBlKG1hcCgoeyB1c2VyRGF0YSB9KSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm9sZXM6IHN0cmluZ1tdID0gdXNlckRhdGEucm9sZXM7XG4gICAgICAgICAgaWYodHlwZW9mIHJvbGVzICE9PSAndW5kZWZpbmVkJyAmJiByb2xlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlZEFsbDogYm9vbGVhbiA9IHRydWU7XG4gICAgICAgICAgICByb2xlLmZvckVhY2goKHN0clJvbGUpID0+IHtcbiAgICAgICAgICAgICAgaWYoISh0eXBlb2Ygc3RyUm9sZSA9PT0gJ3VuZGVmaW5lZCcgfHwgc3RyUm9sZSA9PT0gbnVsbCB8fCBzdHJSb2xlLnRyaW0oKSA9PT0gJycgfHwgcm9sZXMuaW5kZXhPZihzdHJSb2xlKSA+PSAwKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWRBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlZEFsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGlzSW5Sb2xlU3RyaW5nKHJvbGU6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmKHR5cGVvZiByb2xlID09PSAndW5kZWZpbmVkJyB8fCByb2xlID09PSBudWxsIHx8IHJvbGUudHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICAgICAgICAub2lkY1NlY3VyaXR5U2VydmljZVxuICAgICAgICAudXNlckRhdGEkXG4gICAgICAgIC5waXBlKG1hcCgoeyB1c2VyRGF0YSB9KSA9PiB7XG4gICAgICAgICAgY29uc3Qgcm9sZXMgPSB1c2VyRGF0YS5yb2xlcztcbiAgICAgICAgICBpZih0eXBlb2Ygcm9sZXMgIT09ICd1bmRlZmluZWQnICYmIHJvbGVzICE9IG51bGwgJiYgcm9sZXMuaW5kZXhPZihyb2xlKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KSk7XG4gIH1cbn1cbiJdfQ==