UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

180 lines 47.2 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { HeaderViewMode } from '../../enums/header-view-mode.enum'; import { SignInType } from '../../enums/sign-in-type.enum'; import { ButtonType } from '../../enums/button-type.enum'; import { DividerMode } from '../../enums/divider-mode.enum'; import { DividerAxis } from '../../enums/divider-axis.enum'; import { DividerDensity } from '../../enums/divider-density.enum'; import { DividerType } from '../../enums/divider-type.enum'; import { TimerType } from '../../enums/timer-type.enum'; import { SignInMode } from '../../enums/sign-in-mode.enum'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@angular/common"; import * as i3 from "@angular/flex-layout/flex"; import * as i4 from "@angular/flex-layout/extended"; import * as i5 from "../button/button.component"; import * as i6 from "../divider/divider.component"; import * as i7 from "../sign-in/sign-in.component"; import * as i8 from "../timer/timer.component"; export class HeaderComponent { router; viewMode = HeaderViewMode.default; hasMenu = true; // logo hasLogo = true; logoUrl = ''; // URL para logo externa ou caminho para imagem local logoAlt = 'Logo'; // Texto alternativo para a imagem // title and description title; description; // timer hasTimer = false; timeLogout = 1800; timeCritical = 300; // action bar hasNotificationIcon = true; userName = 'Entrar'; signinMode = SignInMode.logout; // Language Selector hasLanguageSelector = true; languageOptions = []; // Array de opções de idioma currentLanguageCode = ''; // Código do idioma atual hasThemeToggle = true; menuEvent = new EventEmitter; criticalTimeEvent = new EventEmitter; timeOutEvent = new EventEmitter; timeEvent = new EventEmitter; notificationIconEvent = new EventEmitter; signinEvent = new EventEmitter; logoutEvent = new EventEmitter; themeToggleEvent = new EventEmitter(); languageChangeEvent = new EventEmitter(); viewModeChange = new EventEmitter(); headerViewModes = HeaderViewMode; dividerModes = DividerMode; dividerTypes = DividerType; dividerDensities = DividerDensity; dividerAxis = DividerAxis; signinTypes = SignInType; signinModes = SignInMode; buttonTypes = ButtonType; timerTypes = TimerType; languageDropdownOpen = false; constructor(router) { this.router = router; // Recuperar tema salvo para o header, se existir const savedHeaderTheme = localStorage.getItem('headerTheme'); if (savedHeaderTheme) { this.viewMode = savedHeaderTheme; } } toggleMenu() { this.menuEvent.emit(); } goToHome() { if (this.router.url !== '/') { this.router.navigate(['/']); } } get firstAndLastName() { const splitedName = this.userName.trim().split(' '); if (splitedName.length === 1) { return splitedName[0]; } else { return `${splitedName[0]} ${splitedName[splitedName.length - 1]}`; } } toggleLanguageDropdown() { this.languageDropdownOpen = !this.languageDropdownOpen; } selectLanguage(langCode) { this.currentLanguageCode = langCode; this.languageDropdownOpen = false; this.languageChangeEvent.emit(langCode); } get currentLanguageDisplay() { if (!this.currentLanguageCode && this.languageOptions.length > 0) { this.currentLanguageCode = this.languageOptions[0].code; } // Retorna o display name (se disponível) ou o código do idioma const currentLang = this.languageOptions.find(lang => lang.code === this.currentLanguageCode); return currentLang ? (currentLang.name || currentLang.code) : this.currentLanguageCode; } /** * Toggle entre os modos de tema do header (claro/escuro) */ toggleTheme() { // Toggle entre os modos default e contrast this.viewMode = this.viewMode === HeaderViewMode.default ? HeaderViewMode.contrast : HeaderViewMode.default; // Emitir eventos para notificar componentes pais this.viewModeChange.emit(this.viewMode); this.themeToggleEvent.emit(this.viewMode); // Salvar preferência apenas para o header localStorage.setItem('headerTheme', this.viewMode); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: HeaderComponent, selector: "cfc-header", inputs: { viewMode: "viewMode", hasMenu: "hasMenu", hasLogo: "hasLogo", logoUrl: "logoUrl", logoAlt: "logoAlt", title: "title", description: "description", hasTimer: "hasTimer", timeLogout: "timeLogout", timeCritical: "timeCritical", hasNotificationIcon: "hasNotificationIcon", userName: "userName", signinMode: "signinMode", hasLanguageSelector: "hasLanguageSelector", languageOptions: "languageOptions", currentLanguageCode: "currentLanguageCode", hasThemeToggle: "hasThemeToggle" }, outputs: { menuEvent: "menuEvent", criticalTimeEvent: "criticalTimeEvent", timeOutEvent: "timeOutEvent", timeEvent: "timeEvent", notificationIconEvent: "notificationIconEvent", signinEvent: "signinEvent", logoutEvent: "logoutEvent", themeToggleEvent: "themeToggleEvent", languageChangeEvent: "languageChangeEvent", viewModeChange: "viewModeChange" }, ngImport: i0, template: "<header\r\n class=\"cfc-header\"\r\n [ngClass]=\"{\r\n 'cfc-header--light': viewMode === headerViewModes.default,\r\n 'cfc-header--dark': viewMode === headerViewModes.contrast\r\n }\"\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"space-between center\">\r\n <div\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"center center\"\r\n fxLayoutGap=\"1rem\">\r\n\r\n <!-- MENU -->\r\n <cfc-button\r\n *ngIf=\"hasMenu\"\r\n [icon]=\"'bars'\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [circle]=\"true\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n aria-label=\"menu\"\r\n data-toggle=\"menu\"\r\n data-target=\"#menu-aside\"\r\n is-push=\"true\"\r\n id=\"push\"\r\n [attr.show-menu]=\"'true'\"\r\n (click)=\"toggleMenu()\">\r\n </cfc-button>\r\n\r\n <!-- LOGO - Sem modifica\u00E7\u00E3o baseada no tema -->\r\n <div *ngIf=\"hasLogo\" class=\"cfc-header__logo-container\" (click)=\"goToHome()\">\r\n <img \r\n [src]=\"logoUrl\" \r\n [alt]=\"logoAlt\" \r\n class=\"cfc-header__logo\"\r\n [ngClass]=\"{\r\n 'cfc-header__logo--clickable': router.url !== '/'\r\n }\">\r\n </div>\r\n\r\n <!-- TITLE AND DESCRIPTION -->\r\n <div\r\n fxLayout=\"column\"\r\n fxLayoutAlign=\"center start\">\r\n <h4\r\n class=\"cfc-header__title\">\r\n {{ title }}\r\n </h4>\r\n <p\r\n *ngIf=\"description\"\r\n class=\"cfc-header__description\">\r\n {{ description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- ACTION BAR -->\r\n <div\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"center center\"\r\n fxLayoutGap=\"0.5rem\">\r\n\r\n <!-- Divider antes do Timer -->\r\n <cfc-divider\r\n *ngIf=\"hasTimer\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default ? dividerTypes.primary : dividerTypes.secondary\"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <cfc-timer\r\n *ngIf=\"hasTimer\"\r\n [type]=\"viewMode === headerViewModes.default\r\n ? timerTypes.primary\r\n : timerTypes.secondary\r\n \"\r\n [initialTime]=\"timeLogout\"\r\n [criticalTime]=\"timeCritical\"\r\n [isGlobal]=\"true\"\r\n (timeCriticalEvent)=\"criticalTimeEvent.emit()\"\r\n (timeOutEvent)=\"timeOutEvent.emit()\"\r\n (timeEvent)=\"timeEvent.emit()\"\r\n ></cfc-timer>\r\n\r\n <!-- Divider depois do Timer -->\r\n <cfc-divider\r\n *ngIf=\"hasTimer\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default ? dividerTypes.primary : dividerTypes.secondary\"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <cfc-button\r\n *ngIf=\"hasNotificationIcon\"\r\n style=\"min-width: 2.2rem;\"\r\n [icon]=\"'bell'\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n [circle]=\"true\"\r\n (onClick)=\"notificationIconEvent.emit()\"\r\n data-toggle=\"menu\"\r\n data-target=\"#push\"\r\n ></cfc-button>\r\n\r\n <cfc-divider\r\n *ngIf=\"!hasNotificationIcon\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default\r\n ? dividerTypes.primary\r\n : dividerTypes.secondary\r\n \"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <!-- Theme Toggle Button -->\r\n <cfc-button \r\n *ngIf=\"hasThemeToggle\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [circle]=\"true\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n [icon]=\"viewMode === headerViewModes.contrast ? 'sun' : 'moon'\"\r\n (onClick)=\"toggleTheme()\"\r\n aria-label=\"Alternar tema\">\r\n </cfc-button>\r\n\r\n <!-- Language Selector -->\r\n <div *ngIf=\"hasLanguageSelector && languageOptions.length > 0\" class=\"cfc-header__language-selector\">\r\n <button class=\"cfc-header__language-button\" \r\n [ngClass]=\"{'cfc-header__language-button--dark': viewMode === headerViewModes.contrast}\"\r\n (click)=\"toggleLanguageDropdown()\">\r\n <span>{{ currentLanguageDisplay }}</span>\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </button>\r\n <ul *ngIf=\"languageDropdownOpen\" class=\"cfc-header__language-dropdown\">\r\n <li *ngFor=\"let lang of languageOptions\" \r\n (click)=\"selectLanguage(lang.code)\"\r\n [class.active]=\"lang.code === currentLanguageCode\">\r\n {{ lang.name || lang.code }}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <cfc-sign-in\r\n class=\"cfc-header__signin\"\r\n [label]=\"firstAndLastName\"\r\n [type]=\"signinTypes.secondary\"\r\n [mode]=\"signinMode\"\r\n (onClick)=\"signinEvent.emit()\"\r\n (onLogout)=\"logoutEvent.emit()\"\r\n ></cfc-sign-in>\r\n </div>\r\n</header>\r\n\r\n<div class=\"cfc-header__spacer\"></div>", styles: ["*{margin:0;padding:0;box-sizing:border-box}:host{display:block;--header-primary-color: #0C326F;--header-text-color-light: #333;--header-text-color-dark: white;--header-background-light: white;--header-background-dark: #0C326F;--header-shadow: 0 0 8px 1px rgba(193, 193, 193, .5);--header-dark-shadow: 0 0 8px 1px rgba(0, 0, 0, .3);--header-transition-time: .3s}.cfc-header{position:fixed;top:0;left:0;width:100%;height:4rem;padding:0 1.5rem;z-index:999;display:flex;justify-content:space-between;align-items:center;transition:background-color var(--header-transition-time),color var(--header-transition-time),box-shadow var(--header-transition-time)}.cfc-header--light{background-color:var(--header-background-light);color:var(--header-text-color-light);box-shadow:var(--header-shadow)}.cfc-header--dark{background-color:var(--header-background-dark);color:var(--header-text-color-dark);box-shadow:var(--header-dark-shadow)}.cfc-header__logo{max-height:2.5rem;max-width:100px;object-fit:contain}.cfc-header__logo--clickable{cursor:pointer}.cfc-header__logo-container{display:flex;align-items:center;justify-content:center;height:100%;cursor:pointer}.cfc-header__title{font-size:1rem;font-weight:600;margin:0}.cfc-header__description{font-size:.75rem;opacity:.7;margin:0}.cfc-header__theme-button{background:none;border:none;cursor:pointer;display:flex;align-items:center;padding:.5rem;border-radius:4px;transition:background-color .2s}.cfc-header__theme-button i{font-size:1.1rem;margin-right:.5rem;transition:transform .3s ease}.cfc-header__theme-button:hover{background-color:#0000000d}.cfc-header--dark .cfc-header__theme-button:hover{background-color:#ffffff1a}.cfc-header__theme-button:hover i{transform:rotate(30deg)}.cfc-header__theme-button--dark{color:var(--header-text-color-dark)}.cfc-header__theme-button--dark:hover{background-color:#ffffff1a}.cfc-header__language-selector{position:relative}.cfc-header__language-button{display:flex;align-items:center;gap:.5rem;background:none;border:none;padding:.5rem;cursor:pointer}.cfc-header__language-button--dark{color:var(--header-text-color-dark)}.cfc-header__language-dropdown{position:absolute;top:100%;right:0;list-style:none;background-color:#fff;border-radius:4px;box-shadow:0 2px 8px #00000026;min-width:100px;z-index:1000}.cfc-header__language-dropdown li{padding:.5rem 1rem;cursor:pointer;transition:background-color .2s}.cfc-header__language-dropdown li:hover{background-color:#f5f5f5}.cfc-header__language-dropdown li.active{background-color:#e6f7ff}.cfc-header__spacer{height:4rem;width:100%}.theme-toggle-text{font-size:.9rem}@media (max-width: 768px){.theme-toggle-text{display:none}}:host ::ng-deep .br-divider.vertical{height:24px!important;min-height:24px;margin:0 4px!important;opacity:.5;display:block!important}:host ::ng-deep .br-divider.vertical.dark-mode{background-color:#ffffff4d!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.ButtonComponent, selector: "cfc-button", inputs: ["label", "type", "submit", "circle", "density", "disabled", "block", "icon", "active", "inverted", "loading"], outputs: ["onClick"] }, { kind: "component", type: i6.DividerComponent, selector: "cfc-divider", inputs: ["height", "width", "mode", "type", "axis", "density"] }, { kind: "component", type: i7.SignInComponent, selector: "cfc-sign-in", inputs: ["label", "type", "density", "mode", "disabled", "active", "block", "circle", "externalImageUrl", "externalLabel"], outputs: ["onClick", "onLogout"] }, { kind: "component", type: i8.TimerComponent, selector: "cfc-timer", inputs: ["type", "initialTime", "criticalTime", "isGlobal"], outputs: ["timeOutEvent", "timeEvent", "timeCriticalEvent"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-header', template: "<header\r\n class=\"cfc-header\"\r\n [ngClass]=\"{\r\n 'cfc-header--light': viewMode === headerViewModes.default,\r\n 'cfc-header--dark': viewMode === headerViewModes.contrast\r\n }\"\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"space-between center\">\r\n <div\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"center center\"\r\n fxLayoutGap=\"1rem\">\r\n\r\n <!-- MENU -->\r\n <cfc-button\r\n *ngIf=\"hasMenu\"\r\n [icon]=\"'bars'\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [circle]=\"true\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n aria-label=\"menu\"\r\n data-toggle=\"menu\"\r\n data-target=\"#menu-aside\"\r\n is-push=\"true\"\r\n id=\"push\"\r\n [attr.show-menu]=\"'true'\"\r\n (click)=\"toggleMenu()\">\r\n </cfc-button>\r\n\r\n <!-- LOGO - Sem modifica\u00E7\u00E3o baseada no tema -->\r\n <div *ngIf=\"hasLogo\" class=\"cfc-header__logo-container\" (click)=\"goToHome()\">\r\n <img \r\n [src]=\"logoUrl\" \r\n [alt]=\"logoAlt\" \r\n class=\"cfc-header__logo\"\r\n [ngClass]=\"{\r\n 'cfc-header__logo--clickable': router.url !== '/'\r\n }\">\r\n </div>\r\n\r\n <!-- TITLE AND DESCRIPTION -->\r\n <div\r\n fxLayout=\"column\"\r\n fxLayoutAlign=\"center start\">\r\n <h4\r\n class=\"cfc-header__title\">\r\n {{ title }}\r\n </h4>\r\n <p\r\n *ngIf=\"description\"\r\n class=\"cfc-header__description\">\r\n {{ description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- ACTION BAR -->\r\n <div\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"center center\"\r\n fxLayoutGap=\"0.5rem\">\r\n\r\n <!-- Divider antes do Timer -->\r\n <cfc-divider\r\n *ngIf=\"hasTimer\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default ? dividerTypes.primary : dividerTypes.secondary\"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <cfc-timer\r\n *ngIf=\"hasTimer\"\r\n [type]=\"viewMode === headerViewModes.default\r\n ? timerTypes.primary\r\n : timerTypes.secondary\r\n \"\r\n [initialTime]=\"timeLogout\"\r\n [criticalTime]=\"timeCritical\"\r\n [isGlobal]=\"true\"\r\n (timeCriticalEvent)=\"criticalTimeEvent.emit()\"\r\n (timeOutEvent)=\"timeOutEvent.emit()\"\r\n (timeEvent)=\"timeEvent.emit()\"\r\n ></cfc-timer>\r\n\r\n <!-- Divider depois do Timer -->\r\n <cfc-divider\r\n *ngIf=\"hasTimer\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default ? dividerTypes.primary : dividerTypes.secondary\"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <cfc-button\r\n *ngIf=\"hasNotificationIcon\"\r\n style=\"min-width: 2.2rem;\"\r\n [icon]=\"'bell'\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n [circle]=\"true\"\r\n (onClick)=\"notificationIconEvent.emit()\"\r\n data-toggle=\"menu\"\r\n data-target=\"#push\"\r\n ></cfc-button>\r\n\r\n <cfc-divider\r\n *ngIf=\"!hasNotificationIcon\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default\r\n ? dividerTypes.primary\r\n : dividerTypes.secondary\r\n \"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <!-- Theme Toggle Button -->\r\n <cfc-button \r\n *ngIf=\"hasThemeToggle\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [circle]=\"true\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n [icon]=\"viewMode === headerViewModes.contrast ? 'sun' : 'moon'\"\r\n (onClick)=\"toggleTheme()\"\r\n aria-label=\"Alternar tema\">\r\n </cfc-button>\r\n\r\n <!-- Language Selector -->\r\n <div *ngIf=\"hasLanguageSelector && languageOptions.length > 0\" class=\"cfc-header__language-selector\">\r\n <button class=\"cfc-header__language-button\" \r\n [ngClass]=\"{'cfc-header__language-button--dark': viewMode === headerViewModes.contrast}\"\r\n (click)=\"toggleLanguageDropdown()\">\r\n <span>{{ currentLanguageDisplay }}</span>\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </button>\r\n <ul *ngIf=\"languageDropdownOpen\" class=\"cfc-header__language-dropdown\">\r\n <li *ngFor=\"let lang of languageOptions\" \r\n (click)=\"selectLanguage(lang.code)\"\r\n [class.active]=\"lang.code === currentLanguageCode\">\r\n {{ lang.name || lang.code }}\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <cfc-sign-in\r\n class=\"cfc-header__signin\"\r\n [label]=\"firstAndLastName\"\r\n [type]=\"signinTypes.secondary\"\r\n [mode]=\"signinMode\"\r\n (onClick)=\"signinEvent.emit()\"\r\n (onLogout)=\"logoutEvent.emit()\"\r\n ></cfc-sign-in>\r\n </div>\r\n</header>\r\n\r\n<div class=\"cfc-header__spacer\"></div>", styles: ["*{margin:0;padding:0;box-sizing:border-box}:host{display:block;--header-primary-color: #0C326F;--header-text-color-light: #333;--header-text-color-dark: white;--header-background-light: white;--header-background-dark: #0C326F;--header-shadow: 0 0 8px 1px rgba(193, 193, 193, .5);--header-dark-shadow: 0 0 8px 1px rgba(0, 0, 0, .3);--header-transition-time: .3s}.cfc-header{position:fixed;top:0;left:0;width:100%;height:4rem;padding:0 1.5rem;z-index:999;display:flex;justify-content:space-between;align-items:center;transition:background-color var(--header-transition-time),color var(--header-transition-time),box-shadow var(--header-transition-time)}.cfc-header--light{background-color:var(--header-background-light);color:var(--header-text-color-light);box-shadow:var(--header-shadow)}.cfc-header--dark{background-color:var(--header-background-dark);color:var(--header-text-color-dark);box-shadow:var(--header-dark-shadow)}.cfc-header__logo{max-height:2.5rem;max-width:100px;object-fit:contain}.cfc-header__logo--clickable{cursor:pointer}.cfc-header__logo-container{display:flex;align-items:center;justify-content:center;height:100%;cursor:pointer}.cfc-header__title{font-size:1rem;font-weight:600;margin:0}.cfc-header__description{font-size:.75rem;opacity:.7;margin:0}.cfc-header__theme-button{background:none;border:none;cursor:pointer;display:flex;align-items:center;padding:.5rem;border-radius:4px;transition:background-color .2s}.cfc-header__theme-button i{font-size:1.1rem;margin-right:.5rem;transition:transform .3s ease}.cfc-header__theme-button:hover{background-color:#0000000d}.cfc-header--dark .cfc-header__theme-button:hover{background-color:#ffffff1a}.cfc-header__theme-button:hover i{transform:rotate(30deg)}.cfc-header__theme-button--dark{color:var(--header-text-color-dark)}.cfc-header__theme-button--dark:hover{background-color:#ffffff1a}.cfc-header__language-selector{position:relative}.cfc-header__language-button{display:flex;align-items:center;gap:.5rem;background:none;border:none;padding:.5rem;cursor:pointer}.cfc-header__language-button--dark{color:var(--header-text-color-dark)}.cfc-header__language-dropdown{position:absolute;top:100%;right:0;list-style:none;background-color:#fff;border-radius:4px;box-shadow:0 2px 8px #00000026;min-width:100px;z-index:1000}.cfc-header__language-dropdown li{padding:.5rem 1rem;cursor:pointer;transition:background-color .2s}.cfc-header__language-dropdown li:hover{background-color:#f5f5f5}.cfc-header__language-dropdown li.active{background-color:#e6f7ff}.cfc-header__spacer{height:4rem;width:100%}.theme-toggle-text{font-size:.9rem}@media (max-width: 768px){.theme-toggle-text{display:none}}:host ::ng-deep .br-divider.vertical{height:24px!important;min-height:24px;margin:0 4px!important;opacity:.5;display:block!important}:host ::ng-deep .br-divider.vertical.dark-mode{background-color:#ffffff4d!important}\n"] }] }], ctorParameters: () => [{ type: i1.Router }], propDecorators: { viewMode: [{ type: Input }], hasMenu: [{ type: Input }], hasLogo: [{ type: Input }], logoUrl: [{ type: Input }], logoAlt: [{ type: Input }], title: [{ type: Input }], description: [{ type: Input }], hasTimer: [{ type: Input }], timeLogout: [{ type: Input }], timeCritical: [{ type: Input }], hasNotificationIcon: [{ type: Input }], userName: [{ type: Input }], signinMode: [{ type: Input }], hasLanguageSelector: [{ type: Input }], languageOptions: [{ type: Input }], currentLanguageCode: [{ type: Input }], hasThemeToggle: [{ type: Input }], menuEvent: [{ type: Output }], criticalTimeEvent: [{ type: Output }], timeOutEvent: [{ type: Output }], timeEvent: [{ type: Output }], notificationIconEvent: [{ type: Output }], signinEvent: [{ type: Output }], logoutEvent: [{ type: Output }], themeToggleEvent: [{ type: Output }], languageChangeEvent: [{ type: Output }], viewModeChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NmYy1kcy9zcmMvbGliL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7OztBQVkzRCxNQUFNLE9BQU8sZUFBZTtJQWlEUDtJQS9DVixRQUFRLEdBQW1CLGNBQWMsQ0FBQyxPQUFPLENBQUM7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixPQUFPO0lBQ0UsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLE9BQU8sR0FBVyxFQUFFLENBQUMsQ0FBQyxxREFBcUQ7SUFDM0UsT0FBTyxH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QVEsQ0FBQyxDQUFDO1FBRTFDLDBDQUEwQztRQUMxQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQzt3R0EvR1UsZUFBZTs0RkFBZixlQUFlLHUzQkN0QjVCLDJrS0E0SnNDOzs0RkR0SXpCLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsWUFBWTsyRUFNYixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEhlYWRlclZpZXdNb2RlIH0gZnJvbSAnLi4vLi4vZW51bXMvaGVhZGVyLXZpZXctbW9kZS5lbnVtJztcclxuaW1wb3J0IHsgU2lnbkluVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NpZ24taW4tdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgQnV0dG9uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2J1dHRvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBEaXZpZGVyTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL2RpdmlkZXItbW9kZS5lbnVtJztcclxuaW1wb3J0IHsgRGl2aWRlckF4aXMgfSBmcm9tICcuLi8uLi9lbnVtcy9kaXZpZGVyLWF4aXMuZW51bSc7XHJcbmltcG9ydCB7IERpdmlkZXJEZW5zaXR5IH0gZnJvbSAnLi4vLi4vZW51bXMvZGl2aWRlci1kZW5zaXR5LmVudW0nO1xyXG5pbXBvcnQgeyBEaXZpZGVyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2RpdmlkZXItdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVGltZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdGltZXItdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgU2lnbkluTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL3NpZ24taW4tbW9kZS5lbnVtJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGFuZ3VhZ2VPcHRpb24ge1xyXG4gIGNvZGU6IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy1oZWFkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9oZWFkZXIuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXJDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSB2aWV3TW9kZTogSGVhZGVyVmlld01vZGUgPSBIZWFkZXJWaWV3TW9kZS5kZWZhdWx0O1xyXG4gIEBJbnB1dCgpIGhhc01lbnUgPSB0cnVlO1xyXG4gIC8vIGxvZ29cclxuICBASW5wdXQoKSBoYXNMb2dvID0gdHJ1ZTtcclxuICBASW5wdXQoKSBsb2dvVXJsOiBzdHJpbmcgPSAnJzsgLy8gVVJMIHBhcmEgbG9nbyBleHRlcm5hIG91IGNhbWluaG8gcGFyYSBpbWFnZW0gbG9jYWxcclxuICBASW5wdXQoKSBsb2dvQWx0OiBzdHJpbmcgPSAnTG9nbyc7IC8vIFRleHRvIGFsdGVybmF0aXZvIHBhcmEgYSBpbWFnZW1cclxuICAvLyB0aXRsZSBhbmQgZGVzY3JpcHRpb25cclxuICBASW5wdXQoKSB0aXRsZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICAvLyB0aW1lclxyXG4gIEBJbnB1dCgpIGhhc1RpbWVyID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdGltZUxvZ291dCA9IDE4MDA7XHJcbiAgQElucHV0KCkgdGltZUNyaXRpY2FsID0gMzAwO1xyXG4gIC8vIGFjdGlvbiBiYXJcclxuICBASW5wdXQoKSBoYXNOb3RpZmljYXRpb25JY29uID0gdHJ1ZTtcclxuICBASW5wdXQoKSB1c2VyTmFtZSA9ICdFbnRyYXInO1xyXG4gIEBJbnB1dCgpIHNpZ25pbk1vZGU6IFNpZ25Jbk1vZGUgPSBTaWduSW5Nb2RlLmxvZ291dDtcclxuICAvLyBMYW5ndWFnZSBTZWxlY3RvclxyXG4gIEBJbnB1dCgpIGhhc0xhbmd1YWdlU2VsZWN0b3IgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGxhbmd1YWdlT3B0aW9uczogTGFuZ3VhZ2VPcHRpb25bXSA9IFtdOyAvLyBBcnJheSBkZSBvcMOnw7VlcyBkZSBpZGlvbWFcclxuICBASW5wdXQoKSBjdXJyZW50TGFuZ3VhZ2VDb2RlID0gJyc7IC8vIEPDs2RpZ28gZG8gaWRpb21hIGF0dWFsXHJcbiAgQElucHV0KCkgaGFzVGhlbWVUb2dnbGUgPSB0cnVlO1xyXG5cclxuICBAT3V0cHV0KCkgbWVudUV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+O1xyXG4gIEBPdXRwdXQoKSBjcml0aWNhbFRpbWVFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPjtcclxuICBAT3V0cHV0KCkgdGltZU91dEV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+O1xyXG4gIEBPdXRwdXQoKSB0aW1lRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD47XHJcbiAgQE91dHB1dCgpIG5vdGlmaWNhdGlvbkljb25FdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPjtcclxuICBAT3V0cHV0KCkgc2lnbmluRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD47XHJcbiAgQE91dHB1dCgpIGxvZ291dEV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+O1xyXG4gIEBPdXRwdXQoKSB0aGVtZVRvZ2dsZUV2ZW50OiBFdmVudEVtaXR0ZXI8SGVhZGVyVmlld01vZGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxIZWFkZXJWaWV3TW9kZT4oKTtcclxuICBAT3V0cHV0KCkgbGFuZ3VhZ2VDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgdmlld01vZGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxIZWFkZXJWaWV3TW9kZT4gPSBuZXcgRXZlbnRFbWl0dGVyPEhlYWRlclZpZXdNb2RlPigpO1xyXG4gIFxyXG5cclxuICByZWFkb25seSBoZWFkZXJWaWV3TW9kZXMgPSBIZWFkZXJWaWV3TW9kZTtcclxuICByZWFkb25seSBkaXZpZGVyTW9kZXMgPSBEaXZpZGVyTW9kZTtcclxuICByZWFkb25seSBkaXZpZGVyVHlwZXMgPSBEaXZpZGVyVHlwZTtcclxuICByZWFkb25seSBkaXZpZGVyRGVuc2l0aWVzID0gRGl2aWRlckRlbnNpdHk7XHJcbiAgcmVhZG9ubHkgZGl2aWRlckF4aXMgPSBEaXZpZGVyQXhpcztcclxuICByZWFkb25seSBzaWduaW5UeXBlcyA9IFNpZ25JblR5cGU7XHJcbiAgcmVhZG9ubHkgc2lnbmluTW9kZXMgPSBTaWduSW5Nb2RlO1xyXG4gIHJlYWRvbmx5IGJ1dHRvblR5cGVzID0gQnV0dG9uVHlwZTtcclxuICByZWFkb25seSB0aW1lclR5cGVzID0gVGltZXJUeXBlO1xyXG5cclxuICBsYW5ndWFnZURyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm91dGVyOiBSb3V0ZXIpIHtcclxuICAgIC8vIFJlY3VwZXJhciB0ZW1hIHNhbHZvIHBhcmEgbyBoZWFkZXIsIHNlIGV4aXN0aXJcclxuICAgIGNvbnN0IHNhdmVkSGVhZGVyVGhlbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyVGhlbWUnKTtcclxuICAgIGlmIChzYXZlZEhlYWRlclRoZW1lKSB7XHJcbiAgICAgIHRoaXMudmlld01vZGUgPSBzYXZlZEhlYWRlclRoZW1lIGFzIEhlYWRlclZpZXdNb2RlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlTWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMubWVudUV2ZW50LmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGdvVG9Ib21lKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucm91dGVyLnVybCAhPT0gJy8nKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLyddKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBmaXJzdEFuZExhc3ROYW1lKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzcGxpdGVkTmFtZSA9IHRoaXMudXNlck5hbWUudHJpbSgpLnNwbGl0KCcgJyk7XHJcbiAgICBpZiAoc3BsaXRlZE5hbWUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIHJldHVybiBzcGxpdGVkTmFtZVswXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBgJHtzcGxpdGVkTmFtZVswXX0gJHtzcGxpdGVkTmFtZVtzcGxpdGVkTmFtZS5sZW5ndGggLSAxXX1gO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlTGFuZ3VhZ2VEcm9wZG93bigpOiB2b2lkIHtcclxuICAgIHRoaXMubGFuZ3VhZ2VEcm9wZG93bk9wZW4gPSAhdGhpcy5sYW5ndWFnZURyb3Bkb3duT3BlbjtcclxuICB9XHJcblxyXG4gIHNlbGVjdExhbmd1YWdlKGxhbmdDb2RlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudExhbmd1YWdlQ29kZSA9IGxhbmdDb2RlO1xyXG4gICAgdGhpcy5sYW5ndWFnZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5sYW5ndWFnZUNoYW5nZUV2ZW50LmVtaXQobGFuZ0NvZGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbnRMYW5ndWFnZURpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5jdXJyZW50TGFuZ3VhZ2VDb2RlICYmIHRoaXMubGFuZ3VhZ2VPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VDb2RlID0gdGhpcy5sYW5ndWFnZU9wdGlvbnNbMF0uY29kZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gUmV0b3JuYSBvIGRpc3BsYXkgbmFtZSAoc2UgZGlzcG9uw612ZWwpIG91IG8gY8OzZGlnbyBkbyBpZGlvbWFcclxuICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5sYW5ndWFnZU9wdGlvbnMuZmluZChsYW5nID0+IGxhbmcuY29kZSA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VDb2RlKTtcclxuICAgIHJldHVybiBjdXJyZW50TGFuZyA/IChjdXJyZW50TGFuZy5uYW1lIHx8IGN1cnJlbnRMYW5nLmNvZGUpIDogdGhpcy5jdXJyZW50TGFuZ3VhZ2VDb2RlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGVudHJlIG9zIG1vZG9zIGRlIHRlbWEgZG8gaGVhZGVyIChjbGFyby9lc2N1cm8pXHJcbiAgICovXHJcbiAgdG9nZ2xlVGhlbWUoKTogdm9pZCB7XHJcbiAgICAvLyBUb2dnbGUgZW50cmUgb3MgbW9kb3MgZGVmYXVsdCBlIGNvbnRyYXN0XHJcbiAgICB0aGlzLnZpZXdNb2RlID0gdGhpcy52aWV3TW9kZSA9PT0gSGVhZGVyVmlld01vZGUuZGVmYXVsdCBcclxuICAgICAgPyBIZWFkZXJWaWV3TW9kZS5jb250cmFzdCBcclxuICAgICAgOiBIZWFkZXJWaWV3TW9kZS5kZWZhdWx0O1xyXG4gICAgXHJcbiAgICAvLyBFbWl0aXIgZXZlbnRvcyBwYXJhIG5vdGlmaWNhciBjb21wb25lbnRlcyBwYWlzXHJcbiAgICB0aGlzLnZpZXdNb2RlQ2hhbmdlLmVtaXQodGhpcy52aWV3TW9kZSk7XHJcbiAgICB0aGlzLnRoZW1lVG9nZ2xlRXZlbnQuZW1pdCh0aGlzLnZpZXdNb2RlKTtcclxuICAgIFxyXG4gICAgLy8gU2FsdmFyIHByZWZlcsOqbmNpYSBhcGVuYXMgcGFyYSBvIGhlYWRlclxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlclRoZW1lJywgdGhpcy52aWV3TW9kZSk7XHJcbiAgfVxyXG59IiwiPGhlYWRlclxyXG4gIGNsYXNzPVwiY2ZjLWhlYWRlclwiXHJcbiAgW25nQ2xhc3NdPVwie1xyXG4gICAgJ2NmYy1oZWFkZXItLWxpZ2h0Jzogdmlld01vZGUgPT09IGhlYWRlclZpZXdNb2Rlcy5kZWZhdWx0LFxyXG4gICAgJ2NmYy1oZWFkZXItLWRhcmsnOiB2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmNvbnRyYXN0XHJcbiAgfVwiXHJcbiAgZnhMYXlvdXQ9XCJyb3dcIlxyXG4gIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIGNlbnRlclwiPlxyXG4gIDxkaXZcclxuICAgIGZ4TGF5b3V0PVwicm93XCJcclxuICAgIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCJcclxuICAgIGZ4TGF5b3V0R2FwPVwiMXJlbVwiPlxyXG5cclxuICAgIDwhLS0gTUVOVSAtLT5cclxuICAgIDxjZmMtYnV0dG9uXHJcbiAgICAgICpuZ0lmPVwiaGFzTWVudVwiXHJcbiAgICAgIFtpY29uXT1cIidiYXJzJ1wiXHJcbiAgICAgIFt0eXBlXT1cImJ1dHRvblR5cGVzLnRlcnRpYXJ5XCJcclxuICAgICAgW2NpcmNsZV09XCJ0cnVlXCJcclxuICAgICAgW2ludmVydGVkXT1cInZpZXdNb2RlID09PSBoZWFkZXJWaWV3TW9kZXMuY29udHJhc3RcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwibWVudVwiXHJcbiAgICAgIGRhdGEtdG9nZ2xlPVwibWVudVwiXHJcbiAgICAgIGRhdGEtdGFyZ2V0PVwiI21lbnUtYXNpZGVcIlxyXG4gICAgICBpcy1wdXNoPVwidHJ1ZVwiXHJcbiAgICAgIGlkPVwicHVzaFwiXHJcbiAgICAgIFthdHRyLnNob3ctbWVudV09XCIndHJ1ZSdcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgpXCI+XHJcbiAgICA8L2NmYy1idXR0b24+XHJcblxyXG4gICAgPCEtLSBMT0dPIC0gU2VtIG1vZGlmaWNhw6fDo28gYmFzZWFkYSBubyB0ZW1hIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cImhhc0xvZ29cIiBjbGFzcz1cImNmYy1oZWFkZXJfX2xvZ28tY29udGFpbmVyXCIgKGNsaWNrKT1cImdvVG9Ib21lKClcIj5cclxuICAgICAgPGltZyBcclxuICAgICAgICBbc3JjXT1cImxvZ29VcmxcIiBcclxuICAgICAgICBbYWx0XT1cImxvZ29BbHRcIiBcclxuICAgICAgICBjbGFzcz1cImNmYy1oZWFkZXJfX2xvZ29cIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICdjZmMtaGVhZGVyX19sb2dvLS1jbGlja2FibGUnOiByb3V0ZXIudXJsICE9PSAnLydcclxuICAgICAgICB9XCI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFRJVExFIEFORCBERVNDUklQVElPTiAtLT5cclxuICAgIDxkaXZcclxuICAgICAgZnhMYXlvdXQ9XCJjb2x1bW5cIlxyXG4gICAgICBmeExheW91dEFsaWduPVwiY2VudGVyIHN0YXJ0XCI+XHJcbiAgICAgIDxoNFxyXG4gICAgICAgIGNsYXNzPVwiY2ZjLWhlYWRlcl9fdGl0bGVcIj5cclxuICAgICAgICB7eyB0aXRsZSB9fVxyXG4gICAgICA8L2g0PlxyXG4gICAgICA8cFxyXG4gICAgICAgICpuZ0lmPVwiZGVzY3JpcHRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwiY2ZjLWhlYWRlcl9fZGVzY3JpcHRpb25cIj5cclxuICAgICAgICB7eyBkZXNjcmlwdGlvbiB9fVxyXG4gICAgICA8L3A+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBBQ1RJT04gQkFSIC0tPlxyXG4gIDxkaXZcclxuICAgIGZ4TGF5b3V0PVwicm93XCJcclxuICAgIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCJcclxuICAgIGZ4TGF5b3V0R2FwPVwiMC41cmVtXCI+XHJcblxyXG4gICAgPCEtLSBEaXZpZGVyIGFudGVzIGRvIFRpbWVyIC0tPlxyXG4gICAgPGNmYy1kaXZpZGVyXHJcbiAgICAgICpuZ0lmPVwiaGFzVGltZXJcIlxyXG4gICAgICBbbW9kZV09XCJkaXZpZGVyTW9kZXMubGluZVwiXHJcbiAgICAgIFt0eXBlXT1cInZpZXdNb2RlID09PSBoZWFkZXJWaWV3TW9kZXMuZGVmYXVsdCA/IGRpdmlkZXJUeXBlcy5wcmltYXJ5IDogZGl2aWRlclR5cGVzLnNlY29uZGFyeVwiXHJcbiAgICAgIFtkZW5zaXR5XT1cImRpdmlkZXJEZW5zaXRpZXMubGFyZ2VcIlxyXG4gICAgICBbYXhpc109XCJkaXZpZGVyQXhpcy52ZXJ0aWNhbFwiXHJcbiAgICA+PC9jZmMtZGl2aWRlcj5cclxuXHJcbiAgICA8Y2ZjLXRpbWVyXHJcbiAgICAgICpuZ0lmPVwiaGFzVGltZXJcIlxyXG4gICAgICBbdHlwZV09XCJ2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmRlZmF1bHRcclxuICAgICAgICA/IHRpbWVyVHlwZXMucHJpbWFyeVxyXG4gICAgICAgIDogdGltZXJUeXBlcy5zZWNvbmRhcnlcclxuICAgICAgXCJcclxuICAgICAgW2luaXRpYWxUaW1lXT1cInRpbWVMb2dvdXRcIlxyXG4gICAgICBbY3JpdGljYWxUaW1lXT1cInRpbWVDcml0aWNhbFwiXHJcbiAgICAgIFtpc0dsb2JhbF09XCJ0cnVlXCJcclxuICAgICAgKHRpbWVDcml0aWNhbEV2ZW50KT1cImNyaXRpY2FsVGltZUV2ZW50LmVtaXQoKVwiXHJcbiAgICAgICh0aW1lT3V0RXZlbnQpPVwidGltZU91dEV2ZW50LmVtaXQoKVwiXHJcbiAgICAgICh0aW1lRXZlbnQpPVwidGltZUV2ZW50LmVtaXQoKVwiXHJcbiAgICA+PC9jZmMtdGltZXI+XHJcblxyXG4gICAgPCEtLSBEaXZpZGVyIGRlcG9pcyBkbyBUaW1lciAtLT5cclxuICAgIDxjZmMtZGl2aWRlclxyXG4gICAgICAqbmdJZj1cImhhc1RpbWVyXCJcclxuICAgICAgW21vZGVdPVwiZGl2aWRlck1vZGVzLmxpbmVcIlxyXG4gICAgICBbdHlwZV09XCJ2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmRlZmF1bHQgPyBkaXZpZGVyVHlwZXMucHJpbWFyeSA6IGRpdmlkZXJUeXBlcy5zZWNvbmRhcnlcIlxyXG4gICAgICBbZGVuc2l0eV09XCJkaXZpZGVyRGVuc2l0aWVzLmxhcmdlXCJcclxuICAgICAgW2F4aXNdPVwiZGl2aWRlckF4aXMudmVydGljYWxcIlxyXG4gICAgPjwvY2ZjLWRpdmlkZXI+XHJcblxyXG4gICAgPGNmYy1idXR0b25cclxuICAgICAgKm5nSWY9XCJoYXNOb3RpZmljYXRpb25JY29uXCJcclxuICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDIuMnJlbTtcIlxyXG4gICAgICBbaWNvbl09XCInYmVsbCdcIlxyXG4gICAgICBbdHlwZV09XCJidXR0b25UeXBlcy50ZXJ0aWFyeVwiXHJcbiAgICAgIFtpbnZlcnRlZF09XCJ2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmNvbnRyYXN0XCJcclxuICAgICAgW2NpcmNsZV09XCJ0cnVlXCJcclxuICAgICAgKG9uQ2xpY2spPVwibm90aWZpY2F0aW9uSWNvbkV2ZW50LmVtaXQoKVwiXHJcbiAgICAgIGRhdGEtdG9nZ2xlPVwibWVudVwiXHJcbiAgICAgIGRhdGEtdGFyZ2V0PVwiI3B1c2hcIlxyXG4gICAgPjwvY2ZjLWJ1dHRvbj5cclxuXHJcbiAgICA8Y2ZjLWRpdmlkZXJcclxuICAgICAgKm5nSWY9XCIhaGFzTm90aWZpY2F0aW9uSWNvblwiXHJcbiAgICAgIFttb2RlXT1cImRpdmlkZXJNb2Rlcy5saW5lXCJcclxuICAgICAgW3R5cGVdPVwidmlld01vZGUgPT09IGhlYWRlclZpZXdNb2Rlcy5kZWZhdWx0XHJcbiAgICAgICAgPyBkaXZpZGVyVHlwZXMucHJpbWFyeVxyXG4gICAgICAgIDogZGl2aWRlclR5cGVzLnNlY29uZGFyeVxyXG4gICAgICBcIlxyXG4gICAgICBbZGVuc2l0eV09XCJkaXZpZGVyRGVuc2l0aWVzLmxhcmdlXCJcclxuICAgICAgW2F4aXNdPVwiZGl2aWRlckF4aXMudmVydGljYWxcIlxyXG4gICAgPjwvY2ZjLWRpdmlkZXI+XHJcblxyXG4gICAgPCEtLSBUaGVtZSBUb2dnbGUgQnV0dG9uIC0tPlxyXG4gICAgPGNmYy1idXR0b24gXHJcbiAgICAgICpuZ0lmPVwiaGFzVGhlbWVUb2dnbGVcIlxyXG4gICAgICBbdHlwZV09XCJidXR0b25UeXBlcy50ZXJ0aWFyeVwiXHJcbiAgICAgIFtjaXJjbGVdPVwidHJ1ZVwiXHJcbiAgICAgIFtpbnZlcnRlZF09XCJ2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmNvbnRyYXN0XCJcclxuICAgICAgW2ljb25dPVwidmlld01vZGUgPT09IGhlYWRlclZpZXdNb2Rlcy5jb250cmFzdCA/ICdzdW4nIDogJ21vb24nXCJcclxuICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlVGhlbWUoKVwiXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJBbHRlcm5hciB0ZW1hXCI+XHJcbiAgICA8L2NmYy1idXR0b24+XHJcblxyXG4gICAgPCEtLSBMYW5ndWFnZSBTZWxlY3RvciAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJoYXNMYW5ndWFnZVNlbGVjdG9yICYmIGxhbmd1YWdlT3B0aW9ucy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjZmMtaGVhZGVyX19sYW5ndWFnZS1zZWxlY3RvclwiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY2ZjLWhlYWRlcl9fbGFuZ3VhZ2UtYnV0dG9uXCIgXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydjZmMtaGVhZGVyX19sYW5ndWFnZS1idXR0b24tLWRhcmsnOiB2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmNvbnRyYXN0fVwiXHJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxhbmd1YWdlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgIDxzcGFuPnt7IGN1cnJlbnRMYW5ndWFnZURpc3BsYXkgfX08L3NwYW4+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPHVsICpuZ0lmPVwibGFuZ3VhZ2VEcm9wZG93bk9wZW5cIiBjbGFzcz1cImNmYy1oZWFkZXJfX2xhbmd1YWdlLWRyb3Bkb3duXCI+XHJcbiAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBsYW5nIG9mIGxhbmd1YWdlT3B0aW9uc1wiIFxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TGFuZ3VhZ2UobGFuZy5jb2RlKVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibGFuZy5jb2RlID09PSBjdXJyZW50TGFuZ3VhZ2VDb2RlXCI+XHJcbiAgICAgICAgICB7eyBsYW5nLm5hbWUgfHwgbGFuZy5jb2RlIH19XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgPC91bD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxjZmMtc2lnbi1pblxyXG4gICAgICBjbGFzcz1cImNmYy1oZWFkZXJfX3NpZ25pblwiXHJcbiAgICAgIFtsYWJlbF09XCJmaXJzdEFuZExhc3ROYW1lXCJcclxuICAgICAgW3R5cGVdPVwic2lnbmluVHlwZXMuc2Vjb25kYXJ5XCJcclxuICAgICAgW21vZGVdPVwic2lnbmluTW9kZVwiXHJcbiAgICAgIChvbkNsaWNrKT1cInNpZ25pbkV2ZW50LmVtaXQoKVwiXHJcbiAgICAgIChvbkxvZ291dCk9XCJsb2dvdXRFdmVudC5lbWl0KClcIlxyXG4gICAgPjwvY2ZjLXNpZ24taW4+XHJcbiAgPC9kaXY+XHJcbjwvaGVhZGVyPlxyXG5cclxuPGRpdiBjbGFzcz1cImNmYy1oZWFkZXJfX3NwYWNlclwiPjwvZGl2PiJdfQ==