ng-devui
Version:
DevUI components based on Angular
148 lines • 27.4 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, Output, inject, TemplateRef, QueryList, ContentChildren, } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { collapseMotion, scaleInOut } from 'ng-devui/utils';
import { MenuComponent } from './menu.component';
import { MenuItemDirective } from './menu-item.directive';
import { auditTime, combineLatest, distinctUntilChanged, filter } from 'rxjs';
import { map } from 'rxjs/operators';
import { SubMenuService } from './submenu.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "ng-devui/icon";
import * as i3 from "@angular/cdk/overlay";
import * as i4 from "ng-devui/utils";
import * as i5 from "./menu-item.directive";
export class SubMenuComponent {
set open(value) {
this._open = value;
}
get open() {
return this._open;
}
get titleContext() {
return {
$implicit: this.title instanceof TemplateRef ? '' : this.title,
open: this.open,
disabled: this.disabled,
icon: this.icon,
};
}
constructor() {
this.subMenuClass = true;
this.noStyle = false;
this._open = false;
this.disabled = false;
this.title = '';
this.icon = '';
this.openChange = new EventEmitter();
this.submenuService = inject(SubMenuService, { self: true });
this.parentMenu = inject(MenuComponent, { skipSelf: true });
this.cdr = inject(ChangeDetectorRef);
this.afterInitAnimate = true;
this.positions = [
{
originX: 'end',
originY: 'top',
overlayX: 'start',
overlayY: 'top',
offsetX: 4
}
];
this.childActive = false;
this.collapsed = false;
this.popoverOpen = false;
// 如果不在constructor里,takeUntilDestroyed就得传入 destroyRef = inject(DestroyRef);
this.parentMenu.collapsed$.pipe(takeUntilDestroyed()).subscribe(res => {
this.collapsed = res;
this.togglePopOpen(false);
this.cdr.markForCheck();
});
const currentActive$ = this.submenuService.childActive$;
combineLatest([this.submenuService.parentSubMenuActive$, currentActive$])
.pipe(map((([parentActive, currentActive]) => parentActive || currentActive)), distinctUntilChanged(), takeUntilDestroyed()).subscribe(res => {
this.toggleActive(res);
this.submenuService.parentSubMenuService?.parentSubMenuActive$?.next(res);
this.cdr.markForCheck();
});
const currentPopoverOpen$ = this.submenuService.childState$.pipe(map((value => value === 'enter')));
combineLatest([this.submenuService.parentPopoverOpen$, currentPopoverOpen$])
.pipe(filter(() => this.collapsed && !this.disabled), map((([parentPopoverOpen, currentPopoverOpen]) => {
return parentPopoverOpen || currentPopoverOpen;
})), auditTime(150), distinctUntilChanged(), takeUntilDestroyed()).subscribe(open => {
this.togglePopOpen(open);
this.submenuService.parentSubMenuService?.parentPopoverOpen$.next(open);
this.cdr.markForCheck();
});
}
ngOnInit() { }
ngAfterContentInit() {
if (this.menuItemDirectives?.length) {
this.submenuService.menuItems.push(...this.menuItemDirectives.toArray());
if (this.submenuService.parentSubMenuService) {
this.submenuService.parentSubMenuService.menuItems.push(...this.menuItemDirectives.toArray());
}
}
}
titleClick() {
if (this.disabled || this.collapsed) {
return;
}
this.toggleOpen(!this.open);
}
titleHover(type) {
this.submenuService.childState$.next(type);
}
toggleOpen(open) {
if (open !== this.open) {
this.open = open;
this.openChange.emit(open);
}
}
togglePopOpen(open) {
if (open !== this.popoverOpen) {
this.popoverOpen = open;
}
}
get expandState() {
return this.open ? 'expanded' : 'collapsed';
}
stateCls(base) {
return `${base} ${this.childActive ? 'active' : ''} ${this.disabled ? 'disabled' : ''} ${this.noStyle ? 'no-style' : ''}`;
}
toggleActive(active) {
if (active !== this.childActive) {
this.childActive = active;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SubMenuComponent, selector: "d-sub-menu, [dSubMenu]", inputs: { noStyle: "noStyle", open: "open", disabled: "disabled", title: "title", icon: "icon" }, outputs: { openChange: "openChange" }, host: { properties: { "class.devui-sub-menu": "this.subMenuClass", "class.no-style": "this.noStyle", "class.open": "this._open" } }, providers: [SubMenuService], queries: [{ propertyName: "menuItemDirectives", predicate: MenuItemDirective }], ngImport: i0, template: "<div\n [class]=\"stateCls('devui-sub-menu-item')\"\n dMenuItem\n [subMenuHost]=\"true\"\n (itemClick)=\"titleClick()\"\n (titleHover)=\"titleHover($event)\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n>\n <div class=\"devui-sub-menu-item-title\" role=\"menu\" *dStrTplOutlet=\"title; context: titleContext\">\n <ng-content select=\"[title]\" *ngIf=\"!title\" />\n <d-icon class=\"devui-menu-item-icon\" *ngIf=\"icon\" [disabled]=\"disabled\" [icon]=\"icon\" />\n <span class=\"devui-menu-item-name over-flow-ellipsis\" [title]=\"title\">{{ title }}</span>\n </div>\n <d-icon class=\"devui-sub-menu-item-arrow\" [disabled]=\"disabled\" icon=\"icon-select-arrow\" />\n</div>\n\n<ng-container *ngIf=\"collapsed; else defaultChildrenTpl\">\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayPush\n cdkConnectedOverlayPanelClass=\"devui-menu-popover-panel\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"popoverOpen\"\n [cdkConnectedOverlayPositions]=\"positions\"\n cdkConnectedOverlayTransformOriginOn=\".devui-sub-menu\"\n >\n <div [class]=\"stateCls('devui-menu-popover')\" @scaleInOut (mouseenter)=\"titleHover('enter')\" (mouseleave)=\"titleHover('leave')\">\n <ng-template [ngTemplateOutlet]=\"contentTpl\" />\n </div>\n </ng-template>\n</ng-container>\n\n<ng-template #defaultChildrenTpl>\n <div class=\"devui-sub-menu-children\" [style.--level]=\"submenuService.level\" [@collapseMotion]=\"expandState\">\n <ng-template [ngTemplateOutlet]=\"contentTpl\" />\n </div>\n</ng-template>\n\n<ng-template #contentTpl>\n <ng-content />\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.IconComponent, selector: "d-icon", inputs: ["icon", "operable", "disabled", "rotate", "color"] }, { kind: "directive", type: i3.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i3.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i4.StrTplOutletDirective, selector: "[dStrTplOutlet]", inputs: ["dStrTplOutlet", "dStrTplOutletContext"] }, { kind: "directive", type: i5.MenuItemDirective, selector: "[dMenuItem]", inputs: ["subMenuHost", "noStyle", "disabled", "active"], outputs: ["itemClick", "titleHover"], exportAs: ["dMenuItem"] }], animations: [collapseMotion, scaleInOut], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SubMenuComponent, decorators: [{
type: Component,
args: [{ selector: 'd-sub-menu, [dSubMenu]', changeDetection: ChangeDetectionStrategy.OnPush, animations: [collapseMotion, scaleInOut], providers: [SubMenuService], template: "<div\n [class]=\"stateCls('devui-sub-menu-item')\"\n dMenuItem\n [subMenuHost]=\"true\"\n (itemClick)=\"titleClick()\"\n (titleHover)=\"titleHover($event)\"\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n>\n <div class=\"devui-sub-menu-item-title\" role=\"menu\" *dStrTplOutlet=\"title; context: titleContext\">\n <ng-content select=\"[title]\" *ngIf=\"!title\" />\n <d-icon class=\"devui-menu-item-icon\" *ngIf=\"icon\" [disabled]=\"disabled\" [icon]=\"icon\" />\n <span class=\"devui-menu-item-name over-flow-ellipsis\" [title]=\"title\">{{ title }}</span>\n </div>\n <d-icon class=\"devui-sub-menu-item-arrow\" [disabled]=\"disabled\" icon=\"icon-select-arrow\" />\n</div>\n\n<ng-container *ngIf=\"collapsed; else defaultChildrenTpl\">\n <ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayPush\n cdkConnectedOverlayPanelClass=\"devui-menu-popover-panel\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"popoverOpen\"\n [cdkConnectedOverlayPositions]=\"positions\"\n cdkConnectedOverlayTransformOriginOn=\".devui-sub-menu\"\n >\n <div [class]=\"stateCls('devui-menu-popover')\" @scaleInOut (mouseenter)=\"titleHover('enter')\" (mouseleave)=\"titleHover('leave')\">\n <ng-template [ngTemplateOutlet]=\"contentTpl\" />\n </div>\n </ng-template>\n</ng-container>\n\n<ng-template #defaultChildrenTpl>\n <div class=\"devui-sub-menu-children\" [style.--level]=\"submenuService.level\" [@collapseMotion]=\"expandState\">\n <ng-template [ngTemplateOutlet]=\"contentTpl\" />\n </div>\n</ng-template>\n\n<ng-template #contentTpl>\n <ng-content />\n</ng-template>\n" }]
}], ctorParameters: () => [], propDecorators: { menuItemDirectives: [{
type: ContentChildren,
args: [MenuItemDirective]
}], subMenuClass: [{
type: HostBinding,
args: ['class.devui-sub-menu']
}], noStyle: [{
type: HostBinding,
args: ['class.no-style']
}, {
type: Input
}], _open: [{
type: HostBinding,
args: ['class.open']
}], open: [{
type: Input
}], disabled: [{
type: Input
}], title: [{
type: Input
}], icon: [{
type: Input
}], openChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvbWVudS9zdWItbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9kZXZ1aS9tZW51L3N1Yi1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZUFBZSxHQUVoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7OztBQVNuRCxNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLElBQ0ksSUFBSSxDQUFDLEtBQWM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBT0QsSUFBSSxZQUFZO1FBQ2QsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxZQUFZLFdBQVcs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aEIsQ0FBQyxjQUFjLENBQUMsNkRBR1YsaUJBQWlCLDZCQ2pDcEMsb25EQTBDQSxpNUREYmMsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDOzs0RkFHN0IsZ0JBQWdCO2tCQVA1QixTQUFTOytCQUNFLHdCQUF3QixtQkFFakIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsYUFDN0IsQ0FBQyxjQUFjLENBQUM7d0RBR1Msa0JBQWtCO3NCQUFyRCxlQUFlO3VCQUFDLGlCQUFpQjtnQkFDRyxZQUFZO3NCQUFoRCxXQUFXO3VCQUFDLHNCQUFzQjtnQkFDSyxPQUFPO3NCQUE5QyxXQUFXO3VCQUFDLGdCQUFnQjs7c0JBQUcsS0FBSztnQkFDVixLQUFLO3NCQUEvQixXQUFXO3VCQUFDLFlBQVk7Z0JBRXJCLElBQUk7c0JBRFAsS0FBSztnQkFTRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIGluamVjdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFF1ZXJ5TGlzdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBBZnRlckNvbnRlbnRJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGNvbGxhcHNlTW90aW9uLCBzY2FsZUluT3V0IH0gZnJvbSAnbmctZGV2dWkvdXRpbHMnO1xuaW1wb3J0IHsgTWVudUNvbXBvbmVudCB9IGZyb20gJy4vbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVudUhvdmVyVHlwZXMsIFN1YlRpdGxlQ29udGV4dFR5cGUgfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBNZW51SXRlbURpcmVjdGl2ZSB9IGZyb20gJy4vbWVudS1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBhdWRpdFRpbWUsIGNvbWJpbmVMYXRlc3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1Yk1lbnVTZXJ2aWNlIH0gZnJvbSAnLi9zdWJtZW51LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkLXN1Yi1tZW51LCBbZFN1Yk1lbnVdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N1Yi1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtjb2xsYXBzZU1vdGlvbiwgc2NhbGVJbk91dF0sXG4gIHByb3ZpZGVyczogW1N1Yk1lbnVTZXJ2aWNlXSxcbiAgfSlcbmV4cG9ydCBjbGFzcyBTdWJNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZHJlbihNZW51SXRlbURpcmVjdGl2ZSkgbWVudUl0ZW1EaXJlY3RpdmVzOiBRdWVyeUxpc3Q8TWVudUl0ZW1EaXJlY3RpdmU+O1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRldnVpLXN1Yi1tZW51Jykgc3ViTWVudUNsYXNzID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5uby1zdHlsZScpIEBJbnB1dCgpIG5vU3R5bGUgPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5vcGVuJykgX29wZW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9vcGVuID0gdmFsdWU7XG4gIH1cblxuICBnZXQgb3BlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlbjtcbiAgfVxuXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxTdWJUaXRsZUNvbnRleHRUeXBlPiA9ICcnO1xuICBASW5wdXQoKSBpY29uID0gJyc7XG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGdldCB0aXRsZUNvbnRleHQoKTogU3ViVGl0bGVDb250ZXh0VHlwZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogdGhpcy50aXRsZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gJycgOiB0aGlzLnRpdGxlLFxuICAgICAgb3BlbjogdGhpcy5vcGVuLFxuICAgICAgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWQsXG4gICAgICBpY29uOiB0aGlzLmljb24sXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdWJtZW51U2VydmljZSA9IGluamVjdChTdWJNZW51U2VydmljZSwgeyBzZWxmOiB0cnVlIH0pO1xuICBwcm90ZWN0ZWQgcGFyZW50TWVudSA9IGluamVjdChNZW51Q29tcG9uZW50LCB7IHNraXBTZWxmOiB0cnVlIH0pO1xuXG4gIHByb3RlY3RlZCBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGFmdGVySW5pdEFuaW1hdGUgPSB0cnVlO1xuXG4gIHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICB7XG4gICAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICBvZmZzZXRYOiA0XG4gICAgfVxuICBdO1xuXG4gIHByaXZhdGUgY2hpbGRBY3RpdmUgPSBmYWxzZTtcblxuICBjb2xsYXBzZWQgPSBmYWxzZTtcblxuICBwb3BvdmVyT3BlbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIOWmguaenOS4jeWcqGNvbnN0cnVjdG9y6YeM77yMdGFrZVVudGlsRGVzdHJveWVk5bCx5b6X5Lyg5YWlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gICAgdGhpcy5wYXJlbnRNZW51LmNvbGxhcHNlZCQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICB0aGlzLmNvbGxhcHNlZCA9IHJlcztcbiAgICAgIHRoaXMudG9nZ2xlUG9wT3BlbihmYWxzZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmUkID0gdGhpcy5zdWJtZW51U2VydmljZS5jaGlsZEFjdGl2ZSQ7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5zdWJtZW51U2VydmljZS5wYXJlbnRTdWJNZW51QWN0aXZlJCwgY3VycmVudEFjdGl2ZSRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoKFtwYXJlbnRBY3RpdmUsIGN1cnJlbnRBY3RpdmVdKSA9PiBwYXJlbnRBY3RpdmUgfHwgY3VycmVudEFjdGl2ZSkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy50b2dnbGVBY3RpdmUocmVzKTtcbiAgICAgICAgdGhpcy5zdWJtZW51U2VydmljZS5wYXJlbnRTdWJNZW51U2VydmljZT8ucGFyZW50U3ViTWVudUFjdGl2ZSQ/Lm5leHQocmVzKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IGN1cnJlbnRQb3BvdmVyT3BlbiQgPSB0aGlzLnN1Ym1lbnVTZXJ2aWNlLmNoaWxkU3RhdGUkLnBpcGUobWFwKCh2YWx1ZSA9PiB2YWx1ZSA9PT0gJ2VudGVyJykpKTtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnN1Ym1lbnVTZXJ2aWNlLnBhcmVudFBvcG92ZXJPcGVuJCwgY3VycmVudFBvcG92ZXJPcGVuJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuY29sbGFwc2VkICYmICF0aGlzLmRpc2FibGVkKSxcbiAgICAgICAgbWFwKCgoW3BhcmVudFBvcG92ZXJPcGVuLCBjdXJyZW50UG9wb3Zlck9wZW5dKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHBhcmVudFBvcG92ZXJPcGVuIHx8IGN1cnJlbnRQb3BvdmVyT3BlbjtcbiAgICAgICAgfSkpLFxuICAgICAgICBhdWRpdFRpbWUoMTUwKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKClcbiAgICAgICkuc3Vic2NyaWJlKG9wZW4gPT4ge1xuICAgICAgICB0aGlzLnRvZ2dsZVBvcE9wZW4ob3Blbik7XG4gICAgICAgIHRoaXMuc3VibWVudVNlcnZpY2UucGFyZW50U3ViTWVudVNlcnZpY2U/LnBhcmVudFBvcG92ZXJPcGVuJC5uZXh0KG9wZW4pO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7IH1cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1lbnVJdGVtRGlyZWN0aXZlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnN1Ym1lbnVTZXJ2aWNlLm1lbnVJdGVtcy5wdXNoKC4uLnRoaXMubWVudUl0ZW1EaXJlY3RpdmVzLnRvQXJyYXkoKSk7XG4gICAgICBpZiAodGhpcy5zdWJtZW51U2VydmljZS5wYXJlbnRTdWJNZW51U2VydmljZSkge1xuICAgICAgICB0aGlzLnN1Ym1lbnVTZXJ2aWNlLnBhcmVudFN1Yk1lbnVTZXJ2aWNlLm1lbnVJdGVtcy5wdXNoKC4uLnRoaXMubWVudUl0ZW1EaXJlY3RpdmVzLnRvQXJyYXkoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGl0bGVDbGljaygpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmNvbGxhcHNlZCkgeyByZXR1cm47IH1cbiAgICB0aGlzLnRvZ2dsZU9wZW4oIXRoaXMub3Blbik7XG4gIH1cblxuXG4gIHRpdGxlSG92ZXIodHlwZTogTWVudUhvdmVyVHlwZXMpIHtcbiAgICB0aGlzLnN1Ym1lbnVTZXJ2aWNlLmNoaWxkU3RhdGUkLm5leHQodHlwZSk7XG4gIH1cblxuICB0b2dnbGVPcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICBpZiAob3BlbiAhPT0gdGhpcy5vcGVuKSB7XG4gICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQob3Blbik7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlUG9wT3BlbihvcGVuOiBib29sZWFuKSB7XG4gICAgaWYgKG9wZW4gIT09IHRoaXMucG9wb3Zlck9wZW4pIHtcbiAgICAgIHRoaXMucG9wb3Zlck9wZW4gPSBvcGVuO1xuICAgIH1cbiAgfVxuXG4gIGdldCBleHBhbmRTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnO1xuICB9XG5cbiAgc3RhdGVDbHMoYmFzZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9ICR7dGhpcy5jaGlsZEFjdGl2ZSA/ICdhY3RpdmUnIDogJyd9ICR7dGhpcy5kaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiAnJ30gJHt0aGlzLm5vU3R5bGUgPyAnbm8tc3R5bGUnIDogJyd9YDtcbiAgfVxuXG4gIHRvZ2dsZUFjdGl2ZShhY3RpdmU6IGJvb2xlYW4pIHtcbiAgICBpZiAoYWN0aXZlICE9PSB0aGlzLmNoaWxkQWN0aXZlKSB7XG4gICAgICB0aGlzLmNoaWxkQWN0aXZlID0gYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBbY2xhc3NdPVwic3RhdGVDbHMoJ2RldnVpLXN1Yi1tZW51LWl0ZW0nKVwiXG4gIGRNZW51SXRlbVxuICBbc3ViTWVudUhvc3RdPVwidHJ1ZVwiXG4gIChpdGVtQ2xpY2spPVwidGl0bGVDbGljaygpXCJcbiAgKHRpdGxlSG92ZXIpPVwidGl0bGVIb3ZlcigkZXZlbnQpXCJcbiAgY2RrT3ZlcmxheU9yaWdpblxuICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuPlxuICA8ZGl2IGNsYXNzPVwiZGV2dWktc3ViLW1lbnUtaXRlbS10aXRsZVwiIHJvbGU9XCJtZW51XCIgKmRTdHJUcGxPdXRsZXQ9XCJ0aXRsZTsgY29udGV4dDogdGl0bGVDb250ZXh0XCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3RpdGxlXVwiICpuZ0lmPVwiIXRpdGxlXCIgLz5cbiAgICA8ZC1pY29uIGNsYXNzPVwiZGV2dWktbWVudS1pdGVtLWljb25cIiAqbmdJZj1cImljb25cIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbaWNvbl09XCJpY29uXCIgLz5cbiAgICA8c3BhbiBjbGFzcz1cImRldnVpLW1lbnUtaXRlbS1uYW1lIG92ZXItZmxvdy1lbGxpcHNpc1wiIFt0aXRsZV09XCJ0aXRsZVwiPnt7IHRpdGxlIH19PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGQtaWNvbiBjbGFzcz1cImRldnVpLXN1Yi1tZW51LWl0ZW0tYXJyb3dcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBpY29uPVwiaWNvbi1zZWxlY3QtYXJyb3dcIiAvPlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjb2xsYXBzZWQ7IGVsc2UgZGVmYXVsdENoaWxkcmVuVHBsXCI+XG4gIDxuZy10ZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5UHVzaFxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzPVwiZGV2dWktbWVudS1wb3BvdmVyLXBhbmVsXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwicG9wb3Zlck9wZW5cIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cInBvc2l0aW9uc1wiXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVRyYW5zZm9ybU9yaWdpbk9uPVwiLmRldnVpLXN1Yi1tZW51XCJcbiAgPlxuICAgIDxkaXYgW2NsYXNzXT1cInN0YXRlQ2xzKCdkZXZ1aS1tZW51LXBvcG92ZXInKVwiIEBzY2FsZUluT3V0IChtb3VzZWVudGVyKT1cInRpdGxlSG92ZXIoJ2VudGVyJylcIiAobW91c2VsZWF2ZSk9XCJ0aXRsZUhvdmVyKCdsZWF2ZScpXCI+XG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudFRwbFwiIC8+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Q2hpbGRyZW5UcGw+XG4gIDxkaXYgY2xhc3M9XCJkZXZ1aS1zdWItbWVudS1jaGlsZHJlblwiIFtzdHlsZS4tLWxldmVsXT1cInN1Ym1lbnVTZXJ2aWNlLmxldmVsXCIgW0Bjb2xsYXBzZU1vdGlvbl09XCJleHBhbmRTdGF0ZVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50VHBsXCIgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRlbnRUcGw+XG4gIDxuZy1jb250ZW50IC8+XG48L25nLXRlbXBsYXRlPlxuIl19