@alauda-fe/common
Version:
Alauda frontend team common codes.
185 lines • 25.7 kB
JavaScript
/**
* @packageDocumentation
* @module account-menu
*/
import { setTheme as setChartTheme } from '@alauda/chart';
import { AlaudaMonacoProviderService } from '@alauda/code-editor';
import { ThemeService } from '@alauda/ui';
import { ChangeDetectionStrategy, Component, Optional } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { combineLatest, map } from 'rxjs';
import { AuthorizationStateService } from '../../../../authorization/public-api';
import { LOCAL_STORAGE_KEY_THEME_MODE } from '../../../../core/public-api';
import { LOCALE_STORAGE, TranslateService, getAvailableLanguages, } from '../../../../translate/public-api';
import * as i0 from "@angular/core";
import * as i1 from "../../../../authorization/public-api";
import * as i2 from "../../../../translate/public-api";
import * as i3 from "@alauda/ui";
import * as i4 from "@alauda/code-editor";
import * as i5 from "@angular/common";
import * as i6 from "../../../../translate/translate.pipe";
const _c0 = ["*"];
function AccountMenuComponent_ng_template_6_aui_submenu_2_Template(rf, ctx) { if (rf & 1) {
const _r2 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "aui-submenu", 6)(1, "div");
i0.ɵɵelement(2, "aui-icon", 11);
i0.ɵɵelementStart(3, "span");
i0.ɵɵtext(4);
i0.ɵɵpipe(5, "translate");
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(6, "aui-menu-item", 12);
i0.ɵɵlistener("click", function AccountMenuComponent_ng_template_6_aui_submenu_2_Template_aui_menu_item_click_6_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setThemeMode("system")); });
i0.ɵɵtext(7);
i0.ɵɵpipe(8, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(9, "aui-menu-item", 12);
i0.ɵɵlistener("click", function AccountMenuComponent_ng_template_6_aui_submenu_2_Template_aui_menu_item_click_9_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setThemeMode("light")); });
i0.ɵɵtext(10);
i0.ɵɵpipe(11, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(12, "aui-menu-item", 12);
i0.ɵɵlistener("click", function AccountMenuComponent_ng_template_6_aui_submenu_2_Template_aui_menu_item_click_12_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.setThemeMode("dark")); });
i0.ɵɵtext(13);
i0.ɵɵpipe(14, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(2);
i0.ɵɵproperty("icon", ctx_r2.themeMode === "system" ? "computer" : ctx_r2.themeMode === "light" ? "sun" : "moon");
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 8, "appearance"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("actived", ctx_r2.themeMode === "system");
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 10, "follow_the_system"), " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("actived", ctx_r2.themeMode === "light");
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(11, 12, "light_theme"), " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("actived", ctx_r2.themeMode === "dark");
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(14, 14, "dark_theme"), " ");
} }
function AccountMenuComponent_ng_template_6_aui_menu_item_9_Template(rf, ctx) { if (rf & 1) {
const _r4 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "aui-menu-item", 12);
i0.ɵɵlistener("click", function AccountMenuComponent_ng_template_6_aui_menu_item_9_Template_aui_menu_item_click_0_listener() { const lang_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.changeLanguage(lang_r5.id)); });
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const lang_r5 = ctx.$implicit;
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("actived", lang_r5.id === ctx_r2.$currentLang());
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", lang_r5.name, " ");
} }
function AccountMenuComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
const _r1 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "aui-menu");
i0.ɵɵprojection(1);
i0.ɵɵtemplate(2, AccountMenuComponent_ng_template_6_aui_submenu_2_Template, 15, 16, "aui-submenu", 5);
i0.ɵɵelementStart(3, "aui-submenu", 6)(4, "div");
i0.ɵɵelement(5, "aui-icon", 7);
i0.ɵɵelementStart(6, "span");
i0.ɵɵtext(7);
i0.ɵɵpipe(8, "translate");
i0.ɵɵelementEnd()();
i0.ɵɵtemplate(9, AccountMenuComponent_ng_template_6_aui_menu_item_9_Template, 2, 2, "aui-menu-item", 8);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(10, "aui-menu-item", 9);
i0.ɵɵlistener("click", function AccountMenuComponent_ng_template_6_Template_aui_menu_item_click_10_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.logout()); });
i0.ɵɵelement(11, "aui-icon", 10);
i0.ɵɵelementStart(12, "span");
i0.ɵɵtext(13);
i0.ɵɵpipe(14, "translate");
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r2.themeMode !== "custom");
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(8, 5, "language"));
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", ctx_r2.languages);
i0.ɵɵadvance();
i0.ɵɵproperty("divide", true);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 7, "logout"));
} }
export class AccountMenuComponent {
constructor(auth, translate, theme, monacoService) {
this.auth = auth;
this.translate = translate;
this.theme = theme;
this.displayName$ = this.auth
.getTokenPayload()
.pipe(map(account => account.email || account.name));
this.languages = getAvailableLanguages();
this.$currentLang = toSignal(this.translate.locale$);
this.initThemeMode();
this.theme.currentTheme$.subscribe(theme => {
setChartTheme(theme);
});
if (monacoService) {
monacoService.initMonaco().then(() => {
combineLatest([
this.theme.currentTheme$,
monacoService.themeMode$,
]).subscribe(([theme, mode]) => {
monacoService.changeThemeMode(mode, theme);
});
});
}
}
logout() {
// 审计记录登出
this.auth.logoutWithAudit();
}
changeLanguage(lang) {
localStorage.setItem(LOCALE_STORAGE, lang);
window.location.reload();
}
setThemeMode(v) {
localStorage.setItem(LOCAL_STORAGE_KEY_THEME_MODE, v);
this.themeMode = v;
this.theme.setThemeMode(v);
}
initThemeMode() {
let localTheme = localStorage.getItem(LOCAL_STORAGE_KEY_THEME_MODE);
if (!localTheme) {
localTheme = 'system';
localStorage.setItem(LOCAL_STORAGE_KEY_THEME_MODE, localTheme);
}
this.themeMode = localTheme;
if (['system', 'light', 'dark'].includes(localTheme)) {
this.theme.setThemeMode(localTheme);
}
}
static { this.ɵfac = function AccountMenuComponent_Factory(t) { return new (t || AccountMenuComponent)(i0.ɵɵdirectiveInject(i1.AuthorizationStateService), i0.ɵɵdirectiveInject(i2.TranslateService), i0.ɵɵdirectiveInject(i3.ThemeService), i0.ɵɵdirectiveInject(i4.AlaudaMonacoProviderService, 8)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AccountMenuComponent, selectors: [["acl-account-menu"]], ngContentSelectors: _c0, decls: 8, vars: 5, consts: [["menu", ""], [1, "account-menu", 3, "auiDropdown", "auiDropdownClass"], ["src", "header/portrait.svg", "alt", "portrait", 1, "account-menu__icon"], [1, "account-menu__display"], ["icon", "angle_down", 1, "account-menu__pointer"], ["class", "acl-account-menu-item", 4, "ngIf"], [1, "acl-account-menu-item"], ["icon", "prod:globe"], [3, "actived", "click", 4, "ngFor", "ngForOf"], [1, "acl-account-menu-item", 3, "click", "divide"], ["icon", "sign_out"], [3, "icon"], [3, "click", "actived"]], template: function AccountMenuComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵprojectionDef();
i0.ɵɵelementStart(0, "div", 1);
i0.ɵɵelement(1, "img", 2);
i0.ɵɵelementStart(2, "div", 3);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "async");
i0.ɵɵelementEnd();
i0.ɵɵelement(5, "aui-icon", 4);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(6, AccountMenuComponent_ng_template_6_Template, 15, 9, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
const menu_r6 = i0.ɵɵreference(7);
i0.ɵɵproperty("auiDropdown", menu_r6)("auiDropdownClass", "acl-page-header__tooltip");
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 3, ctx.displayName$));
} }, dependencies: [i5.NgForOf, i5.NgIf, i3.IconComponent, i3.DropdownDirective, i3.MenuComponent, i3.MenuItemComponent, i3.SubmenuComponent, i5.AsyncPipe, i6.TranslatePipe], styles: ["[_nghost-%COMP%]{display:block}.account-menu[_ngcontent-%COMP%]{display:flex;align-items:center;padding:0 8px 0 24px;height:32px;border-radius:2px;color:var(--acl-page-header-text-color);cursor:pointer;position:relative}.account-menu__icon[_ngcontent-%COMP%]{position:absolute;left:-16px;top:0;height:32px;width:32px;border-radius:50%;margin-right:8px}.account-menu[_ngcontent-%COMP%]:hover, .account-menu.isActive[_ngcontent-%COMP%]{color:#fff;background-color:rgb(var(--aui-color-primary))}.account-menu[_ngcontent-%COMP%]:hover .account-menu__icon[_ngcontent-%COMP%], .account-menu.isActive[_ngcontent-%COMP%] .account-menu__icon[_ngcontent-%COMP%]{border:2px solid rgb(var(--aui-color-primary));height:36px;width:36px;top:-2px;left:-18px}.account-menu__pointer[_ngcontent-%COMP%]{font-size:12px;margin-left:2px}.account-menu__display[_ngcontent-%COMP%]{max-width:175px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} .acl-page-header__tooltip{min-width:155px} .acl-page-header__tooltip .aui-menu-item:hover, .acl-page-header__tooltip .aui-submenu:hover{color:rgb(var(--aui-color-primary))} .acl-account-menu-item:not(:hover) .aui-icon{color:rgb(var(--aui-color-n-2))}"], changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AccountMenuComponent, [{
type: Component,
args: [{ selector: 'acl-account-menu', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"account-menu\"\n [auiDropdown]=\"menu\"\n [auiDropdownClass]=\"'acl-page-header__tooltip'\"\n>\n <img\n src=\"header/portrait.svg\"\n class=\"account-menu__icon\"\n alt=\"portrait\"\n />\n <div class=\"account-menu__display\">{{ displayName$ | async }}</div>\n <aui-icon\n class=\"account-menu__pointer\"\n icon=\"angle_down\"\n ></aui-icon>\n</div>\n\n<ng-template #menu>\n <aui-menu>\n <ng-content></ng-content>\n\n <aui-submenu\n *ngIf=\"themeMode !== 'custom'\"\n class=\"acl-account-menu-item\"\n >\n <div>\n <aui-icon\n [icon]=\"\n themeMode === 'system'\n ? 'computer'\n : themeMode === 'light'\n ? 'sun'\n : 'moon'\n \"\n ></aui-icon>\n <span>{{ 'appearance' | translate }}</span>\n </div>\n <aui-menu-item\n [actived]=\"themeMode === 'system'\"\n (click)=\"setThemeMode('system')\"\n >\n {{ 'follow_the_system' | translate }}\n </aui-menu-item>\n <aui-menu-item\n [actived]=\"themeMode === 'light'\"\n (click)=\"setThemeMode('light')\"\n >\n {{ 'light_theme' | translate }}\n </aui-menu-item>\n <aui-menu-item\n [actived]=\"themeMode === 'dark'\"\n (click)=\"setThemeMode('dark')\"\n >\n {{ 'dark_theme' | translate }}\n </aui-menu-item>\n </aui-submenu>\n\n <aui-submenu class=\"acl-account-menu-item\">\n <div>\n <aui-icon icon=\"prod:globe\"></aui-icon>\n <span>{{ 'language' | translate }}</span>\n </div>\n <aui-menu-item\n *ngFor=\"let lang of languages\"\n [actived]=\"lang.id === $currentLang()\"\n (click)=\"changeLanguage(lang.id)\"\n >\n {{ lang.name }}\n </aui-menu-item>\n </aui-submenu>\n\n <aui-menu-item\n class=\"acl-account-menu-item\"\n [divide]=\"true\"\n (click)=\"logout()\"\n >\n <aui-icon icon=\"sign_out\"></aui-icon>\n <span>{{ 'logout' | translate }}</span>\n </aui-menu-item>\n </aui-menu>\n</ng-template>\n", styles: [":host{display:block}.account-menu{display:flex;align-items:center;padding:0 8px 0 24px;height:32px;border-radius:2px;color:var(--acl-page-header-text-color);cursor:pointer;position:relative}.account-menu__icon{position:absolute;left:-16px;top:0;height:32px;width:32px;border-radius:50%;margin-right:8px}.account-menu:hover,.account-menu.isActive{color:#fff;background-color:rgb(var(--aui-color-primary))}.account-menu:hover .account-menu__icon,.account-menu.isActive .account-menu__icon{border:2px solid rgb(var(--aui-color-primary));height:36px;width:36px;top:-2px;left:-18px}.account-menu__pointer{font-size:12px;margin-left:2px}.account-menu__display{max-width:175px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}::ng-deep .acl-page-header__tooltip{min-width:155px}::ng-deep .acl-page-header__tooltip .aui-menu-item:hover,::ng-deep .acl-page-header__tooltip .aui-submenu:hover{color:rgb(var(--aui-color-primary))}::ng-deep .acl-account-menu-item:not(:hover) .aui-icon{color:rgb(var(--aui-color-n-2))}\n"] }]
}], () => [{ type: i1.AuthorizationStateService }, { type: i2.TranslateService }, { type: i3.ThemeService }, { type: i4.AlaudaMonacoProviderService, decorators: [{
type: Optional
}] }], null); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AccountMenuComponent, { className: "AccountMenuComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3BhZ2Utc2NhZmZvbGQvcGFnZS1oZWFkZXIvYWNjb3VudC1tZW51L2NvbXBvbmVudC9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvcGFnZS1zY2FmZm9sZC9wYWdlLWhlYWRlci9hY2NvdW50LW1lbnUvY29tcG9uZW50L3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbEUsT0FBTyxFQUFhLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFakYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0UsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIscUJBQXFCLEdBQ3RCLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7O0lDTXBDLEFBSkYsc0NBR0MsVUFDTTtJQUNILCtCQVFZO0lBQ1osNEJBQU07SUFBQSxZQUE4Qjs7SUFDdEMsQUFEc0MsaUJBQU8sRUFDdkM7SUFDTix5Q0FHQztJQURDLDhNQUFTLG9CQUFhLFFBQVEsQ0FBQyxLQUFDO0lBRWhDLFlB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ZXNDb250ZW50IjpbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBAbW9kdWxlIGFjY291bnQtbWVudVxuICovXG5cbmltcG9ydCB7IHNldFRoZW1lIGFzIHNldENoYXJ0VGhlbWUgfSBmcm9tICdAYWxhdWRhL2NoYXJ0JztcbmltcG9ydCB7IEFsYXVkYU1vbmFjb1Byb3ZpZGVyU2VydmljZSB9IGZyb20gJ0BhbGF1ZGEvY29kZS1lZGl0b3InO1xuaW1wb3J0IHsgVGhlbWVNb2RlLCBUaGVtZVNlcnZpY2UgfSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIG1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBdXRob3JpemF0aW9uU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vYXV0aG9yaXphdGlvbi9wdWJsaWMtYXBpJztcbmltcG9ydCB0eXBlIHsgQWNjb3VudEluZm8gfSBmcm9tICcuLi8uLi8uLi8uLi9hdXRob3JpemF0aW9uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgTE9DQUxfU1RPUkFHRV9LRVlfVEhFTUVfTU9ERSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQge1xuICBMT0NBTEVfU1RPUkFHRSxcbiAgVHJhbnNsYXRlU2VydmljZSxcbiAgZ2V0QXZhaWxhYmxlTGFuZ3VhZ2VzLFxufSBmcm9tICcuLi8uLi8uLi8uLi90cmFuc2xhdGUvcHVibGljLWFwaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1hY2NvdW50LW1lbnUnLFxuICB0ZW1wbGF0ZVVybDogJ3RlbXBsYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnc3R5bGUuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQWNjb3VudE1lbnVDb21wb25lbnQge1xuICBkaXNwbGF5TmFtZSQgPSB0aGlzLmF1dGhcbiAgICAuZ2V0VG9rZW5QYXlsb2FkPEFjY291bnRJbmZvPigpXG4gICAgLnBpcGUobWFwKGFjY291bnQgPT4gYWNjb3VudC5lbWFpbCB8fCBhY2NvdW50Lm5hbWUpKTtcblxuICB0aGVtZU1vZGU6IHN0cmluZztcblxuICBsYW5ndWFnZXMgPSBnZXRBdmFpbGFibGVMYW5ndWFnZXMoKTtcblxuICAkY3VycmVudExhbmcgPSB0b1NpZ25hbCh0aGlzLnRyYW5zbGF0ZS5sb2NhbGUkKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF1dGg6IEF1dGhvcml6YXRpb25TdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0aGVtZTogVGhlbWVTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIG1vbmFjb1NlcnZpY2U6IEFsYXVkYU1vbmFjb1Byb3ZpZGVyU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5pbml0VGhlbWVNb2RlKCk7XG4gICAgdGhpcy50aGVtZS5jdXJyZW50VGhlbWUkLnN1YnNjcmliZSh0aGVtZSA9PiB7XG4gICAgICBzZXRDaGFydFRoZW1lKHRoZW1lKTtcbiAgICB9KTtcblxuICAgIGlmIChtb25hY29TZXJ2aWNlKSB7XG4gICAgICBtb25hY29TZXJ2aWNlLmluaXRNb25hY28oKS50aGVuKCgpID0+IHtcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgdGhpcy50aGVtZS5jdXJyZW50VGhlbWUkLFxuICAgICAgICAgIG1vbmFjb1NlcnZpY2UudGhlbWVNb2RlJCxcbiAgICAgICAgXSkuc3Vic2NyaWJlKChbdGhlbWUsIG1vZGVdKSA9PiB7XG4gICAgICAgICAgbW9uYWNvU2VydmljZS5jaGFuZ2VUaGVtZU1vZGUobW9kZSwgdGhlbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGxvZ291dCgpIHtcbiAgICAvLyDlrqHorqHorrDlvZXnmbvlh7pcbiAgICB0aGlzLmF1dGgubG9nb3V0V2l0aEF1ZGl0KCk7XG4gIH1cblxuICBjaGFuZ2VMYW5ndWFnZShsYW5nOiBzdHJpbmcpIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTEVfU1RPUkFHRSwgbGFuZyk7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICB9XG5cbiAgc2V0VGhlbWVNb2RlKHY6IFRoZW1lTW9kZSkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZX1RIRU1FX01PREUsIHYpO1xuICAgIHRoaXMudGhlbWVNb2RlID0gdjtcbiAgICB0aGlzLnRoZW1lLnNldFRoZW1lTW9kZSh2KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFRoZW1lTW9kZSgpIHtcbiAgICBsZXQgbG9jYWxUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKExPQ0FMX1NUT1JBR0VfS0VZX1RIRU1FX01PREUpO1xuXG4gICAgaWYgKCFsb2NhbFRoZW1lKSB7XG4gICAgICBsb2NhbFRoZW1lID0gJ3N5c3RlbSc7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMT0NBTF9TVE9SQUdFX0tFWV9USEVNRV9NT0RFLCBsb2NhbFRoZW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLnRoZW1lTW9kZSA9IGxvY2FsVGhlbWU7XG5cbiAgICBpZiAoWydzeXN0ZW0nLCAnbGlnaHQnLCAnZGFyayddLmluY2x1ZGVzKGxvY2FsVGhlbWUpKSB7XG4gICAgICB0aGlzLnRoZW1lLnNldFRoZW1lTW9kZShsb2NhbFRoZW1lIGFzIFRoZW1lTW9kZSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiYWNjb3VudC1tZW51XCJcbiAgW2F1aURyb3Bkb3duXT1cIm1lbnVcIlxuICBbYXVpRHJvcGRvd25DbGFzc109XCInYWNsLXBhZ2UtaGVhZGVyX190b29sdGlwJ1wiXG4+XG4gIDxpbWdcbiAgICBzcmM9XCJoZWFkZXIvcG9ydHJhaXQuc3ZnXCJcbiAgICBjbGFzcz1cImFjY291bnQtbWVudV9faWNvblwiXG4gICAgYWx0PVwicG9ydHJhaXRcIlxuICAvPlxuICA8ZGl2IGNsYXNzPVwiYWNjb3VudC1tZW51X19kaXNwbGF5XCI+e3sgZGlzcGxheU5hbWUkIHwgYXN5bmMgfX08L2Rpdj5cbiAgPGF1aS1pY29uXG4gICAgY2xhc3M9XCJhY2NvdW50LW1lbnVfX3BvaW50ZXJcIlxuICAgIGljb249XCJhbmdsZV9kb3duXCJcbiAgPjwvYXVpLWljb24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNtZW51PlxuICA8YXVpLW1lbnU+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgPGF1aS1zdWJtZW51XG4gICAgICAqbmdJZj1cInRoZW1lTW9kZSAhPT0gJ2N1c3RvbSdcIlxuICAgICAgY2xhc3M9XCJhY2wtYWNjb3VudC1tZW51LWl0ZW1cIlxuICAgID5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxhdWktaWNvblxuICAgICAgICAgIFtpY29uXT1cIlxuICAgICAgICAgICAgdGhlbWVNb2RlID09PSAnc3lzdGVtJ1xuICAgICAgICAgICAgICA/ICdjb21wdXRlcidcbiAgICAgICAgICAgICAgOiB0aGVtZU1vZGUgPT09ICdsaWdodCdcbiAgICAgICAgICAgICAgICA/ICdzdW4nXG4gICAgICAgICAgICAgICAgOiAnbW9vbidcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9hdWktaWNvbj5cbiAgICAgICAgPHNwYW4+e3sgJ2FwcGVhcmFuY2UnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8YXVpLW1lbnUtaXRlbVxuICAgICAgICBbYWN0aXZlZF09XCJ0aGVtZU1vZGUgPT09ICdzeXN0ZW0nXCJcbiAgICAgICAgKGNsaWNrKT1cInNldFRoZW1lTW9kZSgnc3lzdGVtJylcIlxuICAgICAgPlxuICAgICAgICB7eyAnZm9sbG93X3RoZV9zeXN0ZW0nIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2F1aS1tZW51LWl0ZW0+XG4gICAgICA8YXVpLW1lbnUtaXRlbVxuICAgICAgICBbYWN0aXZlZF09XCJ0aGVtZU1vZGUgPT09ICdsaWdodCdcIlxuICAgICAgICAoY2xpY2spPVwic2V0VGhlbWVNb2RlKCdsaWdodCcpXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpZ2h0X3RoZW1lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9hdWktbWVudS1pdGVtPlxuICAgICAgPGF1aS1tZW51LWl0ZW1cbiAgICAgICAgW2FjdGl2ZWRdPVwidGhlbWVNb2RlID09PSAnZGFyaydcIlxuICAgICAgICAoY2xpY2spPVwic2V0VGhlbWVNb2RlKCdkYXJrJylcIlxuICAgICAgPlxuICAgICAgICB7eyAnZGFya190aGVtZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW1lbnUtaXRlbT5cbiAgICA8L2F1aS1zdWJtZW51PlxuXG4gICAgPGF1aS1zdWJtZW51IGNsYXNzPVwiYWNsLWFjY291bnQtbWVudS1pdGVtXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YXVpLWljb24gaWNvbj1cInByb2Q6Z2xvYmVcIj48L2F1aS1pY29uPlxuICAgICAgICA8c3Bhbj57eyAnbGFuZ3VhZ2UnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8YXVpLW1lbnUtaXRlbVxuICAgICAgICAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5ndWFnZXNcIlxuICAgICAgICBbYWN0aXZlZF09XCJsYW5nLmlkID09PSAkY3VycmVudExhbmcoKVwiXG4gICAgICAgIChjbGljayk9XCJjaGFuZ2VMYW5ndWFnZShsYW5nLmlkKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGxhbmcubmFtZSB9fVxuICAgICAgPC9hdWktbWVudS1pdGVtPlxuICAgIDwvYXVpLXN1Ym1lbnU+XG5cbiAgICA8YXVpLW1lbnUtaXRlbVxuICAgICAgY2xhc3M9XCJhY2wtYWNjb3VudC1tZW51LWl0ZW1cIlxuICAgICAgW2RpdmlkZV09XCJ0cnVlXCJcbiAgICAgIChjbGljayk9XCJsb2dvdXQoKVwiXG4gICAgPlxuICAgICAgPGF1aS1pY29uIGljb249XCJzaWduX291dFwiPjwvYXVpLWljb24+XG4gICAgICA8c3Bhbj57eyAnbG9nb3V0JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2F1aS1tZW51LWl0ZW0+XG4gIDwvYXVpLW1lbnU+XG48L25nLXRlbXBsYXRlPlxuIl19