UNPKG

@coreui/angular

Version:

CoreUI Components Library for Angular

111 lines 25.7 kB
import { NgClass, NgTemplateOutlet } from '@angular/common'; import { Component, EventEmitter, Input, Output } from '@angular/core'; import { NavigationEnd, RouterModule } from '@angular/router'; import { filter } from 'rxjs/operators'; import { IconDirective } from '@coreui/icons-angular'; // import {SidebarService} from '../sidebar.service'; import { HtmlAttributesDirective } from '../../shared'; import { SidebarNavHelper } from './sidebar-nav.service'; import { SidebarNavLinkPipe } from './sidebar-nav-link.pipe'; import { SidebarNavBadgePipe } from './sidebar-nav-badge.pipe'; import { SidebarNavIconPipe } from './sidebar-nav-icon.pipe'; import * as i0 from "@angular/core"; import * as i1 from "./sidebar-nav.service"; import * as i2 from "@angular/router"; export class SidebarNavLinkContentComponent { constructor(helper) { this.helper = helper; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidebarNavLinkContentComponent, deps: [{ token: i1.SidebarNavHelper }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: SidebarNavLinkContentComponent, isStandalone: true, selector: "c-sidebar-nav-link-content", inputs: { item: "item" }, providers: [SidebarNavHelper], ngImport: i0, template: ` @if (true) { <ng-container>{{ item?.name ?? '' }}</ng-container> } `, isInline: true }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidebarNavLinkContentComponent, decorators: [{ type: Component, args: [{ selector: 'c-sidebar-nav-link-content', template: ` @if (true) { <ng-container>{{ item?.name ?? '' }}</ng-container> } `, providers: [SidebarNavHelper], standalone: true }] }], ctorParameters: () => [{ type: i1.SidebarNavHelper }], propDecorators: { item: [{ type: Input }] } }); export class SidebarNavLinkComponent { set item(item) { this._item = JSON.parse(JSON.stringify(item)); } get item() { return this._item; } constructor(router // private renderer: Renderer2, // private hostElement: ElementRef, // private sidebarService: SidebarService ) { this.router = router; this._item = {}; this.linkClick = new EventEmitter(); this.navigationEndObservable = router.events.pipe(filter((event) => { return event instanceof NavigationEnd; })); } ngOnInit() { this.url = typeof this.item.url === 'string' ? this.item.url : this.router.serializeUrl(this.router.createUrlTree(this.item.url ?? [''])); this.linkType = this.getLinkType(); this.href = this.isDisabled() ? '' : this.item.href || this.url; this.linkActive = this.router.url.split(/[?#(;]/)[0] === this.href.split(/[?#(;]/)[0]; this.navSubscription = this.navigationEndObservable.subscribe((event) => { const itemUrlArray = this.href.split(/[?#(;]/)[0].split('/'); const urlArray = event.urlAfterRedirects.split(/[?#(;]/)[0].split('/'); this.linkActive = itemUrlArray.every((value, index) => value === urlArray[index]); }); } ngOnDestroy() { this.navSubscription?.unsubscribe(); } getLinkType() { return this.isDisabled() ? 'disabled' : this.isExternalLink() ? 'external' : 'link'; } isDisabled() { return this.item?.attributes?.['disabled']; } isExternalLink() { const linkPath = Array.isArray(this.item.url) ? this.item.url[0] : this.item.url; return !!this.item.href || linkPath?.substring(0, 4) === 'http'; } linkClicked() { this.linkClick.emit(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidebarNavLinkComponent, deps: [{ token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: SidebarNavLinkComponent, isStandalone: true, selector: "c-sidebar-nav-link", inputs: { item: "item" }, outputs: { linkClick: "linkClick" }, providers: [SidebarNavHelper], ngImport: i0, template: "@switch (linkType) {\n @case ('disabled') {\n <a [cHtmlAttr]=\"item.attributes ?? {}\" [ngClass]=\"item | cSidebarNavLink\">\n <ng-container *ngTemplateOutlet=\"iconTemplate; context: {$implicit: item}\" />\n <c-sidebar-nav-link-content [item]=\"item\" />\n @if (item.badge) {\n <span [ngClass]=\"item | cSidebarNavBadge\">{{ item.badge?.text }}</span>\n }\n </a>\n }\n @case ('external') {\n <a (click)=\"linkClicked()\" [cHtmlAttr]=\"item.attributes ?? {}\" [href]=\"href\" [ngClass]=\"item | cSidebarNavLink\">\n <ng-container *ngTemplateOutlet=\"iconTemplate; context: {$implicit: item}\" />\n <c-sidebar-nav-link-content [item]=\"item\" />\n @if (item.badge) {\n <span [ngClass]=\"item | cSidebarNavBadge\">{{ item.badge?.text }}</span>\n }\n </a>\n }\n @default {\n <a (click)=\"linkClicked()\"\n [cHtmlAttr]=\"item.attributes ?? {}\"\n [fragment]=\"item.linkProps?.fragment\"\n [ngClass]=\"item | cSidebarNavLink\"\n [preserveFragment]=\"item.linkProps?.preserveFragment ?? false\"\n [queryParamsHandling]=\"item.linkProps?.queryParamsHandling\"\n [queryParams]=\"item.linkProps?.queryParams ?? null\"\n [replaceUrl]=\"item.linkProps?.replaceUrl ?? false\"\n [routerLinkActiveOptions]=\"item.linkProps?.routerLinkActiveOptions ?? { exact: false }\"\n [routerLink]=\"item.url\"\n [skipLocationChange]=\"item.linkProps?.skipLocationChange ?? false\"\n [state]=\"item.linkProps?.state ?? {}\"\n [target]=\"item.attributes?.['target']\"\n routerLinkActive=\"active\"\n >\n <!-- [class.active]=\"linkActive\"-->\n <ng-container *ngTemplateOutlet=\"iconTemplate ; context: {$implicit: item}\" />\n <c-sidebar-nav-link-content [item]=\"item\" />\n @if (item.badge) {\n <span [ngClass]=\"item | cSidebarNavBadge\">{{ item.badge?.text }}</span>\n }\n </a>\n }\n}\n<ng-template #iconTemplate let-item>\n <!-- <i *ngIf=\"item?.icon\" [ngClass]=\"item | cSidebarNavIcon\"></i>-->\n @if (item?.icon) {\n <span class=\"nav-icon\">\n <span [ngClass]=\"item.icon ?? ''\"></span>\n </span>\n }\n @if (item?.iconComponent) {\n <svg\n [cIcon]=\"item.iconComponent?.content\"\n [customClasses]=\"item | cSidebarNavIcon\"\n [name]=\"item.iconComponent?.name\"\n ></svg>\n }\n @if (!item?.icon && !item?.iconComponent) {\n <span [ngClass]=\"item | cSidebarNavIcon\"></span>\n }\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: HtmlAttributesDirective, selector: "[cHtmlAttr]", inputs: ["cHtmlAttr"], exportAs: ["cHtmlAttr"] }, { kind: "directive", type: IconDirective, selector: "svg[cIcon]", inputs: ["cIcon", "customClasses", "size", "title", "height", "width", "name", "viewBox", "xmlns", "pointer-events", "role"], exportAs: ["cIcon"] }, { kind: "component", type: SidebarNavLinkContentComponent, selector: "c-sidebar-nav-link-content", inputs: ["item"] }, { kind: "pipe", type: SidebarNavLinkPipe, name: "cSidebarNavLink" }, { kind: "pipe", type: SidebarNavBadgePipe, name: "cSidebarNavBadge" }, { kind: "pipe", type: SidebarNavIconPipe, name: "cSidebarNavIcon" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidebarNavLinkComponent, decorators: [{ type: Component, args: [{ selector: 'c-sidebar-nav-link', providers: [SidebarNavHelper], standalone: true, imports: [ RouterModule, HtmlAttributesDirective, IconDirective, SidebarNavLinkContentComponent, SidebarNavLinkPipe, SidebarNavBadgePipe, SidebarNavIconPipe, NgTemplateOutlet, NgClass ], template: "@switch (linkType) {\n @case ('disabled') {\n <a [cHtmlAttr]=\"item.attributes ?? {}\" [ngClass]=\"item | cSidebarNavLink\">\n <ng-container *ngTemplateOutlet=\"iconTemplate; context: {$implicit: item}\" />\n <c-sidebar-nav-link-content [item]=\"item\" />\n @if (item.badge) {\n <span [ngClass]=\"item | cSidebarNavBadge\">{{ item.badge?.text }}</span>\n }\n </a>\n }\n @case ('external') {\n <a (click)=\"linkClicked()\" [cHtmlAttr]=\"item.attributes ?? {}\" [href]=\"href\" [ngClass]=\"item | cSidebarNavLink\">\n <ng-container *ngTemplateOutlet=\"iconTemplate; context: {$implicit: item}\" />\n <c-sidebar-nav-link-content [item]=\"item\" />\n @if (item.badge) {\n <span [ngClass]=\"item | cSidebarNavBadge\">{{ item.badge?.text }}</span>\n }\n </a>\n }\n @default {\n <a (click)=\"linkClicked()\"\n [cHtmlAttr]=\"item.attributes ?? {}\"\n [fragment]=\"item.linkProps?.fragment\"\n [ngClass]=\"item | cSidebarNavLink\"\n [preserveFragment]=\"item.linkProps?.preserveFragment ?? false\"\n [queryParamsHandling]=\"item.linkProps?.queryParamsHandling\"\n [queryParams]=\"item.linkProps?.queryParams ?? null\"\n [replaceUrl]=\"item.linkProps?.replaceUrl ?? false\"\n [routerLinkActiveOptions]=\"item.linkProps?.routerLinkActiveOptions ?? { exact: false }\"\n [routerLink]=\"item.url\"\n [skipLocationChange]=\"item.linkProps?.skipLocationChange ?? false\"\n [state]=\"item.linkProps?.state ?? {}\"\n [target]=\"item.attributes?.['target']\"\n routerLinkActive=\"active\"\n >\n <!-- [class.active]=\"linkActive\"-->\n <ng-container *ngTemplateOutlet=\"iconTemplate ; context: {$implicit: item}\" />\n <c-sidebar-nav-link-content [item]=\"item\" />\n @if (item.badge) {\n <span [ngClass]=\"item | cSidebarNavBadge\">{{ item.badge?.text }}</span>\n }\n </a>\n }\n}\n<ng-template #iconTemplate let-item>\n <!-- <i *ngIf=\"item?.icon\" [ngClass]=\"item | cSidebarNavIcon\"></i>-->\n @if (item?.icon) {\n <span class=\"nav-icon\">\n <span [ngClass]=\"item.icon ?? ''\"></span>\n </span>\n }\n @if (item?.iconComponent) {\n <svg\n [cIcon]=\"item.iconComponent?.content\"\n [customClasses]=\"item | cSidebarNavIcon\"\n [name]=\"item.iconComponent?.name\"\n ></svg>\n }\n @if (!item?.icon && !item?.iconComponent) {\n <span [ngClass]=\"item | cSidebarNavIcon\"></span>\n }\n</ng-template>\n" }] }], ctorParameters: () => [{ type: i2.Router }], propDecorators: { item: [{ type: Input }], linkClick: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci1uYXYtbGluay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NpZGViYXIvc2lkZWJhci1uYXYvc2lkZWJhci1uYXYtbGluay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL3NpZGViYXIvc2lkZWJhci1uYXYvc2lkZWJhci1uYXYtbGluay5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGFBQWEsRUFBVSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELHFEQUFxRDtBQUNyRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7QUFZN0QsTUFBTSxPQUFPLDhCQUE4QjtJQUd6QyxZQUFtQixNQUF3QjtRQUF4QixXQUFNLEdBQU4sTUFBTSxDQUFrQjtJQUFHLENBQUM7K0dBSHBDLDhC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QXVCO3dCQUN2QixhQUFhO3dCQUNiLDhCQUE4Qjt3QkFDOUIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixPQUFPO3FCQUNSOzJFQU1HLElBQUk7c0JBRFAsS0FBSztnQkFTSSxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciwgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSWNvbkRpcmVjdGl2ZSB9IGZyb20gJ0Bjb3JldWkvaWNvbnMtYW5ndWxhcic7XG5cbi8vIGltcG9ydCB7U2lkZWJhclNlcnZpY2V9IGZyb20gJy4uL3NpZGViYXIuc2VydmljZSc7XG5pbXBvcnQgeyBIdG1sQXR0cmlidXRlc0RpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBTaWRlYmFyTmF2SGVscGVyIH0gZnJvbSAnLi9zaWRlYmFyLW5hdi5zZXJ2aWNlJztcbmltcG9ydCB7IElOYXZEYXRhIH0gZnJvbSAnLi9zaWRlYmFyLW5hdic7XG5pbXBvcnQgeyBTaWRlYmFyTmF2TGlua1BpcGUgfSBmcm9tICcuL3NpZGViYXItbmF2LWxpbmsucGlwZSc7XG5pbXBvcnQgeyBTaWRlYmFyTmF2QmFkZ2VQaXBlIH0gZnJvbSAnLi9zaWRlYmFyLW5hdi1iYWRnZS5waXBlJztcbmltcG9ydCB7IFNpZGViYXJOYXZJY29uUGlwZSB9IGZyb20gJy4vc2lkZWJhci1uYXYtaWNvbi5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYy1zaWRlYmFyLW5hdi1saW5rLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAodHJ1ZSkge1xuICAgICAgPG5nLWNvbnRhaW5lcj57eyBpdGVtPy5uYW1lID8/ICcnIH19PC9uZy1jb250YWluZXI+XG4gICAgfVxuICBgLFxuICBwcm92aWRlcnM6IFtTaWRlYmFyTmF2SGVscGVyXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBTaWRlYmFyTmF2TGlua0NvbnRlbnRDb21wb25lbnQge1xuICBASW5wdXQoKSBpdGVtPzogSU5hdkRhdGE7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGhlbHBlcjogU2lkZWJhck5hdkhlbHBlcikge31cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYy1zaWRlYmFyLW5hdi1saW5rJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NpZGViYXItbmF2LWxpbmsuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtTaWRlYmFyTmF2SGVscGVyXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJvdXRlck1vZHVsZSxcbiAgICBIdG1sQXR0cmlidXRlc0RpcmVjdGl2ZSxcbiAgICBJY29uRGlyZWN0aXZlLFxuICAgIFNpZGViYXJOYXZMaW5rQ29udGVudENvbXBvbmVudCxcbiAgICBTaWRlYmFyTmF2TGlua1BpcGUsXG4gICAgU2lkZWJhck5hdkJhZGdlUGlwZSxcbiAgICBTaWRlYmFyTmF2SWNvblBpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBOZ0NsYXNzXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2lkZWJhck5hdkxpbmtDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBfaXRlbTogSU5hdkRhdGEgPSB7fTtcblxuICBASW5wdXQoKVxuICBzZXQgaXRlbShpdGVtOiBJTmF2RGF0YSkge1xuICAgIHRoaXMuX2l0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0pKTtcbiAgfVxuXG4gIGdldCBpdGVtKCk6IElOYXZEYXRhIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBsaW5rQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHVibGljIGxpbmtUeXBlITogc3RyaW5nO1xuICBwdWJsaWMgaHJlZiE6IHN0cmluZztcbiAgcHVibGljIGxpbmtBY3RpdmUhOiBib29sZWFuO1xuICBwcml2YXRlIHVybCE6IHN0cmluZztcblxuICBwcml2YXRlIG5hdmlnYXRpb25FbmRPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPE5hdmlnYXRpb25FbmQ+O1xuICBwcml2YXRlIG5hdlN1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXJcbiAgICAvLyBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgLy8gcHJpdmF0ZSBob3N0RWxlbWVudDogRWxlbWVudFJlZixcbiAgICAvLyBwcml2YXRlIHNpZGViYXJTZXJ2aWNlOiBTaWRlYmFyU2VydmljZVxuICApIHtcbiAgICB0aGlzLm5hdmlnYXRpb25FbmRPYnNlcnZhYmxlID0gcm91dGVyLmV2ZW50cy5waXBlKFxuICAgICAgZmlsdGVyKChldmVudCkgPT4ge1xuICAgICAgICByZXR1cm4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kO1xuICAgICAgfSlcbiAgICApIGFzIE9ic2VydmFibGU8TmF2aWdhdGlvbkVuZD47XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVybCA9XG4gICAgICB0eXBlb2YgdGhpcy5pdGVtLnVybCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyB0aGlzLml0ZW0udXJsXG4gICAgICAgIDogdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoKHRoaXMuaXRlbS51cmwgYXMgYW55W10pID8/IFsnJ10pKTtcbiAgICB0aGlzLmxpbmtUeXBlID0gdGhpcy5nZXRMaW5rVHlwZSgpO1xuICAgIHRoaXMuaHJlZiA9IHRoaXMuaXNEaXNhYmxlZCgpID8gJycgOiB0aGlzLml0ZW0uaHJlZiB8fCB0aGlzLnVybDtcbiAgICB0aGlzLmxpbmtBY3RpdmUgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoL1s/Iyg7XS8pWzBdID09PSB0aGlzLmhyZWYuc3BsaXQoL1s/Iyg7XS8pWzBdO1xuICAgIHRoaXMubmF2U3Vic2NyaXB0aW9uID0gdGhpcy5uYXZpZ2F0aW9uRW5kT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBpdGVtVXJsQXJyYXkgPSB0aGlzLmhyZWYuc3BsaXQoL1s/Iyg7XS8pWzBdLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCB1cmxBcnJheSA9IGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLnNwbGl0KC9bPyMoO10vKVswXS5zcGxpdCgnLycpO1xuICAgICAgdGhpcy5saW5rQWN0aXZlID0gaXRlbVVybEFycmF5LmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSB1cmxBcnJheVtpbmRleF0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uYXZTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TGlua1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkKCkgPyAnZGlzYWJsZWQnIDogdGhpcy5pc0V4dGVybmFsTGluaygpID8gJ2V4dGVybmFsJyA6ICdsaW5rJztcbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLml0ZW0/LmF0dHJpYnV0ZXM/LlsnZGlzYWJsZWQnXTtcbiAgfVxuXG4gIHB1YmxpYyBpc0V4dGVybmFsTGluaygpOiBib29sZWFuIHtcbiAgICBjb25zdCBsaW5rUGF0aCA9IEFycmF5LmlzQXJyYXkodGhpcy5pdGVtLnVybCkgPyB0aGlzLml0ZW0udXJsWzBdIDogdGhpcy5pdGVtLnVybDtcbiAgICByZXR1cm4gISF0aGlzLml0ZW0uaHJlZiB8fCBsaW5rUGF0aD8uc3Vic3RyaW5nKDAsIDQpID09PSAnaHR0cCc7XG4gIH1cblxuICBsaW5rQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpbmtDbGljay5lbWl0KCk7XG4gIH1cblxuICAvLyBwdWJsaWMgaGlkZU1vYmlsZSgpIHtcbiAgLy8gICAvLyB0b2RvOiBwcm9wZXIgc2Nyb2xsSW50b1ZpZXcoKSBhZnRlciBOYXZpZ2F0aW9uRW5kXG4gIC8vICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICBjb25zb2xlLmxvZygnc2Nyb2xsJylcbiAgLy8gICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldygpO1xuICAvLyAgIH0sIDEwMDApXG4gIC8vICAgdGhpcy5zaWRlYmFyU2VydmljZS50b2dnbGUoe29wZW46IGZhbHNlLCBicmVha3BvaW50OiAnJ30pO1xuICAvLyB9XG59XG4iLCJAc3dpdGNoIChsaW5rVHlwZSkge1xuICBAY2FzZSAoJ2Rpc2FibGVkJykge1xuICAgIDxhIFtjSHRtbEF0dHJdPVwiaXRlbS5hdHRyaWJ1dGVzID8/IHt9XCIgW25nQ2xhc3NdPVwiaXRlbSB8IGNTaWRlYmFyTmF2TGlua1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25UZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIiAvPlxuICAgICAgPGMtc2lkZWJhci1uYXYtbGluay1jb250ZW50IFtpdGVtXT1cIml0ZW1cIiAvPlxuICAgICAgQGlmIChpdGVtLmJhZGdlKSB7XG4gICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIml0ZW0gfCBjU2lkZWJhck5hdkJhZGdlXCI+e3sgaXRlbS5iYWRnZT8udGV4dCB9fTwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L2E+XG4gIH1cbiAgQGNhc2UgKCdleHRlcm5hbCcpIHtcbiAgICA8YSAoY2xpY2spPVwibGlua0NsaWNrZWQoKVwiIFtjSHRtbEF0dHJdPVwiaXRlbS5hdHRyaWJ1dGVzID8/IHt9XCIgW2hyZWZdPVwiaHJlZlwiIFtuZ0NsYXNzXT1cIml0ZW0gfCBjU2lkZWJhck5hdkxpbmtcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCIgLz5cbiAgICAgIDxjLXNpZGViYXItbmF2LWxpbmstY29udGVudCBbaXRlbV09XCJpdGVtXCIgLz5cbiAgICAgIEBpZiAoaXRlbS5iYWRnZSkge1xuICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJpdGVtIHwgY1NpZGViYXJOYXZCYWRnZVwiPnt7IGl0ZW0uYmFkZ2U/LnRleHQgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9hPlxuICB9XG4gIEBkZWZhdWx0IHtcbiAgICA8YSAoY2xpY2spPVwibGlua0NsaWNrZWQoKVwiXG4gICAgICAgW2NIdG1sQXR0cl09XCJpdGVtLmF0dHJpYnV0ZXMgPz8ge31cIlxuICAgICAgIFtmcmFnbWVudF09XCJpdGVtLmxpbmtQcm9wcz8uZnJhZ21lbnRcIlxuICAgICAgIFtuZ0NsYXNzXT1cIml0ZW0gfCBjU2lkZWJhck5hdkxpbmtcIlxuICAgICAgIFtwcmVzZXJ2ZUZyYWdtZW50XT1cIml0ZW0ubGlua1Byb3BzPy5wcmVzZXJ2ZUZyYWdtZW50ID8/IGZhbHNlXCJcbiAgICAgICBbcXVlcnlQYXJhbXNIYW5kbGluZ109XCJpdGVtLmxpbmtQcm9wcz8ucXVlcnlQYXJhbXNIYW5kbGluZ1wiXG4gICAgICAgW3F1ZXJ5UGFyYW1zXT1cIml0ZW0ubGlua1Byb3BzPy5xdWVyeVBhcmFtcyA/PyBudWxsXCJcbiAgICAgICBbcmVwbGFjZVVybF09XCJpdGVtLmxpbmtQcm9wcz8ucmVwbGFjZVVybCA/PyBmYWxzZVwiXG4gICAgICAgW3JvdXRlckxpbmtBY3RpdmVPcHRpb25zXT1cIml0ZW0ubGlua1Byb3BzPy5yb3V0ZXJMaW5rQWN0aXZlT3B0aW9ucyA/PyB7IGV4YWN0OiBmYWxzZSB9XCJcbiAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnVybFwiXG4gICAgICAgW3NraXBMb2NhdGlvbkNoYW5nZV09XCJpdGVtLmxpbmtQcm9wcz8uc2tpcExvY2F0aW9uQ2hhbmdlID8/IGZhbHNlXCJcbiAgICAgICBbc3RhdGVdPVwiaXRlbS5saW5rUHJvcHM/LnN0YXRlID8/IHt9XCJcbiAgICAgICBbdGFyZ2V0XT1cIml0ZW0uYXR0cmlidXRlcz8uWyd0YXJnZXQnXVwiXG4gICAgICAgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiXG4gICAgPlxuICAgICAgPCEtLSAgICBbY2xhc3MuYWN0aXZlXT1cImxpbmtBY3RpdmVcIi0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImljb25UZW1wbGF0ZSA7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCIgLz5cbiAgICAgIDxjLXNpZGViYXItbmF2LWxpbmstY29udGVudCBbaXRlbV09XCJpdGVtXCIgLz5cbiAgICAgIEBpZiAoaXRlbS5iYWRnZSkge1xuICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJpdGVtIHwgY1NpZGViYXJOYXZCYWRnZVwiPnt7IGl0ZW0uYmFkZ2U/LnRleHQgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9hPlxuICB9XG59XG48bmctdGVtcGxhdGUgI2ljb25UZW1wbGF0ZSBsZXQtaXRlbT5cbiAgPCEtLSAgPGkgKm5nSWY9XCJpdGVtPy5pY29uXCIgW25nQ2xhc3NdPVwiaXRlbSB8IGNTaWRlYmFyTmF2SWNvblwiPjwvaT4tLT5cbiAgQGlmIChpdGVtPy5pY29uKSB7XG4gICAgPHNwYW4gY2xhc3M9XCJuYXYtaWNvblwiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiaXRlbS5pY29uID8/ICcnXCI+PC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgfVxuICBAaWYgKGl0ZW0/Lmljb25Db21wb25lbnQpIHtcbiAgICA8c3ZnXG4gICAgICBbY0ljb25dPVwiaXRlbS5pY29uQ29tcG9uZW50Py5jb250ZW50XCJcbiAgICAgIFtjdXN0b21DbGFzc2VzXT1cIml0ZW0gfCBjU2lkZWJhck5hdkljb25cIlxuICAgICAgW25hbWVdPVwiaXRlbS5pY29uQ29tcG9uZW50Py5uYW1lXCJcbiAgICA+PC9zdmc+XG4gIH1cbiAgQGlmICghaXRlbT8uaWNvbiAmJiAhaXRlbT8uaWNvbkNvbXBvbmVudCkge1xuICAgIDxzcGFuIFtuZ0NsYXNzXT1cIml0ZW0gfCBjU2lkZWJhck5hdkljb25cIj48L3NwYW4+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=