systelab-components
Version:
systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.
72 lines • 21.7 kB
JavaScript
import { Component } from '@angular/core';
import { AbstractContextMenuComponent } from '../../contextmenu/abstract-context-menu.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../contextmenu/context-menu-submenu-item.component";
import * as i3 from "../../contextmenu/context-menu-item.component";
export class GridContextMenuComponent extends AbstractContextMenuComponent {
constructor(el, myRenderer, cdr) {
super(el, myRenderer, cdr);
this.el = el;
this.myRenderer = myRenderer;
this.cdr = cdr;
}
setActionManager(actionHandler) {
this.actionHandler = actionHandler;
}
setRowIndex(rowIndex) {
this.elementID = (Math.floor(Math.random() * (999999999999 - 1))).toString() + 'row' + rowIndex;
}
openWithOptions(event, newContextMenuOptions) {
this.contextMenuOptions = newContextMenuOptions;
this.open(event);
}
existsAtLeastOneActionEnabled() {
if (this.contextMenuOptions) {
return this.contextMenuOptions.some((menuOption) => this.isEnabled(this.elementID, menuOption.actionId));
}
else {
return false;
}
}
isIconEnabled(elementId, actionId) {
return false;
}
isEnabled(elementId, actionId) {
return this.actionHandler.isContextMenuOptionEnabled(elementId, actionId);
}
executeAction(event, elementId, actionId) {
const option = this.getOption(actionId);
if (option && !option.hasChildren()) {
if (this.isEmbedded) {
this.closeDropDown();
event.stopPropagation();
event.preventDefault();
}
if (option && option.actionId !== null && option.actionId !== undefined) {
this.actionHandler.executeContextMenuAction(elementId, option.actionId);
}
}
else {
this.doMouseOver(event, elementId, actionId);
}
}
getOption(actionId) {
const actions = actionId.split(this.levelSeparator);
let level = 1;
let menuLevel = this.contextMenuOptions.find(opt => opt.actionId === actions[level - 1]);
level++;
while (level <= actions.length) {
menuLevel = menuLevel.childrenContextMenuOptions.find(opt => opt.actionId === actions[level - 1]);
level++;
}
return menuLevel;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: GridContextMenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.9", type: GridContextMenuComponent, selector: "systelab-grid-context-menu", usesInheritance: true, ngImport: i0, template: "<div #dropdownparent id=\"{{elementID}}\" class=\"dropdown\">\n <div class=\"dropdown-toggle slab-context-menu\" data-toggle=\"dropdown\" (click)=\"dotsClicked($event)\">\n <i class=\"icon-context-menu\" [ngClass]=\"{'d-none': isEmbedded}\" [style.font-size]=\"fontSize\"\n [style.color]=\"fontColor\"></i>\n </div>\n <div #dropdownmenu class=\"dropdown-menu slab-dropdown-menu\">\n <div #dropdown class=\"slab-dropdown slab-dropdown-fixed\">\n <div *ngIf=\"isOpened\">\n <div #ngcontent (click)=\"ngContentStopPropagation($event)\">\n <ng-content></ng-content>\n </div>\n <ul #scrollableList class=\"slab-dropdown-scroll\" [ngClass]=\"{'slab-dropdown-overflow': overflow}\">\n @for (action of contextMenuOptions; track action.actionId) {\n <li class=\"d-flex align-items-center m-0\"\n [class.disabled]=\"!isEnabled(elementID, action.actionId) || action.isDivider\"\n (click)=\"doClickWithAction($event, elementID, action.actionId)\"\n (mouseover)=\"doMouseOver($event, elementID, action.actionId)\">\n <div *ngIf=\"isEnabled(elementID, action.actionId)\" class=\"slab-flex-1\" style=\"flex:1 1 auto\">\n <systelab-context-menu-item class=\"d-flex align-items-center\" [action]=\"action\"\n [isEnabled]=\"isEnabled(elementID, action.actionId)\"\n [isIconEnabled]=\"isIconEnabled(elementID, action.actionId)\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"></systelab-context-menu-item>\n <ul *ngIf=\"action.hasChildren()\" #childdropdownmenu id=\"{{action.actionId+elementID}}\"\n class=\"slab-dropdown dropdown-menu slab-dropdown-menu slab-dropdown-scroll slab-dropdown-absolute\">\n <systelab-context-menu-submenu-item [action]=\"action\"\n [actionName]=\"action.actionId\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"\n [contextMenuOriginal]=\"getSelfReference()\"\n [parentId]=\"elementID\"\n ></systelab-context-menu-submenu-item>\n </ul>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ContextMenuSubmenuItemComponent, selector: "systelab-context-menu-submenu-item", inputs: ["action", "actionName", "hasIcons", "hasChildren", "contextMenuOriginal", "parentId", "elementID"] }, { kind: "component", type: i3.ContextMenuItemComponent, selector: "systelab-context-menu-item", inputs: ["action", "hasIcons", "isEnabled", "isIconEnabled", "hasChildren"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: GridContextMenuComponent, decorators: [{
type: Component,
args: [{ selector: 'systelab-grid-context-menu', template: "<div #dropdownparent id=\"{{elementID}}\" class=\"dropdown\">\n <div class=\"dropdown-toggle slab-context-menu\" data-toggle=\"dropdown\" (click)=\"dotsClicked($event)\">\n <i class=\"icon-context-menu\" [ngClass]=\"{'d-none': isEmbedded}\" [style.font-size]=\"fontSize\"\n [style.color]=\"fontColor\"></i>\n </div>\n <div #dropdownmenu class=\"dropdown-menu slab-dropdown-menu\">\n <div #dropdown class=\"slab-dropdown slab-dropdown-fixed\">\n <div *ngIf=\"isOpened\">\n <div #ngcontent (click)=\"ngContentStopPropagation($event)\">\n <ng-content></ng-content>\n </div>\n <ul #scrollableList class=\"slab-dropdown-scroll\" [ngClass]=\"{'slab-dropdown-overflow': overflow}\">\n @for (action of contextMenuOptions; track action.actionId) {\n <li class=\"d-flex align-items-center m-0\"\n [class.disabled]=\"!isEnabled(elementID, action.actionId) || action.isDivider\"\n (click)=\"doClickWithAction($event, elementID, action.actionId)\"\n (mouseover)=\"doMouseOver($event, elementID, action.actionId)\">\n <div *ngIf=\"isEnabled(elementID, action.actionId)\" class=\"slab-flex-1\" style=\"flex:1 1 auto\">\n <systelab-context-menu-item class=\"d-flex align-items-center\" [action]=\"action\"\n [isEnabled]=\"isEnabled(elementID, action.actionId)\"\n [isIconEnabled]=\"isIconEnabled(elementID, action.actionId)\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"></systelab-context-menu-item>\n <ul *ngIf=\"action.hasChildren()\" #childdropdownmenu id=\"{{action.actionId+elementID}}\"\n class=\"slab-dropdown dropdown-menu slab-dropdown-menu slab-dropdown-scroll slab-dropdown-absolute\">\n <systelab-context-menu-submenu-item [action]=\"action\"\n [actionName]=\"action.actionId\"\n [hasChildren]=\"action.hasChildren()\"\n [hasIcons]=\"hasIcons\"\n [contextMenuOriginal]=\"getSelfReference()\"\n [parentId]=\"elementID\"\n ></systelab-context-menu-submenu-item>\n </ul>\n </div>\n </li>\n }\n </ul>\n </div>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1jb250ZXh0LW1lbnUtY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL2dyaWQvY29udGV4dG1lbnUvZ3JpZC1jb250ZXh0LW1lbnUtY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL2NvbnRleHRtZW51L2NvbnRleHQtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBeUIsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbURBQW1ELENBQUM7Ozs7O0FBYWpHLE1BQU0sT0FBTyx3QkFBNEIsU0FBUSw0QkFBc0Q7SUFJdEcsWUFBK0IsRUFBYyxFQUFxQixVQUFxQixFQUFxQixHQUFzQjtRQUNqSSxLQUFLLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQURHLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBcUIsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUFxQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUVsSSxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsYUFBdUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDcEMsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUFnQjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUM7SUFDakcsQ0FBQztJQUVNLGVBQWUsQ0FBQyxLQUFpQixFQUFFLHFCQUFzRDtRQUMvRixJQUFJLENBQUMsa0JBQWtCLEdBQUcscUJBQXFCLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRVMsNkJBQTZCO1FBQ3RDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLFVBQW9DLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNuSTthQUFNO1lBQ04sT0FBTyxLQUFLLENBQUM7U0FDYjtJQUNGLENBQUM7SUFFTSxhQUFhLENBQUMsU0FBaUIsRUFBRSxRQUFnQjtRQUN2RCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFTSxTQUFTLENBQUMsU0FBaUIsRUFBRSxRQUFnQjtRQUNuRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBVSxFQUFFLFNBQWlCLEVBQUUsUUFBZ0I7UUFFbkUsTUFBTSxNQUFNLEdBQTZCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEUsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3ZCO1lBRUQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUN4RTtTQUNEO2FBQU07WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDN0M7SUFDRixDQUFDO0lBRVMsU0FBUyxDQUFDLFFBQWdCO1FBQ25DLE1BQU0sT0FBTyxHQUFhLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVkLElBQUksU0FBUyxHQUE2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkgsS0FBSyxFQUFFLENBQUM7UUFDUixPQUFPLEtBQUssSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQy9CLFNBQVMsR0FBRyxTQUFTLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEcsS0FBSyxFQUFFLENBQUM7U0FDUjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBRWxCLENBQUM7OEdBckVXLHdCQUF3QjtrR0FBeEIsd0JBQXdCLHlGQ2RyQyxraUdBeUNBOzsyRkQzQmEsd0JBQXdCO2tCQUpwQyxTQUFTOytCQUNJLDRCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250ZXh0TWVudUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbnRleHRtZW51L2Fic3RyYWN0LWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR3JpZENvbnRleHRNZW51T3B0aW9uIH0gZnJvbSAnLi9ncmlkLWNvbnRleHQtbWVudS1vcHRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRSb3dNZW51QWN0aW9uSGFuZGxlciB7XG5cdGlzQ29udGV4dE1lbnVPcHRpb25FbmFibGVkKGVsZW1lbnRJZDogc3RyaW5nLCBhY3Rpb25JZDogc3RyaW5nKTogYm9vbGVhbjtcblxuXHRleGVjdXRlQ29udGV4dE1lbnVBY3Rpb24oZWxlbWVudElkOiBzdHJpbmcsIGFjdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICAgICdzeXN0ZWxhYi1ncmlkLWNvbnRleHQtbWVudScsXG5cdHRlbXBsYXRlVXJsOiAnLi4vLi4vY29udGV4dG1lbnUvY29udGV4dC1tZW51LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBHcmlkQ29udGV4dE1lbnVDb21wb25lbnQ8VD4gZXh0ZW5kcyBBYnN0cmFjdENvbnRleHRNZW51Q29tcG9uZW50PEdyaWRDb250ZXh0TWVudU9wdGlvbjxUPj4ge1xuXG5cdHByb3RlY3RlZCBhY3Rpb25IYW5kbGVyOiBHcmlkUm93TWVudUFjdGlvbkhhbmRsZXI7XG5cblx0Y29uc3RydWN0b3IocHJvdGVjdGVkIG92ZXJyaWRlIGVsOiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgb3ZlcnJpZGUgbXlSZW5kZXJlcjogUmVuZGVyZXIyLCBwcm90ZWN0ZWQgb3ZlcnJpZGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuXHRcdHN1cGVyKGVsLCBteVJlbmRlcmVyLCBjZHIpO1xuXHR9XG5cblx0cHVibGljIHNldEFjdGlvbk1hbmFnZXIoYWN0aW9uSGFuZGxlcjogR3JpZFJvd01lbnVBY3Rpb25IYW5kbGVyKTogdm9pZCB7XG5cdFx0dGhpcy5hY3Rpb25IYW5kbGVyID0gYWN0aW9uSGFuZGxlcjtcblx0fVxuXG5cdHB1YmxpYyBzZXRSb3dJbmRleChyb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5lbGVtZW50SUQgPSAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDk5OTk5OTk5OTk5OSAtIDEpKSkudG9TdHJpbmcoKSArICdyb3cnICsgcm93SW5kZXg7XG5cdH1cblxuXHRwdWJsaWMgb3BlbldpdGhPcHRpb25zKGV2ZW50OiBNb3VzZUV2ZW50LCBuZXdDb250ZXh0TWVudU9wdGlvbnM6IEFycmF5PEdyaWRDb250ZXh0TWVudU9wdGlvbjxUPj4pOiB2b2lkIHtcblx0XHR0aGlzLmNvbnRleHRNZW51T3B0aW9ucyA9IG5ld0NvbnRleHRNZW51T3B0aW9ucztcblx0XHR0aGlzLm9wZW4oZXZlbnQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGV4aXN0c0F0TGVhc3RPbmVBY3Rpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLmNvbnRleHRNZW51T3B0aW9ucykge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29udGV4dE1lbnVPcHRpb25zLnNvbWUoKG1lbnVPcHRpb246IEdyaWRDb250ZXh0TWVudU9wdGlvbjxUPikgPT4gdGhpcy5pc0VuYWJsZWQodGhpcy5lbGVtZW50SUQsIG1lbnVPcHRpb24uYWN0aW9uSWQpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBpc0ljb25FbmFibGVkKGVsZW1lbnRJZDogc3RyaW5nLCBhY3Rpb25JZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cHVibGljIGlzRW5hYmxlZChlbGVtZW50SWQ6IHN0cmluZywgYWN0aW9uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmFjdGlvbkhhbmRsZXIuaXNDb250ZXh0TWVudU9wdGlvbkVuYWJsZWQoZWxlbWVudElkLCBhY3Rpb25JZCk7XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZUFjdGlvbihldmVudDogYW55LCBlbGVtZW50SWQ6IHN0cmluZywgYWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuXG5cdFx0Y29uc3Qgb3B0aW9uOiBHcmlkQ29udGV4dE1lbnVPcHRpb248VD4gPSB0aGlzLmdldE9wdGlvbihhY3Rpb25JZCk7XG5cblx0XHRpZiAob3B0aW9uICYmICFvcHRpb24uaGFzQ2hpbGRyZW4oKSkge1xuXHRcdFx0aWYgKHRoaXMuaXNFbWJlZGRlZCkge1xuXHRcdFx0XHR0aGlzLmNsb3NlRHJvcERvd24oKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcHRpb24gJiYgb3B0aW9uLmFjdGlvbklkICE9PSBudWxsICYmIG9wdGlvbi5hY3Rpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuYWN0aW9uSGFuZGxlci5leGVjdXRlQ29udGV4dE1lbnVBY3Rpb24oZWxlbWVudElkLCBvcHRpb24uYWN0aW9uSWQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmRvTW91c2VPdmVyKGV2ZW50LCBlbGVtZW50SWQsIGFjdGlvbklkKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0T3B0aW9uKGFjdGlvbklkOiBzdHJpbmcpOiBHcmlkQ29udGV4dE1lbnVPcHRpb248VD4ge1xuXHRcdGNvbnN0IGFjdGlvbnM6IHN0cmluZ1tdID0gYWN0aW9uSWQuc3BsaXQodGhpcy5sZXZlbFNlcGFyYXRvcik7XG5cdFx0bGV0IGxldmVsID0gMTtcblxuXHRcdGxldCBtZW51TGV2ZWw6IEdyaWRDb250ZXh0TWVudU9wdGlvbjxUPiA9IHRoaXMuY29udGV4dE1lbnVPcHRpb25zLmZpbmQob3B0ID0+IG9wdC5hY3Rpb25JZCA9PT0gYWN0aW9uc1tsZXZlbCAtIDFdKTtcblx0XHRsZXZlbCsrO1xuXHRcdHdoaWxlIChsZXZlbCA8PSBhY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0bWVudUxldmVsID0gbWVudUxldmVsLmNoaWxkcmVuQ29udGV4dE1lbnVPcHRpb25zLmZpbmQob3B0ID0+IG9wdC5hY3Rpb25JZCA9PT0gYWN0aW9uc1tsZXZlbCAtIDFdKTtcblx0XHRcdGxldmVsKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1lbnVMZXZlbDtcblxuXHR9XG5cbn1cbiIsIjxkaXYgI2Ryb3Bkb3ducGFyZW50IGlkPVwie3tlbGVtZW50SUR9fVwiIGNsYXNzPVwiZHJvcGRvd25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlIHNsYWItY29udGV4dC1tZW51XCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIChjbGljayk9XCJkb3RzQ2xpY2tlZCgkZXZlbnQpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiaWNvbi1jb250ZXh0LW1lbnVcIiBbbmdDbGFzc109XCJ7J2Qtbm9uZSc6IGlzRW1iZWRkZWR9XCIgW3N0eWxlLmZvbnQtc2l6ZV09XCJmb250U2l6ZVwiXG4gICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJmb250Q29sb3JcIj48L2k+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAjZHJvcGRvd25tZW51IGNsYXNzPVwiZHJvcGRvd24tbWVudSBzbGFiLWRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgPGRpdiAjZHJvcGRvd24gY2xhc3M9XCJzbGFiLWRyb3Bkb3duIHNsYWItZHJvcGRvd24tZml4ZWRcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc09wZW5lZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgI25nY29udGVudCAoY2xpY2spPVwibmdDb250ZW50U3RvcFByb3BhZ2F0aW9uKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDx1bCAjc2Nyb2xsYWJsZUxpc3QgY2xhc3M9XCJzbGFiLWRyb3Bkb3duLXNjcm9sbFwiIFtuZ0NsYXNzXT1cInsnc2xhYi1kcm9wZG93bi1vdmVyZmxvdyc6IG92ZXJmbG93fVwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChhY3Rpb24gb2YgY29udGV4dE1lbnVPcHRpb25zOyB0cmFjayBhY3Rpb24uYWN0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbS0wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzRW5hYmxlZChlbGVtZW50SUQsIGFjdGlvbi5hY3Rpb25JZCkgfHwgYWN0aW9uLmlzRGl2aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvQ2xpY2tXaXRoQWN0aW9uKCRldmVudCwgZWxlbWVudElELCBhY3Rpb24uYWN0aW9uSWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VvdmVyKT1cImRvTW91c2VPdmVyKCRldmVudCwgZWxlbWVudElELCBhY3Rpb24uYWN0aW9uSWQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRW5hYmxlZChlbGVtZW50SUQsIGFjdGlvbi5hY3Rpb25JZClcIiBjbGFzcz1cInNsYWItZmxleC0xXCIgc3R5bGU9XCJmbGV4OjEgMSBhdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZWxhYi1jb250ZXh0LW1lbnUtaXRlbSBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBbYWN0aW9uXT1cImFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNFbmFibGVkXT1cImlzRW5hYmxlZChlbGVtZW50SUQsIGFjdGlvbi5hY3Rpb25JZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzSWNvbkVuYWJsZWRdPVwiaXNJY29uRW5hYmxlZChlbGVtZW50SUQsIGFjdGlvbi5hY3Rpb25JZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhc0NoaWxkcmVuXT1cImFjdGlvbi5oYXNDaGlsZHJlbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYXNJY29uc109XCJoYXNJY29uc1wiPjwvc3lzdGVsYWItY29udGV4dC1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cImFjdGlvbi5oYXNDaGlsZHJlbigpXCIgI2NoaWxkZHJvcGRvd25tZW51IGlkPVwie3thY3Rpb24uYWN0aW9uSWQrZWxlbWVudElEfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbGFiLWRyb3Bkb3duIGRyb3Bkb3duLW1lbnUgc2xhYi1kcm9wZG93bi1tZW51IHNsYWItZHJvcGRvd24tc2Nyb2xsIHNsYWItZHJvcGRvd24tYWJzb2x1dGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZWxhYi1jb250ZXh0LW1lbnUtc3VibWVudS1pdGVtIFthY3Rpb25dPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25OYW1lXT1cImFjdGlvbi5hY3Rpb25JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzQ2hpbGRyZW5dPVwiYWN0aW9uLmhhc0NoaWxkcmVuKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhc0ljb25zXT1cImhhc0ljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZXh0TWVudU9yaWdpbmFsXT1cImdldFNlbGZSZWZlcmVuY2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50SWRdPVwiZWxlbWVudElEXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3N5c3RlbGFiLWNvbnRleHQtbWVudS1zdWJtZW51LWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19