@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
118 lines • 30 kB
JavaScript
import { Component } from '@angular/core';
import { AppStateService, OptionsService, Status } from '../../common';
import { PRODUCT_EXPERIENCE_CORE_SHARED } from '../../shared/core.model';
import { gettext } from '../../i18n';
import { TranslateService } from '@ngx-translate/core';
import { ModalService } from '../../modal';
import { TenantService, UserService } from '@c8y/client';
import { AlertService } from '../../alert';
import { HeaderService } from '../../header/header.service';
import { Permissions } from '../../common/permissions.service';
import { map } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "../../common";
import * as i2 from "../../modal";
import * as i3 from "@ngx-translate/core";
import * as i4 from "@c8y/client";
import * as i5 from "../../alert";
import * as i6 from "../../header/header.service";
import * as i7 from "../../common/icon.directive";
import * as i8 from "@angular/common";
import * as i9 from "ngx-bootstrap/collapse";
import * as i10 from "../../product-experience/product-experience.directive";
import * as i11 from "../../i18n/c8y-translate.pipe";
export class SupportOutletComponent {
constructor(ui, optionsService, modalService, translateService, tenantService, alertService, userService, headerService) {
this.ui = ui;
this.optionsService = optionsService;
this.modalService = modalService;
this.translateService = translateService;
this.tenantService = tenantService;
this.alertService = alertService;
this.userService = userService;
this.headerService = headerService;
this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_CORE_SHARED;
}
async activateSupportAccess() {
const title = gettext('Activate support user access');
const companyName = this.optionsService.get('companyName', 'Cumulocity');
const textWithCompany = gettext('You are about to allow a support user from {{companyName}} to access your tenant to help you with your issue.');
const textWithoutCompany = gettext('You are about to allow a support user to access your tenant to help you with your issue.');
const finalQuestion = gettext('Do you want to proceed?');
const body = [
this.translateService.instant(companyName ? textWithCompany : textWithoutCompany, {
companyName
}),
this.translateService.instant(finalQuestion)
].join(' ');
const labels = {
ok: gettext('Activate access'),
cancel: gettext('Cancel')
};
const successMsg = gettext('Support user access activated.');
try {
await this.modalService.confirm(title, body, Status.DANGER, labels);
await this.tenantService.enableSupportUser();
await this.refreshCurrentUser();
this.alertService.success(successMsg);
}
catch (ex) {
// intended empty
}
}
async deactivateSupportAccess() {
const title = gettext('Deactivate support user access');
const companyName = this.optionsService.get('companyName', 'Cumulocity');
const textWithCompany = gettext('You are about to block a support user from {{companyName}} from accessing your tenant to help you with your issue.');
const textWithoutCompany = gettext('You are about to block a support user from accessing your tenant to help you with your issue.');
const { data: currentUser } = await this.userService.current();
const isTenantAdmin = this.userService.hasRole(currentUser, Permissions.ROLE_TENANT_ADMIN);
const tenantAdminNote = gettext('Deactivating support access as tenant admin will disable all other support requests on your tenant.');
const finalQuestion = gettext('Do you want to proceed?');
const body = [
this.translateService.instant(companyName ? textWithCompany : textWithoutCompany, {
companyName
}),
isTenantAdmin ? this.translateService.instant(tenantAdminNote) : '',
this.translateService.instant(finalQuestion)
]
.filter(Boolean)
.join(' ');
const labels = {
ok: gettext('Deactivate access'),
cancel: gettext('Cancel')
};
const successMsg = gettext('Support user access deactivated.');
try {
await this.modalService.confirm(title, body, Status.DANGER, labels);
await this.tenantService.disableSupportUser();
await this.refreshCurrentUser();
this.alertService.success(successMsg);
}
catch (ex) {
// intended empty
}
}
ngOnInit() {
const state = this.ui.state$.getValue();
this.isCollapsed = state.activateSupportUserAvailable && state.supportUrl;
this.userSupportAvailable = this.ui.state$.getValue().activateSupportUserAvailable;
this.supportUrl = this.ui.state$.getValue().supportUrl;
this.supportUserEnabled$ = this.ui.currentUser.pipe(map(user => !!user?.supportUserEnabled));
this.isCollapsible = this.userSupportAvailable && !!this.supportUrl;
this.textClass = this.isCollapsible ? 'text-truncate text-12' : 'text-medium';
this.drawerOpen$ = this.headerService.rightDrawerOpen$;
this.tabIndex$ = this.drawerOpen$.pipe(map(drawerOpen => (drawerOpen ? '0' : '-1')));
}
async refreshCurrentUser() {
const currentUserResult = await this.userService.current();
this.ui.currentUser.next(currentUserResult.data);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupportOutletComponent, deps: [{ token: i1.AppStateService }, { token: i1.OptionsService }, { token: i2.ModalService }, { token: i3.TranslateService }, { token: i4.TenantService }, { token: i5.AlertService }, { token: i4.UserService }, { token: i6.HeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SupportOutletComponent, selector: "c8y-support-outlet", ngImport: i0, template: "<button\n class=\"c8y-right-drawer__link sticky-top\"\n [tabindex]=\"tabIndex$ | async\"\n type=\"button\"\n (click)=\"isCollapsed = !isCollapsed\"\n *ngIf=\"isCollapsible\"\n>\n <i c8yIcon=\"c8y-c8y-support\"></i>\n <span class=\"text-bold\">{{ 'Support' | translate }}</span>\n <i\n class=\"m-l-auto\"\n c8yIcon=\"angle-up\"\n [ngClass]=\"{ 'icon-rotate-180': isCollapsed }\"\n ></i>\n</button>\n<div\n class=\"collapse\"\n id=\"collapseSupport\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Activate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"!(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"activateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.ACTIVATE_SUPPORT_ACCESS }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Activate support access' | translate }}\"\n >\n {{ 'Activate support access' | translate }}\n </span>\n </button>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"deactivateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.DEACTIVATE_SUPPORT_ACCESS }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n >\n {{ 'Deactivate support access' | translate }}\n </span>\n </button>\n <a\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Request support' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n role=\"button\"\n target=\"_blank\"\n [ngClass]=\"{ 'separator-top': !isCollapsible }\"\n *ngIf=\"supportUrl\"\n rel=\"noopener noreferrer\"\n [href]=\"supportUrl\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.OPEN_SUPPORT_LINK }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Request support' | translate }}\"\n >\n {{ 'Request support' | translate }}\n </span>\n </a>\n</div>\n", dependencies: [{ kind: "directive", type: i7.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "directive", type: i10.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: i11.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SupportOutletComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-support-outlet', template: "<button\n class=\"c8y-right-drawer__link sticky-top\"\n [tabindex]=\"tabIndex$ | async\"\n type=\"button\"\n (click)=\"isCollapsed = !isCollapsed\"\n *ngIf=\"isCollapsible\"\n>\n <i c8yIcon=\"c8y-c8y-support\"></i>\n <span class=\"text-bold\">{{ 'Support' | translate }}</span>\n <i\n class=\"m-l-auto\"\n c8yIcon=\"angle-up\"\n [ngClass]=\"{ 'icon-rotate-180': isCollapsed }\"\n ></i>\n</button>\n<div\n class=\"collapse\"\n id=\"collapseSupport\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Activate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"!(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"activateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.ACTIVATE_SUPPORT_ACCESS }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Activate support access' | translate }}\"\n >\n {{ 'Activate support access' | translate }}\n </span>\n </button>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"deactivateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.DEACTIVATE_SUPPORT_ACCESS }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n >\n {{ 'Deactivate support access' | translate }}\n </span>\n </button>\n <a\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Request support' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n role=\"button\"\n target=\"_blank\"\n [ngClass]=\"{ 'separator-top': !isCollapsible }\"\n *ngIf=\"supportUrl\"\n rel=\"noopener noreferrer\"\n [href]=\"supportUrl\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.OPEN_SUPPORT_LINK }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Request support' | translate }}\"\n >\n {{ 'Request support' | translate }}\n </span>\n </a>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.AppStateService }, { type: i1.OptionsService }, { type: i2.ModalService }, { type: i3.TranslateService }, { type: i4.TenantService }, { type: i5.AlertService }, { type: i4.UserService }, { type: i6.HeaderService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VwcG9ydC1vdXRsZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vY29yZS9kb2NzL3N1cHBvcnQtb3V0bGV0L3N1cHBvcnQtb3V0bGV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2NvcmUvZG9jcy9zdXBwb3J0LW91dGxldC9zdXBwb3J0LW91dGxldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU1yQyxNQUFNLE9BQU8sc0JBQXNCO0lBV2pDLFlBQ1MsRUFBbUIsRUFDbEIsY0FBOEIsRUFDOUIsWUFBMEIsRUFDMUIsZ0JBQWtDLEVBQ2xDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLGFBQTRCO1FBUDdCLE9BQUUsR0FBRixFQUFFLENBQWlC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UzsrQkFDRSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlLCBPcHRpb25zU2VydmljZSwgU3RhdHVzIH0gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IFBST0RVQ1RfRVhQRVJJRU5DRV9DT1JFX1NIQVJFRCB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb3JlLm1vZGVsJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi8uLi9pMThuJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uLy4uL21vZGFsJztcbmltcG9ydCB7IFRlbmFudFNlcnZpY2UsIFVzZXJTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYWxlcnQnO1xuaW1wb3J0IHsgSGVhZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2hlYWRlci9oZWFkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL2NvbW1vbi9wZXJtaXNzaW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXN1cHBvcnQtb3V0bGV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N1cHBvcnQtb3V0bGV0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTdXBwb3J0T3V0bGV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgaXNDb2xsYXBzZWQ6IGJvb2xlYW47XG4gIGRyYXdlck9wZW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICB1c2VyU3VwcG9ydEF2YWlsYWJsZTogYm9vbGVhbjtcbiAgc3VwcG9ydFVybDogc3RyaW5nIHwgYm9vbGVhbjtcbiAgaXNDb2xsYXBzaWJsZTogYm9vbGVhbjtcbiAgc3VwcG9ydFVzZXJFbmFibGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgdGV4dENsYXNzOiBzdHJpbmc7XG4gIHRhYkluZGV4JDogT2JzZXJ2YWJsZTwnMCcgfCAnLTEnPjtcbiAgUFJPRFVDVF9FWFBFUklFTkNFID0gUFJPRFVDVF9FWFBFUklFTkNFX0NPUkVfU0hBUkVEO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB1aTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50U2VydmljZTogVGVuYW50U2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgaGVhZGVyU2VydmljZTogSGVhZGVyU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgYWN0aXZhdGVTdXBwb3J0QWNjZXNzKCkge1xuICAgIGNvbnN0IHRpdGxlID0gZ2V0dGV4dCgnQWN0aXZhdGUgc3VwcG9ydCB1c2VyIGFjY2VzcycpO1xuXG4gICAgY29uc3QgY29tcGFueU5hbWUgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldCgnY29tcGFueU5hbWUnLCAnQ3VtdWxvY2l0eScpO1xuICAgIGNvbnN0IHRleHRXaXRoQ29tcGFueSA9IGdldHRleHQoXG4gICAgICAnWW91IGFyZSBhYm91dCB0byBhbGxvdyBhIHN1cHBvcnQgdXNlciBmcm9tIHt7Y29tcGFueU5hbWV9fSB0byBhY2Nlc3MgeW91ciB0ZW5hbnQgdG8gaGVscCB5b3Ugd2l0aCB5b3VyIGlzc3VlLidcbiAgICApO1xuICAgIGNvbnN0IHRleHRXaXRob3V0Q29tcGFueSA9IGdldHRleHQoXG4gICAgICAnWW91IGFyZSBhYm91dCB0byBhbGxvdyBhIHN1cHBvcnQgdXNlciB0byBhY2Nlc3MgeW91ciB0ZW5hbnQgdG8gaGVscCB5b3Ugd2l0aCB5b3VyIGlzc3VlLidcbiAgICApO1xuICAgIGNvbnN0IGZpbmFsUXVlc3Rpb24gPSBnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpO1xuICAgIGNvbnN0IGJvZHkgPSBbXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb21wYW55TmFtZSA/IHRleHRXaXRoQ29tcGFueSA6IHRleHRXaXRob3V0Q29tcGFueSwge1xuICAgICAgICBjb21wYW55TmFtZVxuICAgICAgfSksXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChmaW5hbFF1ZXN0aW9uKVxuICAgIF0uam9pbignICcpO1xuXG4gICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgb2s6IGdldHRleHQoJ0FjdGl2YXRlIGFjY2VzcycpLFxuICAgICAgY2FuY2VsOiBnZXR0ZXh0KCdDYW5jZWwnKVxuICAgIH07XG5cbiAgICBjb25zdCBzdWNjZXNzTXNnID0gZ2V0dGV4dCgnU3VwcG9ydCB1c2VyIGFjY2VzcyBhY3RpdmF0ZWQuJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybSh0aXRsZSwgYm9keSwgU3RhdHVzLkRBTkdFUiwgbGFiZWxzKTtcbiAgICAgIGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5lbmFibGVTdXBwb3J0VXNlcigpO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoQ3VycmVudFVzZXIoKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3Moc3VjY2Vzc01zZyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGludGVuZGVkIGVtcHR5XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVhY3RpdmF0ZVN1cHBvcnRBY2Nlc3MoKSB7XG4gICAgY29uc3QgdGl0bGUgPSBnZXR0ZXh0KCdEZWFjdGl2YXRlIHN1cHBvcnQgdXNlciBhY2Nlc3MnKTtcblxuICAgIGNvbnN0IGNvbXBhbnlOYW1lID0gdGhpcy5vcHRpb25zU2VydmljZS5nZXQoJ2NvbXBhbnlOYW1lJywgJ0N1bXVsb2NpdHknKTtcbiAgICBjb25zdCB0ZXh0V2l0aENvbXBhbnkgPSBnZXR0ZXh0KFxuICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gYmxvY2sgYSBzdXBwb3J0IHVzZXIgZnJvbSB7e2NvbXBhbnlOYW1lfX0gZnJvbSBhY2Nlc3NpbmcgeW91ciB0ZW5hbnQgdG8gaGVscCB5b3Ugd2l0aCB5b3VyIGlzc3VlLidcbiAgICApO1xuICAgIGNvbnN0IHRleHRXaXRob3V0Q29tcGFueSA9IGdldHRleHQoXG4gICAgICAnWW91IGFyZSBhYm91dCB0byBibG9jayBhIHN1cHBvcnQgdXNlciBmcm9tIGFjY2Vzc2luZyB5b3VyIHRlbmFudCB0byBoZWxwIHlvdSB3aXRoIHlvdXIgaXNzdWUuJ1xuICAgICk7XG4gICAgY29uc3QgeyBkYXRhOiBjdXJyZW50VXNlciB9ID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jdXJyZW50KCk7XG4gICAgY29uc3QgaXNUZW5hbnRBZG1pbiA9IHRoaXMudXNlclNlcnZpY2UuaGFzUm9sZShjdXJyZW50VXNlciwgUGVybWlzc2lvbnMuUk9MRV9URU5BTlRfQURNSU4pO1xuICAgIGNvbnN0IHRlbmFudEFkbWluTm90ZSA9IGdldHRleHQoXG4gICAgICAnRGVhY3RpdmF0aW5nIHN1cHBvcnQgYWNjZXNzIGFzIHRlbmFudCBhZG1pbiB3aWxsIGRpc2FibGUgYWxsIG90aGVyIHN1cHBvcnQgcmVxdWVzdHMgb24geW91ciB0ZW5hbnQuJ1xuICAgICk7XG4gICAgY29uc3QgZmluYWxRdWVzdGlvbiA9IGdldHRleHQoJ0RvIHlvdSB3YW50IHRvIHByb2NlZWQ/Jyk7XG4gICAgY29uc3QgYm9keSA9IFtcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGNvbXBhbnlOYW1lID8gdGV4dFdpdGhDb21wYW55IDogdGV4dFdpdGhvdXRDb21wYW55LCB7XG4gICAgICAgIGNvbXBhbnlOYW1lXG4gICAgICB9KSxcbiAgICAgIGlzVGVuYW50QWRtaW4gPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0ZW5hbnRBZG1pbk5vdGUpIDogJycsXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChmaW5hbFF1ZXN0aW9uKVxuICAgIF1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcgJyk7XG5cbiAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICBvazogZ2V0dGV4dCgnRGVhY3RpdmF0ZSBhY2Nlc3MnKSxcbiAgICAgIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJylcbiAgICB9O1xuXG4gICAgY29uc3Qgc3VjY2Vzc01zZyA9IGdldHRleHQoJ1N1cHBvcnQgdXNlciBhY2Nlc3MgZGVhY3RpdmF0ZWQuJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybSh0aXRsZSwgYm9keSwgU3RhdHVzLkRBTkdFUiwgbGFiZWxzKTtcbiAgICAgIGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5kaXNhYmxlU3VwcG9ydFVzZXIoKTtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEN1cnJlbnRVc2VyKCk7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKHN1Y2Nlc3NNc2cpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBpbnRlbmRlZCBlbXB0eVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy51aS5zdGF0ZSQuZ2V0VmFsdWUoKTtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gc3RhdGUuYWN0aXZhdGVTdXBwb3J0VXNlckF2YWlsYWJsZSAmJiBzdGF0ZS5zdXBwb3J0VXJsO1xuICAgIHRoaXMudXNlclN1cHBvcnRBdmFpbGFibGUgPSB0aGlzLnVpLnN0YXRlJC5nZXRWYWx1ZSgpLmFjdGl2YXRlU3VwcG9ydFVzZXJBdmFpbGFibGU7XG4gICAgdGhpcy5zdXBwb3J0VXJsID0gdGhpcy51aS5zdGF0ZSQuZ2V0VmFsdWUoKS5zdXBwb3J0VXJsO1xuICAgIHRoaXMuc3VwcG9ydFVzZXJFbmFibGVkJCA9IHRoaXMudWkuY3VycmVudFVzZXIucGlwZShtYXAodXNlciA9PiAhIXVzZXI/LnN1cHBvcnRVc2VyRW5hYmxlZCkpO1xuICAgIHRoaXMuaXNDb2xsYXBzaWJsZSA9IHRoaXMudXNlclN1cHBvcnRBdmFpbGFibGUgJiYgISF0aGlzLnN1cHBvcnRVcmw7XG4gICAgdGhpcy50ZXh0Q2xhc3MgPSB0aGlzLmlzQ29sbGFwc2libGUgPyAndGV4dC10cnVuY2F0ZSB0ZXh0LTEyJyA6ICd0ZXh0LW1lZGl1bSc7XG4gICAgdGhpcy5kcmF3ZXJPcGVuJCA9IHRoaXMuaGVhZGVyU2VydmljZS5yaWdodERyYXdlck9wZW4kO1xuICAgIHRoaXMudGFiSW5kZXgkID0gdGhpcy5kcmF3ZXJPcGVuJC5waXBlKG1hcChkcmF3ZXJPcGVuID0+IChkcmF3ZXJPcGVuID8gJzAnIDogJy0xJykpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaEN1cnJlbnRVc2VyKCkge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyUmVzdWx0ID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jdXJyZW50KCk7XG4gICAgdGhpcy51aS5jdXJyZW50VXNlci5uZXh0KGN1cnJlbnRVc2VyUmVzdWx0LmRhdGEpO1xuICB9XG59XG4iLCI8YnV0dG9uXG4gIGNsYXNzPVwiYzh5LXJpZ2h0LWRyYXdlcl9fbGluayBzdGlja3ktdG9wXCJcbiAgW3RhYmluZGV4XT1cInRhYkluZGV4JCB8IGFzeW5jXCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIChjbGljayk9XCJpc0NvbGxhcHNlZCA9ICFpc0NvbGxhcHNlZFwiXG4gICpuZ0lmPVwiaXNDb2xsYXBzaWJsZVwiXG4+XG4gIDxpIGM4eUljb249XCJjOHktYzh5LXN1cHBvcnRcIj48L2k+XG4gIDxzcGFuIGNsYXNzPVwidGV4dC1ib2xkXCI+e3sgJ1N1cHBvcnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICA8aVxuICAgIGNsYXNzPVwibS1sLWF1dG9cIlxuICAgIGM4eUljb249XCJhbmdsZS11cFwiXG4gICAgW25nQ2xhc3NdPVwieyAnaWNvbi1yb3RhdGUtMTgwJzogaXNDb2xsYXBzZWQgfVwiXG4gID48L2k+XG48L2J1dHRvbj5cbjxkaXZcbiAgY2xhc3M9XCJjb2xsYXBzZVwiXG4gIGlkPVwiY29sbGFwc2VTdXBwb3J0XCJcbiAgW2NvbGxhcHNlXT1cImlzQ29sbGFwc2VkXCJcbiAgW2lzQW5pbWF0ZWRdPVwidHJ1ZVwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImM4eS1yaWdodC1kcmF3ZXJfX2xpbmtcIlxuICAgIHRpdGxlPVwie3sgJ0FjdGl2YXRlIHN1cHBvcnQgYWNjZXNzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgW3RhYmluZGV4XT1cInRhYkluZGV4JCB8IGFzeW5jXCJcbiAgICAqbmdJZj1cIiEoc3VwcG9ydFVzZXJFbmFibGVkJCB8IGFzeW5jKSAmJiB1c2VyU3VwcG9ydEF2YWlsYWJsZVwiXG4gICAgKGNsaWNrKT1cImFjdGl2YXRlU3VwcG9ydEFjY2VzcygpXCJcbiAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgIFthY3Rpb25OYW1lXT1cIlBST0RVQ1RfRVhQRVJJRU5DRS5RVUlDS19MSU5LUy5FVkVOVFMuUVVJQ0tfTElOS19SSUdIVF9EUkFXRVJcIlxuICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0UuUVVJQ0tfTElOS1MuQUNUSU9OUy5BQ1RJVkFURV9TVVBQT1JUX0FDQ0VTUyB9XCJcbiAgPlxuICAgIDxpXG4gICAgICBjOHlJY29uPVwiYzh5LWM4eS1zdXBwb3J0XCJcbiAgICAgICpuZ0lmPVwiIWlzQ29sbGFwc2libGVcIlxuICAgID48L2k+XG4gICAgPHNwYW5cbiAgICAgIFtjbGFzc109XCJ0ZXh0Q2xhc3NcIlxuICAgICAgdGl0bGU9XCJ7eyAnQWN0aXZhdGUgc3VwcG9ydCBhY2Nlc3MnIHwgdHJhbnNsYXRlIH19XCJcbiAgICA+XG4gICAgICB7eyAnQWN0aXZhdGUgc3VwcG9ydCBhY2Nlc3MnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zcGFuPlxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYzh5LXJpZ2h0LWRyYXdlcl9fbGlua1wiXG4gICAgdGl0bGU9XCJ7eyAnRGVhY3RpdmF0ZSBzdXBwb3J0IGFjY2VzcycgfCB0cmFuc2xhdGUgfX1cIlxuICAgIFt0YWJpbmRleF09XCJ0YWJJbmRleCQgfCBhc3luY1wiXG4gICAgKm5nSWY9XCIoc3VwcG9ydFVzZXJFbmFibGVkJCB8IGFzeW5jKSAmJiB1c2VyU3VwcG9ydEF2YWlsYWJsZVwiXG4gICAgKGNsaWNrKT1cImRlYWN0aXZhdGVTdXBwb3J0QWNjZXNzKClcIlxuICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgW2FjdGlvbk5hbWVdPVwiUFJPRFVDVF9FWFBFUklFTkNFLlFVSUNLX0xJTktTLkVWRU5UUy5RVUlDS19MSU5LX1JJR0hUX0RSQVdFUlwiXG4gICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBST0RVQ1RfRVhQRVJJRU5DRS5RVUlDS19MSU5LUy5BQ1RJT05TLkRFQUNUSVZBVEVfU1VQUE9SVF9BQ0NFU1MgfVwiXG4gID5cbiAgICA8aVxuICAgICAgYzh5SWNvbj1cImM4eS1jOHktc3VwcG9ydFwiXG4gICAgICAqbmdJZj1cIiFpc0NvbGxhcHNpYmxlXCJcbiAgICA+PC9pPlxuICAgIDxzcGFuXG4gICAgICBbY2xhc3NdPVwidGV4dENsYXNzXCJcbiAgICAgIHRpdGxlPVwie3sgJ0RlYWN0aXZhdGUgc3VwcG9ydCBhY2Nlc3MnIHwgdHJhbnNsYXRlIH19XCJcbiAgICA+XG4gICAgICB7eyAnRGVhY3RpdmF0ZSBzdXBwb3J0IGFjY2VzcycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8YVxuICAgIGNsYXNzPVwiYzh5LXJpZ2h0LWRyYXdlcl9fbGlua1wiXG4gICAgdGl0bGU9XCJ7eyAnUmVxdWVzdCBzdXBwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgW3RhYmluZGV4XT1cInRhYkluZGV4JCB8IGFzeW5jXCJcbiAgICByb2xlPVwiYnV0dG9uXCJcbiAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ3NlcGFyYXRvci10b3AnOiAhaXNDb2xsYXBzaWJsZSB9XCJcbiAgICAqbmdJZj1cInN1cHBvcnRVcmxcIlxuICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgIFtocmVmXT1cInN1cHBvcnRVcmxcIlxuICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgW2FjdGlvbk5hbWVdPVwiUFJPRFVDVF9FWFBFUklFTkNFLlFVSUNLX0xJTktTLkVWRU5UUy5RVUlDS19MSU5LX1JJR0hUX0RSQVdFUlwiXG4gICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBST0RVQ1RfRVhQRVJJRU5DRS5RVUlDS19MSU5LUy5BQ1RJT05TLk9QRU5fU1VQUE9SVF9MSU5LIH1cIlxuICA+XG4gICAgPGlcbiAgICAgIGM4eUljb249XCJjOHktYzh5LXN1cHBvcnRcIlxuICAgICAgKm5nSWY9XCIhaXNDb2xsYXBzaWJsZVwiXG4gICAgPjwvaT5cbiAgICA8c3BhblxuICAgICAgW2NsYXNzXT1cInRleHRDbGFzc1wiXG4gICAgICB0aXRsZT1cInt7ICdSZXF1ZXN0IHN1cHBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICA+XG4gICAgICB7eyAnUmVxdWVzdCBzdXBwb3J0JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvc3Bhbj5cbiAgPC9hPlxuPC9kaXY+XG4iXX0=