@koalarx/ui
Version:
Koala UI is a Design System developed in Angular whose objective is to facilitate and make your development faster and simpler, making this framework your greatest ally.
100 lines • 26 kB
JavaScript
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { NavigationEnd, Scroll } from '@angular/router';
import { BehaviorSubject } from 'rxjs';
import { koala } from '@koalarx/utils';
import { map, switchMap } from 'rxjs/operators';
import { delay } from '@koalarx/utils/operators/delay';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/icon";
import * as i4 from "@koalarx/ui/icon";
export const menuStateSubject = new BehaviorSubject(null);
export class MenuComponent {
constructor(router) {
this.router = router;
}
ngOnInit() {
if (this.optionsSubject) {
this.optionsSubject.pipe(map((options) => this.defineMenuOptions(options))).subscribe();
this.router.events
.pipe(switchMap((event) => new Promise(async (resolve) => {
while (this.optionsSubject?.getValue()?.length === 0) {
await delay(300);
}
resolve(event);
})))
.pipe(map((event) => {
const options = this.cloneOptions();
this.optionsSubject?.next(options.map((option) => {
option.active = false;
return option;
}));
return event;
}))
.subscribe((event) => {
switch (true) {
case event instanceof Scroll:
case event instanceof NavigationEnd:
const options = this.cloneOptions();
if (options?.length > 0) {
this.optionsSubject?.next(this.defineMenuOptions(options, true));
}
}
});
}
}
toogle(module) {
if (this.optionsSubject) {
const options = JSON.parse(JSON.stringify(this.optionsSubject.getValue()));
this.optionsSubject.next(koala(options)
.array()
.map((item) => {
item.animateOpen = false;
item.animateClose = false;
if (item.name === module.name) {
item.expanded = !module.expanded;
item.animateOpen = item.expanded;
item.animateClose = !item.expanded;
}
else {
item.expanded = false;
}
return item;
})
.getValue());
}
}
getKoalaIcon(config) {
return config.icon;
}
defineMenuOptions(options, routerChange = false) {
options.map((module) => {
if (routerChange) {
module.animateOpen = false;
module.animateClose = false;
module.active = module.tools
? this.router.url === module.routerLink ||
!!module.tools.find((tool) => this.router.url.indexOf(tool.routerLink) >= 0)
: this.router.url === module.routerLink;
module.expanded = module.active;
}
return module;
});
return options;
}
cloneOptions() {
return JSON.parse(JSON.stringify(this.optionsSubject?.getValue()));
}
}
MenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component });
MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MenuComponent, selector: "koala-menu", inputs: { titleMenu: "titleMenu", optionsSubject: "optionsSubject" }, ngImport: i0, template: "<nav>\n <h2 *ngIf=\"titleMenu\" class=\"title\">{{titleMenu}}</h2>\n <ul *ngIf=\"(optionsSubject | async) as options\" class=\"list-menu\" [ngClass]=\"{'without-title': !titleMenu}\">\n <li\n #moduleItem\n\t *ngFor=\"let module of options\"\n\t [ngClass]=\"{\n\t animateOpen: module.animateOpen,\n\t animateClose: module.animateClose,\n expanded: module.expanded,\n active: module.active\n }\">\n <a *ngIf=\"!!module.routerLink else moduleWithoutLink\" [routerLink]=\"module.routerLink\" (click)=\"toogle(module)\" class=\"module\">\n <mat-icon *ngIf=\"module.icon && !module.koalaIcon\">{{module.icon}}</mat-icon>\n <koala-icon *ngIf=\"module.icon && module.koalaIcon\" [icon]=\"getKoalaIcon(module)\"></koala-icon>\n <h3>{{module.name}}</h3>\n <mat-icon\n\t *ngIf=\"module.tools?.length ?? 0 > 0\"\n\t class=\"state-module\">{{module.expanded || module.active ? 'keyboard_arrow_down' : 'keyboard_arrow_right'}}</mat-icon>\n </a>\n <ng-template #moduleWithoutLink>\n <div (click)=\"toogle(module)\" class=\"module\">\n <mat-icon *ngIf=\"module.icon && !module.koalaIcon\">{{module.icon}}</mat-icon>\n <koala-icon *ngIf=\"module.icon && module.koalaIcon\" [icon]=\"getKoalaIcon(module)\" [size]=\"18\"></koala-icon>\n <h3>{{module.name}}</h3>\n <mat-icon\n\t *ngIf=\"module.tools?.length ?? 0 > 0\"\n\t class=\"state-module\">{{module.expanded || module.active ? 'keyboard_arrow_down' : 'keyboard_arrow_right'}}</mat-icon>\n </div>\n </ng-template>\n <ul *ngIf=\"module.tools?.length ?? 0 > 0\">\n <li *ngFor=\"let tool of module.tools\">\n\t\t <a [routerLink]=\"tool.routerLink\" routerLinkActive=\"active\">\n\t <mat-icon *ngIf=\"tool.icon && !tool.koalaIcon\">{{tool.icon}}</mat-icon>\n <koala-icon *ngIf=\"tool.icon && tool.koalaIcon\" [icon]=\"getKoalaIcon(tool)\" [size]=\"18\"></koala-icon>\n\t <h4>{{tool.name}}</h4>\n\t\t </a>\n </li>\n </ul>\n </li>\n </ul>\n</nav>\n", styles: [".title{font-family:OpenSans,sans-serif;font-size:.8em;font-weight:700;line-height:.8em;margin:0;padding:8px 15px}ul{font-size:0;list-style:none;margin:0;padding:0 20px 0 0;width:100%;box-sizing:border-box}ul.list-menu{height:calc(100vh - 107px);overflow:auto}ul.list-menu.without-title{height:calc(100vh - 78px)}ul ul{height:-moz-fit-content;height:fit-content;overflow:hidden;width:100%}ul li{cursor:pointer;display:block;font-size:14px;outline:none;padding:0;position:relative;transition:.2s;overflow:hidden;border-radius:0 20px 20px 0}ul li a{transition:.2s}.module{outline:none;padding:5px 15px;text-decoration:none}a.module{box-sizing:border-box;cursor:pointer;display:block;width:100%}ul li li{border:none!important;padding:0!important;height:0}.state-module{position:absolute;right:10px;top:4px}ul li.active ul{border-bottom:1px solid rgba(0,0,0,.1);box-shadow:0 1px 3px #00000080}ul li.expanded ul{border-bottom:1px solid rgba(0,0,0,.1);box-shadow:0 1px 3px #00000080;height:-moz-fit-content;height:fit-content;padding:15px 0}ul li.expanded ul li{height:30px}ul li li a.active{background:rgba(0,0,0,.1)!important;cursor:default;height:-moz-fit-content!important;height:fit-content!important}ul li h3,ul li h4,ul li koala-icon,ul li mat-icon{display:inline-flex;line-height:1.5em;margin:0;vertical-align:middle}ul li h3,ul li h4{font-size:.9em}ul li koala-icon,ul li li koala-icon{font-size:18px;height:18px;line-height:18px;margin-right:5px;width:18px}ul li mat-icon,ul li li mat-icon{font-size:20px;height:20px;line-height:20px;margin-right:5px;width:20px}ul li koala-icon,ul li li koala-icon{margin-right:10px}ul li li a{cursor:pointer;display:block;padding:5px 15px!important;text-decoration:none;width:100%}ul li li:hover{background:rgba(0,0,0,.1)}ul li li a.active:hover{background:transparent}\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: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.IconComponent, selector: "koala-icon", inputs: ["color", "icon", "size"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuComponent, decorators: [{
type: Component,
args: [{ selector: 'koala-menu', changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav>\n <h2 *ngIf=\"titleMenu\" class=\"title\">{{titleMenu}}</h2>\n <ul *ngIf=\"(optionsSubject | async) as options\" class=\"list-menu\" [ngClass]=\"{'without-title': !titleMenu}\">\n <li\n #moduleItem\n\t *ngFor=\"let module of options\"\n\t [ngClass]=\"{\n\t animateOpen: module.animateOpen,\n\t animateClose: module.animateClose,\n expanded: module.expanded,\n active: module.active\n }\">\n <a *ngIf=\"!!module.routerLink else moduleWithoutLink\" [routerLink]=\"module.routerLink\" (click)=\"toogle(module)\" class=\"module\">\n <mat-icon *ngIf=\"module.icon && !module.koalaIcon\">{{module.icon}}</mat-icon>\n <koala-icon *ngIf=\"module.icon && module.koalaIcon\" [icon]=\"getKoalaIcon(module)\"></koala-icon>\n <h3>{{module.name}}</h3>\n <mat-icon\n\t *ngIf=\"module.tools?.length ?? 0 > 0\"\n\t class=\"state-module\">{{module.expanded || module.active ? 'keyboard_arrow_down' : 'keyboard_arrow_right'}}</mat-icon>\n </a>\n <ng-template #moduleWithoutLink>\n <div (click)=\"toogle(module)\" class=\"module\">\n <mat-icon *ngIf=\"module.icon && !module.koalaIcon\">{{module.icon}}</mat-icon>\n <koala-icon *ngIf=\"module.icon && module.koalaIcon\" [icon]=\"getKoalaIcon(module)\" [size]=\"18\"></koala-icon>\n <h3>{{module.name}}</h3>\n <mat-icon\n\t *ngIf=\"module.tools?.length ?? 0 > 0\"\n\t class=\"state-module\">{{module.expanded || module.active ? 'keyboard_arrow_down' : 'keyboard_arrow_right'}}</mat-icon>\n </div>\n </ng-template>\n <ul *ngIf=\"module.tools?.length ?? 0 > 0\">\n <li *ngFor=\"let tool of module.tools\">\n\t\t <a [routerLink]=\"tool.routerLink\" routerLinkActive=\"active\">\n\t <mat-icon *ngIf=\"tool.icon && !tool.koalaIcon\">{{tool.icon}}</mat-icon>\n <koala-icon *ngIf=\"tool.icon && tool.koalaIcon\" [icon]=\"getKoalaIcon(tool)\" [size]=\"18\"></koala-icon>\n\t <h4>{{tool.name}}</h4>\n\t\t </a>\n </li>\n </ul>\n </li>\n </ul>\n</nav>\n", styles: [".title{font-family:OpenSans,sans-serif;font-size:.8em;font-weight:700;line-height:.8em;margin:0;padding:8px 15px}ul{font-size:0;list-style:none;margin:0;padding:0 20px 0 0;width:100%;box-sizing:border-box}ul.list-menu{height:calc(100vh - 107px);overflow:auto}ul.list-menu.without-title{height:calc(100vh - 78px)}ul ul{height:-moz-fit-content;height:fit-content;overflow:hidden;width:100%}ul li{cursor:pointer;display:block;font-size:14px;outline:none;padding:0;position:relative;transition:.2s;overflow:hidden;border-radius:0 20px 20px 0}ul li a{transition:.2s}.module{outline:none;padding:5px 15px;text-decoration:none}a.module{box-sizing:border-box;cursor:pointer;display:block;width:100%}ul li li{border:none!important;padding:0!important;height:0}.state-module{position:absolute;right:10px;top:4px}ul li.active ul{border-bottom:1px solid rgba(0,0,0,.1);box-shadow:0 1px 3px #00000080}ul li.expanded ul{border-bottom:1px solid rgba(0,0,0,.1);box-shadow:0 1px 3px #00000080;height:-moz-fit-content;height:fit-content;padding:15px 0}ul li.expanded ul li{height:30px}ul li li a.active{background:rgba(0,0,0,.1)!important;cursor:default;height:-moz-fit-content!important;height:fit-content!important}ul li h3,ul li h4,ul li koala-icon,ul li mat-icon{display:inline-flex;line-height:1.5em;margin:0;vertical-align:middle}ul li h3,ul li h4{font-size:.9em}ul li koala-icon,ul li li koala-icon{font-size:18px;height:18px;line-height:18px;margin-right:5px;width:18px}ul li mat-icon,ul li li mat-icon{font-size:20px;height:20px;line-height:20px;margin-right:5px;width:20px}ul li koala-icon,ul li li koala-icon{margin-right:10px}ul li li a{cursor:pointer;display:block;padding:5px 15px!important;text-decoration:none;width:100%}ul li li:hover{background:rgba(0,0,0,.1)}ul li li a.active:hover{background:transparent}\n"] }]
}], ctorParameters: function () { return [{ type: i1.Router }]; }, propDecorators: { titleMenu: [{
type: Input
}], optionsSubject: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZW51L3NyYy9saWIvbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tZW51L3NyYy9saWIvbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRixPQUFPLEVBQUUsYUFBYSxFQUFVLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7QUFLdkQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxlQUFlLENBQXVCLElBQUksQ0FBQyxDQUFDO0FBUWhGLE1BQU0sT0FBTyxhQUFhO0lBSXhCLFlBQW9CLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQUcsQ0FBQztJQUV0QyxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4RixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07aUJBQ2YsSUFBSSxDQUNILFNBQVMsQ0FDUCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ1IsSUFBSSxP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Q0FBQyxLQUFLO29CQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLFVBQVU7d0JBQ3JDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUMxQyxNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDakM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBK0IsQ0FBQztJQUNuRyxDQUFDOzswR0E5RlUsYUFBYTs4RkFBYixhQUFhLHdIQ25CMUIseWtFQTBDQTsyRkR2QmEsYUFBYTtrQkFOekIsU0FBUzsrQkFDRSxZQUFZLG1CQUdMLHVCQUF1QixDQUFDLE1BQU07NkZBR3RDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtvYWxhTWVudU1vZHVsZUludGVyZmFjZSB9IGZyb20gJy4va29hbGEubWVudS1tb2R1bGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciwgU2Nyb2xsIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsga29hbGEgfSBmcm9tICdAa29hbGFyeC91dGlscyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSAnQGtvYWxhcngvdXRpbHMvb3BlcmF0b3JzL2RlbGF5JztcbmltcG9ydCB7IEtvYWxhTWVudVRvb2xJbnRlcmZhY2UgfSBmcm9tICcuL2tvYWxhLm1lbnUtdG9vbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS29hbGFJY29uVHlwZSB9IGZyb20gJ0Brb2FsYXJ4L3VpL2ljb24nO1xuXG5leHBvcnQgdHlwZSBNZW51U3RhdGVUeXBlID0gJ29wZW4nIHwgJ2Nsb3NlJztcbmV4cG9ydCBjb25zdCBtZW51U3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZW51U3RhdGVUeXBlIHwgbnVsbD4obnVsbCk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tvYWxhLW1lbnUnLFxuICB0ZW1wbGF0ZVVybDogJ21lbnUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnbWVudS5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgdGl0bGVNZW51Pzogc3RyaW5nO1xuICBASW5wdXQoKSBvcHRpb25zU3ViamVjdD86IEJlaGF2aW9yU3ViamVjdDxLb2FsYU1lbnVNb2R1bGVJbnRlcmZhY2VbXT47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zU3ViamVjdCkge1xuICAgICAgdGhpcy5vcHRpb25zU3ViamVjdC5waXBlKG1hcCgob3B0aW9ucykgPT4gdGhpcy5kZWZpbmVNZW51T3B0aW9ucyhvcHRpb25zKSkpLnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5yb3V0ZXIuZXZlbnRzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAgIChldmVudCkgPT5cbiAgICAgICAgICAgICAgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5vcHRpb25zU3ViamVjdD8uZ2V0VmFsdWUoKT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgzMDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc29sdmUoZXZlbnQpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNsb25lT3B0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zU3ViamVjdD8ubmV4dChcbiAgICAgICAgICAgICAgb3B0aW9ucy5tYXAoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIG9wdGlvbi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgY2FzZSBldmVudCBpbnN0YW5jZW9mIFNjcm9sbDpcbiAgICAgICAgICAgIGNhc2UgZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kOlxuICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jbG9uZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0Py5uZXh0KHRoaXMuZGVmaW5lTWVudU9wdGlvbnMob3B0aW9ucywgdHJ1ZSkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdG9vZ2xlKG1vZHVsZTogS29hbGFNZW51TW9kdWxlSW50ZXJmYWNlKSB7XG4gICAgaWYgKHRoaXMub3B0aW9uc1N1YmplY3QpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9uc1N1YmplY3QuZ2V0VmFsdWUoKSkpIGFzIEtvYWxhTWVudU1vZHVsZUludGVyZmFjZVtdO1xuICAgICAgdGhpcy5vcHRpb25zU3ViamVjdC5uZXh0KFxuICAgICAgICBrb2FsYShvcHRpb25zKVxuICAgICAgICAgIC5hcnJheTxLb2FsYU1lbnVNb2R1bGVJbnRlcmZhY2U+KClcbiAgICAgICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpdGVtLmFuaW1hdGVPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICBpdGVtLmFuaW1hdGVDbG9zZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PT0gbW9kdWxlLm5hbWUpIHtcbiAgICAgICAgICAgICAgaXRlbS5leHBhbmRlZCA9ICFtb2R1bGUuZXhwYW5kZWQ7XG4gICAgICAgICAgICAgIGl0ZW0uYW5pbWF0ZU9wZW4gPSBpdGVtLmV4cGFuZGVkO1xuICAgICAgICAgICAgICBpdGVtLmFuaW1hdGVDbG9zZSA9ICFpdGVtLmV4cGFuZGVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaXRlbS5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZ2V0VmFsdWUoKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEtvYWxhSWNvbihjb25maWc6IEtvYWxhTWVudU1vZHVsZUludGVyZmFjZSB8IEtvYWxhTWVudVRvb2xJbnRlcmZhY2UpIHtcbiAgICByZXR1cm4gY29uZmlnLmljb24gYXMgS29hbGFJY29uVHlwZTtcbiAgfVxuXG4gIHByaXZhdGUgZGVmaW5lTWVudU9wdGlvbnMob3B0aW9uczogS29hbGFNZW51TW9kdWxlSW50ZXJmYWNlW10sIHJvdXRlckNoYW5nZSA9IGZhbHNlKSB7XG4gICAgb3B0aW9ucy5tYXAoKG1vZHVsZSkgPT4ge1xuICAgICAgaWYgKHJvdXRlckNoYW5nZSkge1xuICAgICAgICBtb2R1bGUuYW5pbWF0ZU9wZW4gPSBmYWxzZTtcbiAgICAgICAgbW9kdWxlLmFuaW1hdGVDbG9zZSA9IGZhbHNlO1xuICAgICAgICBtb2R1bGUuYWN0aXZlID0gbW9kdWxlLnRvb2xzXG4gICAgICAgICAgPyB0aGlzLnJvdXRlci51cmwgPT09IG1vZHVsZS5yb3V0ZXJMaW5rIHx8XG4gICAgICAgICAgICAhIW1vZHVsZS50b29scy5maW5kKCh0b29sKSA9PiB0aGlzLnJvdXRlci51cmwuaW5kZXhPZih0b29sLnJvdXRlckxpbmspID49IDApXG4gICAgICAgICAgOiB0aGlzLnJvdXRlci51cmwgPT09IG1vZHVsZS5yb3V0ZXJMaW5rO1xuICAgICAgICBtb2R1bGUuZXhwYW5kZWQgPSBtb2R1bGUuYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbW9kdWxlO1xuICAgIH0pO1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZU9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zU3ViamVjdD8uZ2V0VmFsdWUoKSkpIGFzIEtvYWxhTWVudU1vZHVsZUludGVyZmFjZVtdO1xuICB9XG59XG4iLCI8bmF2PlxuICA8aDIgKm5nSWY9XCJ0aXRsZU1lbnVcIiBjbGFzcz1cInRpdGxlXCI+e3t0aXRsZU1lbnV9fTwvaDI+XG4gIDx1bCAqbmdJZj1cIihvcHRpb25zU3ViamVjdCB8IGFzeW5jKSBhcyBvcHRpb25zXCIgY2xhc3M9XCJsaXN0LW1lbnVcIiBbbmdDbGFzc109XCJ7J3dpdGhvdXQtdGl0bGUnOiAhdGl0bGVNZW51fVwiPlxuICAgIDxsaVxuICAgICAgI21vZHVsZUl0ZW1cblx0ICAgICpuZ0Zvcj1cImxldCBtb2R1bGUgb2Ygb3B0aW9uc1wiXG5cdCAgICBbbmdDbGFzc109XCJ7XG5cdCAgICAgIGFuaW1hdGVPcGVuOiBtb2R1bGUuYW5pbWF0ZU9wZW4sXG5cdCAgICAgIGFuaW1hdGVDbG9zZTogbW9kdWxlLmFuaW1hdGVDbG9zZSxcbiAgICAgICAgZXhwYW5kZWQ6IG1vZHVsZS5leHBhbmRlZCxcbiAgICAgICAgYWN0aXZlOiBtb2R1bGUuYWN0aXZlXG4gICAgICB9XCI+XG4gICAgICA8YSAqbmdJZj1cIiEhbW9kdWxlLnJvdXRlckxpbmsgZWxzZSBtb2R1bGVXaXRob3V0TGlua1wiIFtyb3V0ZXJMaW5rXT1cIm1vZHVsZS5yb3V0ZXJMaW5rXCIgKGNsaWNrKT1cInRvb2dsZShtb2R1bGUpXCIgY2xhc3M9XCJtb2R1bGVcIj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwibW9kdWxlLmljb24gJiYgIW1vZHVsZS5rb2FsYUljb25cIj57e21vZHVsZS5pY29ufX08L21hdC1pY29uPlxuICAgICAgICA8a29hbGEtaWNvbiAqbmdJZj1cIm1vZHVsZS5pY29uICYmIG1vZHVsZS5rb2FsYUljb25cIiBbaWNvbl09XCJnZXRLb2FsYUljb24obW9kdWxlKVwiPjwva29hbGEtaWNvbj5cbiAgICAgICAgPGgzPnt7bW9kdWxlLm5hbWV9fTwvaDM+XG4gICAgICAgIDxtYXQtaWNvblxuXHQgICAgICAgICpuZ0lmPVwibW9kdWxlLnRvb2xzPy5sZW5ndGggPz8gMCA+IDBcIlxuXHQgICAgICAgIGNsYXNzPVwic3RhdGUtbW9kdWxlXCI+e3ttb2R1bGUuZXhwYW5kZWQgfHwgbW9kdWxlLmFjdGl2ZSA/ICdrZXlib2FyZF9hcnJvd19kb3duJyA6ICdrZXlib2FyZF9hcnJvd19yaWdodCd9fTwvbWF0LWljb24+XG4gICAgICA8L2E+XG4gICAgICA8bmctdGVtcGxhdGUgI21vZHVsZVdpdGhvdXRMaW5rPlxuICAgICAgICA8ZGl2IChjbGljayk9XCJ0b29nbGUobW9kdWxlKVwiIGNsYXNzPVwibW9kdWxlXCI+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwibW9kdWxlLmljb24gJiYgIW1vZHVsZS5rb2FsYUljb25cIj57e21vZHVsZS5pY29ufX08L21hdC1pY29uPlxuICAgICAgICAgIDxrb2FsYS1pY29uICpuZ0lmPVwibW9kdWxlLmljb24gJiYgbW9kdWxlLmtvYWxhSWNvblwiIFtpY29uXT1cImdldEtvYWxhSWNvbihtb2R1bGUpXCIgW3NpemVdPVwiMThcIj48L2tvYWxhLWljb24+XG4gICAgICAgICAgPGgzPnt7bW9kdWxlLm5hbWV9fTwvaDM+XG4gICAgICAgICAgPG1hdC1pY29uXG5cdCAgICAgICAgICAqbmdJZj1cIm1vZHVsZS50b29scz8ubGVuZ3RoID8/IDAgPiAwXCJcblx0ICAgICAgICAgIGNsYXNzPVwic3RhdGUtbW9kdWxlXCI+e3ttb2R1bGUuZXhwYW5kZWQgfHwgbW9kdWxlLmFjdGl2ZSA/ICdrZXlib2FyZF9hcnJvd19kb3duJyA6ICdrZXlib2FyZF9hcnJvd19yaWdodCd9fTwvbWF0LWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDx1bCAqbmdJZj1cIm1vZHVsZS50b29scz8ubGVuZ3RoID8/IDAgPiAwXCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgdG9vbCBvZiBtb2R1bGUudG9vbHNcIj5cblx0XHQgICAgICA8YSBbcm91dGVyTGlua109XCJ0b29sLnJvdXRlckxpbmtcIiByb3V0ZXJMaW5rQWN0aXZlPVwiYWN0aXZlXCI+XG5cdCAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJ0b29sLmljb24gJiYgIXRvb2wua29hbGFJY29uXCI+e3t0b29sLmljb259fTwvbWF0LWljb24+XG4gICAgICAgICAgICA8a29hbGEtaWNvbiAqbmdJZj1cInRvb2wuaWNvbiAmJiB0b29sLmtvYWxhSWNvblwiIFtpY29uXT1cImdldEtvYWxhSWNvbih0b29sKVwiIFtzaXplXT1cIjE4XCI+PC9rb2FsYS1pY29uPlxuXHQgICAgICAgICAgPGg0Pnt7dG9vbC5uYW1lfX08L2g0PlxuXHRcdCAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9saT5cbiAgPC91bD5cbjwvbmF2PlxuIl19