design-angular-kit
Version:
Un toolkit Angular conforme alle linee guida di design per i servizi web della PA
103 lines • 28.3 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
import { ItIconComponent } from '../../utils/icon/icon.component';
import { ItNavBarModule } from '../navbar/navbar.module';
import { ItNavBarComponent } from '../navbar/navbar/navbar.component';
import { ItButtonDirective } from '../../core/button/button.directive';
import { inputToBoolean } from '../../../utils/coercion';
import { HeaderSticky } from 'bootstrap-italia';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
import * as i2 from "../navbar/navbar/navbar.component";
export class ItHeaderComponent {
constructor() {
this.showSlim = true;
this.smallHeader = true;
this.showSearch = true;
this.slimTitleLink = '#';
this.loginStyle = 'none';
this.expand = true;
this.loginClick = new EventEmitter();
this.searchClick = new EventEmitter();
}
ngAfterViewInit() {
this.updateListeners();
}
ngOnChanges(changes) {
if (changes['sticky'] && changes['sticky'].currentValue == true && !changes['sticky'].firstChange) {
this.updateListeners();
}
if (changes['sticky'] && changes['sticky'].currentValue == false) {
this.stickyHeader?._elementObj?._unsetSticky();
this.stickyHeader?._elementObj?.dispose();
delete this.stickyHeader;
this.stickyHeader = undefined;
}
}
updateListeners() {
if (!this.stickyHeader && this.headerWrapper && this.sticky) {
this.stickyHeader = new HeaderSticky(this.headerWrapper.nativeElement);
}
}
openNavBar() {
this.itNavBarComponent?.open();
}
closeNavBar() {
this.itNavBarComponent?.close();
}
emitLoginClick(event) {
event.preventDefault();
this.loginClick.emit(event);
}
emitSearchClick(event) {
event.preventDefault();
this.searchClick.emit(event);
}
toggleCollapse() {
this.itNavBarComponent?.toggleCollapse();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItHeaderComponent, isStandalone: true, selector: "it-header", inputs: { light: ["light", "light", inputToBoolean], sticky: ["sticky", "sticky", inputToBoolean], showSlim: ["showSlim", "showSlim", inputToBoolean], smallHeader: ["smallHeader", "smallHeader", inputToBoolean], showSearch: ["showSearch", "showSearch", inputToBoolean], slimTitle: "slimTitle", slimTitleLink: "slimTitleLink", loginStyle: "loginStyle", megamenu: ["megamenu", "megamenu", inputToBoolean], expand: ["expand", "expand", inputToBoolean] }, outputs: { loginClick: "loginClick", searchClick: "searchClick" }, viewQueries: [{ propertyName: "headerWrapper", first: true, predicate: ["headerWrapper"], descendants: true }, { propertyName: "itNavBarComponent", first: true, predicate: ItNavBarComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<header\n #headerWrapper\n class=\"it-header-wrapper\"\n [class.it-header-sticky]=\"sticky\"\n data-bs-position-type=\"fixed\"\n data-bs-sticky-class-name=\"is-sticky\"\n data-bs-target=\"#header-nav-wrapper\">\n @if (showSlim) {\n <div class=\"it-header-slim-wrapper\" [class.theme-light]=\"light\">\n <div class=\"container-xxl\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"it-header-slim-wrapper-content\">\n <a class=\"d-none d-lg-block navbar-brand\" [href]=\"slimTitleLink\" [target]=\"slimTitleLink !== '#' ? '_blank' : '_self'\">\n {{ slimTitle }}\n </a>\n <div class=\"nav-mobile\">\n <nav [attr.aria-label]=\"'it.navigation.secondary-navigation' | translate\">\n <a\n class=\"it-opener d-lg-none\"\n data-bs-toggle=\"collapse\"\n href=\"#menuC1\"\n role=\"button\"\n aria-expanded=\"false\"\n aria-controls=\"menuC1\">\n <span>{{ slimTitle }}</span>\n <it-icon name=\"expand\"></it-icon>\n </a>\n <div class=\"link-list-wrapper collapse\" id=\"menuC1\">\n <ng-content select=\"[slimLinkList]\"></ng-content>\n </div>\n </nav>\n </div>\n <div class=\"it-header-slim-right-zone\">\n <ng-content select=\"[slimRightZone]\"></ng-content>\n @if (loginStyle === 'default') {\n <div class=\"it-access-top-wrapper\">\n <a class=\"btn btn-primary btn-sm\" (click)=\"emitLoginClick($event)\" href=\"#\">\n {{ 'it.navigation.login' | translate }}\n </a>\n </div>\n }\n @if (loginStyle === 'full') {\n <a itButton=\"primary\" class=\"btn-full btn-icon\" (click)=\"emitLoginClick($event)\" href=\"#\">\n <span class=\"rounded-icon\">\n <it-icon name=\"user\" color=\"primary\"></it-icon>\n </span>\n <span class=\"d-none d-lg-block\">{{ 'it.navigation.full-login' | translate }}</span>\n </a>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n <div class=\"it-nav-wrapper\">\n <div class=\"it-header-center-wrapper\" [class.it-small-header]=\"smallHeader\" [class.theme-light]=\"light\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"it-header-center-content-wrapper\">\n <div class=\"it-brand-wrapper\">\n <ng-content select=\"[brand]\"></ng-content>\n </div>\n <div class=\"it-right-zone\">\n <ng-content select=\"[rightZone]\"></ng-content>\n\n @if (showSearch) {\n <div class=\"it-search-wrapper\">\n <span class=\"d-none d-md-block\">{{ 'it.navigation.search' | translate }}</span>\n <a\n href=\"#\"\n class=\"search-link rounded-icon\"\n [attr.aria-label]=\"'it.navigation.website-search' | translate\"\n (click)=\"emitSearchClick($event)\">\n <it-icon name=\"search\"></it-icon>\n </a>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"it-header-navbar-wrapper\" [class.theme-light-desk]=\"light\" id=\"header-nav-wrapper\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12\">\n <it-navbar [megamenu]=\"megamenu\" [expand]=\"expand\">\n <ng-container navItems>\n <ng-content select=\"[navItems]\"></ng-content>\n </ng-container>\n </it-navbar>\n </div>\n </div>\n </div>\n </div>\n </div>\n</header>\n", styles: [".nav-mobile:has(.link-list-wrapper:empty){display:none}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: ItIconComponent, selector: "it-icon", inputs: ["name", "size", "color", "padded", "svgClass", "title", "labelWaria"] }, { kind: "directive", type: ItButtonDirective, selector: "[itButton]", inputs: ["itButton", "size", "block", "disabled", "type"], exportAs: ["itButton"] }, { kind: "ngmodule", type: ItNavBarModule }, { kind: "component", type: i2.ItNavBarComponent, selector: "it-navbar", inputs: ["megamenu", "expand"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItHeaderComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'it-header', changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, ItIconComponent, ItButtonDirective, ItNavBarModule], template: "<header\n #headerWrapper\n class=\"it-header-wrapper\"\n [class.it-header-sticky]=\"sticky\"\n data-bs-position-type=\"fixed\"\n data-bs-sticky-class-name=\"is-sticky\"\n data-bs-target=\"#header-nav-wrapper\">\n @if (showSlim) {\n <div class=\"it-header-slim-wrapper\" [class.theme-light]=\"light\">\n <div class=\"container-xxl\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"it-header-slim-wrapper-content\">\n <a class=\"d-none d-lg-block navbar-brand\" [href]=\"slimTitleLink\" [target]=\"slimTitleLink !== '#' ? '_blank' : '_self'\">\n {{ slimTitle }}\n </a>\n <div class=\"nav-mobile\">\n <nav [attr.aria-label]=\"'it.navigation.secondary-navigation' | translate\">\n <a\n class=\"it-opener d-lg-none\"\n data-bs-toggle=\"collapse\"\n href=\"#menuC1\"\n role=\"button\"\n aria-expanded=\"false\"\n aria-controls=\"menuC1\">\n <span>{{ slimTitle }}</span>\n <it-icon name=\"expand\"></it-icon>\n </a>\n <div class=\"link-list-wrapper collapse\" id=\"menuC1\">\n <ng-content select=\"[slimLinkList]\"></ng-content>\n </div>\n </nav>\n </div>\n <div class=\"it-header-slim-right-zone\">\n <ng-content select=\"[slimRightZone]\"></ng-content>\n @if (loginStyle === 'default') {\n <div class=\"it-access-top-wrapper\">\n <a class=\"btn btn-primary btn-sm\" (click)=\"emitLoginClick($event)\" href=\"#\">\n {{ 'it.navigation.login' | translate }}\n </a>\n </div>\n }\n @if (loginStyle === 'full') {\n <a itButton=\"primary\" class=\"btn-full btn-icon\" (click)=\"emitLoginClick($event)\" href=\"#\">\n <span class=\"rounded-icon\">\n <it-icon name=\"user\" color=\"primary\"></it-icon>\n </span>\n <span class=\"d-none d-lg-block\">{{ 'it.navigation.full-login' | translate }}</span>\n </a>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n <div class=\"it-nav-wrapper\">\n <div class=\"it-header-center-wrapper\" [class.it-small-header]=\"smallHeader\" [class.theme-light]=\"light\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"it-header-center-content-wrapper\">\n <div class=\"it-brand-wrapper\">\n <ng-content select=\"[brand]\"></ng-content>\n </div>\n <div class=\"it-right-zone\">\n <ng-content select=\"[rightZone]\"></ng-content>\n\n @if (showSearch) {\n <div class=\"it-search-wrapper\">\n <span class=\"d-none d-md-block\">{{ 'it.navigation.search' | translate }}</span>\n <a\n href=\"#\"\n class=\"search-link rounded-icon\"\n [attr.aria-label]=\"'it.navigation.website-search' | translate\"\n (click)=\"emitSearchClick($event)\">\n <it-icon name=\"search\"></it-icon>\n </a>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"it-header-navbar-wrapper\" [class.theme-light-desk]=\"light\" id=\"header-nav-wrapper\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12\">\n <it-navbar [megamenu]=\"megamenu\" [expand]=\"expand\">\n <ng-container navItems>\n <ng-content select=\"[navItems]\"></ng-content>\n </ng-container>\n </it-navbar>\n </div>\n </div>\n </div>\n </div>\n </div>\n</header>\n", styles: [".nav-mobile:has(.link-list-wrapper:empty){display:none}\n"] }]
}], ctorParameters: () => [], propDecorators: { light: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], sticky: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], showSlim: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], smallHeader: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], showSearch: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], slimTitle: [{
type: Input
}], slimTitleLink: [{
type: Input
}], loginStyle: [{
type: Input
}], loginClick: [{
type: Output
}], searchClick: [{
type: Output
}], headerWrapper: [{
type: ViewChild,
args: ['headerWrapper']
}], itNavBarComponent: [{
type: ViewChild,
args: [ItNavBarComponent]
}], megamenu: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], expand: [{
type: Input,
args: [{ transform: inputToBoolean }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvbmF2aWdhdGlvbi9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvbmF2aWdhdGlvbi9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBVWhELE1BQU0sT0FBTyxpQkFBaUI7SUE2QjVCO1FBeEJzQyxhQUFRLEdBQWEsSUFBSSxDQUFDO1FBRTFCLGdCQUFXLEdBQWEsSUFBSSxDQUFDO1FBRTdCLGVBQVUsR0FBYSxJQUFJLENBQUM7UUFHekQsa0JBQWEsR0FBdUIsR0FBRyxDQUFDO1FBRXhDLGVBQVUsR0FBZ0MsTUFBTSxDQUFDO1FBV3BCLFdBQU0sR0FBYSxJQUFJLENB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Z0JBRTNCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFNkIsYUFBYTtzQkFBaEQsU0FBUzt1QkFBQyxlQUFlO2dCQUVZLGlCQUFpQjtzQkFBdEQsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBRVUsUUFBUTtzQkFBN0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUU7Z0JBQ0UsTUFBTTtzQkFBM0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSXRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJdE5hdkJhck1vZHVsZSB9IGZyb20gJy4uL25hdmJhci9uYXZiYXIubW9kdWxlJztcbmltcG9ydCB7IEl0TmF2QmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vbmF2YmFyL25hdmJhci9uYXZiYXIuY29tcG9uZW50JztcblxuaW1wb3J0IHsgSXRCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IGlucHV0VG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY29lcmNpb24nO1xuaW1wb3J0IHsgSGVhZGVyU3RpY2t5IH0gZnJvbSAnYm9vdHN0cmFwLWl0YWxpYSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2l0LWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9oZWFkZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIEl0SWNvbkNvbXBvbmVudCwgSXRCdXR0b25EaXJlY3RpdmUsIEl0TmF2QmFyTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgSXRIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGlucHV0VG9Cb29sZWFuIH0pIGxpZ2h0PzogYm9vbGVhbjtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGlucHV0VG9Cb29sZWFuIH0pIHN0aWNreT86IGJvb2xlYW47XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBpbnB1dFRvQm9vbGVhbiB9KSBzaG93U2xpbT86IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogaW5wdXRUb0Jvb2xlYW4gfSkgc21hbGxIZWFkZXI/OiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGlucHV0VG9Cb29sZWFuIH0pIHNob3dTZWFyY2g/OiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzbGltVGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgc2xpbVRpdGxlTGluazogc3RyaW5nIHwgdW5kZWZpbmVkID0gJyMnO1xuXG4gIEBJbnB1dCgpIGxvZ2luU3R5bGU6ICdub25lJyB8ICdkZWZhdWx0JyB8ICdmdWxsJyA9ICdub25lJztcblxuICBAT3V0cHV0KCkgbG9naW5DbGljazogRXZlbnRFbWl0dGVyPEV2ZW50PjtcblxuICBAT3V0cHV0KCkgc2VhcmNoQ2xpY2s6IEV2ZW50RW1pdHRlcjxFdmVudD47XG5cbiAgQFZpZXdDaGlsZCgnaGVhZGVyV3JhcHBlcicpIHByaXZhdGUgaGVhZGVyV3JhcHBlcj86IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoSXROYXZCYXJDb21wb25lbnQpIHByaXZhdGUgaXROYXZCYXJDb21wb25lbnQ/OiBJdE5hdkJhckNvbXBvbmVudDtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGlucHV0VG9Cb29sZWFuIH0pIG1lZ2FtZW51PzogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBpbnB1dFRvQm9vbGVhbiB9KSBleHBhbmQ/OiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIHN0aWNreUhlYWRlcj86IEhlYWRlclN0aWNreTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxvZ2luQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICAgIHRoaXMuc2VhcmNoQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudXBkYXRlTGlzdGVuZXJzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3N0aWNreSddICYmIGNoYW5nZXNbJ3N0aWNreSddLmN1cnJlbnRWYWx1ZSA9PSB0cnVlICYmICFjaGFuZ2VzWydzdGlja3knXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy51cGRhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3N0aWNreSddICYmIGNoYW5nZXNbJ3N0aWNreSddLmN1cnJlbnRWYWx1ZSA9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zdGlja3lIZWFkZXI/Ll9lbGVtZW50T2JqPy5fdW5zZXRTdGlja3koKTtcbiAgICAgIHRoaXMuc3RpY2t5SGVhZGVyPy5fZWxlbWVudE9iaj8uZGlzcG9zZSgpO1xuICAgICAgZGVsZXRlIHRoaXMuc3RpY2t5SGVhZGVyO1xuICAgICAgdGhpcy5zdGlja3lIZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlTGlzdGVuZXJzKCkge1xuICAgIGlmICghdGhpcy5zdGlja3lIZWFkZXIgJiYgdGhpcy5oZWFkZXJXcmFwcGVyICYmIHRoaXMuc3RpY2t5KSB7XG4gICAgICB0aGlzLnN0aWNreUhlYWRlciA9IG5ldyBIZWFkZXJTdGlja3kodGhpcy5oZWFkZXJXcmFwcGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5OYXZCYXIoKSB7XG4gICAgdGhpcy5pdE5hdkJhckNvbXBvbmVudD8ub3BlbigpO1xuICB9XG5cbiAgY2xvc2VOYXZCYXIoKSB7XG4gICAgdGhpcy5pdE5hdkJhckNvbXBvbmVudD8uY2xvc2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0TG9naW5DbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubG9naW5DbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0U2VhcmNoQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNlYXJjaENsaWNrLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgdG9nZ2xlQ29sbGFwc2UoKSB7XG4gICAgdGhpcy5pdE5hdkJhckNvbXBvbmVudD8udG9nZ2xlQ29sbGFwc2UoKTtcbiAgfVxufVxuIiwiPGhlYWRlclxuICAjaGVhZGVyV3JhcHBlclxuICBjbGFzcz1cIml0LWhlYWRlci13cmFwcGVyXCJcbiAgW2NsYXNzLml0LWhlYWRlci1zdGlja3ldPVwic3RpY2t5XCJcbiAgZGF0YS1icy1wb3NpdGlvbi10eXBlPVwiZml4ZWRcIlxuICBkYXRhLWJzLXN0aWNreS1jbGFzcy1uYW1lPVwiaXMtc3RpY2t5XCJcbiAgZGF0YS1icy10YXJnZXQ9XCIjaGVhZGVyLW5hdi13cmFwcGVyXCI+XG4gIEBpZiAoc2hvd1NsaW0pIHtcbiAgICA8ZGl2IGNsYXNzPVwiaXQtaGVhZGVyLXNsaW0td3JhcHBlclwiIFtjbGFzcy50aGVtZS1saWdodF09XCJsaWdodFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci14eGxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdC1oZWFkZXItc2xpbS13cmFwcGVyLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkLW5vbmUgZC1sZy1ibG9jayBuYXZiYXItYnJhbmRcIiBbaHJlZl09XCJzbGltVGl0bGVMaW5rXCIgW3RhcmdldF09XCJzbGltVGl0bGVMaW5rICE9PSAnIycgPyAnX2JsYW5rJyA6ICdfc2VsZidcIj5cbiAgICAgICAgICAgICAgICB7eyBzbGltVGl0bGUgfX1cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LW1vYmlsZVwiPlxuICAgICAgICAgICAgICAgIDxuYXYgW2F0dHIuYXJpYS1sYWJlbF09XCInaXQubmF2aWdhdGlvbi5zZWNvbmRhcnktbmF2aWdhdGlvbicgfCB0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXQtb3BlbmVyIGQtbGctbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIlxuICAgICAgICAgICAgICAgICAgICBocmVmPVwiI21lbnVDMVwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwibWVudUMxXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNsaW1UaXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGl0LWljb24gbmFtZT1cImV4cGFuZFwiPjwvaXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWxpc3Qtd3JhcHBlciBjb2xsYXBzZVwiIGlkPVwibWVudUMxXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzbGltTGlua0xpc3RdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uYXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXQtaGVhZGVyLXNsaW0tcmlnaHQtem9uZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzbGltUmlnaHRab25lXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICBAaWYgKGxvZ2luU3R5bGUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0LWFjY2Vzcy10b3Atd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIiAoY2xpY2spPVwiZW1pdExvZ2luQ2xpY2soJGV2ZW50KVwiIGhyZWY9XCIjXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ2l0Lm5hdmlnYXRpb24ubG9naW4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKGxvZ2luU3R5bGUgPT09ICdmdWxsJykge1xuICAgICAgICAgICAgICAgICAgPGEgaXRCdXR0b249XCJwcmltYXJ5XCIgY2xhc3M9XCJidG4tZnVsbCBidG4taWNvblwiIChjbGljayk9XCJlbWl0TG9naW5DbGljaygkZXZlbnQpXCIgaHJlZj1cIiNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3VuZGVkLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aXQtaWNvbiBuYW1lPVwidXNlclwiIGNvbG9yPVwicHJpbWFyeVwiPjwvaXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtbm9uZSBkLWxnLWJsb2NrXCI+e3sgJ2l0Lm5hdmlnYXRpb24uZnVsbC1sb2dpbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIDxkaXYgY2xhc3M9XCJpdC1uYXYtd3JhcHBlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJpdC1oZWFkZXItY2VudGVyLXdyYXBwZXJcIiBbY2xhc3MuaXQtc21hbGwtaGVhZGVyXT1cInNtYWxsSGVhZGVyXCIgW2NsYXNzLnRoZW1lLWxpZ2h0XT1cImxpZ2h0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXQtaGVhZGVyLWNlbnRlci1jb250ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0LWJyYW5kLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYnJhbmRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0LXJpZ2h0LXpvbmVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcmlnaHRab25lXVwiPjwvbmctY29udGVudD5cblxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1NlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0LXNlYXJjaC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ub25lIGQtbWQtYmxvY2tcIj57eyAnaXQubmF2aWdhdGlvbi5zZWFyY2gnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1saW5rIHJvdW5kZWQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInaXQubmF2aWdhdGlvbi53ZWJzaXRlLXNlYXJjaCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlbWl0U2VhcmNoQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpdC1pY29uIG5hbWU9XCJzZWFyY2hcIj48L2l0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaXQtaGVhZGVyLW5hdmJhci13cmFwcGVyXCIgW2NsYXNzLnRoZW1lLWxpZ2h0LWRlc2tdPVwibGlnaHRcIiBpZD1cImhlYWRlci1uYXYtd3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgPGl0LW5hdmJhciBbbWVnYW1lbnVdPVwibWVnYW1lbnVcIiBbZXhwYW5kXT1cImV4cGFuZFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG5hdkl0ZW1zPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltuYXZJdGVtc11cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9pdC1uYXZiYXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9oZWFkZXI+XG4iXX0=